The manual
Everything the product answers without a support ticket: how work docks, how it is found, how it is charted, and how your agents drive it.
Getting started
Register and sneck charts your first org in the wizard: name it, invite the crew, and the board opens with sample data already docked - real columns, real issues, nothing to configure before you can feel the product. The sample data removes itself in one click when real work arrives (Remove sample data in the board's first-run strip - the marker is honest, a reserved label OR the sample project, so editing the seeded issues never blinds it).
The + in the topbar (or the c key)
opens the composer: every option settable at create - status,
priority, assignee, team, project, cycle, estimate, labels, due
date, and the template picker. It stays open across creates for
rapid entry.
Importers bring the past along: Jira and Linear exports land through the import page, preserving titles, descriptions, labels, and status.
The query grammar
One query language runs the search box, the filters, the saved
views, and the API: fq. Type it by hand or compose
it with the Filters dropdowns - both write the same query, and
the URL carries it.
| key | aliases | values | comparators | compiles to |
|---|---|---|---|---|
assignee |
assignees |
me, none or a member's name, email, or uuid
|
= |
assignees |
blocked |
- |
`true` or `false`
blocked = any unresolved blocked-by dependency (done and canceled resolve)
|
= |
dependency set (informational - never blocks) |
component |
components |
component name or uuid
resolved via context; a name matching several projects' components matches them all
|
= |
components (as uuids) |
cycle |
- |
current or a cycle's name or uuid
|
= |
cycle_id |
due |
- |
a date (2026-10-31), `overdue`, or `week`
the date literals resolve at apply time (today's clock)
|
= |
due_date (the overdue/week literals expand) |
estimate |
- |
0, 1, 2, 3, 5, 8, 13, 21, 40
the closed scale
|
= != > >= < <= |
estimates (eq) / estimate_min + estimate_max (ranges) |
has |
- |
assignee, label, project
|
= |
any-label / any-assignee sets; has:project errors |
is |
- |
active, backlog, done
sugar for status (active = todo,in_progress)
|
= |
statuses (expanded at parse time) |
label |
labels |
label names
resolved against your org's labels
|
= |
labels (as uuids) |
priority |
priorities |
0, 1, 2, 3
integers 0..3 (0 none .. 3 urgent)
|
= != > >= < <= |
priorities (comparators expand to ranges) |
project |
- |
project name or uuid
one project per query (the slot is a scalar)
|
= |
project_id |
status |
statuses |
backlog, todo, in_progress, done, canceled
case-insensitive
|
= |
statuses |
team |
- |
team name, key, or uuid
several teams OR (repeat the key or comma-join)
|
= |
teams (uuids, ANY-of) |
type |
types |
story, bug, task, epic
case-insensitive
|
= |
types |
version |
- |
version name or uuid
the fix version (released or not)
|
= |
fix_version_id |
<field_key> |
- |
any ACTIVE custom field key (risk, tags…)
per type: option, string, integer, YYYY-MM-DD
|
= (all); number fields also take > >= < <= |
custom_fields (per-type clause) |
Refs and prefixes
Issues wear human refs, not bare numbers:
PREFIX-NUMBER. Each team can carry its own prefix
(the Jira-project pattern) - ENG-7 and
SNECK-7 are different issues in the same org, each
numbering its own scope from 1. Move an issue between teams and
it is renumbered into the destination scope; refs are
scope-stable, not row-stable.
Every surface speaks the full ref: URLs, deep-links, mentions,
and commit-message references (Fixes ENG-7 links the
issue from a connected forge). Bare numbers are retired -
under per-scope sequences they name no one issue.
Sprints (cycles)
Cycles are sneck's sprints: fixed boxes per team, one active at a time, with a carry-over policy that runs at close - none leaves unfinished work in the closed box, carry moves it into the next cycle (opening one for it), backlog returns it to the backlog with status kept.
The cadence can run itself: recurring mode opens the next box back-to-back when one closes, whatever the policy does with the issues - the boxes keep a rhythm; the policy governs the cargo. The cycle pages chart burn-up and burn-down from the same honest trail, and each team's rolling velocity rides the work page.
Agents and MCP
sneck is agent-native: an MCP server (the same one this tracker's
own backlog is worked through) exposes the verb set - create,
update, comment, label, cycle, project, and time-logging among
them - addressed by full refs. Mint a scoped token at
/settings/mcp: read-only tokens observe, write
tokens file lanes.
The machine-readable contract is llms.txt - the same verb list, drift-checked by the test suite.
Keyboard
The work surfaces are keyboard-first - the same inventory the
in-app ? overlay shows:
Global
Command palette
Triage
List
Issue cards
Overlays
Webhook events
Outbound webhooks subscribe to the event catalog - rendered here from the same source the receivers validate against:
| event | when it fires |
|---|---|
| issue | |
issue.created |
an issue is created |
issue.updated |
any issue field edit (estimate rides this) |
issue.status_changed |
a status transition (rides on top of issue.updated) |
issue.deleted |
an issue is hard-deleted (archive is the default exit) |
issue.archived |
an issue leaves the working set (opt-in subscription) |
issue.unarchived |
an issue returns to the working set |
issue.cloned |
a clone is created from a source issue |
issue.merged |
a duplicate is merged away (fires on both rows) |
| comment | |
comment.created |
a comment is posted |
comment.updated |
a comment's body is edited (mentions never re-fire on edits) |
comment.deleted |
a comment is deleted |
| doc_comment | |
doc_comment.created |
a comment is posted on a doc |
doc_comment.updated |
a doc comment's body is edited (mentions never re-fire on edits) |
doc_comment.deleted |
a doc comment is deleted |
| project | |
project.created |
a project is created |
project.updated |
any project edit |
project.deleted |
a project is hard-deleted (its issues survive unprojected) |
| project_update | |
project_update.created |
a status post / health report lands on a project |
project_update.deleted |
a status post is deleted |
| cycle | |
cycle.started |
a team's next cycle opens (manual or the carry policy) |
cycle.closed |
a cycle is closed (unfinished cargo returns to the dock) |
| member | |
member.invited |
an invite is issued or superseded (never the token) |
member.joined |
an invite is accepted |
| label | |
label.created |
a label is created |
| digest | |
digest.ready |
the periodic org summary |