A terminal-based AI-powered project manager built in Rust.
- Buckets view — organize tasks across Team, John-only, and Admin columns
- Timeline view — chronological task overview
- Kanban view — drag tasks through Backlog → Todo → In Progress → Done
- Settings — configure AI model, API key, and other options from within the app
- AI triage & tools — natural language input is routed through AI tool calls to create, update, delete, decompose, or bulk-update tasks
- URL context — paste a link (GitHub PR/issue or any URL) and the AI automatically fetches and incorporates its content
- Delete confirmation — modal prompt before deleting any task
- Keyboard-driven — full navigation via keyboard with tab bar focus, arrow keys, and vim-style bindings
| Context | Key | Action |
|---|---|---|
| Global | Ctrl-C |
Quit |
| Global | 1/2/3/4 |
Switch tabs |
| Input | /exit |
Quit |
| Tab bar | ←/→ |
Navigate tabs |
| Tab bar | Enter |
Enter selected tab |
| Input | Enter |
Create task |
| Input | Esc |
Switch to board |
| Board | ↑/↓/←/→ |
Navigate tasks and columns |
| Board | Enter/e |
Edit selected task |
| Board | d/x/Backspace/Delete |
Delete task (with confirmation) |
| Board | p/Space |
Advance progress |
| Board | P |
Retreat progress |
| Board | Esc |
Focus tab bar |
| Edit | ↑/↓ |
Navigate fields |
| Edit | Enter/e |
Edit field value |
| Edit | ←/→ |
Cycle enum fields |
| Edit | Esc |
Close overlay |
- Rust 1.70+
- An OpenAI API key (for AI features)
cargo build --release
./target/release/aipmSet your API key for your preferred provider:
export ANTHROPIC_API_KEY="sk-ant-..." # for Claude models
export OPENAI_API_KEY="sk-..." # for OpenAI modelsOr configure it in the Settings tab (4) within the app. The default model is claude-sonnet-4-5.
All subcommands output JSON to stdout. Errors go to stderr with a non-zero exit code.
Task IDs accept short prefixes (4+ hex chars), e.g. 36149d52 or 3614.
aipm task list— JSON array of all tasks.aipm task show <id>— single task as JSON.aipm task add --title "X" --bucket "Y"— create a task. Optional flags:--priority low|medium|high|critical,--progress backlog|todo|in-progress|done,--due YYYY-MM-DD,--description "...",--parent <id>(for sub-tasks). Prints the created task as JSON.aipm task edit <id>— update a task. Pass any combination of:--title,--bucket,--description,--priority,--progress,--due(usenoneto clear). Prints the updated task as JSON.aipm task delete <id>— delete a task and all its sub-tasks. Prints confirmation JSON.
aipm bucket list— JSON array of all buckets.aipm bucket add <name>— add a bucket. Optional:--description "...".aipm bucket rename <old> <new>— rename a bucket and update all tasks in it.aipm bucket delete <name>— delete a bucket; tasks move to the first remaining bucket.
aipm "<instruction>"— send a natural-language instruction to AI for triage (create/update/delete tasks). Requires an API key.
The AI agent uses tool calling to decide how to handle each input. Available tools:
| Tool | Description |
|---|---|
create_task |
Create a new task with title, bucket, description, priority, progress, due date, and optional subtasks |
update_task |
Update fields on an existing task by ID prefix |
delete_task |
Delete a task by ID prefix |
decompose_task |
Break a task into smaller subtasks with dependency ordering |
bulk_update_tasks |
Apply an instruction across multiple tasks at once |
The AI also automatically fetches context from URLs included in the input:
- GitHub PRs/Issues — fetches title, author, state, and body via the GitHub API
- Generic URLs — fetches the page, extracts the title and a text snippet
Each task is stored as an individual markdown file with YAML front matter in a tasks/ directory:
<data_dir>/
tasks/
550e8400-implement-user-auth.md
660e8400-setup-oauth-flow.md
...
settings.yaml
Task file format:
---
id: "550e8400-e29b-41d4-a716-446655440000"
title: "Implement user authentication"
bucket: Team
progress: InProgress
priority: High
due_date: "2026-03-01"
parent_id: "660e8400-e29b-41d4-a716-446655440001"
dependencies:
- "770e8400-e29b-41d4-a716-446655440002"
created_at: "2026-02-10T12:00:00Z"
updated_at: "2026-02-15T14:30:00Z"
---
Description goes here as the markdown body.This file-per-task architecture makes tasks naturally navigable by AI coding agents:
grep -r "priority: Critical" tasks/ # find all critical tasks
grep -r "bucket: Team" tasks/ # find all team tasks
ls tasks/ # browse tasks by name
cat tasks/550e8400-*.md # read a specific taskDefault data directory:
- macOS:
~/Library/Application Support/aipm/ - Linux:
$XDG_DATA_HOME/aipm/or~/.local/share/aipm/
Override with AIPM_DATA_DIR environment variable.
Existing tasks.json data is automatically migrated to the new format on first run.
MIT