The Generate application portal — applications, reviews, and the hiring pipeline.
It has two parts:
backend/— Go API (Fiber + Huma) backed by Supabase Postgres.frontend/— Next.js app (App Router) using Supabase auth.
For the domain model and the full application → review → interview → selection pipeline, see info.md.
- Go 1.25+ (backend)
- Node.js 20+ and npm (frontend)
- A Supabase project (Postgres + auth)
- Optionally Docker to run the backend in a container
The Go backend connects to Supabase Postgres and can run directly on your machine or in Docker.
Copy backend/.env.example to backend/.env and set:
PORT— defaults to8080DATABASE_URL— Supabase Session Pooler URL formake runDATABASE_URL_DOCKER— same Supabase Session Pooler URL formake docker-up
From backend/:
make runFor development, make dev watches .go files and automatically rebuilds and
restarts the server on save. It uses air
(configured in backend/.air.toml) and installs it on first
run if it isn't already present.
From backend/:
make devFrom backend/:
make docker-upThe Supabase project (config, migrations, seed) lives in backend/internal/supabase/. Running it locally requires Docker and the Supabase CLI.
From backend/:
supabase start --workdir internal # start Postgres, Studio, Auth, Storage, etc.
supabase stop --workdir internal # tear downsupabase start prints connection details, including:
- Database:
postgresql://postgres:postgres@127.0.0.1:54322/postgres - Studio (DB browser): http://127.0.0.1:54323
Point the backend at it by setting DATABASE_URL in backend/.env to the
local database URL above instead of the hosted Supabase Session Pooler URL.
Note that Supabase auth still requires SUPABASE_URL to point at a real
project — logging in works against that, but any user without a matching row
in the local users table will fail requests that look up the current actor.
A fresh local database starts empty (aside from seed.sql, if present) — no
users, applications, or cycles. If you need real-shaped data to test against
(e.g. to reproduce a bug, or to exercise an existing account's roles), you
can copy data from the hosted project into your local one.
This isn't a maintained script, just a manual recipe — treat
DATABASE_URL_DOCKER in backend/.env as the source (it already holds the
hosted Supabase Session Pooler URL) and the local supabase_db_internal
Docker container as the destination. Run pg_dump/psql inside that
container rather than with your host's client — the local Postgres image is
on a specific major version (currently 17), and pg_dump refuses to dump
from a server newer than itself:
# from backend/, with the local stack already running (supabase start)
export PROD_URL=$(grep '^DATABASE_URL_DOCKER=' .env | cut -d'=' -f2-)
docker exec supabase_db_internal pg_dump "$PROD_URL" --data-only --schema=public -f /tmp/prod_data.sql
docker exec supabase_db_internal psql -U postgres -d postgres -v ON_ERROR_STOP=1 -f /tmp/prod_data.sqlThis dumps every public schema table's data (not auth.* — Supabase auth
is untouched) and restores it in one transaction-safe pass, so foreign key
ordering across tables is handled automatically. Since this reads real user
data from production, don't run it against a database or machine you
wouldn't want that data sitting on.
supabase migration new <name> # scaffold a new migration file, from backend/
supabase db reset --workdir internal # wipe and replay all migrations from scratchsupabase db reset replays every file in
backend/internal/supabase/migrations/
against a fresh database — the way to confirm a new migration actually
applies cleanly (not just that it worked once against a database that
already had earlier state) before merging.
GET /healthz— liveness check for the app processGET /readyz— readiness check that pings Supabase PostgresGET /docs— Scalar API docs (OpenAPI at/openapi.json)
From backend/:
make dev— run with hot reload (rebuilds on file save)make fmt— format Go code and supported docsmake fmt-check— check formatting without changing filesmake lint— rungo vetandgolangci-lint(config in backend/.golangci.yml)make test— run Go testsmake build— build the backend binarymake openapi— write the OpenAPI spec tobackend/api/openapi.yaml(source for frontend codegen)make docker-down— stop the Docker Compose stack
The Next.js frontend talks to the Go backend and uses Supabase for auth.
Copy frontend/.env.example to frontend/.env and set:
NEXT_PUBLIC_API_URL— backend base URL (defaults tohttp://localhost:8080)NEXT_PUBLIC_SUPABASE_URL— your Supabase project URLNEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY— your Supabase publishable (anon) key
From frontend/:
npm install
npm run dev # start the dev server at http://localhost:3000From frontend/:
npm run dev— start the dev servernpm run build— production buildnpm run start— serve the production buildnpm run lint— run ESLintnpm run format:check— check formatting with Prettiernpm test— run unit tests (Vitest)npm run generate:api— regenerate the typed API client from the OpenAPI spec
The frontend's src/generated/ API client is generated from the backend's
OpenAPI spec with Orval. After changing the backend API,
run make openapi (backend) then npm run generate:api (frontend). See
frontend/README.md for details.
GitHub Actions run on every pull request to main:
- Backend CI — gofmt,
go vet, golangci-lint,go test,go build - Frontend CI — lint, type-check, format, test, build
See .github/ for the workflows, Dependabot config, and PR template.