A modern, lightweight web-based Kanban board management application built with React and Supabase.
- User Authentication - Secure email/password authentication with Supabase Auth
- Multi-Board Management - Create and manage multiple Kanban boards
- Flexible Task Management - Create, edit, and organize tasks across customizable columns
- Drag & Drop - Intuitive drag-and-drop interface for task organization
- Real-time Collaboration - Live updates across all connected clients
- Task Details - Rich task information including:
- Priority levels (Low, Medium, High, Urgent)
- Due dates and start dates
- Task descriptions
- Tags and labels
- Comments
- Email Reminders - Automated email notifications for task deadlines
- Statistics Dashboard - Visual insights into task completion and productivity
- Modern, responsive UI built with Tailwind CSS
- Clean, intuitive interface with minimal learning curve
- Mobile-friendly design
- Dark mode support (via next-themes)
- React 18 - UI framework with latest concurrent features
- TypeScript 5.6 - Type-safe development
- Vite 6 - Fast build tool and dev server
- Tailwind CSS - Utility-first CSS framework
- shadcn/ui - High-quality UI components (Radix UI primitives)
- @dnd-kit - Modern drag-and-drop toolkit
- Zustand - Lightweight state management
- React Router v6 - Client-side routing
- React Hook Form + Zod - Form handling and validation
- PostgreSQL - Robust relational database
- Supabase Auth - Authentication and user management
- Row Level Security (RLS) - Database-level security policies
- Realtime Subscriptions - Live data synchronization
- Edge Functions - Serverless functions for email reminders and cron jobs
- Node.js 18+ (LTS recommended)
- pnpm 8+ (package manager)
- Supabase Account - For backend services
git clone https://github.com/zhouhao/kanban-supabase.git
cd kanban-supabase/xiandan-kanban-apppnpm installCreate a .env file in the project root:
VITE_SUPABASE_URL=your_supabase_project_url
VITE_SUPABASE_ANON_KEY=your_supabase_anon_key
VITE_SUPABASE_PUBLISHABLE_KEY=your_supabase_publishable_keyTo get these credentials:
- Create a project at supabase.com
- Go to Project Settings > API
- Copy the Project URL and anon/public key
Run the migrations in your Supabase project:
- Go to the SQL Editor in your Supabase dashboard
- Execute the migration files in order from
supabase/migrations/:1764397628_create_core_tables.sql1764397678_enable_rls_policies.sql1764397719_enable_realtime_and_functions.sql1764399216_create_user_profile_trigger.sql1764399316_create_task_comments_and_reminders.sql1764401189_simplify_rls_policies.sql
pnpm devThe application will be available at http://localhost:5173
# Install dependencies
pnpm install
# Start development server (with auto-install)
pnpm dev
# Build for production
pnpm build:prod
# Build for development
pnpm build
# Lint code
pnpm lint
# Preview production build
pnpm preview
# Clean dependencies and cache
pnpm cleanNote: All scripts automatically run pnpm install --prefer-offline before execution to ensure dependencies are up-to-date.
src/
├── components/
│ ├── Auth/ # Authentication pages (Login, Register)
│ ├── Board/ # Board view and task components
│ ├── Dashboard/ # Dashboard and statistics
│ └── ui/ # Reusable UI components (shadcn/ui)
├── stores/ # Zustand state management
│ ├── authStore.ts # Authentication state
│ ├── boardStore.ts # Boards and columns state
│ └── taskStore.ts # Tasks state
├── lib/
│ ├── supabase.ts # Supabase client and type definitions
│ └── utils.ts # Utility functions
├── hooks/ # Custom React hooks
├── App.tsx # Main app component with routing
└── main.tsx # Application entry point
supabase/
├── functions/ # Edge Functions (email reminders, cron jobs)
└── migrations/ # Database schema migrations
The application uses Zustand for state management with three main stores:
- authStore - User authentication and profile management
- boardStore - Board and column CRUD operations with realtime subscriptions
- taskStore - Task CRUD operations with realtime subscriptions
Each store follows a consistent pattern:
- Async methods for Supabase operations
- Loading and error states
- Real-time subscription management
- Automatic local state updates
The application uses Supabase Realtime for live collaboration:
- Column Updates - Changes to columns are instantly reflected across all clients
- Task Updates - Task creation, updates, and deletion sync in real-time
- Automatic Subscription - Components subscribe on mount and unsubscribe on unmount
Core tables:
user_profiles- User metadata and preferencesboards- Kanban boardscolumns- Board columns with positioningtasks- Task cards with full detailstask_tags- Tags for categorizing taskstask_comments- Comments on tasksreminders- Email reminder scheduling
All tables use Row Level Security (RLS) to ensure users can only access their own data.
pnpm buildIncludes source identifiers for debugging (data-matrix-* attributes)
pnpm build:prodOptimized build without debug attributes
- Connect your repository to Vercel
- Set the root directory to
xiandan-kanban/xiandan-kanban-app - Add environment variables:
VITE_SUPABASE_URLVITE_SUPABASE_ANON_KEYVITE_SUPABASE_PUBLISHABLE_KEY
- Deploy
All static hosting platforms that support Vite are compatible.
The backend is already hosted on Supabase Cloud. For edge functions:
# Install Supabase CLI
npm install -g supabase
# Login
supabase login
# Link project
supabase link --project-ref your-project-ref
# Deploy functions
supabase functions deploy| Variable | Description | Required |
|---|---|---|
VITE_SUPABASE_URL |
Your Supabase project URL | Yes |
VITE_SUPABASE_ANON_KEY |
Your Supabase anonymous key | Yes |
VITE_SUPABASE_PUBLISHABLE_KEY |
Your Supabase publishable key | Yes |
- Chrome/Edge (latest)
- Firefox (latest)
- Safari (latest)
- Mobile browsers (iOS Safari, Chrome Mobile)
Use @/ to import from src/:
import { supabase } from '@/lib/supabase'
import { useAuthStore } from '@/stores/authStore'- TypeScript strict mode enabled
- ESLint for code quality
- Consistent naming conventions (see CLAUDE.md)
- Define TypeScript types in
src/lib/supabase.ts - Create/update Zustand store in
src/stores/ - Add database migration if needed
- Create React components
- Update routing if necessary
# Clear cache and reinstall
pnpm clean
pnpm install- Verify environment variables are set correctly
- Check browser console for errors
- Ensure
authStore.initialize()is called inApp.tsx
- Check Supabase Realtime is enabled for your tables
- Verify RLS policies allow SELECT operations
- Ensure subscription cleanup on component unmount
Additional documentation is available in the docs/ directory:
- Technical Architecture
- Feature Requirements
- Database & API Design
- UI/UX Guidelines
- Email System Design
MIT
For issues and questions, please check:
- Existing GitHub issues
- Supabase documentation: https://supabase.com/docs
- React documentation: https://react.dev
Built with ❤️ using React and Supabase