A full-featured project management app (Asana clone) built with Next.js 14, Supabase, Tailwind CSS, and shadcn/ui.
- Workspaces & Teams -- Create organizations, invite members, manage roles
- Projects -- Color-coded projects with multiple views and sections
- Task Management -- Create, assign, prioritize, and track tasks with subtasks
- Multiple Views -- List, Board (Kanban), Calendar, Timeline/Gantt, and Overview
- My Tasks -- Personal task dashboard with sorting and filtering
- Collaboration -- Comments on tasks, activity logging, file attachments
- Real-time Notifications -- Live inbox with assignment, comment, and mention alerts
- Search -- Global search across projects and tasks (Cmd+K)
- Dark Mode -- Full light/dark theme support
- Row Level Security -- All data access enforced at the database level
- Framework: Next.js 14 (App Router, Server Components, Server Actions)
- Database & Auth: Supabase (PostgreSQL, Auth, Storage, Realtime)
- Styling: Tailwind CSS 3 + shadcn/ui components
- State Management: Zustand
- Language: TypeScript
cd teamwork
npm install- Go to supabase.com/dashboard and create a new project
- Note your Project URL and anon public key from Settings > API
Edit .env.local in the project root:
NEXT_PUBLIC_SUPABASE_URL=https://your-project-id.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key-hereOpen the SQL Editor in your Supabase dashboard and run each migration file in order:
supabase/migrations/001_foundation.sql-- Profiles, auth triggerssupabase/migrations/002_workspaces_teams.sql-- Workspaces, teams, invitations, RLS helperssupabase/migrations/003_projects.sql-- Projects, sections, favorites, labelssupabase/migrations/004_tasks.sql-- Tasks, subtasks, followers, full-text searchsupabase/migrations/005_my_tasks.sql-- Personal task sectionssupabase/migrations/006_collaboration.sql-- Comments, activity log, attachmentssupabase/migrations/007_notifications.sql-- Notifications, realtime
Tip: Copy-paste each file's contents into the SQL Editor and click Run. They must be run sequentially since later migrations reference earlier tables.
In your Supabase dashboard, go to Storage and create two buckets:
| Bucket | Public | Notes |
|---|---|---|
avatars |
Yes | For user profile pictures (set 2MB file size limit, images only) |
attachments |
No | For task file attachments (set 50MB file size limit) |
In your Supabase dashboard, go to Database > Replication and enable realtime for the notifications table (this may already be done by migration 007).
npm run devOpen http://localhost:3000 in your browser.
npm run build
npm startnpm run lintOnce the dev server is running, follow these steps to verify each feature:
- Go to localhost:3000/signup and create an account
- Check your email for the confirmation link (or disable email confirmation in Supabase Auth settings for faster testing)
- Log in at localhost:3000/login
- Verify you're redirected to
/home
- On first login you'll need to create a workspace (Settings > Workspace)
- Invite a second user via email from Settings > Members
- Verify the invited user can accept and see the workspace
- Click + New Project in the sidebar or go to
/projects/new - Choose a name, color, and default view
- Verify the project appears in the sidebar
- Open a project and click + Add task at the bottom of any section
- Create a few tasks, try inline editing the title
- Click a task to open the detail panel -- set assignee, due date, priority, description
- Create subtasks within the detail panel
- Mark tasks as complete using the checkbox
- In a project, click the Board tab
- Verify tasks appear as cards in columns (one per section)
- Drag cards between columns
- Click the Calendar tab
- Verify tasks with due dates appear on the correct days
- Navigate between months
- Click the Timeline tab
- Verify tasks with start/due dates render as horizontal bars
- Go to My Tasks in the sidebar
- Verify all tasks assigned to you appear
- Try sorting by due date, priority, or project
- Open a task's detail panel
- Add a comment in the comment section
- Verify the comment appears immediately
- Assign a task to another user
- The other user should see a notification badge on the bell icon
- Click the bell or go to Inbox to view notifications
- Click Mark all as read
- Press Cmd+K (or click the search icon in the top bar)
- Type a project or task name
- Verify results appear and clicking them navigates correctly
- Click the theme toggle (sun/moon icon) in the top bar
- Verify the entire UI switches themes
teamwork/
├── app/
│ ├── (auth)/ # Login, signup, forgot password (no sidebar)
│ ├── (dashboard)/ # Authenticated pages (with sidebar)
│ │ ├── home/
│ │ ├── my-tasks/
│ │ ├── inbox/
│ │ ├── search/
│ │ ├── projects/
│ │ ├── teams/
│ │ └── settings/
│ ├── layout.tsx # Root layout with ThemeProvider
│ └── globals.css # CSS variables and theme tokens
├── components/
│ ├── ui/ # 22 shadcn/ui primitives
│ ├── layout/ # Sidebar, TopBar, WorkspaceSwitcher
│ ├── auth/ # LoginForm, SignupForm
│ ├── tasks/ # TaskRow, TaskDetailPanel, TaskListView
│ ├── projects/ # ProjectHeader, SectionHeader, ProjectOverview
│ ├── board/ # BoardView, BoardColumn, BoardCard
│ ├── calendar/ # CalendarView
│ ├── timeline/ # TimelineView
│ ├── collaboration/ # CommentSection
│ ├── inbox/ # InboxView
│ └── common/ # AssigneePicker, DatePicker, PriorityPicker
├── lib/
│ ├── supabase/ # Browser, server, and middleware clients
│ ├── actions/ # 9 server action files
│ ├── hooks/ # Realtime subscriptions
│ ├── stores/ # Zustand stores (sidebar, task detail, workspace)
│ ├── types/ # Database types
│ └── utils.ts # cn() helper
├── supabase/migrations/ # 7 SQL migration files
├── middleware.ts # Auth session refresh + route protection
└── .env.local # Supabase credentials
This project is licensed under the MIT License.