gantt-board/README.md

4.0 KiB

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

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.