Project Hub with Kanban board for task/idea tracking
| comps | ||
| public | ||
| src | ||
| .gitignore | ||
| eslint.config.mjs | ||
| next.config.ts | ||
| package-lock.json | ||
| package.json | ||
| postcss.config.mjs | ||
| README.md | ||
| tsconfig.json | ||
Gantt Board
Task and sprint board built with Next.js + Zustand and SQLite-backed API persistence.
Current Product Behavior
Feb 20, 2026 updates
- Added task attachments with SQLite persistence.
- Added URL-based task detail pages (
/tasks/{taskId}) so tasks can be opened/shared by link. - Replaced flat notes/comments with threaded comments.
- Added unlimited nested replies (reply to comment, reply to reply, no depth limit).
- Updated UI wording from "notes" to "comments".
- Improved attachment opening/rendering by coercing MIME types (including
.mdas text) and using blob URLs for reliable in-browser viewing.
Data model and status rules
- Tasks use labels (
tags: string[]) and can have multiple labels. - Tasks support attachments (
attachments: TaskAttachment[]). - There is no active
backlogstatus in workflow logic. - A task is considered in Backlog when
sprintIdis empty. - Current status values:
opentodoblockedin-progressreviewvalidatearchivedcanceleddone
- New tasks default to
status: open.
Labels
- Project selection UI for tasks was removed in favor of labels.
- You can add/remove labels inline in:
- New Task modal
- Task Detail page
- Label entry supports:
- Enter/comma to add
- Existing-label suggestions
- Quick-add chips
- Case-insensitive de-duplication
Task detail pages
- Clicking a task from Kanban or Backlog opens a dedicated route:
/tasks/{taskId}
- Task detail is no longer popup-only behavior.
- Each task now has a shareable deep link.
Attachments
- Task detail page supports adding multiple attachments per task.
- Attachments are stored with each task in SQLite and survive refresh/restart.
- Attachment UI supports:
- Upload multiple files
- Open/view file
- Markdown (
.md) preview rendering in browser tab - Text/code preview for common file types including iOS project/code files (
.swift,.plist,.pbxproj,.storyboard,.xib,.xcconfig,.entitlements) - Syntax-highlighted source rendering (highlight.js) with copy-source action
- CSV table preview and sandboxed HTML preview with source view
- Download file
- Remove attachment
Threaded comments
- Comments are now threaded, not flat.
- You can:
- Add top-level comments
- Reply to any comment
- Reply to replies recursively (unlimited depth)
- Delete any comment or reply from the thread
- Thread data is persisted in SQLite through the existing
/api/taskssync flow.
Backlog drag and drop
Backlog view supports moving tasks between:
- Current sprint
- Other sprint sections
- Backlog
Status behavior on drop:
- Drop into any sprint section:
status -> open - Drop into backlog section:
status -> open sprintIdis set/cleared based on destination
Changes persist through store sync to SQLite.
Kanban drag and drop
Kanban supports drag by visible left handle on each task card.
Columns:
To Docontains statuses:open,todoIn Progresscontains statuses:blocked,in-progress,review,validateDonecontains statuses:archived,canceled,done
Drop behavior:
- Drop on column body: applies that column's default status
To Do->openIn Progress->in-progressDone->done
- Drop on status chip target: applies exact status
- Drop on a task: adopts that task's exact status
During drag, the active target column shows expanded status drop zones for clarity.
Layout
- Left sidebar cards (Current Sprint and Labels quick view) were removed.
- Main board now uses full width for Kanban/Backlog views.
Persistence
- Client state is managed with Zustand.
- Persistence is done via
/api/tasks. - API reads/writes
data/tasks.db(SQLite).
Run locally
npm install
npm run dev
Open http://localhost:3000.
Task URLs follow http://localhost:3000/tasks/{taskId}.
Scripts
npm run dev
npm run build
npm run start
npm run lint
Notes
- You may see a Next.js warning about multiple lockfiles and inferred workspace root. This is non-blocking for local dev.