A modern, full-stack skeleton application built with TypeScript, Vue.js, Nuxt 3, tRPC, and PostgreSQL.
This skeleton project is built as a monorepo using Turborepo, featuring:
- Backend: Bun + Hono + tRPC + PostgreSQL + Drizzle ORM
- Frontend: Nuxt 3 + Vue 3 + Pinia + TailwindCSS
- Type Safety: End-to-end TypeScript with tRPC
- Code Quality: Biome for linting and formatting
my-app/
├── apps/
│ ├── api/ # Backend tRPC API server
│ └── web/ # Nuxt 3 frontend application
├── packages/
│ ├── config/ # Shared configuration management
│ ├── shared-db/ # Database schemas and connection
│ ├── trpc/ # tRPC routers and procedures
│ ├── types/ # Shared TypeScript types
│ ├── ui/ # Shared UI components library
│ └── utils/ # Shared utilities
├── drizzle/ # Database migrations
└── [config files] # Various configuration files
- Node.js >= 18.0.0
- Bun >= 1.0.0
- PostgreSQL
-
Clone/copy the skeleton:
cp -r skeleton-project my-new-app cd my-new-app -
Install dependencies:
bun install
-
Set up environment variables:
cp .env.example .env # Edit .env with your database URL and other config -
Database setup:
# Run migrations bun run db:generate bun run db:migrate -
Start development servers:
# Start both API and web bun run dev # Or start individually bun run dev:api # Backend API (port 3000) bun run dev:web # Frontend (port 8010)
# Development
bun run dev # Start both API and web
bun run build # Build all packages
bun run typecheck # TypeScript checking
# Database
bun run db:generate # Generate migrations
bun run db:migrate # Run migrations
bun run db:studio # Open Drizzle Studio
# Code Quality
bun run lint # Lint all packages
bun run format # Format all codepackage.json- Monorepo and workspace configurationturbo.json- Turborepo build pipelinetsconfig.json- TypeScript configurationbiome.json- Code formatting and linting.cursorrules- AI coding assistant rules
src/index.ts- Server entry pointsrc/server.ts- Hono server setup with tRPC
nuxt.config.ts- Nuxt configurationpages/index.vue- Home page examplestores/auth.ts- Authentication store
packages/config/- Environment configuration managementpackages/shared-db/- Database schemas with Drizzle ORMpackages/trpc/- tRPC routers and contextpackages/types/- Shared TypeScript types and Zod schemaspackages/ui/- Vue component librarypackages/utils/- Utility functions
Replace @my-app/ namespace in all package.json files:
find . -name "package.json" -exec sed -i 's/@my-app/@your-app/g' {} +Update the path aliases in tsconfig.json and throughout the codebase.
Add new schemas in packages/shared-db/src/schemas/ and export them from index.ts.
Add new routers in packages/trpc/src/routers/ and include them in the main router.
Create new components in packages/ui/src/components/ following the existing patterns.
This skeleton follows these principles from the original codebase:
- Direct over Abstract - Simple functions over complex abstractions
- Type Safety First - Strict TypeScript configuration
- Ship Fast - Pragmatic approach focused on delivery
- Monorepo Benefits - Shared code and consistent tooling
- Runtime: Bun
- Backend: Hono (web server) + tRPC (API layer)
- Database: PostgreSQL + Drizzle ORM
- Frontend: Nuxt 3 + Vue 3 (Composition API)
- State: Pinia stores
- Styling: TailwindCSS v4
- Auth: Supabase (configured but not implemented)
- Build: Turborepo
- Code Quality: Biome (ESLint + Prettier replacement)
- Follow the
.cursorrulesguidelines - Use TypeScript strictly
- Write direct, simple functions
- Add types to the
packages/types/package - Update documentation as needed
MIT# modern-saas-stack