Hoppa till innehållet

Next.js och Supabase, där datalagret är produkten.

En monorepo där appen och bakgrundsjobben bara är användare av ett datalager. Där bor varje fråga och varje behörighetskontroll, med Postgres och deny-by-default-RLS som skydd under.

Öppna på GitHubMIT-licens · fri att använda

Använd den när

Du startar en SaaS på Postgres som behöver bakgrundsjobb, och vill ha behörigheten i serverkoden där den går att granska — inte utspridd i SQL-policys.

Kör du MongoDB i stället för Postgres? template-next-mongo i stället →

Det här ingår

Färdigt från start.

  • Datalagret

    @ketryon/db har båda Supabase-klienterna, alla DTO:er och varje fråga. Varje funktion tar en session, aldrig ett användar-id.

  • RLS som andra lås

    Deny-by-default på varje tabell, med pgTAP-tester. Läsningar går under RLS, skrivningar genom datalagret.

  • Bakgrundsjobb

    Trigger.dev-uppgifter i egna köer med gräns för samtidighet, och varje körning sparas i en job_run-tabell.

  • Exempel att bygga från

    En order-funktion med sida, server actions, API-route och middleware som förnyar token.

  • Lint som vakt

    ESLint stoppar appen från att importera Supabase-klienten eller jobbens privilegierade ingång.

  • Typer från databasen

    pnpm db:types genererar typerna från schemat efter varje migrering.

Principerna

Reglerna den håller.

  1. 1

    Index-filen exporterar ingen klient. En ny fråga läggs i datalagret, där den granskas.

  2. 2

    Varje funktion i datalagret tar en session, aldrig ett användar-id.

  3. 3

    getUser(), aldrig getSession(), för allt som rör säkerhet.

  4. 4

    Middleware är för omdirigering, inte behörighet — anta att den kan förbigås.

  5. 5

    Sidindelning med nyckel och ett tak. Ingen OFFSET.

  6. 6

    Varje jobb sparar sitt utfall, eftersom leverantörens panel bara minns i några veckor.

Kom igång

pnpm install
cp .env.example apps/web/.env.local
cp .env.example packages/jobs/.env
pnpm db:start     # local Supabase (needs Docker)
pnpm db:reset     # migrations + seed
pnpm db:types
pnpm dev
pnpm jobs:dev     # separate terminal

Struktur

supabase/          migrations, seed, pgTAP RLS tests
packages/db/       @ketryon/db  — Supabase clients, DTOs, every query
packages/jobs/     @ketryon/jobs — Trigger.dev tasks
apps/web/          Next.js 16 — calls the DAL, owns no database code

Miljövariabler

  • NEXT_PUBLIC_SUPABASE_URL
  • NEXT_PUBLIC_SUPABASE_ANON_KEY
  • SUPABASE_SERVICE_ROLE_KEY
  • TRIGGER_PROJECT_REF
  • TRIGGER_SECRET_KEY

Kopiera .env.example till appen och till jobb-paketet. Servicenyckeln är bara för servern.

Bra att veta

  • SQL-delen — migreringar, seed och pgTAP-testerna — har inte körts mot en riktig databas här. Kör pnpm db:start, db:reset, db:test och db:lint innan du litar på dem.
  • Typkontroll och lint passerar med Next 16.4, React 19.3 och Zod 4.6.

Byggd med

  • Next.js 16
  • React 19
  • Supabase
  • Postgres
  • Trigger.dev
  • Zod 4
  • Tailwind CSS 4
  • pnpm workspaces

Låt oss bygga
nästa sak.

Du pratar med mig, inte med en säljare. Första samtalet är gratis.

— Kenny

psst, det tar 15 min

Skriver du svarar jag samma vardag.