Premium paid intake → processing → ATS assets → dashboard → admin approval.
- Install deps:
npm install
- Copy env template:
cp .env.local.example .env.local
- Env vars (local
.env.local):
SUPABASE_URL=
SUPABASE_SERVICE_ROLE_KEY=
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
NEXT_PUBLIC_APP_URL=http://localhost:3000
STRIPE_SECRET_KEY=
STRIPE_WEBHOOK_SECRET=
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=
STRIPE_PRICE_JOB_RADAR_49=
STRIPE_PRICE_GHOST_PROOF_99=
STRIPE_PRICE_INTERVIEW_BOOST_149=
STRIPE_PRICE_RAPID_LITE_199=
STRIPE_PRICE_PIVOT_PACK=
STRIPE_PRICE_OFFER_REPORT_399=
STRIPE_PRICE_OFFER_SPRINT_599=
RESEND_API_KEY=
ADMIN_EMAILS=
JOB_PIPELINE_SECRET=
OPENAI_API_KEY=
STRIPE_DISABLED=true
ADMIN_BYPASS=true
DEBUG_UI_PASSWORD=
JOB_SEED_URLS=
QC_AUTO_SHIP_THRESHOLD=0.82
QC_PREMIUM_ALWAYS_REVIEW=true
- Apply SQL migrations in Supabase:
supabase/migrations/001_job_sourcing.sqlsupabase/migrations/002_mvp_orders.sqlsupabase/migrations/003_candidates.sqlsupabase/migrations/004_pricing_tiers.sqlsupabase/migrations/005_qc_results.sqlsupabase/migrations/006_intake_outputs.sqlsupabase/migrations/007_pivot_pathways.sql
- Create storage buckets in Supabase:
reportsintakes
- Run the setup helper:
npm run setup:dev
Optional migration list:
npm run db:print-migrations
- Run dev:
npm run dev
- POST
/api/stripe/checkoutwith{ "tierId": "job_radar" | "ghost_proof_list" | "interview_boost_kit" | "rapid_offer_lite" | "pivot_pack" | "offer_farming_report" | "offer_sprint" } - If
STRIPE_DISABLED=true, you are redirected to/intake?dev=1.
curl -X POST http://localhost:3000/api/intake/submit \
-F session_id=dev-session \
-F tier=rapid \
-F full_name="Jordan Lane" \
-F email="jordan@example.com" \
-F target_titles="RevOps Manager, BizOps" \
-F seniority=Manager \
-F remote_only=true \
-F contract_ok=false \
-F resume=@/path/to/resume.pdf
- Login via
/login(magic link) - Visit
/dashboard
- Enable Email provider.
- Site URL:
http://localhost:3000 - Redirect URLs:
http://localhost:3000/**
- Create one Price per tier in Stripe.
- Paste each Price ID into the matching
STRIPE_PRICE_*env var. - Create products + prices (idempotent):
STRIPE_SECRET_KEY=... npm run stripe:create-tiers
/adminis gated byADMIN_EMAILSorADMIN_BYPASS=true.
/debug/jobs(disabled in production unlessDEBUG_UI_PASSWORDset)- Click “Create test candidate” to generate a UUID (requires
JOB_PIPELINE_SECRET).
- Default seeds live in
lib/jobs/seeds.ts. - Override with
JOB_SEED_URLS(comma-separated ATS boards). - Seeds are deduped automatically.
{
"skills": ["SQL", "Tableau", "Salesforce"],
"tools": ["Excel", "Snowflake"],
"roles": ["RevOps Manager"],
"seniority": "manager",
"industries": ["SaaS"],
"keywords": ["pipeline", "forecasting"],
"locations": ["Remote"],
"achievements": ["Grew ARR 20% in 12 months"]
}
- 401 Unauthorized: set
JOB_PIPELINE_SECRETand includex-job-pipeline-secret. - No jobs returned: add ATS seeds in
JOB_SEED_URLSor relax preferred titles. - Report generation slow: reduce
JOB_DISCOVERY_MAXor run in background.