alex-roc126 downloadsTask management on plain markdown checkboxes: completion heatmap, hover actions, outline hierarchy and tag grouping.
Task management on the markdown checkboxes you already write. Your notes are the only source of truth: there is no separate task database, no query language to learn, and no new syntax to adopt. Enable the plugin and the tasks already in your vault appear in an agenda, in a completion heatmap and behind a hover menu that can edit them.
It is meant for people who keep tasks inside their notes — in daily notes, under project headings, nested in an outline — and want to see and act on them without moving them anywhere else. Disable the plugin and your notes are exactly as they were.
✅ date. The plugin
keeps no record of its own and never guesses a date: if your markdown does not
say when a task closed, no day claims it. data.json holds your settings and
nothing else.[[wikilink]] on its own line, or failing that to the nearest ancestor that
has one, so - 🎯 [[census-explorer]] files everything nested under it with no
new syntax.simple-tasks:stats, simple-tasks:today and
simple-tasks:move through Obsidian's official CLI, each with
format=json|text so the output can be piped into a script.Settings → Community plugins → Browse → "Simple Tasks" → Install. That is the way in for everyone, and updates arrive through Obsidian like any other plugin. The listing is at community.obsidian.md/plugins/simple-tasks.
Only if you want what is on main before it is released. Install the
BRAT plugin, run BRAT: Add a
beta plugin for testing and enter:
alex-roc/simple-tasks
Do not run both at once: BRAT and the catalog install into the same folder, and whichever updated last is what you get.
Download main.js, manifest.json and styles.css from the
latest release into
<vault>/.obsidian/plugins/simple-tasks/, then enable the plugin.
Enable the plugin and run Open today's agenda. The tasks already in your
vault are there — the default statuses are [ ], [/], [x], [-] and [>],
so nothing needs configuring first. Hover a task, in the agenda or in any note,
to get the actions popover.
The full documentation is in docs/:
Obsidian 1.10.0 or newer, desktop or mobile. The three terminal commands additionally need Obsidian 1.12.2, where the CLI gained plugin commands; capabilities newer than 1.10.0 are probed, so nothing breaks without them.
Everything works on its own. When the Periodic Calendar plugin is installed, Simple Tasks registers itself as one of its sources: every day is shaded by how much you closed in its note, so the calendar becomes a second heatmap in the sidebar you already have open, with the figures on hover — dots instead of the shading if you prefer them. The month, quarter and year buttons add up the notes of those periods too. It also accepts tasks dragged from the agenda onto a day, and gains a context-menu entry that opens the agenda for that day. Nothing is announced at startup when it is absent — details.
styles.css uses only Obsidian's CSS variables, so both views follow your theme
in light and dark mode. With the Style Settings plugin you also get controls
for the heatmap's colour, cell size, gap, density and roundness.
Issues and pull requests are welcome. Building needs pnpm and Node 22.18+:
pnpm install
pnpm dev # watch and rebuild
pnpm build # type-check and produce a production main.js
pnpm lint
pnpm test # domain unit tests, run by Node's own test runner
pnpm test needs no test framework: the domain/ modules import nothing from
obsidian at runtime, so node --test runs the TypeScript directly through
native type stripping — which is why relative imports carry an explicit .ts
extension. pnpm seed populates a scratch vault with realistic notes and
pnpm verify runs the real parser and serializer over every list line of it,
failing if one stops round-tripping byte-for-byte.
BRAT installs from a published release, which means a tag and a release for every
change you want to try. To run a local build instead, copy .env.local.example to
.env.local and name your vaults there — vault roots, not plugin folders:
VAULT_TEST=/Users/you/dev/my-obsidian-plugins
VAULT_REAL=/Users/you/Library/…/YourVault
VAULT_DEFAULT=TEST
Then:
pnpm dev # watch, reinstalling on every save
pnpm dev --vault=real # the same, in another vault
pnpm install:vault --vault=real # one production build, installed there
Each install copies main.js, manifest.json and styles.css into
<vault>/.obsidian/plugins/simple-tasks, plus the .hotreload marker that lets
Hot Reload reload the plugin without
restarting Obsidian. The plugin folder comes from the manifest id, so the same
.env.local works for every plugin you develop.
Two deliberate choices. pnpm build never writes to a vault — that is the CI
path, and installing only happens when you ask for it. And installs copy rather
than symlink, because a symlink would put this repo's node_modules and .git
inside a vault that iCloud, Dropbox or Syncthing is watching; if a vault already
reaches the repo through a symlink, the install is skipped instead.
Conventions for the codebase are in AGENTS.md.
MIT © Alex Ojeda Copa