Endless is a project awareness system for solo developers managing multiple projects with AI assistants. It allows managing a myriad of software projects using AI without losing track of the details.
just installThis builds Go binaries to ./bin/, symlinks them to /usr/local/bin/, and installs the Python CLI via uv tool.
just build # templ generate, tailwind CSS, Go binaries
just test # run Python testsEndless depends on a fork of modelcontextprotocol/go-sdk via a replace directive in go.mod, pending upstream merge of PR #844. If go mod tidy fails with a sum.golang.org 404, set GOPRIVATE once to bypass the public checksum database for the fork:
go env -w GOPRIVATE=github.com/mikeschinkel/*endless register \
[<path>] \
[--infer] \
[--name <name>] \
[--label <label>] \
[--desc <text>] \
[--lang <lang>] \
[--status active|paused|archived|idea]# Register current directory, auto-detect metadata
endless register --infer
# Register a specific path with explicit fields
endless register ~/Projects/myapp --name myapp --label "My App" --lang Go --status activeendless list [--status active|paused|archived|idea] [--group]
endless status [<name>]endless list
endless list --status active
endless list --group
endless status myappendless set <field>=<value> [--path <partial_path>]
endless set <project>.<field>=<value> [--path <partial_path>]Fields: name, label, description, status, language, group_name
# From within the project directory
endless set label="My Application"
endless set status=paused
# From anywhere, prefix with project name
endless set myapp.label="My Application"
endless set myapp.lang=Go
# Disambiguate if multiple projects share a name
endless set myapp.lang=Go --path Projects/workendless rename <old_name> <new_name> [--path <partial_path>]
endless discover [<path>] [--all] [--reset]
endless unregister <name>
endless purge <name>endless rename oldname newname
endless discover ~/Projects
endless unregister myapp
endless purge myappTasks form a tree. Each task can have child tasks. The tasks table stores title, description, full text, prompt, and type.
endless task show [--project <name>] [--all]
endless task detail <task_id>endless task show
endless task show --all
endless task detail 445endless task add <title> \
[--description <text>] \
[--parent <task_id>] \
[--phase now|next|later] \
[--type task|plan|bug|research|spike|chore] \
[--project <name>]endless task add "Build dashboard" --description "Web dashboard for project status"
endless task add "Fix login bug" --parent 444 --description "Auth token expires too early"
endless task add "Refactor DB layer" --phase next
endless task add "Design auth system" --type planendless task import \
[<file>] \
[--project <name>] \
[--replace] \
[--parent <task_id>] \
[--from-claude]endless task import PLAN.md --project endless
endless task import PLAN.md --project endless --replace
endless task import subplan.md --project endless --parent 445
endless task import --from-claude --project endlessendless task update <id> \
[--status needs_plan|ready|in_progress|verify|completed|blocked|revisit] \
[--title <title>] \
[--description <text>] \
[--text <file>] \
[--prompt <file>] \
[--parent <task_id>]# Change status
endless task update 445 --status ready
# Update title and description
endless task update 441 --title "Dependency Graph" --description "Track cross-project deps"
# Load full task text from a file
endless task update 449 --text plan-markdown-component.md
# Move a task under a different parent (0 = make root)
endless task update 506 --parent 443endless task start <task_id>
endless task complete <task_id>
endless task remove <task_id>endless task start 445
endless task complete 445
endless task remove 445endless task prompt <task_id>
endless task spawn <task_id> [--project <name>]
endless task chat# Review the prompt that will be sent
endless task prompt 445
# Spawn a new tmux window with Claude working on the task's prompt
endless task spawn 445
# Start a chat session without task tracking
endless task chatendless scan [--project <name>] [--docs-only]
endless docs [<name>] [--type <type>]endless scan
endless scan --project myapp --docs-only
endless docs myapp
endless docs --type readmeendless notes [<name>] [--all]
endless note add <message> [--project <name>]
endless note resolve <note_id>endless notes myapp
endless notes --all
endless note add "Review auth token expiry" --project myapp
endless note resolve 42endless serve Start the web dashboard
--port INTEGER Port (default: 8484)
Routes:
/— Dashboard homepage/status— Project status (master-detail with task tree)/status/<name>— Project-specific status/project/<name>— Project detail (tasks, activity, notes, deps)/project/<name>/tasks— Full task list
endless setup prompt-hook Install ZSH prompt hook
endless setup remove-prompt-hook Remove ZSH prompt hook
endless setup claude-hook Install Claude Code hook
endless setup remove-claude-hook Remove Claude Code hookThe Claude Code hook handles:
- SessionStart: Injects task context
- PreToolUse: Blocks Write/Edit without active task session
- PostToolUse: Detects file changes, tracks plan file path on session
- ExitPlanMode: Syncs the accepted plan, using the tracked file path
- Stop/SessionEnd: Ends the session, records file changes
SQLite at ~/.config/endless/endless.db. Key tables:
projects— registered projectstasks— hierarchical task tree (title, description, text, prompt, type, parent_id)ai_sessions— Claude/Codex session tracking with active_goal_id and plan_file_pathactivity— hook-captured activity eventsfile_changes— detected file modificationsnotes— project notes and alertsdocuments— tracked document metadatatask_deps— cross-item and cross-project dependencies