OpenSpec × GitHub Issues

The issue is the spec.
The changelog is the spec history.

specsync projects your OpenSpec change specs into your issue tracker — automatically. Plan locally, sync once, collaborate everywhere. And when you ship, the changelog writes itself from the specs — in user language, never a commit dump.


How it works

Two flows. One source of truth.

Start from a local spec or an existing issue — specsync handles both directions and keeps them in sync as work progresses.

Spec-first

Write the plan, create the issue

Author proposal.md and tasks.md locally. Run specsync once — the GitHub issue appears, body and checklist intact. No branch, no pre-existing issue required.

# Write your spec mkdir -p openspec/changes/my-feature # ... edit proposal.md and tasks.md ... # Preview specsync -dry-run -slug my-feature # Create the issue specsync -slug my-feature created github.com/org/repo/issues/42

Issue-first

Pull an existing issue into a spec

When the issue already exists — created manually or via your backlog MCP — pull it. specsync materialises proposal.md and tasks.md from the issue body and caches the ref — the next push updates that same issue, never creates a duplicate.

# Pull issue #4083 into a local spec specsync pull -issue 4083 specsync: pulled issue 4083 -> openspec/changes/streamlined-modals/ + proposal.md + tasks.md # Refine locally, then push back specsync -slug streamlined-modals

Cross-repo

Link issues across repositories

Large features span multiple repos. Use -repo to target any repo, then specsync link to cross-reference both. Each issue gets a ## Related section pointing to the sibling — maintained automatically on every push.

# Create issues in two repos specsync -slug feature-api -repo org/api specsync -slug feature-ui # Cross-link them specsync link feature-api feature-ui linked feature-api <-> .../issues/89 linked feature-ui <-> .../issues/42 specsync link: 2 specs cross-linked

Everything a spec needs. Nothing it doesn't.

specsync is a small, focused binary. No config file, no daemon, no SDK dependency — just gh under the hood.

Auto-detect repo

Reads the git remote — no config required. Override with -repo owner/name for any other repo.

🔁

Idempotent

Re-run freely. An identity marker in the issue body prevents duplicates even if the ref cache is lost.

🧩

Tracker-agnostic

Not just GitHub. Project an OpenSpec change onto a Beads task graph with -provider beads — the WorkProvider interface keeps the tracker your choice.

🔗

Cross-repo linking

specsync link writes links.md and pushes a Related section to both issues automatically.

📥

Issue-first pull

Pull any existing issue into a local spec. The ref is cached so subsequent pushes update — never duplicate.

🔭

Planning scan

specsync scan shows what already exists for an area — in-flight changes, loose issues, recent commits — before you plan.

🧾

Release follow-up

specsync release-plan reconstructs what shipped, what's loose, and an advisory bump — using OpenSpec requirement deltas as a release signal no commit-only tool can see.

🤖

Agent-friendly

A bundled skill installs for Claude Code, Codex, OpenCode, Copilot, or any agentskills.io-compatible .agents directory.

🔍

Preview writes

sync, pull, and link support -dry-run. Read-only inspection commands need no preview mode.

🎯

Auto-lifecycle

stage:active while work remains; auto-flips to stage:complete when all tasks are checked. Optional -close-completed keeps the issue open/closed state aligned — completion closes it, new work reopens it.

🔀

Two-way reconcile

Checkboxes ticked in the GitHub issue merge back into your local tasks.md on the next sync — progress flows both ways, never lost in either direction.

🧵

Traceability

specsync trace reconstructs how a change, its issue, PRs, and commits connect — every link backed by evidence (markers, branches, commit footers), never guessed.

📋

Projects boards

Point -project owner/number at a GitHub Projects board: synced issues land on the board, Status follows the change lifecycle, and human curation is respected.

📜

Spec-driven changelog

specsync changelog writes a Keep a Changelog section from your shipped changes — one entry per change, release notes authored at planning time, never a raw commit dump.


Changelog

Recent releases

v0.7.0 Jul 14, 2026

Added

  • resolve refs live at release time, wire into release CI (d0578292)
  • render changelog from CHANGELOG.md, not the GitHub API (e2c18f8d)
Fixed

  • never let a failed build degrade committed content (9035465c)
  • stop reading bare #N in commit prose as issue evidence (aeee62a9)
<!-- 1 internal commit(s) omitted (chore/docs/ci/...) -->

v0.6.0 Jul 14, 2026
Features
  • spec-driven changelog — one entry per shipped change 1897530
Fixes
  • case-insensitive Status matching + CLI status-map wiring cc2bc11
  • readable release notes, spec-history hero, drop stale blocks 0349b06
  • guard legacy ref fallback against cross-repo clobber 64203a4
Other
  • record v0.5.1 verification 4cdd037
  • prepare standalone Cloudflare deployment b1ad4ca
  • Stabilize projection ref-cache key so sync never duplicates an issue (#35) a29de44
  • GitHub Projects (board) compatibility (#37) 51d6b83
  • Merge branch 'claude/jovial-noyce-5910b2': board Status case-insensitivity + -status-map CLI wiring b6d2cee
  • Merge branch 'claude/happy-wright-4358a5' d51514d
  • document changelog/board CLI surface, add CHANGELOG.md for v0.6.0 6b70891
v0.5.1 Jul 12, 2026
Fixes
  • complete lifecycle sync and harden npm install 2990406

Get started in one line

Requires Node 16+ for the installer. The binary itself has no runtime dependencies.

$ npm install -g @androidand/specsync

Or install with Go: go install github.com/androidand/specsync/cmd/specsync@latest
Full documentation on GitHub →