# 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 `.md` as 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 `backlog` status in workflow logic. - A task is considered in Backlog when `sprintId` is empty. - Current status values: - `open` - `todo` - `blocked` - `in-progress` - `review` - `validate` - `archived` - `canceled` - `done` - 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/tasks` sync 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` - `sprintId` is 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 Do` contains statuses: `open`, `todo` - `In Progress` contains statuses: `blocked`, `in-progress`, `review`, `validate` - `Done` contains statuses: `archived`, `canceled`, `done` Drop behavior: - Drop on column body: applies that column's default status - `To Do` -> `open` - `In Progress` -> `in-progress` - `Done` -> `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 ```bash npm install npm run dev ``` Open `http://localhost:3000`. Task URLs follow `http://localhost:3000/tasks/{taskId}`. ## Scripts ```bash 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.