Creator

FAQ

Common questions about Creator.

Can I use a different database?

Creator uses PostgreSQL with Drizzle ORM. The database client in lib/db/index.ts uses postgres.js with prepare: false for compatibility with transaction pool mode (common with hosted databases like Supabase and Neon). Switching to another PostgreSQL host is just a DATABASE_URL change. Switching to a different database engine (MySQL, SQLite) would require updating the Drizzle dialect and schema.

Do I need both Stripe and Lemon Squeezy?

No. Set NEXT_PUBLIC_PAYMENT_GATEWAY to either "stripe" or "lemonsqueezy" and only configure the environment variables for the one you choose. The checkout and webhook routes are separate for each provider.

Do I need both Resend and Mailgun?

No. Set NEXT_PUBLIC_EMAIL_SERVICE to either "resend" or "mailgun". The email service uses a factory pattern — you only need to configure the provider you pick.

Can I use both R2 and Supabase Storage?

No. Set NEXT_PUBLIC_STORAGE_SERVICE to either "r2" or "supabase". Like the email service, storage uses a factory pattern that selects one provider at runtime.

How do I add a new shadcn/ui component?

Use the shadcn CLI:

npx shadcn@latest add button

Components are installed to components/ui/. The project uses the New York style with a neutral base color.

How does route protection work?

Creator uses proxy.ts (Next.js middleware renamed) to protect routes. Every route is protected by default — only routes listed in the publicRoutes array in config/public-routes.config.ts are accessible without authentication. Auth routes (login, signup, etc.) redirect authenticated users to the dashboard. Admin routes check for role === "admin". API routes use requireApiAuth() and requireApiAdmin() guards for additional server-side checks.

How do I change the default theme?

Edit config/app.config.ts and set siteSettings.theme to "light", "dark", or "system". The theme is applied via next-themes in the root layout.

Where are the colors defined?

All colors use the OKLCH color space and are defined as CSS custom properties in app/globals.css. Both light and dark mode values are defined there. The project uses Tailwind CSS v4's CSS-first configuration — there is no tailwind.config.ts file.

How do I add rate limiting to a new endpoint?

Import rateLimit from lib/rate-limit.ts and call it at the top of your route handler:

import { rateLimit } from "@/lib/rate-limit";

export async function POST(request: NextRequest) {
  const limited = await rateLimit(request, "api");
  if (limited) return limited;

  // ... your handler logic
}

Available tiers: "auth" (10/60s), "sensitive" (5/60s), "api" (60/60s).

On this page

We use cookies to ensure you get the best experience on our website. For more information on how we use cookies, please see our cookie policy.