D98 downloadsA native-feeling list/to-do extension for Obsidian for those who dont want to be using pure markdown for everything.
A native-feeling list/to-do extension for Obsidian for those who dont want to be using pure markdown for everything. Born out of my fustration for Reminder Apps/Todo List apps that are not syncable, easy to use or ergonomic. (honestly, how the hell do we have AI but no reliably decent way to do lists/todos)
The extension uses a folder of markdown files. One file is a list. One line is a task. There is no database, no index and no cache — open any of these files in the editor and you are looking at exactly what the plugin is looking at.
For context I dog-food this extension as I am all in on it. I do try to test and squash bugs as much as I can and improve the extensions as much as I can but feedback and help is always appreciated to try make this the best example of how lists/todos should be done!
.md files is your lists. Add a file, get a list.💼Work.md) or set from the list menu; both are stored in the
file's frontmatter.my-work-list.md into "My work list" for display, without
touching the filename. Toggleable if you want the true name.🔁 every week. Ticking one writes the next occurrence.✅ 2026-08-26T14:32.Cmd/Ctrl+Z inside a List Vibes view walks back the last fifty
changes it made, because a view is not an editor and Obsidian's own undo
cannot reach a file that is open nowhere.A ## heading is a group, and groups are a real part of the file rather than a
view over it.
groups: hidden on a list, or the setting for all of
them. The list goes flat and each row carries its heading as a badge, so
where a task lives is shown rather than lost.Open List Vibes · Open My Day · Open a list in a new tab · Add a task ·
Add a task to My Day · Undo last change
The decisions underneath — why files are edited one line at a time, why undo is the plugin's own, why every colour comes from your theme, and why there are no runtime dependencies — are in DESIGN.md.
List settings live in YAML frontmatter. Task metadata lives inline, because it has to fit on one line.
---
icon: 💼
sort: manual
showCompleted: collapsed
groups: shown
---
- [ ] Take screenshots for review
- [ ] Write update to review ☀️ ⏰ 11:00 📅 2026-08-24 ➕ 2021-01-08 ⏫
- [x] take screenshots
- [ ] crop and prep screenshots
Remember the product entry needs the new pricing table.
- [x] Draft the outline ✅ 2026-08-20
| Field | Written as | Standard |
|---|---|---|
| Due | 📅 2026-08-24 |
Obsidian Tasks |
| Scheduled | ⏳ 2026-08-24 |
Obsidian Tasks |
| Repeat | 🔁 every week |
Obsidian Tasks |
| Important | ⏫ / 🔺 |
Obsidian Tasks |
| Created | ➕ 2021-01-08 |
Obsidian Tasks |
| Completed | [x] + ✅ 2026-08-20 |
Obsidian Tasks |
| Steps | nested - [ ] |
plain markdown |
| Note | indented text under the task | plain markdown |
| My Day | ☀️ |
this plugin |
| Reminder | ⏰ 11:00 |
this plugin |
Most of that is the Obsidian Tasks emoji dialect, so existing vaults parse with
no migration and the files stay readable by the Tasks plugin, TaskForge and
Finalist. Dataview inline fields ([due:: 2026-08-24]) are always parsed too;
the setting only controls which format gets written, so switching it never breaks
anything already on disk.
An emoji at the start of a filename (📺Movies & TV.md) is used as the list icon
and removed from the display name.
## headings are groups. Nothing else is written for them — a group is the
heading, so renaming one rewrites that line and moving one moves the block
beneath it. Which group a task is in is decided by where its line sits, not by
anything recorded on the task.
Two things that look like groups are not, and are never written to the file: the Starred band and Completed. Both are views over whatever happens to be starred or done, which is why a task shown in either carries the name of the group it came from.
Colour and layout are written to the list's frontmatter. That write goes through
our own single-key editor rather than Obsidian's processFrontMatter, which
round-trips the whole block through a YAML parser and can reorder keys — these
files are yours, and one of them is a Kanban board whose plugin reads its own
frontmatter back. Only the line being set is ever touched.
Default lists/, configurable.
Do not use a dot-prefixed folder like .lists/.
npm install
npm run dev # watch build
npm run build # typecheck + production build
npm test # 540 tests: parsing, groups, sorting, merges, undo, writes
npm run test:ui # drives drags, groups, renames, titles and mobile typing
npm run shot # renders every pane to harness/shot-{light,dark}.png
One-off install into a vault:
./install.sh "/path/to/your/vault"
Then in Obsidian: Settings → Community plugins → enable List Vibes. On a fresh vault you have to turn off Restricted mode first.
For an actual dev loop, build straight into the vault instead:
npm run dev:vault -- "/path/to/your/vault"
esbuild watches src/ and writes main.js, manifest.json and styles.css
into <vault>/.obsidian/plugins/list-vibes/ on every save. Only those three
files land in the vault; the repo stays outside it so node_modules is never
somewhere Obsidian would try to index.
It also drops a .hotreload marker in the plugin folder. Install the
Hot Reload community plugin (pjeby/hot-reload) and Obsidian will pick up
each rebuild without a restart. Without it, toggle the plugin off and on in
settings after a change.
For mobile, app.emulateMobile(true) in the desktop console (Ctrl/Cmd+Shift+I)
renders the real WorkspaceMobileDrawer, which exercises the same code path the
phone uses. To get it onto an actual phone you need the built files inside the
vault's .obsidian/plugins/list-vibes/ and that folder syncing to the device —
note that Obsidian Sync excludes plugin files unless you explicitly enable it.
This app is co-created with AI and has been vibe coded.
MIT
Desktop, tablet and phone. One view, one codebase: the layout collapses from three panes to two to one as the space runs out, and the task detail docks in Obsidian's right panel or opens as a drawer, whichever the device has.
Captured from List Vibes 0.11.0 — desktop on macOS, phone on Android, both running the demo vault.