Skip to content
findplate

DocsStart

Why findplate

The philosophy, what is in, what is out and why.

On this page

Most starters are a repo you clone, rename by hand and then spend a day cutting down. findplate is a generator instead: it copies a template, renames it, and removes everything you did not ask for, so what you get has no dead code and is yours from the first commit.

Philosophy

  • Generate, then own it. There is no runtime dependency on findplate. The output is a normal turborepo that you edit freely. The cli does not come back to update it.
  • The minimum is real. A project with no optional modules still builds, lints and passes its tests. CI generates every module alone, all of them together and none, and checks each.
  • One way to do each thing. One orm, one auth library, one rpc layer, one linter. Fewer choices means a template that stays tested.
  • Optional means removable. A module is a package, its env keys and the lines that use it. Turn it off and all three are gone, not hidden behind a flag.
  • Keys are optional at runtime. A missing key turns a feature off instead of crashing the app, so a fresh project always starts.

What is in

  • A turborepo with a landing page, a dashboard with login and an api
  • Next.js, oRPC on bun, better-auth, Drizzle on Postgres, shadcn, Tailwind
  • Biome for format and lint, strict TypeScript, security headers, one root .env
  • Design presets driven by shadcn tokens
  • Optional modules for storage, AI, email, chat notifications, analytics, tracing, error tracking, secrets and public pages
  • Deploy paths for Vercel or your own server, PR previews, and provisioning of the pieces around it

What is out

  • A second choice of stack. No Prisma, no tRPC, no Auth.js, no pages router. If you want one, findplate is the wrong tool.
  • Payments, teams and billing. Every product wants them different, and a half-built version costs more to remove than to write.
  • A component library of its own. UI is shadcn, in your repo, so you edit the components.
  • Silent updates. findplate update is a three-way merge you run on purpose. It never touches files you didn't change and lists conflicts instead of guessing, so you still read a diff.
  • Hosted services. The modules that need a server (Umami, GlitchTip, Langfuse and the rest) point at an instance you run, with a compose file each.

Why these choices

ChoiceWhy
oRPC with a separate api appOne typed contract for the web, the dashboard and any other client, and only one app touches the database
better-authLives in your database and your code, no hosted tenant to depend on
DrizzlePlain SQL migrations you can read and a schema in TypeScript
shadcnYou own the components, and presets are just tokens
BiomeOne fast tool for format and lint, so the CI step is seconds
pnpm in the project, bun for the apipnpm for strict, cacheable installs, bun for a fast api runtime
Markers instead of templatingThe template is real code that is type-checked and tested in this repo, not strings with holes

Where to go next