A web app for writing Bisaya rap bars. AI-assisted lyric editor with beat linking, verse snippet management, and a built-in Cebuano thesaurus.
| Layer | Technology | Version |
|---|---|---|
| Framework | Next.js (App Router) | 16.2.1 |
| Runtime | React | 19.2.4 |
| Language | TypeScript | ^5.9.3 |
| Styling | Tailwind CSS | ^4.2.2 |
| UI Components | shadcn/ui (new-york) + Radix UI | shadcn ^4.1.1 / radix-ui ^1.4.3 |
| Server State | TanStack Query v5 | ^5.95.2 |
| Forms | React Hook Form | ^7.72.0 |
| Validation | Zod | ^4.3.6 |
| Backend / Auth | Supabase (Auth · Postgres · Storage · Realtime) | supabase-js ^2.101.0 |
| AI | Vercel AI SDK (Google Gemini + Groq fallback) | ai ^6.0.141 |
| Thesaurus | @junsayke/cebuano-thesaurus (GitHub Packages) | ^1.3.1 |
| API Mocking | MSW | ^2.12.14 |
| Package Manager | pnpm | 10.26.1 |
| Node.js | — | v20+ |
These accounts are for the local prototype only. Register them manually via
/signupafter runningpnpm supabase db reset, or add them through Supabase Studio at http://localhost:54323.
This app has a single user type — all authenticated users have the same level of access.
| # | Display Name | Password | |
|---|---|---|---|
| 1 | Demo User | demo@bars.local |
Demo1234! |
| 2 | Test Rapper | rapper@bars.local |
Rapper1234! |
Note: No seed file is committed. Create these accounts manually through the signup page or Supabase Studio → Authentication → Users → Add User.
Prerequisites: Node.js v20+, pnpm v10+, Docker Desktop
The Cebuano thesaurus is hosted on GitHub Packages. Create a .npmrc file in the project root:
@junsayke:registry=https://npm.pkg.github.com
//npm.pkg.github.com/:_authToken=<your-github-pat>
Generate a PAT at GitHub → Settings → Developer settings → Personal access tokens with the read:packages scope.
.npmrcis gitignored — never commit it.
pnpm installDocker Desktop must be running.
pnpm supabase startAfter startup, the CLI prints your local API URL and anon key. Copy them.
Apply all migrations:
pnpm supabase db resetcp .env.example .env.localEdit .env.local:
NEXT_PUBLIC_SUPABASE_URL=http://localhost:54321
NEXT_PUBLIC_SUPABASE_ANON_KEY=<anon key from supabase start>
# Set to `enabled` to use MSW mocks instead of real Supabase calls
NEXT_PUBLIC_API_MOCKING=disabled
# AI feedback — at least one key required
GOOGLE_GENERATIVE_AI_API_KEY=<from https://aistudio.google.com>
GROQ_API_KEY=<from https://console.groq.com>pnpm devOpen http://localhost:3000.
| Route | Notes |
|---|---|
/login |
Sign in |
/signup |
Register a new account |
/workspaces |
Session list (requires login) |
/workspaces/editor |
Bar editor (requires login) |
/settings/profile |
Profile settings (requires login) |
| Supabase Studio | http://localhost:54323 |
Push to GitHub and import the repo in your Vercel dashboard.
Go to Project → Settings → Environment Variables and add:
| Variable | Value |
|---|---|
NEXT_PUBLIC_SUPABASE_URL |
Your Supabase project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY |
Your Supabase anon key |
NEXT_PUBLIC_API_MOCKING |
disabled |
GOOGLE_GENERATIVE_AI_API_KEY |
(optional, recommended) |
GROQ_API_KEY |
(optional, fallback AI) |
For the private package registry on Vercel, add
NPM_RCas an environment variable containing the contents of your.npmrcfile, or configure it invercel.json.
pnpm build # Verify build locally firstThen push to your main branch — Vercel deploys automatically.
pnpm dev # Start Next.js dev server (http://localhost:3000)
pnpm build # Production build
pnpm lint # Run ESLint
pnpm supabase start # Start local Supabase stack (requires Docker)
pnpm supabase stop # Stop local Supabase
pnpm supabase db reset # Re-apply all migrations
pnpm supabase gen types typescript --local > src/shared/types/database.types.ts