Default Stack
What Orvenath builds with by default, and why each choice was made.
Default Stack
Defaults exist so that stack selection is not re-litigated on every project. Deviate when a project genuinely requires it, and record the reason.
Web#
| Layer | Default | Why |
|---|---|---|
| Framework | Next.js (App Router) | Server components, file routing, one framework for static and dynamic |
| Language | TypeScript, strict | Catches at build what would otherwise be found by the client |
| Styling | Tailwind CSS | Fast, consistent, no naming overhead |
| Database | PostgreSQL | Relational by default; most client data is relational |
| ORM | Drizzle | Typed, close to SQL, no runtime overhead |
| Hosting | Vercel | Zero-config Next.js deploys, preview environments, sensible free tier |
| DB hosting | Neon | Serverless Postgres, branching for staging |
| Auth | Depends on project — Auth.js default | Avoid rolling custom auth |
| Payments | Stripe | Best documentation, best test mode |
| Resend | Simple API, good deliverability |
Mobile#
| Layer | Default | Why |
|---|---|---|
| Framework | Flutter | One codebase, both platforms, strong rendering consistency |
| Language | Dart | Comes with Flutter |
| State | Bloc / Riverpod | Project-dependent; structured reactive state and separation of concerns |
Tooling#
- Antigravity IDE for scaffolding and large generation passes
- Git with GitHub, private repos by default
- Figma for design work
Rules about the stack#
Do not learn a new framework on a client's money. If a project requires something unfamiliar, either quote the learning time honestly or decline.
Do not add a dependency to save twenty lines of code. Every dependency is a future security patch, a future breaking change, and something the client's next developer has to understand.
Prefer boring. The client is buying software that works in three years, not the newest thing.
When to deviate#
Record deviations as an ADR. If the same deviation happens three times, it is not a deviation — update this document.