Race-free claims
amt claim atomically leases the highest-priority open issue to one agent (BEGIN IMMEDIATE). Crashed agent? The lease expires and the issue becomes claimable again.
amt claim --agent worker-1 amt · one Rust binary · CLI + MCP server
Ametrite is a local-first issue tracker and wikilinked knowledge base for AI agent workflows. Think Linear + Obsidian in one SQLite file. No cloud, no accounts, no embeddings.
$ amt claim --agent worker-1
claimed AMT-1 in_progress urgent Fix login token refresh [bug] 🔒worker-1
# … agent does the work …
$ amt decide --issue AMT-1 --title "Rotate refresh tokens server-side"
recorded D-1 — Rotate refresh tokens server-side (resolves AMT-1)
$ amt release AMT-1 --agent worker-1 --status in_review \
-m "see [[Session Tokens]]"
released AMT-1 in_review urgent Fix login token refresh [bug]
$ amt doctor
workspace healthy ✓ Two agents can never claim the same issue. Leases are atomic.
Why Ametrite
Two agents working the same repo have no shared state: no backlog, no “who’s doing what”, no record of decisions already made. Ametrite gives every repo a shared workspace both humans and agents can read and write.
amt claim leases work atomically. No double-claims, everFeatures
Everything lives in .ametrite/ametrite.db: SQLite in WAL mode, written
only by the Rust engine. Git-ignored and branch-invariant: switch branches, same board.
amt claim atomically leases the highest-priority open issue to one agent (BEGIN IMMEDIATE). Crashed agent? The lease expires and the issue becomes claimable again.
amt claim --agent worker-1 Issue and note bodies are markdown with [[wikilinks]] and #tags, indexed into a bidirectional link graph with backlinks. Dangling links resolve when the target appears.
amt backlinks AMT-1 amt decide records an ADR-style decision against the issue it resolves: searchable, linkable, supersedable. The “why” is one backlink hop from the “what”.
amt decide --issue AMT-1 --title "…" SQLite FTS5 (BM25) + tags + link graph + structured filters. No vector DB, no API keys, no drift. Your knowledge base is greppable and exact.
amt search token --type note Every command takes --json; amt events --follow streams activity as NDJSON. Wire it into CI, cron, or a fleet of while-loops.
amt --json claim | jq .id The optional Bun web UI is a single kanban across every registered workspace, live-updating via SSE whenever any process writes: CLI, MCP agent, or another tab.
bun run web # :1776 The optional web UI
bun run web serves one kanban across every registered workspace. It
live-updates over SSE whenever any process writes, and it never touches the database
directly: reads are SQLite, mutations shell out to amt.
Real screenshots, not mockups: a demo workspace with two agents holding live claims, one recorded decision, and a note linked from the issue that cites it.
Built for agent fleets
amt mcp is a stdio MCP server exposing 23 tools: issues, claims, notes,
decisions, dependencies, search, context bundles, stats, events, git commits. Or skip
MCP entirely: every command speaks --json.
# register the MCP server
$ claude mcp add ametrite -- amt mcp
# the repo also ships a skill that teaches agents
# the claim loop, decision recording, and wikilink etiquette
$ ls .claude/skills/ametrite/ while id=$(amt --json claim --agent worker-1 | jq -r '.id // empty'); \
[ -n "$id" ]; do
amt context "$id" # issue + decisions + backlinked docs
# … do the work …
amt release "$id" --agent worker-1 --status in_review \
-m "done, see [[Session Tokens]]"
done Choose honestly
Every tool below is excellent at the job it was built for. None of them were built for the job Ametrite does: letting a fleet of concurrent agents share one repo’s backlog, knowledge, and decisions without stepping on each other. That one job is the whole product.
your second brain
Not either/or: amt export writes the workspace as an Obsidian-compatible vault, and amt import reads it back. Keep your brain; link the work.
where your team coordinates
These compose: humans coordinate in Linear, agents grind in amt, and the results arrive as pull requests.
the default
Markdown is genuinely fine until concurrency. That is the line, and it is a hard one.
mem0, Zep, RAG memory
amt never guesses. You trade semantic fuzz for exactness. Pair it with a RAG layer if you need both.
Install
Prebuilt for macOS (Intel + Apple Silicon), Linux x86_64, and Windows.
amt upgrade updates in place, delegating to whichever of these installed it.
brew install Davidb3l/tap/amt
# Recent brew versions refuse third-party taps until trusted;
# if brew asks, run `brew trust Davidb3l/tap` and re-run. curl --proto '=https' --tlsv1.2 -LsSf \
https://github.com/Davidb3l/Ametrite/releases/latest/download/amt-installer.sh | sh irm https://github.com/Davidb3l/Ametrite/releases/latest/download/amt-installer.ps1 | iex cargo install --git https://github.com/Davidb3l/Ametrite amt --locked $ amt init --name my-project --prefix AMT # creates .ametrite/ (git-ignores itself)
$ amt issue create --title "Fix login token refresh" --priority urgent --label bug
$ amt note create --title "Session Tokens" -b "Rotation affects [[AMT-1]]. #auth"
$ amt search token