- New /api/activity endpoint returning combined timeline of progress notes
and comments across all tasks, sorted chronologically
- Activity page now fetches from unified endpoint instead of extracting
from task data client-side
- Type filter (progress/comment) and status filter on Activity page
- Comment entries show author avatars and type badges
- 30s auto-refresh on activity feed
- New task_comments table (separate from progress notes)
- Backend: GET/POST/DELETE /api/tasks/:id/comments with session + bearer auth
- TaskComments component on TaskPage (full-page view) with markdown support,
author avatars, delete own comments, 30s polling
- CompactComments in TaskDetailPanel (side panel) with last 3 + expand
- Comment API functions in frontend lib/api.ts
- Deploy job runs after tests pass, only on push to main
- Uses Dokploy compose.deploy API with secrets for URL, token, compose ID
- PRs only run tests (no deploy)
- Extract pure utility functions to lib/utils.ts for testability
- Add 28 unit tests covering: computeNextDueDate, resetSubtasks,
parseTaskIdentifier, validators, statusSortOrder
- Add Gitea Actions workflow (.gitea/workflows/ci.yml) that runs
tests and type checking on push/PR to main
- Refactor tasks.ts to use extracted utils
- Added recurrence field (daily/weekly/biweekly/monthly) to tasks schema
- Backend: auto-creates next task instance when recurring task completed
- Copies title, description, assignee, project, tags, subtasks (unchecked)
- Computes next due date based on frequency
- Optional autoActivate to immediately activate next instance
- Frontend: recurrence picker in CreateTaskModal and TaskDetailPanel
- Recurrence badges (🔄) on TaskCard, KanbanBoard, TaskPage, DashboardPage
- Schema uses JSONB column (no migration needed, db:push on deploy)
- Command palette: Ctrl+K opens global task search with arrow key navigation
- Shows active/recent tasks when empty, filters on type
- Enter to open task detail page, Esc to close
- Sidebar: active task count badge (amber) and blocked count (red) on Queue nav
- Updated keyboard shortcuts modal with Ctrl+K
- Added tags (JSONB array) to tasks schema with full CRUD support
- Tag editor in TaskDetailPanel with chip UI, Enter/comma to add, Backspace to remove
- Tag badges on TaskCard, KanbanBoard cards, and DashboardPage
- Sort controls on QueuePage: sort by priority, due date, created, updated, name
- Sort direction toggle (asc/desc) with persistence to localStorage
- Tag filter dropdown in QueuePage header (populated from existing tags)
- Search now matches tags
- Backend: tags in create/update, progressNotes in PATCH body
- Full dark mode across TaskPage (header, cards, sidebar, forms)
- Task descriptions rendered as markdown (ReactMarkdown + remark-gfm)
- Inline description editing with markdown preview
- Inline title editing (click to edit)
- Theme system (useTheme hook with light/dark/system toggle)
- Dark mode classes across remaining components
- New KanbanBoard component with 4 columns: Active, Queued, Blocked, Done
- HTML5 drag-and-drop to move tasks between status columns
- Visual drop zone highlighting and drag state
- Task cards show priority, project, assignee, due date, subtask progress
- View toggle (list/board) in Queue page header, persisted to localStorage
- Status filter hidden in board mode (columns serve as visual filter)
- Cards link to task detail pages, click opens detail panel
- Lazy-load all route pages (React.lazy + Suspense) - main bundle 520KB → 266KB
- New Activity Log page (/activity) with timeline view, day grouping, status filter
- Chat: gateway session browser - browse existing Clawdbot sessions from sidebar
- Chat: clicking a gateway session adds it as a local thread for conversation
- Sidebar: added Activity nav item between Projects and Chat
- Up Next items link to task detail pages
- Recently Completed items are now clickable links
- High/critical priority badges shown on Up Next items
- Hover states on dashboard items
- CreateTaskModal: project selector, due date picker, source in 'more options'
- TaskCard: project name badge (📁) and assignee badge (👤)
- QueuePage: status filter dropdown, clear filters button, filter count indicator
- QueuePage: Ctrl+N keyboard shortcut to create task
- DashboardPage: project/assignee badges on active task cards
- Search now also matches assignee name
- Schema: added due_date and subtasks JSONB columns to tasks
- API: CRUD endpoints for subtasks (/tasks/:id/subtasks)
- API: due date support in create/update task
- TaskDetailPanel: due date picker with overdue/soon badges
- TaskDetailPanel: subtask checklist with progress bar
- TaskPage: full-page task view at /task/HQ-{number}
- Dashboard: task cards link to detail page, show subtask progress & due date badges
- Migration: 0001_mighty_callisto.sql
- Add react-markdown + remark-gfm for rich message rendering
- Assistant messages now render markdown (code blocks, lists, links, etc.)
- User messages stay as plain text
- Fix docker-compose to map GATEWAY_WS_URL from VITE_WS_URL
- Added GATEWAY_WS_TOKEN to Dokploy env vars
- TaskCard: hide action buttons on mobile (tap to open detail panel), smaller text/badges, word-break titles
- TaskDetailPanel: full-screen on mobile with Back button, responsive padding, stacked timeline, hidden UUID on small screens
- QueuePage: sticky header offset for mobile nav bar (top-14)
- Priority/source grid stacks vertically on mobile
- Updated webhook notification message to use dash domain
- Caddy now proxies /hooks/* to gateway, blocks all other paths
- Control UI no longer exposed publicly
- Added assignee_id and assignee_name columns to tasks table
- PATCH /api/tasks/:id now accepts assigneeId and assigneeName
- db:push on startup will auto-migrate the columns
- Collapsible hamburger sidebar on mobile
- Mobile header bar with menu toggle
- Thread list as overlay on mobile, sidebar on desktop
- Responsive padding and font sizes
- Task queue header responsive adjustments
- Single domain for hooks + WebSocket (path-based routing)
- No need for ws.hammer or hooks.hammer subdomains
- Caddy proxies everything to gateway on this VPS
- Add React Router with sidebar layout (DashboardLayout)
- Queue is now a routed page at /queue
- Chat placeholder page at /chat
- Admin page accessible from sidebar
- Dark sidebar with amber accent for active nav
- Updated CORS and auth to support dash.donovankelly.xyz
- Renamed to Hammer Dashboard
- Webhook URL must be set via env var (no fallback)
- Webhook URL must start with https:// or it's rejected
- Both URL and token required, skip silently if missing
- Default CLAWDBOT_HOOK_URL to VPS hook-proxy (72.60.68.214:18790)
- Add default CLAWDBOT_HOOK_TOKEN in compose for Dokploy deploys
- Add extra_hosts for host.docker.internal resolution
- Queue backend on remote server can now reach Clawdbot gateway
- EditableText now updates draft state instead of saving immediately
- Panel tracks dirty state across title, description, priority, source
- Save/Cancel bar slides up when any field is modified
- Cancel reverts all changes, Save commits them in one API call
- Slide-up animation for the save/cancel bar
- All logged-in users can create/edit/manage tasks (no bearer token needed)
- Added user role system (user/admin)
- Donovan's account auto-promoted to admin on startup
- Admin page: view users, change roles, delete users
- /api/me endpoint returns current user info + role
- /api/admin/* routes (admin-only)
- Removed bearer token UI from frontend
- Bearer token still works for API/bot access
- Click-to-edit title and description (inline editing)
- Clickable priority selector (toggle between critical/high/medium/low)
- Clickable source selector (toggle between all sources)
- Saving indicator
- EditableText component with Escape to cancel, Enter/blur to save
- Pass token and onTaskUpdated props from App
- Add serial task_number column to tasks table
- Display HQ-{number} on cards and detail panel
- API resolveTask() supports UUID, number, or HQ-N prefix
- GET /api/tasks/:id endpoint for single task lookup
- All PATCH/POST/DELETE endpoints resolve by number or UUID