An open-source feedback board built with Next.js 14+, Supabase, and shadcn/ui. A credible alternative to Canny for collecting feature requests and user feedback.
- Multiple boards per instance
- Post creation with title + description
- One-click upvoting (one vote per user per post)
- Comments on posts
- Status labels: Idea, Under Review, Planned, In Progress, Complete, Closed
- Roadmap view — Kanban board grouped by status
- Sort posts by votes, newest, oldest
- Auth via GitHub & Google OAuth (Supabase Auth)
- Admin panel — board creators can manage post statuses
- Dark mode
- Responsive / mobile-ready
- Row Level Security — all data access controlled at the database level
git clone <your-repo-url> feedback-board
cd feedback-board
npm install-
Create a new project at supabase.com
-
Go to SQL Editor and run the migration file:
supabase/migrations/001_initial_schema.sqlThis creates all tables, indexes, RLS policies, and triggers.
-
Go to Authentication > Providers and enable:
- GitHub — add your GitHub OAuth app credentials
- Google — add your Google OAuth credentials
-
In Authentication > URL Configuration, add your redirect URL:
http://localhost:3000/auth/callback
Copy the example env file and fill in your Supabase credentials:
cp .env.example .env.localEdit .env.local:
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
You can find these in your Supabase project under Settings > API.
npm run devOpen http://localhost:3000.
| Variable | Description |
|---|---|
NEXT_PUBLIC_SUPABASE_URL |
Your Supabase project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY |
Your Supabase anonymous/public key |
feedback-board/
├── app/ # Next.js App Router pages
│ ├── page.tsx # Home — list all boards
│ ├── login/page.tsx # Login page (OAuth)
│ ├── auth/callback/route.ts # OAuth callback handler
│ ├── board/[slug]/ # Board pages
│ │ ├── page.tsx # Board — list posts
│ │ ├── new/page.tsx # New post form
│ │ ├── post/[id]/page.tsx # Post detail + comments
│ │ └── roadmap/page.tsx # Roadmap (Kanban)
│ └── admin/ # Admin pages
├── components/ # React components
│ ├── ui/ # shadcn/ui primitives
│ ├── layout/ # Header, footer, theme toggle
│ ├── auth/ # Login button, user menu
│ ├── board/ # Board card, create dialog
│ ├── post/ # Post card, list, form, vote button
│ ├── comment/ # Comment list, form
│ ├── roadmap/ # Kanban board
│ └── status/ # Status badge
├── lib/
│ ├── supabase/ # Supabase client utilities
│ ├── actions/ # Server actions
│ └── types/ # TypeScript type definitions
├── supabase/migrations/ # SQL migration files
└── middleware.ts # Auth session refresh
- Push your code to GitHub
- Import the repository on Vercel
- Add environment variables in the Vercel dashboard
- Update the Supabase redirect URL to your production domain:
https://your-domain.com/auth/callback
- Next.js — React framework (App Router)
- Supabase — Postgres database + Auth
- shadcn/ui — UI components
- Tailwind CSS — Styling
- TypeScript — Type safety
- Fork the repository
- Create a feature branch:
git checkout -b feature/my-feature - Commit your changes:
git commit -m 'Add my feature' - Push to the branch:
git push origin feature/my-feature - Open a Pull Request
MIT