Skip to content
Public template

About

Production-ready TypeScript fullstack monorepo template with React, Fastify, Drizzle ORM, and AI agents

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

Β 

History

27 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

TypeScript Fullstack Template

Modern PERN stack monorepo for rapid prototyping and production applications with Turborepo, Biome, strict type safety, and composable deployment across web, API, agents, and shared packages.

πŸš€ Quick Start

# Prerequisites: Docker Desktop running

# 1. Clone and install
cp -r /path/to/ts-fullstack my-app
cd my-app
yarn install

# 2. Setup environment
cp .env.example .env
# Edit .env if needed (defaults work for local dev)

# 3. Start local database
yarn docker:up

# 4. Setup database
yarn db:push              # Push schema to database
yarn db:seed              # Seed with test data

# 5. Start development (all services with Turbo)
yarn dev                  # Start API + Web + Agent (parallel)
# Or run separately:
yarn dev:api              # API only (http://localhost:3000)
yarn dev:web              # Web only (http://localhost:5173)
yarn dev:agent            # Agent only (http://localhost:3001)

# 6. Verify quality
yarn build                # Turbo: build all packages
yarn lint:check           # Biome: 0 warnings enforced
yarn test                 # Vitest: all tests must pass

πŸ“¦ Stack

Frontend:

  • React 18 + TypeScript
  • Vite (fast dev + HMR)
  • TanStack Query (data fetching)
  • React Router (routing)
  • Tailwind CSS + Shared UI Components (@adaptiveworx/ui)

Backend:

  • Fastify (high-performance HTTP)
  • Drizzle ORM (type-safe SQL)
  • PostgreSQL 17 (via Docker)
  • Redis (caching/sessions)
  • Zod (runtime validation)

Agent Services:

  • LLM/worker orchestration (@adaptiveworx/agent)
  • MCP-compatible tool structure
  • Multi-step workflows

Developer Experience:

  • Turborepo - Incremental builds, remote caching, smart DAG execution
  • Biome - 100x faster linting + formatting (replaces ESLint + Prettier)
  • Yarn 4 node-modules - Better compatibility with IaC/Docker
  • TypeScript strict mode (@tsconfig/strictest)
  • ESM-first (NodeNext)
  • Monorepo workspaces (apps, packages, envs)

πŸ“‚ Structure

ts-fullstack/
β”œβ”€β”€ apps/
β”‚   β”œβ”€β”€ api/                  # @adaptiveworx/api - Fastify API server
β”‚   β”‚   β”œβ”€β”€ src/routes/       # API route handlers
β”‚   β”‚   └── package.json
β”‚   β”œβ”€β”€ web/                  # @adaptiveworx/web - React frontend (Vite)
β”‚   β”‚   β”œβ”€β”€ src/components/
β”‚   β”‚   └── package.json
β”‚   └── [future: admin, mobile-web, etc.]
β”œβ”€β”€ packages/
β”‚   β”œβ”€β”€ db/                   # @adaptiveworx/db - Drizzle ORM, schemas
β”‚   β”‚   β”œβ”€β”€ src/schema/       # Table definitions
β”‚   β”‚   β”œβ”€β”€ client.ts         # Database client
β”‚   β”‚   └── seed.ts
β”‚   β”œβ”€β”€ shared/               # @adaptiveworx/shared - Common types, utils
β”‚   β”‚   β”œβ”€β”€ src/config/       # Secrets manager (Infisical)
β”‚   β”‚   β”œβ”€β”€ src/types/
β”‚   β”‚   └── src/utils/
β”‚   β”œβ”€β”€ ui/                   # @adaptiveworx/ui - Shared React components
β”‚   β”‚   β”œβ”€β”€ src/components/   # Button, Input, Card, etc.
β”‚   β”‚   └── src/styles/       # Tailwind globals
β”‚   └── agent/                # @adaptiveworx/agent - LLM/worker services
β”‚       β”œβ”€β”€ src/tools/        # Agent tools (MCP or custom)
β”‚       └── src/workflows/    # Multi-step orchestrations
β”œβ”€β”€ envs/                     # Environment-specific configs
β”‚   β”œβ”€β”€ dev/                  # Development (local + cloud dev)
β”‚   β”œβ”€β”€ stg/                  # Staging (pre-production)
β”‚   └── prd/                  # Production
β”œβ”€β”€ .github/workflows/        # CI/CD pipelines
β”œβ”€β”€ turbo.json                # Turborepo pipeline config
β”œβ”€β”€ biome.json                # Biome linter + formatter config
└── package.json              # Root monorepo scripts

🎯 Use Cases

  • Rapid Prototyping: Full-stack app in < 5 minutes
  • AI-First Apps: Agent package ready for LLM orchestration
  • Multi-Environment Deploys: Dev/Stg/Prd version pinning
  • Paired Programming: Vibe-coding with candidates
  • Hackathons: Production patterns, zero setup time
  • Internal Tools: CRUD apps with type safety
  • MVPs: Production-ready from day one

πŸ› οΈ Commands

Development

yarn dev                  # Turbo: run all services in parallel
yarn dev:api              # API only (port 3000)
yarn dev:web              # Web only (port 5173)
yarn dev:agent            # Agent only (port 3001)

Database

yarn db:push              # Push schema changes to database
yarn db:reset             # Drop all tables (destructive!)
yarn db:seed              # Seed with test data

Docker

yarn docker:up            # Start PostgreSQL + Redis
yarn docker:down          # Stop containers
docker ps                 # Check running containers

Quality (Zero-Tolerance)

yarn build                # Turbo: build all packages (must pass!)
yarn type-check           # TypeScript compilation (all workspaces)
yarn lint:check           # Biome: 0 warnings enforced
yarn lint:fix             # Biome: auto-fix issues
yarn test                 # Turbo: run all tests
yarn test:coverage        # Coverage reports

πŸ”’ Quality Standards

Zero-Tolerance Policies:

  • βœ… 0 TypeScript errors
  • βœ… 0 Biome warnings
  • βœ… All tests passing
  • βœ… Strict mode enabled (@tsconfig/strictest)

Enforced via:

  • exactOptionalPropertyTypes: true - Catch undefined edge cases
  • noUncheckedIndexedAccess: true - Array/object safety
  • noPropertyAccessFromIndexSignature: true - Explicit property access
  • Turborepo caching validates all checks before build

🌍 Environment Configuration

Local Development

Uses root .env file and local Docker services.

Environment Pinning (Dev/Stg/Prd)

Each environment pins specific package versions:

// envs/prd/package.json
{
  "dependencies": {
    "@adaptiveworx/api": "0.2.0",
    "@adaptiveworx/web": "0.2.0",
    "@adaptiveworx/agent": "0.1.5"
  }
}

Version Promotion Flow:

  1. Test in envs/dev with latest versions
  2. Promote to envs/stg for validation
  3. Promote to envs/prd for production release

See envs/README.md for details.

πŸ—„οΈ Database Patterns

Schema Definition (Drizzle)

// packages/db/src/schema/users.ts
import { pgTable, text, timestamp } from "drizzle-orm/pg-core";
import { createInsertSchema } from "drizzle-zod";

export const users = pgTable("users", {
  id: text("id").primaryKey().$defaultFn(() => crypto.randomUUID()),
  email: text("email").notNull().unique(),
  name: text("name"),
  createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
});

export const insertUserSchema = createInsertSchema(users);
export type User = typeof users.$inferSelect;

API Routes (Type-Safe)

// apps/api/src/routes/users.ts
import { db } from "@adaptiveworx/db";
import { users, insertUserSchema } from "@adaptiveworx/db";

server.get("/api/users", async () => {
  const allUsers = await db.select().from(users);
  return { users: allUsers };
});

server.post("/api/users", async (request) => {
  const data = insertUserSchema.parse(request.body);
  const [user] = await db.insert(users).values(data).returning();
  return { user };
});

🎨 UI Components

Shared component library in @adaptiveworx/ui:

// apps/web/src/pages/MyPage.tsx
import { Button, Card, CardHeader, CardTitle, CardContent } from '@adaptiveworx/ui';

export function MyPage() {
  return (
    <Card>
      <CardHeader>
        <CardTitle>Welcome</CardTitle>
      </CardHeader>
      <CardContent>
        <Button variant="default">Get Started</Button>
      </CardContent>
    </Card>
  );
}

πŸ€– Agent Services

// packages/agent/src/tools/example-tool.ts
import { z } from 'zod';

export const exampleTool = {
  name: 'fetch_user_data',
  description: 'Fetches user data from the database',
  parameters: z.object({
    userId: z.string().uuid(),
  }),
  execute: async ({ userId }) => {
    const user = await db.select().from(users).where(eq(users.id, userId));
    return user[0];
  },
};

🚒 CI/CD

GitHub Actions Workflows

.github/workflows/ci.yml - PR quality checks:

  • Type checking (Turbo)
  • Linting (Biome)
  • Testing (Vitest)
  • Building (Turbo with remote cache)

.github/workflows/deploy.yml - Multi-environment deploys:

  • Triggered on version tags (v*.*.*)
  • Matrix strategy for dev/stg/prd
  • Focused workspace installs
  • Pulumi infrastructure deployment

Turborepo Remote Caching

- name: Restore Turbo cache
  uses: actions/cache@v4
  with:
    path: .turbo
    key: turbo-${{ runner.os }}-${{ github.sha }}

🌐 Environment Variables

Copy .env.example to .env:

# Database (Docker local)
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/fullstack_dev

# API Server
PORT=3000
HOST=0.0.0.0
CORS_ORIGIN=http://localhost:5173
NODE_ENV=development

# Agent Server
AGENT_PORT=3001

# Infisical (optional - for production secrets)
INFISICAL_PROJECT_SLUG=your-project
INFISICAL_APPS_PROJECT_ID=your-project-id

🀝 Collaboration Workflow

This template follows the 5-Step Agentic Workflow:

  1. Collaborate on Objectives - Discuss what to build
  2. Agree on Architecture - Plan stacks/components
  3. Agent Handles Dev/Test - Claude writes code, runs builds/tests, delivers 100% clean
  4. User Handles Environment - User manages Docker/deployments
  5. Review Together - Both review results

Agent responsibilities:

  • βœ… Write TypeScript code across all packages
  • βœ… Run yarn build - fix ALL errors
  • βœ… Run yarn lint:check - fix ALL warnings
  • βœ… Run yarn test - fix ALL failures
  • βœ… Deliver 100% clean code

User responsibilities:

  • βœ… Manage Docker containers
  • βœ… Run database migrations
  • βœ… Review/approve changes
  • βœ… Deploy to environments

πŸ“– Key Files

  • turbo.json - Turborepo pipeline definitions
  • biome.json - Linting and formatting rules
  • .env.example - Environment variable template
  • docker-compose.yml - Local PostgreSQL 17 + Redis
  • tsconfig.json - Strict TypeScript configuration
  • packages/*/package.json - Individual package configs
  • envs/*/package.json - Environment version pinning

πŸ”§ Troubleshooting

Database connection failed:

docker ps | grep postgres
yarn docker:down && yarn docker:up

Port already in use:

lsof -ti:3000 | xargs kill -9
# Or change PORT in .env

Turborepo cache issues:

rm -rf .turbo
yarn build --force

Type errors with Drizzle:

  • Pattern: db.insert(table).values(data as typeof table.$inferInsert)

Import errors (.js extensions):

  • ESM + NodeNext requires .js extensions in imports
  • Even for .ts files: import { foo } from "./bar.js"

πŸ“„ License

MIT - Built for 100% agentic development by AdaptiveWorX

About

Production-ready TypeScript fullstack monorepo template with React, Fastify, Drizzle ORM, and AI agents

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages