Local setup

Get the platform running

Seven steps. Public pages come up after step five; the Passport and BEAT matching need Clerk.

  1. Convex

    Provisions the database and deploys the functions. Leave it running while you work. It hot-reloads the backend.

    npx convex dev
  2. Clerk

    Create an application at dashboard.clerk.com, then add a JWT template named exactly `convex`. Copy the Frontend API URL it shows you.

    # .env.local
    NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_...
    CLERK_SECRET_KEY=sk_test_...
  3. Tell Convex which Clerk instance to trust

    Convex verifies the Clerk JWT against this issuer. Without it, every authenticated call fails.

    npx convex env set CLERK_JWT_ISSUER_DOMAIN https://your-instance.clerk.accounts.dev
  4. Anthropic

    Powers résumé parsing, match explanations, action plans, and analyst drafts. Everything else works without it.

    npx convex env set ANTHROPIC_API_KEY sk-ant-...
  5. Seed the taxonomy and launch data

    Loads the Creative Economy taxonomy, career pathways, seed opportunities, data sources, sector outlooks, and industry signals.

    npx convex run seed:run
  6. Grant yourself analyst access

    Sign in through the app first so your user record exists, then run this. Privileged roles are never self-assignable through the UI.

    npx convex run seed:setRole '{"email":"you@example.com","role":"analyst"}'
    npx convex run seed:run  # re-run to attach seeded interpretations
  7. Start the app

    The public pages work as soon as Convex is seeded. The member area needs Clerk.

    npm run dev

Reference

Where things live

convex/schema.ts
The canonical data model: every object in the spec
convex/lib/beat.ts
The BEAT scoring engine. Pure functions, no I/O
convex/matching.ts
Builds candidate profiles and runs matching
convex/ai.ts
Anthropic calls, all recorded in aiInvocations
convex/seed.ts
Taxonomy, pathways, opportunities, signals
Grilled.md
Goal, scope, stack decisions, and open questions