ShipVeryFastShipVeryFast
Documentation

Tech stack

Every major dependency in ShipVeryFast and the role it plays. The list below is taken straight from package.json, if a library is here, it is wired into the boilerplate and ready to use.

The package manager is npm. After cloning, run npm install and the entire stack below is installed in one step.

Framework & language

The app runs on Next.js 15 (next ^15.5.19) with the App Router, on React 19 (react / react-dom ^19.0.0). The dev server uses Turbopack, the dev script is literally next dev --turbopack.

Everything is written in TypeScript ^5 with "strict": true. The compiler is configured in tsconfig.json with target: ES2017, module: esnext, and moduleResolution: bundler. The @/* path alias maps to the project root, so imports look like @/libs/auth rather than long relative paths.

// tsconfig.json (excerpt)
{
  "compilerOptions": {
    "target": "ES2017",
    "strict": true,
    "module": "esnext",
    "moduleResolution": "bundler",
    "jsx": "preserve",
    "paths": { "@/*": ["./*"] }
  }
}

Data & auth

Data lives in Supabase (managed Postgres). The client comes from @supabase/supabase-js, with @supabase/auth-helpers-nextjs and @supabase/auth-helpers-react for session-aware server and client helpers.

Authentication is handled by NextAuth.js (next-auth ^4.24.11), configured in libs/auth.ts. It uses the official Supabase adapter, @next-auth/supabase-adapter (imported as SupabaseAdapter), so NextAuth sessions and Supabase rows stay in sync.

Payments

Payments run on the official Stripe Node SDK (stripe ^18.0.0). The boilerplate ships Stripe Checkout for subscriptions plus a webhook handler so subscription lifecycle events update your database. See Payments for the Checkout and webhook wiring.

Email

Transactional email is sent through Mailgun. The transport layer lives in libs/mailer.ts, which sends over Mailgun SMTP (smtp.mailgun.org) using nodemailer with Mailgun open/click tracking headers enabled. Higher-level helpers and templates sit in libs/emailService.ts and libs/emailTemplates.ts. The mailgun.js client is also available for direct API calls.

UI

The UI is built with Tailwind CSS (tailwindcss ^3.3.0) and shadcn/ui, scaffolded via the shadcn CLI. The primitives underneath are Radix UI packages (@radix-ui/react-select, @radix-ui/react-switch, @radix-ui/react-tooltip, @radix-ui/react-accordion, and more). Icons come from lucide-react and react-icons.

Theming is driven by CSS custom properties defined in app/globals.css: color tokens such as --background, --primary, and --ring are stored as HSL channels and consumed via hsl(var(--token)), with a full .dark override for dark mode. Animations use tailwindcss-animate and tw-animate-css; class composition uses clsx, tailwind-merge, and class-variance-authority. Charts are rendered with recharts. Client state is managed with zustand and server state with @tanstack/react-query.

AI

The AI layer in libs/ai/ is provider-agnostic: Anthropic and OpenAI live behind one interface so the chat UI can switch providers. The Claude path uses the official @anthropic-ai/sdk, libs/ai/anthropic.ts exposes the model claude-opus-4-8("Claude Opus 4.8"). The OpenAI path uses the official openai SDK in libs/ai/openai.ts, with models gpt-4o and gpt-4o-mini. Both providers stream plain-text deltas. See AI assistant for the streaming endpoint and UI.

Validation & security

Request and environment validation use Zod (zod ^3.24.3) , for example, libs/config.ts validates environment variables at import time. Rate limiting is built on rate-limiter-flexible, input sanitization on isomorphic-dompurify (DOMPurify), and CSRF protection is a custom implementation. Cookie handling uses cookies-next. See Security for how these fit together.

Testing

Unit and integration tests run on Jest (jest ^29.7.0) with ts-jest for TypeScript and jest-environment-jsdom for the DOM. Component tests use React Testing Library (@testing-library/react, @testing-library/jest-dom, @testing-library/user-event). End-to-end tests run on Playwright (@playwright/test), with accessibility assertions powered by @axe-core/playwright. See Testing for the full command list.

Key dependencies and their roles

A quick map of the libraries you'll touch most often:

PackageRole
nextNext.js 15 App Router framework (Turbopack dev server)
react / react-domReact 19 runtime
typescriptTypeScript ^5, strict mode
@supabase/supabase-jsPostgres database + auth client
next-auth + @next-auth/supabase-adapterSession auth wired to Supabase
stripeCheckout, subscriptions, webhooks
nodemailer + mailgun.jsTransactional email via Mailgun
tailwindcss + shadcnStyling and UI component scaffolding
lucide-react / react-iconsIcon sets
rechartsCharts (admin analytics, dashboards)
@tanstack/react-queryServer-state fetching and caching
zustandClient-side state stores
@anthropic-ai/sdk / openaiAI providers behind libs/ai/
zodSchema validation (requests, env vars)
rate-limiter-flexibleAPI rate limiting
isomorphic-dompurifyHTML/XSS sanitization
jest + ts-jestUnit / integration test runner
@playwright/test + @axe-core/playwrightE2E and accessibility tests

Next steps