some notes: https://www.arhamhumayun.com/blog/streamed-ai-response
This repository is a Turborepo-managed monorepo with two Next.js apps and a shared UI package. ESLint has been replaced by Biome for linting and formatting in apps.
apps/web: Public site (Next.js). Rewrites/approutes to the application zone viaAPP_ORIGIN.apps/app: Application zone (Next.js) served under the base path/app.
packages/ui(@turbotemplate/ui): Shared component library and utilities used by both apps.
All code is TypeScript.
- English and Spanish internationalization PRD: website routing, app preferences, authentication, billing, emails, and support in generated projects.
- Node.js ≥ 18
- Bun (repo is configured with
packageManager: bun@1.3.9)
bun installRun both apps with Turborepo:
bun run devTo run a single app:
bunx turbo run dev --filter=web
bunx turbo run dev --filter=appLocal defaults (when both are running):
The web app rewrites /app traffic to the app origin. Set APP_ORIGIN so links resolve correctly:
# from apps/web
APP_ORIGIN=http://localhost:3001Build everything:
bun run buildBuild a single target:
bunx turbo run build --filter=web
bunx turbo run build --filter=appWe use Biome instead of ESLint/Prettier inside apps.
From the repo root (runs across workspaces via Turborepo):
bun run lint # executes "biome check" in each app
bun run format # executes "biome format --write" in each appFrom an individual app directory:
bun run lint
bun run formatNote: The root still includes Prettier primarily for miscellaneous files. Prefer Biome for TypeScript/JavaScript formatting in app workspaces.
bun run check-typesBoth apps transpile and consume @turbotemplate/ui.
Example usage:
import { Button } from "@turbotemplate/ui/components/button";
export default function Example() {
return <Button>Click me</Button>;
}Aliases provided by the apps map ui and utils to the package (see each app's components.json).
apps/apphasbasePath: "/app".apps/webrewrites/appand/app/:path*toAPP_ORIGIN.
For local development set APP_ORIGIN=http://localhost:3001 in apps/web when both apps run.
- Cache-aware tasks live in
turbo.json. - Use
--filterto scope tasks, e.g.--filter=webor--filter=app.
Useful docs: tasks, caching, filters, and configuration at the Turborepo site.
Both apps share typed catalogs in packages/i18n. Public Spanish pages use /es. Account pages keep /app paths and save the selected language in account settings.
See the translation guide for message, route, locale, email, and template changes. See vendor release checks before announcing bilingual support.
bun run check-i18n
bun run test
bun run check-templateDependencies use the latest stable registry versions checked on 6 September 2026. Use Bun 1.4.0 and Node 24 LTS. Next.js 16.3.4 has a small tracked patch to preserve response Vary headers. See the translation guide before upgrading Next.js.