No database, no SaaS, no login!
The issue tracker your coding agents already know how to use.
Project management that lives in your repo as folders and markdown files. No databases, no apps, no syncing — just git and a text editor. Humans and AI agents work from the same files, so nothing falls out of sync when you switch tools, add teammates, or hand work to an agent. A task's status is which folder it's in:
docs/tasks/backlog/ Planned, not started
docs/tasks/next/ Queued for current sprint
docs/tasks/doing/ In progress
docs/tasks/blocked/ Not fully defined yet
docs/tasks/review/ Done, awaiting approval
docs/tasks/done/ Shipped
AI coding tools have their own task tracking — /goal, /plan, task lists, loops. These are session-scoped: they exist inside one conversation and vanish when it ends. That works for staying focused within a session, but it's not project management. Rename a variable across three files and the context is gone. Come back tomorrow and there's no trail.
Files in your repo survive sessions, tools, and people. A task in docs/tasks/doing/ is visible to every AI agent, every IDE, every teammate, and every git log — without anyone needing to be in the right conversation at the right time. More importantly, it's in the source code. If project state lives in someone's session or loop, the rest of the team can't see it — they can't participate in planning, can't pick up where someone left off, and can't review what's in flight. Agentic loops have the same problem: a loop can poll, retry, and iterate, but it's still anchored to a single session. When the loop ends, the work it tracked disappears unless something was written down.
Files checked into the repo are the one communication layer that every tool, every person, and every agent already knows how to read. As distributed agents become more common, file-based project state becomes a shared coordination surface — multiple agents working on the same codebase can read the board, claim tasks, and leave progress behind without needing to share a session.
Session tools and loops are useful within a work session. Files are how the work persists between them. sprint.md is the second part.
cd sprint.md
./setup.sh
# enter your project path when promptedThis creates the folder structure, CLI, templates, and docs in your project. You now have ./sprint.sh and a docs/ folder ready to go.
./sprint.sh profile
./sprint.sh -g profile # optional: Grok Build for this run (-c = Claude Code)An AI-guided interview about your stack, conventions, and goals. The answers are saved to docs/sprintmd/project.md so every command that follows already knows what you're building and how. Default AI provider comes from setup / docs/sprintmd/config; leading -g / -c override for one run.
./sprint.sh newfeature # AI-guided Q&A — builds a complete spec through conversation
./sprint.sh newfeature "User authentication" # quick mode — creates a template you fill in yourselfWithout a name, newfeature starts an interactive session that asks about users, requirements, and success criteria, then writes a complete feature spec to docs/features/. With a name, it creates a blank template for you to fill in manually. Features describe what the system does — they're the big picture that tasks break down into.
./sprint.sh newtask "Add login endpoint"
./sprint.sh newtask "Set up Stripe integration"
./sprint.sh newtask "Write auth middleware"Tasks land in docs/tasks/backlog/ with an auto-assigned ID, each built from a battle-tested template with prompts for success criteria, dependencies, and scope. Also: ./sprint.sh newbug "description" and ./sprint.sh newidea "description".
Bug reports live in docs/bugs/ as a triage inbox. ./sprint.sh chat bugs sorts them: [w] work it converts a report into a filled fix task and deletes the bug file; close/kill also remove the report. Prefer newtask when the fix is already clear work.
Move tasks through folders as you work. The folder a task is in is its status.
Always: git mv SRC DEST || mv SRC DEST — try git mv first; when it fails
(usual for new tasks not yet committed), finish with plain mv and continue.
# Queue a task for your current sprint
git mv docs/tasks/backlog/1-add-login-endpoint.md docs/tasks/next/ \
|| mv docs/tasks/backlog/1-add-login-endpoint.md docs/tasks/next/
# Start working on it
git mv docs/tasks/next/1-add-login-endpoint.md docs/tasks/doing/ \
|| mv docs/tasks/next/1-add-login-endpoint.md docs/tasks/doing/
# Finished — send to review
git mv docs/tasks/doing/1-add-login-endpoint.md docs/tasks/review/ \
|| mv docs/tasks/doing/1-add-login-endpoint.md docs/tasks/review/
# Approved — done
git mv docs/tasks/review/1-add-login-endpoint.md docs/tasks/done/ \
|| mv docs/tasks/review/1-add-login-endpoint.md docs/tasks/done/Check where things stand at any time:
./sprint.sh statusFor the full workflow reference — task format, feature specs, bug reports, and conventions — see DOCUMENTATION.md.
Once you have tasks in your backlog, AI can help plan, validate, and execute them.
Happy path (spine): chat → plan start → work → polish. loop is that spine on autopilot; gate / split are off-spine. Help groups: create · chat · plan · work · look · keep (./sprint.sh help).
# Author a plan, then commit its members into next/
./sprint.sh newplan "Theme" 12 13
./sprint.sh chat plan <id> # author / mark READY
./sprint.sh plan start <id> # members → next/ (plan latches STARTED)
./sprint.sh plan done <id> # all members in done/ → delete the plan
# Validate — catch done, underspecified, or blocked tasks before execution
./sprint.sh gate
# Execute — one fresh AI context per task
./sprint.sh work./sprint.sh work runs everything in next/. Start with --assist to choose a mode interactively, or pick your own:
./sprint.sh work --assist # interactive mode picker
./sprint.sh work --fast # 4 concurrent jobs
./sprint.sh work --parallel --jobs N # set concurrency explicitly
./sprint.sh work --max # remove per-task turn/budget limits
./sprint.sh work --audit # code audit after each task
./sprint.sh work --drift # skip done tasks, fix stale onesFirst-class AI providers (setup picker or CLI= / PROVIDER= in
docs/sprintmd/config): Claude Code (claude / claude-code) and
Grok Build (grok / grok-build). Both support interactive chat, emit
inside the agent session, and parallel subagent orchestration. Other binaries
fall back to a generic prompt passthrough.
Per-run provider (leading flags; does not rewrite config):
./sprint.sh -g work # Grok Build this run
./sprint.sh -c chat 12 # Claude Code this run
./sprint.sh --grok loop --refill # long form
SPRINTMD_CLI=codex ./sprint.sh work # generic env overrideWork flags combine: ./sprint.sh work --max --audit --fast
Run tasks continuously with crash recovery. Each task gets a fresh context.
./sprint.sh loop # drain next/
./sprint.sh loop --hours 2 --refill # run for 2h, refill from backlog when empty
./sprint.sh loop --refill --retry # full autopilot./sprint.sh chat <task-id> # define, refine, split, or stress-test a task (auto-detects state)
./sprint.sh split <path> # break a large task into subtasks
./sprint.sh gate [folder] [limit] # vet task quality (next/: READY-gate; other folders: report)
./sprint.sh polish --code <file> # code audit on changed files
./sprint.sh polish <file> # deep-judge finished work; file enhancements
./sprint.sh plan think [id] # dual-persona plan critique
./sprint.sh validate [--fix] # integrity-check task IDs and dependency refs
./sprint.sh sync [--all] # push task changes to GitHubStart with DOCUMENTATION.md — it's the complete reference. Use ./sprint.sh commands to create work items, never create files manually, and don't edit anything under docs/sprintmd/. Folder = status.
See CONTRIBUTING.md.