Plans is a lightweight planning convention for AI-assisted projects. Markdown files, one command to set up, your AI assistant reads it automatically.
*_PLAN.md files at the repo root. Active, stale, and shipped all mixed together.
FEATURE_A_PLAN.md
FEATURE_B_PLAN.md (stale?)
FEATURE_C_PLAN.md (shipped?)
OLD_IDEA_PLAN.md (abandoned?)
NEW_PLAN.md (conflicts with B?)
Nobody knows.
Not a PM tool replacement. Operates at plan and phase level, not task level.
# MyProject: Project Status
*Last updated: 2026-05-06*
<!-- AUTO-GENERATED -->
## In flight
| Initiative | Status | Progress | ETA |
| ----------------- | ----------- | ----------- | ---------- |
| Dark Mode | In progress | Phase 2/3 | 2026-05-12 |
| Search Index | In progress | Phase 1/2 | 2026-05-09 |
## Up next
| Initiative | Depends on | Effort |
| ----------------- | ----------- | ------- |
| Theme Picker | Dark Mode | 1 week |
| Search autocomplete | Search index | 1 week |
<!-- END AUTO-GENERATED -->
## Recently shipped
| What | Shipped |
| ------------------ | ---------- |
| First-run onboarding | 2026-04-23 |
## Backlog
- Export to CSV
- Keyboard shortcuts
In flight, up next, shipped, backlog. One read. Two minutes. You know what's happening.
No re-explaining. It already knows what's in flight and which plan to update when you ship.
In flight, Up next, and Recently shipped are regenerated by /plans sync. You never update them manually.
curl -sSL https://raw.githubusercontent.com/yrangana/Plans/main/install.sh | bash
plans-init /path/to/your/project
plans-init and plans-update to ~/.local/bin/.plans/, adds it to .git/info/exclude, detects your AI instruction file and offers to append the planning snippet. Nothing happens without confirmation..bak.Frontmatter is machine-readable. The status banner is human-readable. If they disagree, frontmatter wins. Run /plans sync to catch disagreements automatically.
---
status: active
priority: P1
owner: yash
type: feature
depends_on: [AUTH_PLAN]
blocks: [DASHBOARD_PLAN]
last_updated: 2026-05-06
in_flight: true
---
Set in_flight: true when work starts. This drives the dashboard "In flight" vs "Up next" split.
## Status
- **Overall:** In progress, Phase 2 of 3
- **Phase 0 (Design):** Done (2026-04-28)
- **Phase 1 (Backend):** Done (2026-05-01)
- **Phase 2 (Frontend):** In progress
- **Phase 3 (Tests):** Not started
**Next action:** Wire up the API client.
**Last updated:** 2026-05-06
A guided command installed by plans-init. It asks five questions and writes a correctly structured plan file — correct frontmatter, correct banner template, correct filename.
SCREAMING_SNAKE_CASE.md)feature, bug, research, spike, or planCreated plans/active/AUTH_REFACTOR.md
Next steps:
1. Fill in Context, Goals, and Phases
2. Add a row to STATUS.md "Up next":
| AUTH_REFACTOR | feature | P1 | TBD |
3. Set in_flight: true when work starts
/plans sync won't flag it immediately.
Run it weekly. It reads all plan frontmatter, runs git log since last sync, finds every discrepancy, regenerates derived files, and shows you a diff. You confirm before anything is written.
Review and confirm:
Apply these changes? (y/n/select)
y apply all
n apply nothing
select choose per file
15-minute manual audit becomes a 2-minute review.
A static HTML file included in plans/. Reads plans.json directly. Open it with python -m http.server 8080 and share the URL with anyone.
Interactive timeline. Progress bars per phase. Shipped items in green. Today button auto-scrolls to the current date.
Which plans block which. Zoom, pan, reset. Visualises blockers before they become surprises.
Filter by status. Phase breakdown per plan. Next action shown inline. No markdown knowledge needed.
/plans sync regenerates plans.json, the dashboard reads it fresh on every open.
plans-init appends a snippet to your CLAUDE.md, AGENTS.md, or .cursorrules. The AI reads it at session start. No re-explaining required.
Read plans/STATUS.md at session start.
Active plans in plans/active/,
completed in plans/shipped/,
replaced in plans/superseded/.
Two-source rule: frontmatter and banner
must agree. Frontmatter wins on conflict.
Lifecycle:
- New idea: backlog bullet only
- Committed: run /plans new
- Work starts: set in_flight: true
- Done: mv active/ to shipped/
- Replaced: mv active/ to superseded/
Audit drift: /plans sync
Create a plan: /plans new
plans/ is pure markdown and JSON. Install skill to .claude/skills/ for Claude Code, .agents/skills/ for Antigravity. The data never changes.
curl -sSL https://raw.githubusercontent.com/yrangana/Plans/main/install.sh | bash
plans-init /path/to/your/project