TL;DR
- OpenSpec is a lightweight spec-driven development layer for AI coding assistants. It gives your team a repo-native place to capture proposals, behavior specs, technical design, tasks, and archived decisions.
- For existing projects, do not document the whole app first. OpenSpec’s own brownfield guide says to write specs only for the slice you are about to change.
- For new projects, use OpenSpec before the first implementation branch gets messy. The biggest win is agreeing on behavior, scope, and trade-offs before the AI assistant turns a vague idea into code.
- There are two places to type commands:
openspec ...runs in the terminal;/opsx:...runs in your AI assistant chat. - The default first loop is:
TERMINAL npm install -g @fission-ai/openspec@latest
TERMINAL cd your-project && openspec init
AI CHAT /opsx:explore # optional, when unclear
AI CHAT /opsx:propose ...
AI CHAT /opsx:apply
AI CHAT /opsx:archive
- My default recommendation:
- existing product: start with one small real change
- new product: start with one thin end-to-end capability
- unclear idea: start with
/opsx:explore - clear idea: start with
/opsx:propose
What You Will Learn Here
By the end of this article, you should be able to:
- explain what OpenSpec adds on top of normal AI coding chat
- install and initialize OpenSpec without confusing terminal commands and chat commands
- choose the right first workflow for an existing app vs a new app
- run a realistic first change, such as rate limiting or guest checkout
- understand what files OpenSpec creates and why they belong in git
- avoid the most common adoption mistakes for engineers and PMs
On July 1, 2026, I reviewed the current OpenSpec README and docs for installation, getting started, existing projects, workflows, supported tools, and customization. The command names, directory layout, delta-spec model, supported-tool behavior, and brownfield guidance below are source-backed. The rollout sequence and team operating advice are my synthesis for engineering and product teams.
For the broader comparison against GitHub Spec Kit, start with OpenSpec vs GitHub Spec Kit. This article is more hands-on: how to start using OpenSpec without turning it into a planning ceremony.
The Problem OpenSpec Solves
AI coding assistants are good at turning a prompt into code. That is useful, but it creates a new problem:
chat idea
-> generated code
-> reviewer asks "is this actually what we agreed to build?"
-> more chat
-> more code
-> intent disappears
OpenSpec adds a small layer between the idea and the code:
idea
-> proposal
-> behavior specs
-> design
-> tasks
-> implementation
-> archived spec history
That layer gives engineers something concrete to build against and gives PMs something concrete to review before implementation gets expensive.
OpenSpec’s own README frames the project as fluid, iterative, easy, and built for brownfield as well as greenfield work. In this article, when I call the workflow “lightweight,” I mean that relative to heavier phase-gated spec workflows: the source-backed part is that OpenSpec’s default core profile keeps the loop to explore, propose, apply, sync, and archive; the team-fit interpretation is my judgment.
The Mental Model
OpenSpec has two core directories:
openspec/
|-- specs/
| `-- <domain>/spec.md # current system behavior
`-- changes/
`-- <change-name>/
|-- proposal.md # why and what
|-- design.md # how
|-- tasks.md # implementation checklist
`-- specs/
`-- <domain>/spec.md # delta: ADDED/MODIFIED/REMOVED
The important idea is delta specs. A change does not need to describe the entire system. It describes what is being added, modified, or removed.
current behavior
+
change delta
=
updated behavior after archive
That is why OpenSpec is especially interesting for existing codebases. You can start with a nearly empty openspec/specs/ directory and let it become useful one real change at a time.
First Decision: Existing Project or New Project?
Use this quick decision flow:
Are you adding OpenSpec to an app that already exists?
|
|-- yes
| `-- pick one small real change
| use /opsx:explore if the code path is unclear
| write only the delta for the touched area
|
`-- no
`-- pick one thin end-to-end capability
use /opsx:propose to shape the first build
avoid designing every future feature upfront
Existing project default
Use OpenSpec to make one change safer:
"Add rate limiting to public API routes"
"Add guest checkout"
"Fix login redirect after SSO"
"Add audit log export"
Do not start with:
"Document our entire platform"
"Create specs for every service"
"Reverse-engineer every feature before we ship again"
Those sound responsible. In practice, they usually create stale specs nobody trusts.
New project default
Use OpenSpec to protect the first implementation from vague scope:
"Build a team bookmarks app with login, shared collections, and search"
Then scope the first real slice:
"Users can create a workspace, add one bookmark, and see it in a list"
That gives the AI assistant a small system to make real, while leaving room for future OpenSpec changes.
Install and Initialize
OpenSpec currently requires Node.js 20.19.0 or higher.
node --version
npm install -g @fission-ai/openspec@latest
openspec --version
Then initialize it inside your project:
cd your-project
openspec init
If you want a scripted setup for specific tools:
openspec init --tools cursor,claude
OpenSpec’s supported-tools docs also document --tools all, --tools none, and a --profile option. The default profile is core, which includes:
/opsx:explore/opsx:propose/opsx:apply/opsx:sync/opsx:archive
The expanded workflows add:
/opsx:new/opsx:continue/opsx:ff/opsx:verify/opsx:bulk-archive/opsx:onboard
Enable expanded workflows when you want more explicit control:
openspec config profile
openspec update
One technical caveat: generated skills and commands are profile-dependent and tool-dependent. A Cursor setup, a Claude Code setup, and a --tools none setup will not create the same files. Treat the paths in this article as representative examples, then check your generated directories before committing.
Do Not Mix Up Terminal Commands and Chat Commands
This is the most common early stumble.
TERMINAL commands
openspec init
openspec update
openspec list
openspec show <change>
openspec validate <change>
AI CHAT commands
/opsx:explore
/opsx:propose add-rate-limiting
/opsx:apply
/opsx:archive
There is no separate OpenSpec chat app. You type /opsx:... in the same AI coding assistant chat where you would normally ask for code.
Workflow 1: Add OpenSpec to an Existing Project
Scenario:
You maintain an existing API. You want to add rate limiting to public routes, but you are not sure where requests flow through the middleware stack.
Step 1: Initialize OpenSpec
cd api-service
openspec init --tools cursor
Commit the generated OpenSpec files and tool commands in the same branch where you introduce the workflow. If your repo has strict review rules, make this a small setup PR first.
Step 2: Explore before proposing
In AI chat:
/opsx:explore
Then give it the practical question:
I need to add rate limiting to public API routes.
Please inspect the routing and middleware flow first.
Do not write code yet.
Tell me where the clean insertion point is and what risks exist.
Expected output:
Request path:
edge proxy
-> Express app
-> request logging
-> auth middleware
-> route handlers
Candidate insertion points:
1. Before auth: protects auth endpoints too, but may rate-limit login incorrectly
2. After auth: user-aware limits, but public anonymous routes need IP fallback
3. Per-router middleware: more explicit, more repeated config
/opsx:explore creates no artifacts. That is the point. It is a thinking step before OpenSpec commits you to a change folder.
Step 3: Propose a small change
/opsx:propose add-public-api-rate-limiting
Ask for the scope you actually want:
Scope this as a small first change:
- Add IP-based rate limiting to unauthenticated public API routes
- Do not change authenticated user quotas yet
- Add a clear 429 response contract
- Include tests for normal, near-limit, and over-limit requests
OpenSpec should create something like:
openspec/changes/add-public-api-rate-limiting/
|-- proposal.md
|-- design.md
|-- tasks.md
`-- specs/api/spec.md
Step 4: Review the artifacts
For PMs, review proposal.md and the scenarios in the delta spec:
## ADDED Requirements
### Requirement: Public API Rate Limiting
The system SHALL limit unauthenticated public API requests by client IP.
#### Scenario: Over-limit request
- GIVEN an unauthenticated client has exceeded the request limit
- WHEN the client calls a public API route
- THEN the system returns HTTP 429
- AND the response includes retry guidance
For engineers, review design.md and tasks.md:
Does this match the actual middleware stack?
Does the 429 response contract match API conventions?
Are tests attached to behavior, not implementation details?
Is the rollout reversible?
Before moving to /opsx:apply, use a small review checklist:
Scope
[ ] Is this one logical change?
[ ] Are non-goals explicit?
Behavior
[ ] Does the delta spec describe user-visible behavior?
[ ] Are edge cases written as scenarios?
Implementation
[ ] Does design.md match the actual code path?
[ ] Are tasks small enough to review?
[ ] Is there a validation command or test plan?
Step 5: Apply, verify, and archive
/opsx:apply
If you use expanded workflows:
/opsx:verify
Then finish:
/opsx:archive
After archive, the delta spec becomes part of the main openspec/specs/api/spec.md behavior library, and the change moves under openspec/changes/archive/.
Workflow 2: Start a New Project with OpenSpec
Scenario:
You want to build a small internal tool for team bookmarks. Engineers want a clean first slice; PMs want to avoid building search, permissions, import/export, and analytics before the core behavior is proven.
Step 1: Create the project
mkdir team-bookmarks
cd team-bookmarks
git init
npm init -y
openspec init --tools cursor
If the app framework is not chosen yet, use /opsx:explore first:
/opsx:explore
Prompt:
We need a small internal team bookmarks app.
Compare a simple Astro + API route approach vs Next.js vs a lightweight Express backend.
Focus on what lets us ship the first authenticated bookmark flow fastest.
Do not create files yet.
Step 2: Propose the first thin slice
/opsx:propose team-bookmarks-mvp
Prompt:
Create the MVP spec for:
- A user can create one workspace
- A user can add a bookmark with title and URL
- A user can see bookmarks in a list
- No sharing, tags, import/export, or full-text search yet
- Keep the implementation small enough for one PR
The goal is not a perfect product plan. The goal is a first slice that teaches the team whether the architecture and workflow are working.
Step 3: Use artifacts as review surfaces
PM review:
proposal.md
-> is the MVP scope right?
specs/bookmarks/spec.md
-> are the user-visible behaviors correct?
tasks.md
-> is the PR small enough to review?
Engineering review:
design.md
-> is the stack choice explicit?
-> are persistence and auth boundaries clear?
tasks.md
-> can backend, UI, and tests run in parallel?
-> is there a validation path before archive?
Step 4: Apply and archive
/opsx:apply
/opsx:archive
Now the new project has both code and the first spec history. Future features become new OpenSpec changes:
add-tags
add-shared-workspaces
add-bookmark-search
add-import-from-browser-export
Each one can be scoped and reviewed separately.
Common Scenario Playbook
Scenario A: You have a bug but not a clear cause
Start with:
/opsx:explore
Use it like a diagnostic partner:
Users are sometimes redirected to the wrong page after login.
Trace the login callback and redirect logic.
Give me likely causes and the smallest change worth proposing.
Then:
/opsx:propose fix-login-redirect-after-auth
This avoids writing a spec for the wrong bug.
Scenario B: You have a clear feature request
Skip exploration if the scope is already clear:
/opsx:propose add-invoice-csv-export
Then review:
proposal.md -> scope and non-goals
spec.md -> export behavior and permissions
design.md -> query, format, and performance choices
tasks.md -> implementation checklist
Scenario C: You already have a PRD
Do not bulk-convert the whole PRD.
Use it as source material for the current change:
/opsx:explore
Prompt:
Here is the PRD section for guest checkout.
Extract only the requirements needed for the first implementation PR.
Identify open questions before we create an OpenSpec change.
Then:
/opsx:propose add-guest-checkout
Scenario D: You are in a monorepo
Start simple:
repo-root/
|-- apps/web/
|-- services/api/
|-- packages/ui/
`-- openspec/
Use domains that match how your team thinks:
openspec/specs/
|-- auth/spec.md
|-- checkout/spec.md
|-- search/spec.md
`-- admin/spec.md
For true multi-repo planning, OpenSpec has a beta Stores feature. I would treat that as promising but evolving, and start with one repo-level openspec/ directory unless the cross-repo need is real.
What to Put in openspec/config.yaml
OpenSpec project config is the easiest customization point for teams. Use it to teach the agent your stack and review rules.
schema: spec-driven
context: |
Tech stack: TypeScript, Astro, React islands, Tailwind CSS.
Deployment: Cloudflare Pages static output.
Testing: npm run build is required before article PRs.
Content convention: user-facing text lives in content/ when possible.
rules:
proposal:
- Include explicit non-goals.
- Identify affected user roles.
specs:
- Use Given/When/Then scenarios.
- Separate current behavior from proposed changes.
design:
- Mention rollback or migration risk when state changes.
tasks:
- Keep tasks small enough for one reviewer to verify.
Keep this config useful, not encyclopedic. The docs mention a 50KB context limit, but the practical limit is attention: the larger the context, the easier it is for important rules to disappear in noise.
What Engineers and PMs Should Review
PM REVIEW ENGINEERING REVIEW
--------- ------------------
proposal.md problem, scope, non-goals affected systems, rollout risk
spec.md behavior, scenarios, edge cases testability, current-vs-new behavior
design.md trade-offs in plain language architecture, dependencies, failure modes
tasks.md delivery shape and review size sequencing, parallel work, validation
archive decision history future maintenance context
The point is not to make PMs read implementation details or engineers rewrite product language. The point is to give each role a stable place to correct the part they own.
The First Week Adoption Plan
If I were adding OpenSpec to a real team, I would not start with a workshop.
I would do this:
Day 1
initialize OpenSpec in a small branch
add project config with minimal context
Day 2
pick one real upcoming change
run /opsx:explore if unclear
run /opsx:propose
Day 3
review proposal/spec/design/tasks with PM + engineer
remove overreach
clarify non-goals
Day 4
run /opsx:apply
adjust artifacts if implementation reveals reality was different
Day 5
verify if using expanded profile
archive
merge the change
write down what felt useful and what felt heavy
After that, decide whether OpenSpec belongs in:
- every product feature
- only risky features
- brownfield changes with unclear behavior
- onboarding and reverse-engineering work
- new-project scaffolding
Do not force it everywhere until the first few changes prove the habit.
Common Mistakes
Mistake 1: Backfilling the whole app
OpenSpec’s existing-project guide is direct: you do not document the whole codebase to start. You document what you are about to change.
Mistake 2: Treating /opsx:propose as implementation approval
Proposal means the change has a shape. It does not mean the scope is right. Review the artifacts before /opsx:apply.
Mistake 3: Archiving without syncing reality
If implementation discovers a different design, update the artifact before archive. Otherwise, openspec/specs/ becomes aspiration instead of behavior.
Mistake 4: Hiding specs from product
If PMs only see the final code diff, OpenSpec loses half its value. The spec exists so product feedback can land before code review becomes the only review surface.
Mistake 5: Over-customizing on day one
Start with project config. Reach for custom schemas after you have repeated evidence that the default artifacts do not match your team process.
How This Fits with the Previous Comparison Article
The previous article compared OpenSpec and GitHub Spec Kit side by side. The short version:
- OpenSpec is strong when you want living specs, delta changes, and fluid iteration.
- Spec Kit is strong when you want explicit gates, richer artifact bundles, and extension catalogs.
For this article’s use case - getting started in an existing codebase or a new app - OpenSpec’s advantage is its adoption curve. You can start small:
one repo
-> one change
-> one delta spec
-> one archived decision
That is enough to learn whether the workflow helps your team.
Sources
Primary sources reviewed on July 1, 2026:
- Fission AI, OpenSpec README - philosophy, quick start, Node requirement, default and expanded workflows, usage notes
- Fission AI, Installation - package managers, Node.js 20.19+ prerequisite, update behavior
- Fission AI, Getting Started - terminal vs AI chat commands, first loop, directory layout, artifact descriptions, delta spec archive behavior
- Fission AI, Using OpenSpec in an Existing Project - brownfield-first guidance, do not spec the whole codebase, first real change model, monorepo note
- Fission AI, Workflows - core profile, expanded workflows,
/opsx:explore,/opsx:verify, archive behavior, update-vs-new heuristic - Fission AI, Supported Tools - generated skills and commands, supported tool IDs, profile-dependent install behavior
- Fission AI, Customization -
openspec/config.yaml, context/rules injection, custom schemas, community schemas
Related reading on this site: