Acme Inc.

Ein Worker. Web und Mobile rufen denselben.

TanStack Start, Expo, Better Auth, oRPC, Drizzle auf Neon, Dateien auf R2. Klonen, pnpm setup, pushen.

Der Stack

Apps

  • apps/web

    TanStack Start, shadcn, i18n, SEO. File-Routes. Landing und Architektur-Session sind öffentlich. Dashboard-Routen sitzen hinter Auth.

  • apps/mobile

    Expo Router, NativeTabs, derselbe oRPC-Client-Typ. Passkeys und 2FA teilen die Worker-Session.

Packages

  • packages/api

    oRPC-Router und Zod-Verträge. MCP-Tools und Webhooks liegen hier. Der Client-Typ ist nur import type.

  • packages/app-update

    Vergleicht die laufende App-Version mit Admin-Config und sagt dem Client, ob er nachfragen soll.

  • packages/auth

    Better Auth mit Drizzle, Passkeys, 2FA, Admin-Impersonation. Session-Cookies treffen den Worker, keinen zweiten Auth-Host.

  • packages/config

    Geteiltes tsconfig und die oxlint-Client-Boundary-Regeln. Kein Runtime.

  • packages/db

    Drizzle-Schema auf Neon. Das Schema-Barrel ist der eine erlaubte Aggregat, und nur Server-Code erreicht es.

  • packages/email

    Eine sendEmail-Naht. Templates sind pur. Produktion nutzt Cloudflare Email oder Resend. Dev druckt auf die Konsole.

  • packages/env

    env/server ist Worker-only. env/web ist die öffentliche Teilmenge. Native hat ein eigenes Leaf für Expo.

  • packages/errors

    Geteilte Fehlercodes und i18n-Keys. Clients mappen Codes auf Strings. Sie importieren nie die Server-Error-Fabrik.

  • packages/flags

    Die Flag-Registry ist ein Leaf. Das DB-Repo ist ein eigener Subpath, damit ein Client-Import kein Drizzle zieht.

  • packages/intl

    i18next plus React-Provider. Die Server-Sprache kommt aus Cookie und Query.

  • packages/project-setup-cli

    pnpm setup. Umbenennen, Env-Dateien, Neon, GitHub- und Worker-Secrets.

  • packages/storage

    R2 über files-sdk. Uploads sind pro User namenraum-isoliert. Der Worker stellt URLs aus oder proxied Bytes.

  • packages/ui

    shadcn- und ReUI-Primitives. Tokens in globals.css. Das ist die visuelle Autorität fürs Web.

  • packages/widgets

    iOS- und Android-Homescreen-Todo-Widgets. Hinter einem Feature-Flag und Native-Rebuild.

Agent-Plugin

  • plugins/agent-plugin

    agent-plugin. Agent-Plugins-1.0-Paket: MCP über OAuth, Writes nur als Drafts, und Skills. Liegt in plugins/agent-plugin.

packages/api

api

oRPC-Router und Zod-Verträge. MCP-Tools und Webhooks liegen hier. Der Client-Typ ist nur import type.

Client-/Server-Schnitt

Client and server cutFour layers. Clients import leaves. The Worker owns api, auth, and email. Neon and R2 sit below the Worker.CLIENTSapps/web · apps/mobileLEAVESapi/client · *.enums.ts · *.schema.ts · errors · intlWORKERapi routers · auth · email · flags/repo · env/serverDATAdb / Neon · storage / R2

Was mitkommt

  • Auth ist verdrahtet

    Passwort, OAuth, Passkeys und 2FA. Admin-Impersonation sitzt im Dashboard.

  • Ein typisierter Schnitt

    Router-Inputs und -Outputs bleiben in Zod. Web und Mobile importieren dieselben Verträge.

  • Ein Worker pro PR

    Ein PR erzeugt einen Wegwerf-Worker. Merge nach main liefert Produktion.