Skip to content
BoringStack
GitHub

Stack at a glance

4 min read

Stack map

Runtime and dev dependencies, what each does, and why each piece exists. BoringStack is built from proven parts and wired with contracts so humans and AI agents can change one layer without guessing about the others.

UI

api + infra

1

OpenAPI contract

validate

architecture gate

apps/api

Bun HTTP API + workers

Elysia, Drizzle, Postgres, Valkey, BullMQ, Pino. Owns security, persistence, background work, and OpenAPI.

apps/ui

Vite React SPA

React 19, TanStack Query, Zustand, shadcn/ui, Playwright, and a generated client instead of hand-written API calls.

infra-compose

Single-host Compose runtime

Postgres, Valkey, Traefik, and optional observability/error-tracking overlays for local and VPS environments.

infra-tofu

First real deploy path

OpenTofu, Hetzner, Cloudflare, and cloud-init provision a VPS and drop the Compose stack in place.

Runtime: Bun
Bun-native APIs, fastest install and cold boot.
HTTP framework: Elysia
TypeBox-typed routes, OpenAPI auto-emit.
ORM: Drizzle
TS-first, SQL-shaped, real migrations.
Database: Postgres
Durable, well-tooled.
Cache + queue store: Valkey
OSS Redis-protocol fork (BSD-3); drop-in for Redis clients.
Queues: BullMQ
Canonical Valkey job queue.
Auth
bcryptjs + short-lived JWT access cookies + DB-backed refresh sessions + Arctic (OAuth).
Email
Cloudflare Email (default), Resend, SendGrid, SMTP, noop. SMTP works with Mailpit in dev.
Error tracking
@sentry/bun → hosted Sentry or self-hosted GlitchTip.
AI
OpenAI SDK, Anthropic SDK, or noop. OPENAI_BASE_URL for compatible endpoints.
Logger
Pino + pino-pretty. JSON in prod.
Templates
Handlebars precompiled to JSON at build; zero runtime parse.
Dead-code detection
Knip gates bun run validate.

Each app workspace ships custom ESLint plugins (all open-sourced) that codify the patterns and stop drift at the lint gate.

Full inventory with GitHub links →