O Ordna CLI · Web · Core MIT

A Kanban that lives inside your repo.

Ordna is a local-first, git-based task board you run from your terminal or your browser. No servers, no logins, no SaaS — just markdown files, plain commits, and an API your agents can drive.

$ npx @frehilm/ordna-cli ordna See what it does
~/MyProjects/TestCode · ordna
Ordna TUI — keyboard-driven Kanban in the terminal with sidebar of views, priorities and tags, three columns of tasks.
ordna board · 12 tasks · 3 columns
Ordna Web — same board in the browser with cards, tags, assignees, progress and contextual edit actions.
localhost:7421 · same .ordna/ files
Built for the way you actually work
markdown tasks works offline branches as boards TUI & Web your data, your repo agent-ready API
Why Ordna

A small tool with strong opinions.

Every feature traces back to one idea: your tasks should live next to the code they describe — versioned, reviewable, and editable by anyone (or anything) that can edit a file.

Git-native, by design

Every task is a markdown file. Every move is a commit. Use the merge tools you already have to resolve conflicts, blame to find who changed what, and branches to plan what-ifs.

diff --git a/.ordna/doing/T-006.md b/.ordna/done/T-006.md
- status: doing
+ status: done
+ closed_at: 2026-04-28T14:02Z
renamed: .ordna/doing/T-006.md.ordna/done/T-006.md

Local-first, no account required

Boards live in .ordna/ in your repo. There is no Ordna server. There is nothing to sign up for. It works on a plane, and it works in 2032.

.ordna/
├─ todo/     5 tasks
├─ doing/    3 tasks
├─ done/     4 tasks
├─ archived/ 0 tasks
└─ board.json  columns & settings

Two interfaces, one source

A keyboard-driven TUI for the terminal and a polished web UI for the browser. Both read and write the exact same files.

Your data, your laws

Plain markdown + JSON, committed alongside your code. Migrate, grep, script, or quit any time — there is nothing to export.

Built for keyboard speed

Every action — move, assign, create, filter, archive — is one or two keystrokes. Touch your mouse only when you want to.

Tags, priorities & views

Filter by #frontend, by @assignee, by priority, or by saved views. Combine and refine without leaving the keyboard.

Branch-aware boards

Different work on different branches stays on different branches. Merging brings the work with it — no duplicate tickets.

Embeddable core

Drop @frehilm/ordna-core into any Node project. Use it for dashboards, CI checks, scripts, or your own UI.

Install

Up and running in one command.

Pick your interface — terminal, browser, or both. They share the same on-disk format, so you can mix and match per project.

$ shell — @frehilm/ordna-cli
# Install globally — one binary, no daemons
$ npm install -g @frehilm/ordna-cli

# Or run without installing
$ npx @frehilm/ordna-cli ordna

# Open the keyboard-driven board in your repo
$ ordna

# Common commands
$ ordna add "Refund flow — partial amounts"
$ ordna move T-007 doing
$ ordna list --status review
$ ordna assign T-007 @fredrik

Three packages on npm

All MIT-licensed, all written in TypeScript, all share @frehilm/ordna-core under the hood.

@frehilm/ordna-cli
TUI & commands · the daily driver
npm ↗
@frehilm/ordna-web
Browser UI · zero-config local server
npm ↗
@frehilm/ordna-core
Library · read & write boards programmatically
npm ↗
Library · @frehilm/ordna-core

Use Ordna as a building block.

Everything the CLI and Web UI do, they do through the same public API. Embed it in dashboards, CI jobs, agent loops, or your own custom client.

A boring, durable API.

Promise-based, fully typed, no global state, no required runtime dependency apart from git. Open a board, list it, mutate it, save it. That's the whole shape.

01
openBoard(cwd) Locates .ordna/, validates schema, returns a typed board handle.
02
board.tasks() & board.columns() Stream the current state, filter by status, label, assignee, or branch.
03
board.add / move / update / archive Mutations write atomically to disk — every change is a clean diff.
04
board.commit(message) Stage and commit pending board changes through the user's existing git config.
05
board.watch(handler) Subscribe to filesystem events — perfect for live dashboards and agent feedback loops.
examples/standup-report.ts
import { openBoard } from "@frehilm/ordna-core";

// Read the board next to your code
const board = await openBoard(process.cwd());

// What did we ship since yesterday?
const shipped = await board.tasks({
  status: "done",
  closedAfter: subDays(new Date(), 1),
});

for (const task of shipped) {
  console.log(`✓ ${task.id} ${task.title}`);
}

// Mutations are just function calls
await board.add({
  title: "Schedule retro",
  status: "todo",
  tags: ["chore"],
});

await board.commit("chore: prep retro card");

Agents that pull their own work.

Because every task is a file and every state change is a commit, an agent can plan, claim, and finish work end-to-end — and you review it as a normal pull request.

See the agent recipe
agent loop● ready
1board.tasks({ status: "todo", tag: "agent" }) → pick T-011
2board.move("T-011", "doing") // claim
3// run tools, edit code, run tests
4board.comment("T-011", "draft PR opened")
5board.move("T-011", "done") // hand back
6board.commit("feat(mobile): expo shell")
Git, the way you know it

Reviewable boards, not magic dashboards.

Every plan, move, and decision shows up in git log. Pair work, blame, bisect — all of it just works.

commit a4f1e2c · ⎇ feat/streaks · chore(ordna): T-006 → done @fredrik · 2m ago
before — .ordna/doing/T-006.md
1---
2id: T-006
3title: Streak calculation engine
4-status: doing
5assignee: @fredrik
6tags: [backend, logic]
7-progress: 2/5
8---
9Compute streaks per user across timezones,
10handling DST and freeze tokens.
after — .ordna/done/T-006.md
1---
2id: T-006
3title: Streak calculation engine
4+status: done
5assignee: @fredrik
6tags: [backend, logic]
7+progress: 5/5
8+closed_at: 2026-04-28T14:02Z
9---
10Compute streaks per user across timezones,

Stop herding tabs. Commit your plan.

Ordna is small enough to learn in a coffee break, and stays out of your way for the next ten years.