cowork-deck

A task board for Claude Code — markdown cards or GitHub issues

Cards in your repo, or the repository’s issues. Either way, ▶ turns one into a running session.

The board: configured columns of cards, each card carrying its kind and the arrows that move it, one card in the working step marked as having a session running on it.

Two sources, never both

Every workspace can have a board, and it reads from exactly one of two places. Picking one is a deliberate constraint: a board that merged markdown cards with GitHub issues would have two answers to “where does a new card go”.

Markdown cards in a folder

Cards are markdown files under .cowork/tasks/, or any folder you point at — a dedicated repository, an Obsidian vault, a directory already synced by something else. They are ordinary files: readable, diffable, and yours if you uninstall the app.

The steps and the card kinds live in a board.json beside them, so one project runs backlog / todo / doing / shipped and the next just open / done. Nothing about the column names is baked into the app.

Or the repository's own GitHub issues

Point the board at the repository instead and it reads the issues under that workspace's GitHub account, filtered by state and by label. Issues open as documents — the body rendered, the labels and the link to GitHub beside it — rather than as a modal with a text field in it.

▶ turns a card into a session

This is the part that makes it a board rather than a list. Press play on a card and cowork-deck starts a session with that card as its prompt. On a GitHub issue, ▶ goes further: a new branch, in a worktree of its own, so the session works beside your checkout rather than inside it. ✓ closes the issue, after asking.

“In progress” is derived, never stored

A card shows as being worked on because a live session is running on it — not because someone dragged it into a column. When the session ends, the marker goes with it.

This is the answer to the oldest failure of every board anyone has ever used: a column full of things nobody is doing, because moving a card out is a separate act of discipline that nobody performs. Here there is nothing to move.

Filing a card without leaving the deck

Cmd/Ctrl+Shift+T files a card from anywhere in the app. More interestingly, sessions file their own: a bundled cowork_task CLI is on the session's path, so an agent that notices something out of scope can write a ticket instead of either forgetting it or expanding the job it was given.

That is a small mechanism with a disproportionate effect on how a long session behaves. Scope creep is usually a side finding with nowhere to go.

Where the board opens

The board belongs to one repository, so it is not in the app's rail with the global things. It opens from that repository's own row, into a panel on the other side of the deck — and the deck never leaves the window.