Ecosystem

Cairn

A file-based project tracker with two interfaces. A CLI for automation and AI assistants. A milestone-centric web board for visual planning. No database, no cloud, no accounts.

cairn init
cairn add "Build the thing" --milestone "v1.0" --priority 1
cairn add "Ship it" --milestone "v1.0" --depends-on 1

cairn serve   # open http://localhost:3000

Features

Milestone board

Tasks organised by milestone in a visual board. Drag cards between milestones, reorder within columns, click to edit.

Computed blocking

Tasks declare dependencies. Blocked state is computed automatically. Complete a dependency and everything it blocked becomes actionable.

Two-tier tasks

Global tasks for trackable work. Locally scoped subtasks for decomposition. Promote subtasks to global tasks when they grow.

CLI-first

Every operation is a single command. Built for scripting, automation, and AI assistant integration.

Live reload

Change a task via CLI, see it update on the board instantly. SSE-based push notifications with targeted DOM patching.

Files, not a database

Everything is TOML files in a .cairn/ directory. Human-readable, version-controllable, editable with any text editor.

Dependency search

Autocomplete search for adding dependencies. Type a task title or #ID and pick from matching results.

Inline editing

Click any task on the board to open a detail panel. Edit every field, manage subtasks and dependencies, all without leaving the board.

Zero dependencies

A single Go binary. No database, no runtime, no package manager. Build and run.

Also includes

Priority sorting Product filtering Status filtering Milestone management Task promotion Activity log Dependency graph Keyboard shortcuts Document attachments

How it works

Cairn stores tasks as TOML files in a .cairn/ directory. Each task is a numbered directory containing a meta.toml file. The CLI and web board both read and write these files directly. No synchronisation layer, no conflict resolution — just files.

.cairn/
  cairn.toml              # global config + ID counter
  milestones.toml         # milestone definitions
  tasks/
    1/
      meta.toml           # task data
      tasks/
        1/meta.toml       # subtask 1/1
        2/meta.toml       # subtask 1/2
    2/
      meta.toml
    3/
      meta.toml