Projects + Issues, in sync
Every PRD becomes a Linear Project. Every ERD epic becomes a parent Issue. Every story becomes a child Issue with proper estimation. Auto-created on file write.
Stop manually creating Linear issues. fastpace's hook-driven event bus creates Projects, parent Issues, and child Issues in your Linear team the moment you author a PRD, ERD, or plan — and a 15-minute reconciler keeps state in sync via GraphQL.
Most Linear integrations are manual sync buttons. This one is an event bus — every artifact your team produces fires a hook, and the right thing happens in Linear without anyone clicking.
Every PRD becomes a Linear Project. Every ERD epic becomes a parent Issue. Every story becomes a child Issue with proper estimation. Auto-created on file write.
Manually moved an issue's state in Linear? Reassigned someone? The reconciler catches it via GraphQL and surfaces the divergence in your local dashboard.
Every push, every state transition, every drift lands in fastpace/audit.log. Linear becomes one provider on a hooks-driven event bus, not a black-box export.
No webhooks required, no public endpoint. fastpace pushes mutations on hook fire, polls Linear's GraphQL every 15 minutes. Local-first, async + retry.
Linear has no native "Initiative" type, so fastpace models the 3-level hierarchy as Project (initiative) → parent Issue (epic) → child Issue (story). Same shape as Jira; native to Linear.
fastpace/docs/prd/[slug].mdfastpace/docs/erd/[slug].mdfastpace/exec-plans/[slug].json (epics)fastpace/exec-plans/[slug].json (stories)fastpace/watch-cards/[slug].json
fastpace's hooks call into api.linear.app/graphql with a single auth header.
Toggle individual hooks via fastpace.config.yaml.
prd.writtenerd.writtenexecplan.writtenadr.writtenphase.changedpr.openedpr.mergedreview.completed
When a watch card moves phase, fastpace looks up the matching workflowState by name from your
team's configured states and posts an issueUpdate(stateId) mutation.
planning In Definition spec In Design write-tests In Progress implement In Progress run-tests In Review document In Review create-pr In Review push Done Every 15 minutes, the poller queries each linked Project via a GraphQL query that fetches Project state + all child issues. fastpace normalizes the response and compares to its expected state. Divergences show up in the local dashboard with a "Mark resolved" action.
Edit fastpace.config.yaml. The team_id is a UUID — easiest to grab via fastpace integrations test after step 3.
integrations:
provider: linear
hierarchy: initiative-epic-story
linear:
team_id: 11111111-2222-3333-...
team_key: ENG # cached for display Go to linear.app → Settings → API, create a personal API key, and save it to fastpace/.integrations.local.json (auto-gitignored, chmod 0600):
{
"linear_api_key": "lin_api_..."
} $ fastpace integrations test
✓ Connection ok. authenticated as Jordan Park
team: Engineering (ENG)
teams visible: 4 If you don't have team_id yet, the test output lists your visible teams — copy the UUID into the config.
Run /fp-write-prd in Claude Code. The PRD write fires prd.written → a Project is created in Linear automatically.
$ fastpace integrations list
✓ partial-refunds FP-100 phase=planning
! legacy-cleanup FP-87 1 drift phase=spec fastpace sync [slug] Re-runs artifact-write events. Without a slug, syncs every linked feature in your repo.
--push push only --pull reconcile only fastpace integrations status Shows team_id, hierarchy, hook on/off matrix, and whether your API key is configured.
fastpace integrations test Hits Linear's viewer { id name email } query to verify auth + lists visible teams.
fastpace integrations list Roll-up of every linked feature × Project identifier × phase × drift count.
Test-drive in a sandbox first; then edit one config block, paste one API key. The hooks do the rest.