Kamil Rudnicki85 downloadsSee the tasks of every note in one table with saved views, filters, sorting and properties.
Tasks Table shows the tasks from every note in your vault in one table, in the style of Obsidian Bases. Tasks stay in their notes; the table reads them and writes your edits back to the Markdown.

- [ ] tasks in every note, also in callouts and numbered lists. Fenced code and front matter are skipped.📅 2026-11-02, ⏫) and the Dataview format ([due:: 2026-11-02], [priority:: high]).[ ], In progress [/], Later [>], Done [x] and Cancelled [-]. Later is a task put off for now: it stays open, so a past due date still shows as overdue, and the Open view leaves it out. Other checkbox symbols read as To do and keep their symbol.[key:: value] in your tasks, such as [projekt:: Website] or [estimate:: 3], is a property you can show as a column, filter by (is, is not, is empty, is not empty, with the values your tasks use) and sort by. Field columns start hidden. Fields with columns of their own (due, scheduled, start, created, completion, cancelled, priority) stay in those columns, and (key:: value) fields, which Dataview shows without their key, are not included. Neither are comments, which have a column of their own.[comment_2026-11-03 14:30:: Agent is running in codex://threads/01a1a0f1-…], so the Comments column shows which tasks an agent is on and opens its chat. The agent reads its chat's id from CODEX_THREAD_ID (ChatGPT) or CLAUDE_CODE_HOST_SESSION_ID (Claude). Claude's claude://code/continue?session=… link is the one the Claude app uses itself; Anthropic does not document it yet. The chat works in the folder from the settings; Claude asks you to confirm that folder each time. Neither app sends anything until you press Enter. The first time, Obsidian asks before it opens the codex:// or claude:// link; you can let it always open them.[comment_2026-11-01 14:30:: Called the vendor]. A new comment goes after the task text and its earlier comments, before its dates, where the Tasks plugin still reads them. Comments are not part of the task title or its tags, so editing the title or the tags keeps them. Links in comments open from the popup: web pages, Obsidian links, and agent chats, which show as ChatGPT or Claude.Open the table with the ribbon icon or the Tasks Table: Open table command. The plugin also adds Add task and Rebuild task index commands.
Settings → Tasks Table:
tasks-table.sqlite, in the plugin folder (<vault>/.obsidian/plugins/tasks-table/). It has a settings table with one name/value row per setting and a views table. It syncs with the rest of the vault's configuration.main.js contains sql.js's WebAssembly binary (SQLite), stored as base64 and decoded when the plugin loads. The sql.js loader also has code that downloads the .wasm file with fetch or XMLHttpRequest; the plugin never runs it, as it gives sql.js the bundled binary. Other fetch names in main.js are TanStack Query methods, not network requests.Requires Obsidian 1.13 or later, on desktop and mobile.
npm install
npm run dev # rebuild main.js and styles.css on every change
npm run build # type check and production build
npm test # unit tests (Vitest)
npm run lint # ESLint with the Obsidian rules
npm run test:e2e # build, then drive a real Obsidian through the main flows
npm run screenshot # build, then take docs/screenshot.png from a demo vault
npm run test:e2e starts a separate Obsidian (/Applications/Obsidian.app by default, override with OBSIDIAN_PATH) with a temporary profile and a generated fixture vault, so it never touches your own vaults. It copies the newest Obsidian app update from your profile, so the test runs the Obsidian version you use. It runs in the background: on macOS it starts Obsidian with open -g, and when Obsidian still takes the focus as it shows its window at start (Electron activates the app for each window it shows), it gives the focus back to the app you use within a moment. npm run e2e:open opens such an instance with a fixture vault and keeps it running (pass a vault path to use a copy of a vault instead; the plugin is installed into it; set E2E_FOCUS=1 to work in it by hand); PORT=9333 node e2e/cdp.mjs script.mjs runs a Playwright script against it. npm run screenshot starts Obsidian the same way, with the demo vault from e2e/fixtureVault.mjs in the light theme.
To try the plugin in a vault, copy or link main.js, manifest.json and styles.css to <vault>/.obsidian/plugins/tasks-table/.
src/main.ts: plugin lifecycle, commands and the view.src/plugin/: the composition root (PluginServices), the API the UI calls, the item view and the settings tab (Obsidian's declarative settings).src/database/: sql.js (SQLite compiled to WebAssembly, bundled into main.js), migrations, and the settings and views repositories.scripts/reactDomScripts.mjs: removes React DOM's script loading (ReactDOM.preinit() and hoisted <script> elements, which the plugin does not use) from the bundle, so main.js has no code that adds scripts to the page.src/vault/: task line syntax (taskLineSyntax.ts) and editing (taskLine.ts), the in-memory task index with its filters and sorting, the vault indexer and the writer that edits notes with Vault.process.src/ui/: the React UI with shadcn/ui (Base UI) and ReUI's data grid and filters, TanStack Table, Query and Store.The UI uses Tailwind CSS. Obsidian loads styles.css into the whole app, so scripts/scopeCss.mjs scopes every rule to the plugin's elements, removes cascade layers and prefixes keyframes, and src/ui/styles/obsidianReset.css drops Obsidian's global button and input styles inside the plugin. The design tokens in src/ui/styles/app.css map to Obsidian's CSS variables. src/ui/components/ui and src/ui/components/reui are generated by the shadcn and ReUI registries; keep changes to them minimal. They follow the same lint rules as the rest of the code, as the community plugin review scans all of the source.
Bump version in manifest.json and versions.json, then create a GitHub release whose tag is the version. The release workflow builds and attaches main.js, manifest.json and styles.css.