Acme Inc.

Un Worker. Le web et le mobile l'appellent tous les deux.

TanStack Start, Expo, Better Auth, oRPC, Drizzle sur Neon, fichiers sur R2. Cloner, pnpm setup, pousser.

La stack

Apps

  • apps/web

    TanStack Start, shadcn, i18n, SEO. Routes fichiers. La landing et cette session sont publiques. Les routes dashboard sont derrière l'auth.

  • apps/mobile

    Expo Router, NativeTabs, le même type de client oRPC. Passkeys et 2FA partagent la session Worker.

Packages

  • packages/api

    Routeurs oRPC et contrats zod. Les outils MCP et webhooks sont ici. Le type client est import type seulement.

  • packages/app-update

    Compare la version de l'app à la config admin et dit au client s'il doit demander une mise à jour.

  • packages/auth

    Better Auth avec Drizzle, passkeys, 2FA, impersonation admin. Les cookies de session tapent le Worker, pas un second hôte auth.

  • packages/config

    tsconfig partagé et les règles oxlint de frontière client. Pas de runtime.

  • packages/db

    Schéma Drizzle sur Neon. Le barrel de schéma est le seul agrégat sanctionné, et seul le code serveur l'atteint.

  • packages/email

    Une couture sendEmail. Les templates sont purs. La prod utilise Cloudflare Email ou Resend. Le dev imprime dans la console.

  • packages/env

    env/server est Worker-only. env/web est le sous-ensemble public. Native a sa propre feuille pour Expo.

  • packages/errors

    Codes d'erreur et clés i18n partagés. Les clients mappent les codes vers des chaînes. Ils n'importent jamais la fabrique d'erreurs serveur.

  • packages/flags

    Le registre de flags est une feuille. Le repo DB est un sous-chemin séparé pour qu'un import client ne tire pas Drizzle.

  • packages/intl

    i18next plus un provider React. La langue serveur vient du cookie et de la query.

  • packages/project-setup-cli

    pnpm setup. Renommer, fichiers env, Neon, secrets GitHub et Worker.

  • packages/storage

    R2 via files-sdk. Les uploads sont namespacés par utilisateur. Le Worker émet des URLs ou proxifie les octets.

  • packages/ui

    Primitives shadcn et ReUI. Tokens dans globals.css. C'est l'autorité visuelle du web.

  • packages/widgets

    Widgets todo iOS et Android. Derrière un feature flag et un rebuild natif.

Plugin agent

  • plugins/agent-plugin

    agent-plugin. Paquet Agent Plugins 1.0: MCP via OAuth, écritures en brouillon, et skills. Vit dans plugins/agent-plugin.

packages/api

api

Routeurs oRPC et contrats zod. Les outils MCP et webhooks sont ici. Le type client est import type seulement.

Coupe client / serveur

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

Ce qui est livré

  • L'auth est déjà branchée

    Mot de passe, OAuth, passkeys et 2FA. L'impersonation admin est dans le tableau de bord.

  • Une coupe typée

    Entrées et sorties des routeurs restent en Zod. Web et mobile importent les mêmes contrats.

  • Un Worker par PR

    Un PR crée un Worker jetable. Fusionner dans main livre la production.