A lean Kanban board for teams that want clarity without the bloat.
Status: Open-source and self-hosted. Run it locally or deploy your own instance with your own Supabase project.
- Custom columns — add, rename, duplicate config, delete (cards move to the first remaining column), tint colors, collapse/expand
- Drag-and-drop cards across columns (
@dnd-kit) - Cards with type (Feature / Fix / Chore), priority, title, notes, and source URL
- One image attachment per card (client-side WebP encode, stored in Supabase Storage)
- Card inspector with Issue, Activity, and Artifacts tabs
- Activity history and comments (authenticated workspaces)
- Keyboard shortcuts:
Nnew card,Cnew column,Escclose dialogs and inspector
- One auto-provisioned workspace per user, blank on first sign-in
- Custom workspace title, logo, and background image
- Light / dark / system color mode; comfortable or compact density
- Optional celebration confetti and sound when a card lands in the rightmost column
- Google OAuth and email/password sign-in
- Public read-only share links at
/share/{token} - Account deletion from settings
- Next.js 16 (App Router), React 19, TypeScript
- Tailwind CSS 4, Radix UI / shadcn-style components
- Supabase — Auth, Postgres, Storage
- Bun — install and scripts
@dnd-kit, Sonner toasts
- Bun
- A Supabase project (Free tier works for local development)
- Optional: Google OAuth in Supabase Auth if you want Google sign-in on the login page
-
Clone the repository.
-
Install dependencies:
bun install
-
Copy
.env.exampleto.env.localand fill in your Supabase values (see Environment variables). -
Set up Supabase manually — see Supabase setup.
-
In Supabase Auth, add a redirect URL:
{NEXT_PUBLIC_SITE_URL}/auth/callback(for local dev, usehttp://localhost:3000/auth/callback). -
Start the dev server:
bun run dev
-
Open http://localhost:3000.
| Command | Description |
|---|---|
bun run dev |
Start Next.js dev server |
bun run build |
Production build |
bun run start |
Run production server |
bun run lint |
Run ESLint |
| Variable | Required | Purpose |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL |
Yes | Supabase project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY or NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY |
Yes | Client-side auth and data access |
SUPABASE_SERVICE_ROLE_KEY |
For public shares | Server-only; used by /share/{token} SSR. Never expose as a NEXT_PUBLIC_* variable. |
NEXT_PUBLIC_SITE_URL |
Recommended | App origin for OAuth redirects and share links (e.g. http://localhost:3000 locally; your domain in production) |
See .env.example for placeholders.
Security: Do not commit .env.local, service role keys, OAuth secrets, agent notes, or real user data.
All SQL is applied manually in the Supabase SQL editor. Nothing in this repo connects to or runs against your project automatically.
Run docs/supabase-schema.sql first. It creates the core workspace/board tables, RLS policies, and the private kanbanish-attachments Storage bucket.
Apply these in the SQL editor when setting up a new project or updating an existing one:
| File | Purpose |
|---|---|
docs/supabase-blank-workspaces-patch.sql |
New workspaces start blank (no seeded demo columns) |
docs/supabase-workspace-shares-token-patch.sql |
Share token constraint + service_role grants for public share pages |
docs/supabase-comment-added-patch.sql |
Extend card activity event types for comments |
docs/supabase-celebration-confetti-patch.sql |
Confetti preference column on user_preferences |
docs/supabase-card-activity-prune-patch.sql |
Lock down prune_card_activity_events() RPC |
docs/supabase-demo-user-seed.sql |
Optional dev demo seed (replace placeholder user ID) |
- Email/password sign-in works once you create a user in Supabase Auth (dashboard or SQL).
- Google OAuth is optional: enable the Google provider in Supabase Auth if you want the "Continue with Google" button.
- Add redirect URLs for each environment, e.g.
http://localhost:3000/auth/callback.
The core schema defines kanbanish-attachments (private). The app also expects:
workspace-assets— public bucket for workspace logo and background images (displayed via public URLs)user-avatars— private bucket for profile avatars
These buckets and their policies are not yet fully defined in repo SQL. You will need to create them in the Supabase dashboard or add DDL in a follow-up schema update.
The app also uses profiles, user_preferences, workspace_shares, and card_activity_events. Some patch files assume these tables already exist. A consolidated bootstrap SQL file is planned; until then, refer to the queries in lib/supabase/ for the expected shape.
Public share pages (/share/{token}) require SUPABASE_SERVICE_ROLE_KEY on the server. Run docs/supabase-workspace-shares-token-patch.sql so service_role can read activity and attachment metadata.
app/ Routes: board (/), login, public share, auth callback, account delete API
components/ Kanban board, columns, cards, inspector, settings, UI primitives
lib/supabase/ Board sync, attachments, profiles, public share SSR
lib/ Types, helpers, celebration effects
docs/ Supabase SQL (manual paste only)
Deploy as a standard Next.js application on your host. Set the environment variables from .env.example and configure Supabase Auth redirect URLs for your domain.
Kanbanish is licensed under the GNU General Public License v3.0.
Pull requests are welcome. Use Bun for install and scripts, stick to Tailwind color tokens for styling, and apply Supabase SQL changes manually in your own project (nothing in this repo runs migrations against a hosted database).
Keep secrets, production credentials, .env.local, and real user data out of the repository.



