FAQ
Last updated on 2026-09-07
General
What tech stack does the kit use?
- Framework: Next.js 16 (App Router, React 19, Server Components, Server Actions)
- Database: Supabase (PostgreSQL with Row Level Security)
- Auth: Supabase Auth (email/password, Google OAuth, GitHub OAuth)
- Styling: Tailwind CSS v4 with oklch color tokens
- Components: shadcn/ui (Radix UI primitives via Base UI)
- Drag-and-drop: @hello-pangea/dnd
- Charts: Recharts 3
- Fonts: Inter (body), DM Sans (headings), JetBrains Mono (code)
- Dark mode: next-themes with class-based switching
Is this a SaaS template?
No. This is a project management UI kit with a fully wired Supabase backend. It does not include billing, subscription management, or multi-tenant workspace isolation. All authenticated users share a single workspace. You can add billing (e.g., Stripe) and multi-tenancy on top.
How many database tables are included?
31 tables across the schema, including:
- Core entities:
profiles,workspaces,projects,tasks,subtasks,task_comments - Organization:
cycles,modules,goals,key_results,pages - Junction tables:
project_members,task_labels,cycle_tasks,module_tasks - Analytics:
daily_metrics,burndown_points,velocity_points,cumulative_flow_points,contribution_data - Platform:
activities,notifications,saved_views,automation_rules,milestones,labels - Settings:
api_keys,webhooks,integration_configs,project_templates,notification_preferences
How many routes does the kit have?
44 routes organized under the (dashboard) layout group, covering projects, boards, tasks, cycles, modules, goals, pages, analytics, roadmap, workload, settings, and more.
Auth
What auth methods are supported?
Email/password, Google OAuth, and GitHub OAuth via Supabase Auth. The signInWithProvider Server Action handles OAuth flows with redirect to /auth/callback.
How is the user profile created?
When a user signs up, Supabase Auth creates a row in auth.users. A database trigger (003_triggers.sql) automatically creates a corresponding row in the profiles table with the user's full_name, email, and avatar_url extracted from user metadata.
How do I make myself an admin?
After creating your account, update your profile role in the Supabase Table Editor:
UPDATE profiles SET role = 'Owner' WHERE email = 'you@example.com';
Board & Tasks
How does drag-and-drop work?
The Kanban board uses @hello-pangea/dnd (a maintained fork of react-beautiful-dnd). When a card is dropped in a new column:
- An optimistic UI update moves the card instantly in local state
- A toast confirms the move
- The
updateTaskStatusServer Action writes the new status to Supabase revalidatePath()refreshes server data on the next navigation
Are task numbers auto-generated?
Yes. The createTask Server Action queries the maximum number for the project and increments by 1. Task numbers are scoped per project and displayed with the project prefix (e.g., PRJ-42).
How do subtasks work?
Subtasks are stored in the subtasks table with a task_id foreign key. They have their own title, completed status, assignee, and due date. The SubtaskList component renders them with checkboxes that call updateSubtask to toggle completion.
What happens when I delete a task?
The deleteTask Server Action first fetches the task to get its project_id, then deletes the task. The ON DELETE CASCADE constraints automatically remove related subtasks, comments, task labels, cycle tasks, and module tasks.
Cycles (Sprints)
How is velocity calculated?
When you complete a cycle via the completeCycle Server Action, it fetches all tasks in the cycle via the cycle_tasks junction table. It sums the estimate field of tasks with status Done to get completed_points, and sums all task estimates to get planned_points. The velocity is set to completed_points.
Can I have multiple active cycles?
The schema does not enforce a single active cycle, but the UI shows only one "Active" cycle card at the top of the cycles page. You can activate multiple cycles by setting their status to Active, but the UI is designed around one active cycle per project.
What are story point estimates?
Tasks have an optional estimate field (numeric) for story point estimates. When feat_estimates is enabled on a project, the estimate field appears in the task detail sidebar and is used in velocity and burndown calculations.
Analytics
Where does analytics data come from?
- Daily metrics come from the
daily_metricstable (one row per day per project) - Velocity data comes from the
velocity_pointstable (one row per sprint) - Cumulative flow comes from the
cumulative_flow_pointstable (one row per day per project) - Burndown data comes from the
burndown_pointstable (one row per day per cycle) - Status/priority distribution is computed at query time from the
taskstable - Contribution data comes from the
contribution_datatable (one row per member per project)
How do I populate analytics data?
The analytics tables need to be populated. You can:
- Use the seed data included in the kit
- Write database triggers that insert a
daily_metricsrow when tasks are created/completed - Write a cron job that snapshots task status counts into
cumulative_flow_pointsdaily - Have
completeCyclealso insert intovelocity_points
What chart library is used?
Recharts 3. All charts use the ResponsiveContainer wrapper for responsive sizing and are styled with CSS variable references (var(--chart-1), var(--border), etc.) for theme consistency.
Styling & Theming
How do I change the brand color?
Edit app/globals.css and change the oklch hue from 255 (blue-indigo) to your desired hue. Update --primary, --primary-foreground, and related tokens in both :root and .dark. See Design Tokens for details.
Does dark mode work out of the box?
Yes. Dark mode is handled by next-themes with attribute="class" and enableSystem. It defaults to the system preference and can be toggled via a theme switcher in the sidebar. All components use semantic CSS tokens that adapt automatically.
Can I use a different component library?
The kit uses shadcn/ui components (built on Radix UI / Base UI primitives). You can replace individual components, but the entire UI is built on these primitives. Swapping the full library would require significant refactoring.
Deployment
Do I need a paid Supabase plan?
The free tier (2 projects, 500MB database, 50,000 monthly active users) is sufficient for development and small deployments. For production with higher traffic, consider the Pro plan.
Can I deploy anywhere besides Vercel?
Yes. The kit is a standard Next.js App Router project. It can be deployed to any platform that supports Next.js Server Actions: Vercel, Netlify, AWS Amplify, Railway, or self-hosted with next start. The Supabase backend is independent.
What environment variables do I need?
| Variable | Required | Description |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL |
Yes | Supabase project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY |
Yes | Supabase public anon key |
SUPABASE_SERVICE_ROLE_KEY |
Yes | Supabase service role key (server-side only) |
NEXT_PUBLIC_SITE_URL |
Yes | Your production URL |
Customization
Can I add new task fields?
Yes. Add a column to the tasks table, update the Task interface in types/index.ts, update the mapTask function in lib/queries.ts, and update the createTask/updateTask Server Actions.
How do I add a new page to the sidebar?
- Create a new route in
app/(dashboard)/your-page/ - Add a navigation link in the sidebar component with a Lucide icon
- Add the route to the middleware matcher if needed
Can I remove features I do not need?
Yes. Each project has feature flags (feat_cycles, feat_modules, feat_pages, feat_automations, feat_estimates) that control which tabs appear in the project navigation. You can also remove entire route directories for features you will never use.