Upstack is a high-performance feature request and upvoting platform built for product teams to prioritize what to build next. It allows customers and team members to submit ideas, vote on their favorites, and participate in the product development lifecycle through a transparent feedback loop.
- Team Management: Robust multi-tenant support where team leads and global admins can manage members, invites, and team settings.
- Feature Requests: Simple yet powerful submission flow for new ideas with categorization and status tracking.
- Upvoting System: Intelligent voting system that prevents duplicate votes and highlights the most supported ideas.
- Discussion Threads: Nested commenting system for each feature request to foster deep collaboration.
- Role-Based Access: Granular security model with Leads, Members, and Global Admins powered by Supabase RLS.
- Dynamic Dashboard: Real-time filtering and sorting of ideas based on status, category, and popularity.
- Framework: TanStack Start (Full-stack React framework with SSR)
- Language: TypeScript with Bun as the primary runtime/package manager
- Frontend: React 19, TanStack Router, TanStack Query
- Database: Supabase (PostgreSQL + PostgREST)
- Security: Supabase Auth + Row Level Security (RLS)
- Styling: Tailwind CSS v4, shadcn/ui (Radix UI)
- Icons: Lucide React
- Deployment: Vercel (Recommended)
- Bun (v1.x recommended)
- Supabase CLI (for local database development)
- A Supabase Project (for API keys)
git clone <repository-url>
cd remix-of-upvote
bun installCopy the example environment file and fill in your Supabase credentials:
cp .env .env.localRequired variables:
| Variable | Description |
|---|---|
VITE_SUPABASE_URL |
Your Supabase project URL |
VITE_SUPABASE_PUBLISHABLE_KEY |
Your Supabase anon/public key |
Initialize the local Supabase environment (optional if using a remote instance):
supabase start
supabase db pushbun devOpen http://localhost:8080 to view the application.
Upstack utilizes a decentralized data flow where the frontend communicates directly with Supabase via PostgREST. Security is enforced at the database layer using Row Level Security (RLS).
- User interacts with a TanStack Router protected route.
- Data is fetched/mutated via TanStack Query calling the Supabase Client.
- Supabase RLS verifies the user's role (
lead/member) and team membership. - Server response is rendered with SSR via TanStack Start.
| Table | Description |
|---|---|
profiles |
User profile data (name, email, avatar) linked to Auth. |
teams |
Team metadata including name and invite_code. |
team_members |
Join table for users and teams with role (lead/member). |
feature_requests |
Core data for ideas (title, description, status). |
votes |
Atomic records of user support for specific requests. |
comments |
User feedback threads for specific requests. |
user_roles |
Global system roles (e.g., global admin). |
The project is optimized for deployment on Vercel.
- Connect your repository to Vercel.
- The build command should be
bun run build. - The output directory is automatically detected.
Built with ❤️ by the Upstack Team.