A community site for browsing and downloading Moza sim racing wheel presets, built with Next.js, Supabase, and Tailwind CSS. Deployed for free on Vercel.
- Go to supabase.com and create a free account + new project.
- Open the SQL Editor and run the contents of
supabase-setup.sqlto create the tables and helper function. - Go to Storage → New bucket, name it
presets, and leave it as private. - In the storage bucket, go to Policies and add a policy for the service role:
- Name:
Service role full access - Operations: ALL
- Role:
service_role
- Name:
cp .env.local.example .env.localThen fill in all four values in .env.local:
| Variable | Where to find it |
|---|---|
NEXT_PUBLIC_SUPABASE_URL |
Supabase → Settings → API → Project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY |
Supabase → Settings → API → anon public key |
SUPABASE_SERVICE_ROLE_KEY |
Supabase → Settings → API → service_role key |
ADMIN_PASSWORD |
Choose anything — this is what you type at /admin |
ADMIN_SECRET |
A long random string — run openssl rand -hex 32 |
npm install
npm run devOpen http://localhost:3000.
- Push the project to a GitHub repository.
- Go to vercel.com, import the repo, and deploy.
- In Vercel → your project → Settings → Environment Variables, add all five variables from
.env.local. - Redeploy once the variables are saved.
| Route | Description |
|---|---|
/ |
Public browse page — search, filter, download |
/preset/[id] |
Preset detail page with rating widget |
/admin |
Admin login |
/admin/upload |
Upload a new preset file |
/admin/presets |
Edit or delete existing presets |
Open lib/types.ts and add entries to the WHEELBASES or GAMES arrays. They'll automatically appear in all dropdowns and filters.
- Next.js 16 (App Router, TypeScript)
- Tailwind CSS v3
- Supabase (PostgreSQL + Storage)
- Vercel (hosting + serverless functions)
The public /upload page is protected by Cloudflare Turnstile, which is free with no usage limits.
- Go to dash.cloudflare.com and sign up / log in
- Navigate to Turnstile in the left sidebar
- Click Add site
- Give it a name (e.g. "PitHouse Presets"), enter your domain, choose Managed widget type
- Copy the Site Key →
NEXT_PUBLIC_TURNSTILE_SITE_KEYin your.env.local - Copy the Secret Key →
TURNSTILE_SECRET_KEYin your.env.local - Add both keys to Vercel's environment variables when deploying
For local development, Turnstile provides a set of dummy keys that always pass — use 1x00000000000000000000AA as the site key and 1x0000000000000000000000000000000AA as the secret key in .env.local only.