A terminal-based TODO application with kanban boards, knowledge base, and integrations.
- TUI Client: Rust + ratatui + crossterm
- Backend: Rust + Axum + PostgreSQL
- Hosting: Self-hosted VPS
- Initialize Cargo workspace with 3 crates
- Create .env.example
- Add .gitignore
- Add rustfmt.toml and clippy config
- Write roadmap
- Task model (id, title, status, description, priority, due_date, time_estimate)
- User model
- Workspace model (with roles: owner, admin, editor, reader)
- Comment model
- Document model (knowledge base)
- API request/response types
- Users & authentication tables
- Workspaces & membership (with roles)
- Task statuses (kanban columns)
- Tasks table with all fields
- Comments table
- Tags table
- Documents table (ltree for hierarchy)
- Trigram search indexes (pg_trgm for multilingual search)
- Integration settings tables
- Axum app skeleton with config
- Database connection pool (SQLx)
- Error handling infrastructure
- Auth endpoints (register, login, JWT)
- Auth middleware
- Refresh token handling
- Terminal setup/teardown
- Basic app state structure
- Event handling loop
- Basic UI rendering
- Login view
- API client skeleton
- GET /api/v1/workspaces/{wid}/tasks - List tasks
- POST /api/v1/workspaces/{wid}/tasks - Create task
- GET /api/v1/workspaces/{wid}/tasks/{id} - Get task
- PUT /api/v1/workspaces/{wid}/tasks/{id} - Update task
- DELETE /api/v1/workspaces/{wid}/tasks/{id} - Delete task
- PUT /api/v1/workspaces/{wid}/tasks/{id}/move - Move task
- Status CRUD endpoints
- KanbanBoard component with columns
- Column component
- TaskCard component (with priority indicator and due date)
- Vim navigation (h/j/k/l)
- Task selection highlighting
- Move task between columns (m + h/l)
- Create task (n key)
- Delete task (d key)
- Scroll within columns (with scroll indicators)
- TaskDetail side panel
- Title/description editor
- Priority selector (lowest/low/medium/high/highest)
- Due date picker
- Time estimate input
- Assignee selector (h/l to cycle through workspace members)
- Default assignee on task creation (workspace setting override)
- GET /api/v1/workspaces/{wid}/tasks/{id}/comments
- POST /api/v1/workspaces/{wid}/tasks/{id}/comments
- PUT /api/v1/workspaces/{wid}/tasks/{id}/comments/{cid}
- DELETE /api/v1/workspaces/{wid}/tasks/{id}/comments/{cid}
- Comments list in task detail TUI
- Add comment with timestamp
- Create CommentWithUser response type (includes author username)
- Update comment list endpoint to return CommentWithUser
- Update TUI to display comments as
[timestamp][@username]: content
- Trigram search with pg_trgm (multilingual, typo-tolerant)
- GET /api/v1/workspaces/{wid}/search?q=...
- Search pagination
- Search panel (/ command)
- Real-time search results
- Navigate and select results
- Highlight matches
- Filter by: status, priority, assignee, due date, tags
- Order by: title, due_date, priority, created_at, position
- Filter bar in kanban view
- Command mode filters (
:filter priority=high) - Save filter presets
- Add username field to User model (unique, alphanumeric + underscore)
- Migration: Add username column to users table
- Update registration to require username
- Add email verification flow with one-time code
- Migration: Add verification fields (is_verified, verification_code, verification_expires_at)
- POST /api/v1/auth/verify - Verify email with code
- POST /api/v1/auth/resend-verification - Resend verification code
- Restrict login to verified users only
- Update TUI registration to include username input
- Add email verification screen in TUI
- GET /api/v1/workspaces - List user's workspaces
- POST /api/v1/workspaces - Create workspace
- GET /api/v1/workspaces/{id} - Get workspace
- PUT /api/v1/workspaces/{id} - Update workspace
- DELETE /api/v1/workspaces/{id} - Delete workspace
- Role-based permissions middleware
- GET /api/v1/workspaces/{id}/members
- POST /api/v1/workspaces/{id}/invites - Send invite
- GET /api/v1/invites/{token} - Get invite details
- POST /api/v1/invites/{token}/accept - Accept invite
- PUT /api/v1/workspaces/{id}/members/{uid} - Update role
- DELETE /api/v1/workspaces/{id}/members/{uid} - Remove member
- Workspace switcher (Ctrl+W)
- Member list view
- Role management UI (for admins/owners)
- Invite flow
- Document schema with ltree (hierarchical paths)
- GET /api/v1/workspaces/{wid}/documents - List tree
- POST /api/v1/workspaces/{wid}/documents - Create document
- GET /api/v1/workspaces/{wid}/documents/{id} - Get document
- PATCH /api/v1/workspaces/{wid}/documents/{id} - Update document
- DELETE /api/v1/workspaces/{wid}/documents/{id} - Delete (cascade)
- POST /api/v1/workspaces/{wid}/documents/{id}/move - Move in tree
- DocumentTree component (collapsible, h/l to expand)
- DocumentViewer (text with wrapping)
- DocumentEditor
- Navigate tree with j/k, expand/collapse with h/l
- Create/delete documents (n/d keys, Ctrl+K to open KB)
- POST /api/v1/workspaces/{wid}/documents/{id}/tasks - Link task
- GET /api/v1/workspaces/{wid}/documents/{id}/tasks - List linked tasks
- DELETE /api/v1/workspaces/{wid}/documents/{id}/tasks/{tid} - Unlink
- GET /api/v1/workspaces/{wid}/tasks/{id}/documents - List linked documents
- Show linked documents in task detail
- Show linked tasks in document view
- Full-text search for documents
- Unified search (tasks + documents)
- Replace
CorsLayer::permissive()with specific allowed origins - Fix refresh token validation (verify token hash, not just existence)
- Add rate limiting for auth endpoints (login, verification)
- Improve email validation (RFC 5322 format)
- Add
usernamefield to User model (exists in DB, missing in model) - Add
email_verified,email_verified_atto User model - Fix
tag_idstype mismatch:String(server) vsVec<Uuid>(shared)
- Fix token refresh race condition (proactive refresh before expiration)
- Handle stale state after search/navigation
- Extract
check_membership()to shared module (duplicated in 6 handlers) - Extract
verify_task()to shared module (duplicated in 3 handlers)
- Split
app.rs(3754 lines) into modules:auth_handlers.rsdashboard_handlers.rskb_handlers.rsfilter_handlers.rs
- Fix silent failures (search, tags, members, linked docs)
- Add proper success notifications (not via
set_error())
- Add unit tests
- Add integration tests
- Setup GitHub Actions CI/CD
- Add
cargo-auditfor vulnerability scanning
- Standardize pagination defaults (50 vs 20)
- Add request body size limits (
DefaultBodyLimit) - Add color validation for tags/statuses (#RRGGBB)
- Standardize HTTP status codes for deletes (204 vs 200)
- Add cascade delete warning for documents
- Add feedback for invalid date input in filters
- Standardize keybindings across views
- Update CLAUDE.md with new fields/migrations
- Add OpenAPI/Swagger documentation
- Add database ERD
- Add setup instructions to README
- Soft deletes (deleted_at) for recovery
- Audit logging (who changed what)
- Configurable DB pool size (env var)
- User profile endpoints (change password, delete account)
- Expired invites cleanup job
- Batch task operations
- Search history (Ctrl+R)
- Column hide/collapse
- Task sorting within column
- Toast notifications
- YouTrack API client (REST)
- Field mapping configuration
- POST /api/v1/workspaces/{wid}/integrations - Configure
- POST /api/v1/workspaces/{wid}/integrations/youtrack/sync - Trigger sync
- Bidirectional sync engine
- Conflict resolution (last-write-wins)
- Background sync job
- POST /api/v1/webhooks/github - Webhook receiver
- POST /api/v1/webhooks/gitlab - Webhook receiver
- Signature verification
- Extract task reference from PR title/branch (e.g., TODO-123)
- Auto-update task status:
- PR opened → "In Review"
- PR merged → "Done"
- Store PR link in task external_refs
- Telegram bot setup (teloxide)
- /start command - generate link token
- Link Telegram chat to user account
- PUT /api/v1/workspaces/{wid}/notifications/settings
- Notification triggers:
- Task assigned
- Task updated
- New comment
- Due date approaching (1 day before)
- Background notification job
- Research Model Context Protocol compatibility
- Evaluate if MCP tools can expose task data
- Prototype if viable
- Document findings
- Command palette (Ctrl+P)
- Help overlay (?)
- Keyboard shortcut reference
- Home dashboard with workspace stats
- ASCII art workspace titles (figlet)
- Quote of the day
- Markdown rendering in Knowledge Base
- Remember last opened workspace
- Status bar (sync status, workspace, user)
- Notification toasts
- Undo/redo for task changes
- Offline mode (queue changes)
- Database query optimization
- Add indexes for common queries
- Lazy loading for large task lists
- Connection pooling tuning
- TUI rendering optimization
- Deployment scripts for VPS
- Systemd service files
- Nginx reverse proxy config
- TLS setup (Let's Encrypt / certbot)
- Database backup scripts
Normal Mode:
h/l - Navigate columns
j/k - Navigate tasks
gg/G - First/last task
Enter - Open task detail
i - Insert mode (edit)
a - Add comment
n - New task
d - Delete task
m + h/l - Move task to column
Space - Toggle done
/ - Search
: - Command mode
Ctrl+P - Command palette
Ctrl+W - Workspace switcher
Ctrl+K - Knowledge base
? - Help
q - Quit/close
Insert Mode:
Esc - Return to normal
Ctrl+Enter- Save and exit
Tab - Next field
Shift+Tab - Previous field
Command Mode:
:w - Save
:q - Quit
:new - New task
:filter - Apply filter
:sync - Trigger sync
:help - Show help
-- Core entities
users (id, email, username, password_hash, display_name, is_verified, verification_code, created_at)
workspaces (id, name, slug, owner_id, settings jsonb)
workspace_members (workspace_id, user_id, role)
-- Tasks
task_statuses (id, workspace_id, name, slug, color, position, is_done)
tasks (id, workspace_id, status_id, title, description, priority,
due_date, time_estimate_minutes, position, created_by, assigned_to,
external_refs jsonb)
task_comments (id, task_id, user_id, content, created_at)
tags (id, workspace_id, name, color)
task_tags (task_id, tag_id)
-- Knowledge base
documents (id, workspace_id, path ltree, parent_id, title, slug, content)
task_document_links (task_id, document_id)
-- Integrations
workspace_integrations (id, workspace_id, integration_type, config, enabled)
user_notification_settings (user_id, workspace_id, telegram_chat_id, ...)POST /api/v1/auth/register
POST /api/v1/auth/login
POST /api/v1/auth/refresh
POST /api/v1/auth/logout
GET /api/v1/auth/me
POST /api/v1/auth/verify
POST /api/v1/auth/resend-verification
GET /api/v1/workspaces
POST /api/v1/workspaces
GET /api/v1/workspaces/{id}
PUT /api/v1/workspaces/{id}
DELETE /api/v1/workspaces/{id}
GET /api/v1/workspaces/{id}/members
POST /api/v1/workspaces/{id}/invites
GET /api/v1/workspaces/{wid}/statuses
POST /api/v1/workspaces/{wid}/statuses
PUT /api/v1/workspaces/{wid}/statuses/{id}
DELETE /api/v1/workspaces/{wid}/statuses/{id}
PUT /api/v1/workspaces/{wid}/statuses/reorder
GET /api/v1/workspaces/{wid}/tasks
POST /api/v1/workspaces/{wid}/tasks
GET /api/v1/workspaces/{wid}/tasks/{id}
PUT /api/v1/workspaces/{wid}/tasks/{id}
DELETE /api/v1/workspaces/{wid}/tasks/{id}
PUT /api/v1/workspaces/{wid}/tasks/{id}/move
GET /api/v1/workspaces/{wid}/tasks/{id}/comments
POST /api/v1/workspaces/{wid}/tasks/{id}/comments
PUT /api/v1/workspaces/{wid}/tasks/{id}/comments/{cid}
DELETE /api/v1/workspaces/{wid}/tasks/{id}/comments/{cid}
GET /api/v1/workspaces/{wid}/documents
POST /api/v1/workspaces/{wid}/documents
GET /api/v1/workspaces/{wid}/documents/{id}
PATCH /api/v1/workspaces/{wid}/documents/{id}
DELETE /api/v1/workspaces/{wid}/documents/{id}
POST /api/v1/workspaces/{wid}/documents/{id}/move
GET /api/v1/workspaces/{wid}/documents/{id}/tasks
POST /api/v1/workspaces/{wid}/documents/{id}/tasks
DELETE /api/v1/workspaces/{wid}/documents/{id}/tasks/{tid}
GET /api/v1/workspaces/{wid}/tasks/{id}/documents
GET /api/v1/workspaces/{wid}/search?q=...&search_type=all|tasks|documents
GET /api/v1/workspaces/{wid}/integrations
POST /api/v1/workspaces/{wid}/integrations
POST /api/v1/workspaces/{wid}/integrations/{type}/sync
POST /api/v1/webhooks/github
POST /api/v1/webhooks/gitlab