| Service | How to run | Port |
|---|---|---|
| Supabase stack (Postgres, Auth, PostgREST, Storage, pgmq) | sudo supabase start from repo root (Docker; start the daemon first with sudo service docker start if needed) |
54321 (API), 54322 (DB), 54323 (Studio) |
Next.js app (apps/cursor) |
bun dev from apps/cursor (see README and apps/cursor/package.json for standard commands: lint, typecheck, seed:*) |
3000 |
Lint from repo root: bunx biome ci . (matches CI in .github/workflows/ci.yml). There is no automated test suite.
bunis installed via npm into~/.local/bin(onPATHvia~/.bashrc); the standalone bun.sh installer is blocked by the network egress policy.- The repo's dated migrations assume a pre-existing hosted base schema.
supabase/migrations/00000000000000_local_base_schema.sqlreconstructs it (tables, signup trigger, slug triggers,pgmq_publicwrappers, storage policies) so a freshsupabase start/supabase db resetworks locally. It is guarded to be a no-op where objects already exist. - App env lives in
apps/cursor/.env(gitignored). For local dev it uses the Supabase CLI's well-known local default keys (supabase statusprints them) withNEXT_PUBLIC_SUPABASE_URL=http://127.0.0.1:54321.CRON_SECRETguards/api/queue/plugin-scans/drainand/api/cron/*. - The login page only offers GitHub/Google OAuth, which are not configured locally. Create a confirmed user via the GoTrue admin API (
POST {SUPABASE_URL}/auth/v1/admin/userswith the secret key,"email_confirm": true); a DB trigger provisions thepublic.usersprofile row. To get a browser session, add a temporary route that callssupabase.auth.signInWithPassword(...)with the server client (do not commit it). Put the user's id inADMIN_USER_IDS/NEXT_PUBLIC_ADMIN_USER_IDSto use/admin/plugins. - Cache Components (
cacheComponents: true) makes pages withgenerateStaticParamsthrow 500 on an empty database — seed at least one active plugin. Usebun run seed:extract/seed:insert, but note: the insert script must be run asbun run --conditions=react-server --env-file=apps/cursor/.env apps/cursor/src/scripts/insert-from-jsonl.tsor theserver-onlyimport throws under plainbun run. GitHub Code Search (used byseed:extractdiscovery) is heavily rate-limited; hand-writingapps/cursor/.seed/candidates.jsonwith{"candidates":[{"owner":...,"repo":...,"source":"seed:topic","matchedQuery":"manual"}]}skips discovery. - Seeded plugin logos hosted on
raw.githubusercontent.com500 plugin pages because that host is not innext.config.mjsimages.remotePatterns; null them:update plugins set logo = null where logo like 'https://raw.githubusercontent.com%'. - After changing
.envor database content backing cached pages, restartbun dev(andrm -rf apps/cursor/.nextif stale renders persist) — hot reload does not invalidate Cache Components output. - Without
CURSOR_API_KEY, plugin submission works but the security scan errors (plugin lands in the admin "Scan issues" queue, where an admin can publish it manually). This is expected locally. - Supabase
edge_runtimeis disabled insupabase/config.toml(no edge functions in this app; its boot probe needs deno.land which is blocked).