5.2 KiB
5.2 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
.mdas text) and using blob URLs for reliable in-browser viewing. - Added lightweight collaborator identity tracking for task/comment authorship.
Data model and status rules
- Tasks use labels (
tags: string[]) and can have multiple labels. - Tasks support attachments (
attachments: TaskAttachment[]). - Tasks now track
createdById,createdByName,updatedById, andupdatedByName. - 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.
Authentication and sessions
- Added account-based authentication with:
POST /api/auth/registerPOST /api/auth/loginPOST /api/auth/logoutGET /api/auth/session
- Added a dedicated login/register screen at
/login. - Added account settings at
/settingsfor authenticated users. - Main board (
/) and task detail pages (/tasks/{taskId}) require an authenticated session. - Main board and task detail headers include quick access to Settings and Logout.
- API routes now enforce auth on task read/write/delete (
/api/tasksreturns401when unauthenticated). - Added
PATCH /api/auth/accountto update name/email/password for the current user. - Session cookie:
gantt_session(HTTP-only, same-site lax, secure in production). - Added
Remember mein auth forms:- Checked: persistent 30-day cookie/session.
- Unchecked: browser-session cookie (clears on browser close), with server-side short-session expiry.
- Task/comment authorship now uses authenticated user identity.
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.