Skald
Track work from idea to release, in Markdown, in your repo, with your coding agents.
Skald turns a folder of Markdown files into a backlog that travels with your code. Capture an idea, plan it, hand it to an agent, answer the questions it raises, review the result, and ship it in a release, with every step recorded as a dated note in the story's own file. Agents drive it from a small CLI that fits in a session's context. You drive it from a local board that shows every project and worktree on the machine. There is no database and no service: one dependency-free Python package, and git is the history.
.skald/
├── config.json # project name, story format version, columns (committed)
├── AGENTS.md # what an agent needs to know, written by `init` (committed)
├── stories/ # one Markdown file per story (committed)
│ └── a3f9c2-implement-wireguard-overlay.md
└── archive/ # stories shipped in a release, moved out of the way
Stories are committed with the code they describe, so the board travels with the branch and shows up in pull request diffs.
| An agent's session: claim, resume, hand off, move, and see the diff. | The same story on the board: dependencies, acceptance criteria, notes. |
What you get
- A workflow agents can follow.
contextorients a session in one block,nextandclaimpick work without stepping on other agents,resumereads what the last session left behind, notes carry kinds such asdecisionandhandoff, and acceptance checklists gate the move to done. The contract is one Markdown file thatinitwrites for you. - A board for the human. Every registered project in one page, live updates, drag, multi-select, dependency graph, the working tree of every worktree on the machine, read-only views of other branches, dark mode, and a Help panel with the full CLI reference.
- Git as the database. Story changes commit with the code they describe
and carry
Skald-Storytrailers.diff,activity, andchangelogread history back;rendercommits a snapshot GitHub shows in place;releaseturns the done column into a changelog section and a versioned archive. - More than one repository. A machine-local index gives you one board
and
project:iddependencies across every repository you use Skald in. - Nothing to run. Python standard library only, Python 3.9 or newer, Linux, macOS, and Windows. Tab completion for bash, zsh, and fish.
Is Skald the right tool?
Several projects keep a tracker inside the repository. They make different trade-offs, so this table is about focus rather than ranking. Checked against each project's README in September 2026; follow the links for current detail.
| Skald | Backlog.md | Beads | git-bug | git-issue | |
|---|---|---|---|---|---|
| Data lives in | Markdown files under .skald/, committed |
Markdown files under backlog/, committed |
Dolt database under .beads/, with a JSONL export |
Git objects, not files in the worktree | Text files under .issues/, committed |
| Unit of work | Story: column, rank, dependencies, tags, dated notes | Task: status, acceptance criteria, dependencies, labels, milestones | Issue: status, priority, assignee, dependencies, labels, hierarchy | Issue with comments, labels, status | Issue with comments, tags, assignee, milestone, due date |
| Built for | Coding agents first, humans reviewing on a board | Humans and agents together | Agents, with memory decay of closed work | Humans, distributed and offline-first | Humans, git-native |
| Agent interface | CLI, MCP server, Claude Code hooks and skill, AGENTS.md |
CLI, MCP server, AGENTS.md |
CLI with JSON output, MCP server, AGENTS.md |
CLI | CLI |
| Human interface | Local web board across all projects on the machine | Terminal board and local web board | CLI | CLI, TUI, web UI | CLI |
| More than one repository | Yes: one board, project:id references |
One project per workspace | Separate repos with routing and sync | Per repository, pushed to remotes | Per repository |
| Work in progress across worktrees | Board shows each checkout's working tree; a claim in a worktree is seen before it is committed | Files per checkout; the MCP server follows the current worktree | Not documented | Shared: issues are git objects, not files | Files per checkout |
| Committed snapshot | skald render writes Markdown or HTML with a dependency graph |
backlog board export writes a Markdown report |
No | No | No |
| Sync with hosted trackers | No | No | No | Bridges to GitHub and GitLab | Import and export with GitHub and GitLab |
| Runtime | Python, standard library only | TypeScript on Bun or Node | Go | Go | Shell, jq, curl |
Skald is a good fit when agents do most of the work, a human wants to see that work on one board across repositories, and the backlog should read well in a pull request diff. Reach for something else when you want threaded discussion on issues (git-bug, or the hosted tracker you already use), a long history that needs summarising to save context (Beads), or two-way sync with GitHub issues (git-bug, git-issue).
Install
pip install skald-kanban
# or: pipx install skald-kanban
# or: uv tool install skald-kanban
# latest from source: pip install git+https://github.com/Vitund-AI/skald.git
cd your-repo
skald init
The distribution name is skald-kanban; the command is skald, and git skald works too. init creates .skald/, writes the agent contract, registers the
project on your machine, and points your CLAUDE.md or AGENTS.md at the
contract. Shell completion is one line in your rc file:
eval "$(skald completion zsh)" # or bash; fish: skald completion fish > ~/.config/fish/completions/skald.fish
Quick start
skald new "Implement WireGuard overlay" --tags infra --body "Configure wg0 on every node."
skald new "Write the network docs" --status ready --blocked-by a3f9c2
skald ls
skald open # starts the board server if needed and opens this project
An agent's session looks like this:
skald context --as claude # mine, next, blockers, claims elsewhere, uncommitted
skald claim a3f9c2 --as claude # assign it and move it to in_progress
skald resume a3f9c2 # requirements, checklist, deps, latest handoff
skald note a3f9c2 "Why we chose X" --as claude --kind decision
skald note a3f9c2 "Done: ... Remaining: ... Next: ..." --as claude --kind handoff
skald move a3f9c2 review
git add .skald src && git commit --trailer "Skald-Story: a3f9c2"
For Claude Code, skald hooks claude --install --as claude adds a
SessionStart hook that runs skald context so every session begins
oriented without reading the whole backlog, a Stop hook that refuses to end
with a broken backlog, and a skill that loads the contract. Agents without a
shell can use skald mcp.
Documentation
| Page | Read it when |
|---|---|
| Getting started | You are installing Skald or adding it to a repository. |
| Working with agents | You want to know what the contract asks for and why, and how to hook Claude Code or any MCP client up to it. |
| The board | You want every board feature in one place. |
| Stories | You want the file format, the design-record layout for long stories, columns and roles, facets and epics, templates, archiving, and releases. |
| Git and CI | You want commit trailers, reviewing what changed, the committed snapshot, hooks, the GitHub workflow, and the release flow. |
| Multiple projects | You have more than one repository, or more than one checkout of one. |
| Importing | You have an existing folder of Markdown records to bring in. |
| CLI reference | You need the exact flags. Generated from the parser. |
| HTTP API | You are scripting against the board server. |
| Troubleshooting | Something printed an error or looks wrong. |
| Examples | Worked setups on top of the core: routing stories to model-pinned agents by tag, with a report on what each model finished. |
The design is in SPEC.md and the reasoning behind non-obvious choices in DECISIONS.md.
Development
pip install -e .
python -m unittest # standard library only
skald serve # run against this repository's own backlog
skald docs # regenerate docs/cli.md after changing a command
This repository dogfoods Skald: its own backlog is in .skald/, and the
board rendered from it is at .skald/README.md.
License
MIT. See LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file skald_kanban-0.5.0.tar.gz.
File metadata
- Download URL: skald_kanban-0.5.0.tar.gz
- Upload date:
- Size: 161.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e2e37f094a921ff9d92efa1aea6a0d1bd17170d5004a19811daef304e13a461c
|
|
| MD5 |
357059b67462b1dd8c096dd87c9900d3
|
|
| BLAKE2b-256 |
d911757d056951db135c1cbccc58a4a9ec98de54b1a6d55a4111928a2f19c05a
|
Provenance
The following attestation bundles were made for skald_kanban-0.5.0.tar.gz:
Publisher:
publish.yml on Vitund-AI/skald
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
skald_kanban-0.5.0.tar.gz -
Subject digest:
e2e37f094a921ff9d92efa1aea6a0d1bd17170d5004a19811daef304e13a461c - Sigstore transparency entry: 2803506575
- Sigstore integration time:
-
Permalink:
Vitund-AI/skald@c0c8d9362b036c72a3a70c65bf4e803302c2e145 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/Vitund-AI
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c0c8d9362b036c72a3a70c65bf4e803302c2e145 -
Trigger Event:
push
-
Statement type:
File details
Details for the file skald_kanban-0.5.0-py3-none-any.whl.
File metadata
- Download URL: skald_kanban-0.5.0-py3-none-any.whl
- Upload date:
- Size: 127.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
076a1bcb96376ce962af962425df91eb09de5730f42e68461a0cdddb813e1b9a
|
|
| MD5 |
51db3d22704a191ed57b39f6c34f2feb
|
|
| BLAKE2b-256 |
45a899d0f10bbe12eba4ad55b66a5c04e976c3df8d1321190be41d66b998df89
|
Provenance
The following attestation bundles were made for skald_kanban-0.5.0-py3-none-any.whl:
Publisher:
publish.yml on Vitund-AI/skald
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
skald_kanban-0.5.0-py3-none-any.whl -
Subject digest:
076a1bcb96376ce962af962425df91eb09de5730f42e68461a0cdddb813e1b9a - Sigstore transparency entry: 2803506652
- Sigstore integration time:
-
Permalink:
Vitund-AI/skald@c0c8d9362b036c72a3a70c65bf4e803302c2e145 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/Vitund-AI
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c0c8d9362b036c72a3a70c65bf4e803302c2e145 -
Trigger Event:
push
-
Statement type: