The grammar
fredrin <noun> <verb> [options]
Both a noun and a verb are required, always. There are no flat verbs, because fredrin start is ambiguous the moment a second resource can be started.
Inside a ticket's worktree the wrapper is ./.fredrin/fredrin, and it already knows which ticket it is.
Tickets
fredrin tickets list [project]
fredrin tickets get <id|identifier>
fredrin tickets create '{"title":"…","description":"…"}'
fredrin tickets context <id>
fredrin tickets attach <id> <file>
tickets context is the interesting one: it returns the relevance-scoped project memory for a ticket, the concepts and decisions it actually touches, rather than the most recent N documents.
Creating a ticket accepts dependsOn, and the response echoes a per-reference result. A bad reference is skipped rather than fatal, so check the echo instead of assuming the edges landed.
Goals
fredrin goals list
fredrin goals create
fredrin goals assign <goal> <ticket>
fredrin goals ask <goal>
Notes
fredrin notes list
fredrin notes read <name>
fredrin notes write <name>
fredrin notes create|rename|move|delete
These reach the project's own notebook, not files in your repository. "Read my roadmap note" means this, not a grep.
Connectors
fredrin connectors list
fredrin connectors metrics
fredrin connectors revenue
fredrin connectors deploys
fredrin connectors uptime
fredrin connectors health
Read live third-party data through the connection that already exists. Do not mint your own provider keys. See connectors.
Terminals, servers and sessions
fredrin terminals new|list|read|send|split|layout|close
fredrin servers start|stop|list
fredrin sessions list|send|reap
These drive the desktop app's own panes, which is what lets an agent start your dev server, read its output, and act on it.
Browser
fredrin browser navigate|click|type|screenshot|text|console|eval
Drive a real browser to verify a change. Screenshots stay on disk unless you explicitly attach them to a ticket, which is the privacy gate working as designed.
Output
Everything is JSON. Pipe it into jq, or let an agent parse it. Nothing prints a human-formatted table that a script would then have to unpick.
Next steps
- REST API - the HTTP surface underneath.
- MCP server - the same board, for other agents.