Files
pastilhasandClaude Opus 5 6e54f223e6 Kanban — the todo board, extracted, over as many projects as you like
was `/todos` in the platform: a board, an API and a tree reader pointed at
`resolve(process.cwd(), 'todo')`. that is not a setting — it is the belief that
there is one project and it is the one the server happens to have been started in.

THE READER CAME ACROSS UNCHANGED except for that one line. the frontmatter parser
that never rewrites a body, the ordering, the index writer — all of it as it was,
and its 8 tests came too and still pass. everything that changed is that the
directory is now a parameter.

`writeIndex` no longer writes to `process.cwd()` either. that was the same
assumption wearing a different hat, and with two projects it would have had every
board overwriting one file. the map goes beside the folder it describes.

A PROJECT IS A NAME AND A PATH, and paths are confined to the owner's home by the
same three checks av-club uses — absolute, realpath BEFORE the containment test,
and `root` or `root + sep` rather than a bare startsWith. spelled out again rather
than cross-referenced, because the next person to add a path-taking route reads the
file they are in.

it stores NO ITEMS. one table, a list of folders. uninstalling with "delete its
data" ticked loses the list and never a line of anybody's work — which is the
property the markdown format was chosen for.

`/projects` is owner-only: pointing this at a directory is a statement about the
filesystem. moving a card is not, so a member granted `kanban` can work any board
they can see.

removing a project removes the ROW. the route says so in its response and the
button says so in its tooltip, because "delete" beside a folder full of somebody's
work should not be ambiguous.

README records the seam honestly: the platform keeps its own todo/ and its CLI, so
there are two copies of the reader and they will drift. the alternative was making
the platform's own backlog depend on a plugin being installed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 03:27:56 +01:00

1.7 KiB

Kanban

A board over a folder of markdown todo files — as many projects as you point it at.

Items are <theme>/<slug>.md with frontmatter and hand-written prose. The files are the truth. This plugin stores no copy of them: its one table is a list of folders, so uninstalling it with "delete its data" ticked loses the list and never a line of anybody's work.

Adding a project

The path is the folder that holds the theme directories — usually todo/, not the repository root. It must be absolute and inside your home; symlinks are resolved before that is checked.

What it does to your files

  • Writes frontmatter only — status, priority, due, order. The body is yours and no route here can touch it.
  • Regenerates TODO.md beside the folder on every write.
  • Never deletes anything. Removing a project removes the row.

Where it came from

/todos in the Officer platform, which read resolve(process.cwd(), 'todo') — one board, found by assuming the server's working directory. The reader, the ordering and the frontmatter handling came across unchanged, with their tests. What changed is that the directory is a setting.

The platform kept its own todo/ folder and scripts/todo-index.ts: that folder is its own backlog, committed with its own code, and the CLI regenerates the index from a terminal with no Officer running. Making the platform's own backlog depend on a plugin being installed would have been the wrong trade.

That leaves two copies of the tree reader — this one, generalised over a root, and the platform's, which serves only that CLI. They will drift. The alternative was worse in both directions, and the honest fix on the day it matters is to delete the platform's CLI and let this own the format outright.