New

5 demos, 10+ applications, 50+ blocks, 30+ pages & much more

Documentation

Browse and explore docs

Database Clients

The project exposes three pre-configured clients inside the lib/ folder. Import the right one depending on context.

FileExportUse InPurpose
lib/supabase.tssupabaseClient componentsAuth operations, respects RLS
lib/supabase-server.tssupabaseAdminAPI routes, server onlyPrivileged ops, bypasses RLS
lib/prisma.tsprismaAPI routes, server onlyAll database queries via ORM

lib/supabase.ts — Client-side Supabase

Used in React components and client-side code for authentication operations (sign in, sign up, OAuth). Respects Row Level Security (RLS).

import { createClient } from '@supabase/supabase-js'

const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL
const supabaseKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY

export const supabase = createClient(supabaseUrl, supabaseKey)

lib/supabase-server.ts — Server-side Admin Client

Used only in API routes and server components. Uses the service role key so it bypasses RLS. Never import this in client components.

import { createClient } from "@supabase/supabase-js";

export const supabaseAdmin = createClient(
  process.env.NEXT_PUBLIC_SUPABASE_URL!,
  process.env.SUPABASE_SERVICE_ROLE_KEY!
);

lib/prisma.ts — Prisma Client

Singleton Prisma client using the @prisma/adapter-pg adapter for connection pooling via DATABASE_URL (pgbouncer / Transaction mode). Use this for all database queries.

import { PrismaPg } from "@prisma/adapter-pg";
import { PrismaClient } from "./generated/prisma/client";

const globalForPrisma = globalThis as unknown as {
  prisma: PrismaClient | undefined;
};

function createClient() {
  const connectionString = process.env.DATABASE_URL!;
  const adapter = new PrismaPg({ connectionString });
  return new PrismaClient({ adapter, log: ["error"] });
}

export const prisma = globalForPrisma.prisma ?? createClient();

if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;