Full Stack TypeScript
Stacknaut is TypeScript end-to-end — frontend, backend, API, shared code, and database schemas. One language across the entire stack, with type safety from the database to the UI.
The Stack
| Layer | Technology | Role |
|---|---|---|
| Frontend | Vue 3 + Vite + Tailwind CSS | SPA with pre-rendering for SEO |
| Backend | Fastify + Node.js | Private API for the frontend |
| API | Fastify + Node.js | Public-facing API service |
| Database | PostgreSQL + Drizzle ORM | Type-safe queries and migrations |
| Shared | @myapp/shared | Types, schemas, and utilities |
| UI | shadcn-vue + Radix | Accessible, composable components |
| State | Pinia | Frontend state management |
| Routing | Vue Router | Client-side routing with pre-rendered pages |
Why These Choices
Vue 3 — Simpler mental model than React. The Composition API is powerful without the complexity of hooks rules. Templates are readable. The ecosystem (Pinia, Vue Router, VueUse) is cohesive and well-maintained.
Fastify — Faster than Express, with built-in TypeScript support, schema validation, and a plugin system that scales. The decorator pattern keeps things organized without heavy abstractions.
Drizzle ORM — SQL-like query builder that's fully type-safe. No magic, no runtime overhead, no query generation surprises. Schemas are plain TypeScript — your AI coding agent can read and extend them without special knowledge.
PostgreSQL — The most reliable relational database. Handles everything from a solo project to millions of rows. Runs as a Kamal accessory on the same server.
Project Structure
frontend/ — Vue 3 SPA
src/
views/ — Page components
components/ — Reusable UI components
stores/ — Pinia stores
lib/ — Utilities
router/ — Route definitions
backend/ — Fastify API (private, for frontend)
src/
controllers/ — Request handlers
routes/ — Route definitions
services/ — Business logic
plugins/ — Fastify plugins
lib/ — Utilities
api/ — Fastify API (public)
src/
controllers/
routes/
lib/
shared/ — Shared between all services
src/
schemas/ — Drizzle database schemas
index.ts — Exported types and utilities
Shared Code
The shared/ module (@myapp/shared) is the single source of truth for:
- Database schemas — Drizzle table definitions in
shared/src/schemas/ - Types — Shared TypeScript types used by frontend and backend
- Utilities — Functions used across services (e.g., credit calculations)
Import with the package alias:
import { users, magicLinks } from "@myapp/shared"
When you change a schema, all services that import from shared get type errors immediately — no drift between frontend expectations and backend reality.
Path Aliases
Both frontend and backend use @ as an alias for src/:
import { env } from "@/env"
import { LOGGER } from "@/plugins/logger"
No relative import chains (../../../lib/utils). Every import is clear about where it comes from.
Database Workflow
Schemas live in shared/src/schemas/. Edit the TypeScript schema, then generate and run migrations:
cd backend
pnpm run db:generate # Generate SQL migration from schema changes
pnpm run db:migrate # Apply pending migrations
pnpm run db:studio # Open Drizzle Studio (database GUI)
Migrations run automatically when the backend starts in production — no separate migration step during deployment.
What You Get
- TypeScript for all application code (frontend, backend, API, shared)
- Type-safe database queries with Drizzle ORM
- Shared types and schemas between frontend and backend
- Path aliases (
@/) in all services - Vue 3 Composition API with
<script setup> - Pinia stores for state management
- shadcn-vue components (accessible, customizable)
- Tailwind CSS with dark mode support
- Fastify with Zod request validation
- Auto-running migrations in production
- Pre-rendering for SEO pages
- PostHog analytics integration
Production SaaS starting point
Start from the foundation your checklist assumes.
Stacknaut packages the recurring SaaS work into repos your coding agent can inspect, modify, and deploy.
What you get in Stacknaut
- Auth, billing, shared types, API structure, jobs, logging, and prerendered pages
- Agent instructions and skills that keep future changes consistent
- Kamal + Hetzner deployment so launch work has a clear finish line