Local Dev Setup (new contributors)
Get the app running locally without any production secrets. You use your
own free Supabase project as a sandbox; we never pass the real .env around
(it holds live service-role + API keys — sharing those in chat is a leak). See
SECRETS_HANDLING.md for what's secret vs public and why.
1. Clone + install
git clone --recurse-submodules <repo-url>
cd hivejournal-2026
npm install # installs both apps (workspaces)
2. Your own Supabase project
- Create a free project at supabase.com.
- Grab your keys from Project Settings → API: the project URL, the
anonkey (public), theservice_rolekey (secret), and the JWT secret.
Never use the production project (
pfyocleyejmtxmbxrdcm…) for local dev. Your own project is your sandbox — break it freely.
2a. Apply the schema — use the CLI, don't hand-run the files
There are 300+ migration files in .
Don't paste them into the SQL Editor one by one — it's slow and a few older
ones can fail out of order on a fresh DB. Let the Supabase CLI apply them all,
in order:supabase/migrations/
brew install supabase/tap/supabase # or: npm i -g supabase
supabase login
supabase link --project-ref <your-project-ref> # YOUR sandbox, never prod
supabase db push # applies supabase/migrations/ in order
(<your-project-ref> is the slug in your project URL: https://<ref>.supabase.co.)
Do you need the full schema? Those 300+ migrations build every feature on the platform; a given task usually touches a handful of tables.
- Public / unauthenticated page, or a pure component? You can often skip the database — the app boots and you build the UI against empty or mocked data. Frontend acceptance is
npm run check+npm run build+ the visual result.- Authenticated page (anything under
/dashboard)? You still need the schema stood up to log in — signup writes aprofilesrow via a trigger defined in the migrations. Runsupabase db pushonce; logging in then works. You can still mock the page's own data in the component to render states that are hard to create by hand (e.g. every status badge) — revert the mock before committing.- Either way, ask in your issue which tables/data your task actually needs.
3. Environment files
Each app has a documented template. Copy and fill in:
cp apps/backend/.env.example apps/backend/.env
cp apps/frontend/.env.example apps/frontend/.env.local
- Backend (
apps/backend/.env.example) — the ~6 vars under "MINIMAL TO BOOT" (Supabase URL/keys + the localhost URLs) are all you need to start. Everything else gates a specific integration (OpenAI, Stripe, Resend, …) and can stay blank until you work on it. SetDISABLE_CRONS=trueso background jobs stay quiet while you develop. - Frontend (
apps/frontend/.env.example) — 4 vars to boot (your Supabase URL + anon key, the API URL, the site URL).NEXT_PUBLIC_*values are baked into the browser bundle, so they're public by definition — never hide a secret behind that prefix.
Feature-specific third-party keys (OpenAI, ElevenLabs, Stripe, etc.) are handed out per-feature as you need them — ask in the contributor channel. Most tasks don't need them.
4. Run
# terminal 1 — backend API (http://localhost:3001)
cd apps/backend && npm run dev
# terminal 2 — frontend (http://localhost:3000)
cd apps/frontend && npm run dev
5. Before opening a PR
cd apps/frontend && npm run check # lint + typecheck (Vercel-blocking rules)
Backend-only changes: cd apps/backend && npx tsc --noEmit. If you touched a
page that uses useSearchParams or a dynamic [param] route, also run
cd apps/frontend && npm run build (those failures only show in a real build).
See docs/README.md for the rest of the docs and CONTRIBUTING / contributor issues for picking up a task.