Project structure

Where code lives in a generated Taman monorepo, and which packages stay on npm.

Paths below use the default @taman/ scope. After create-taman --scope acme, every @taman/ name becomes @acme/.

Top level

apps/
  web/                 @taman/web     Vue 3 SPA (Vite)
  api/                 @taman/api     Nitro v3 API (Cloudflare Workers)
packages/
  shell/               browser-only workspace packages
  server/              db-pg, emails
  shared/              api-contract, rbac, constants
docker-compose.yml     Postgres 18 on host port 5437
pnpm-workspace.yaml    catalog + workspace globs
nx.json                nx project graph
template.manifest.ts   only in the source repo — removed on generate

Published packages (@vinicunca/taman-core, taman-ui, request, create-taman, and internal/*) exist in the source repository. Generated projects install them from npm.

Web app (apps/web)

PathRole
src/main.tsinitPreferences then dynamic bootstrap
src/bootstrap.tsadapters, Pinia, i18n, access directive, router, Vue Query, pohon, AG Grid
src/preferences.tsdefineOverridesPreferences (home path, app name)
src/router/routes/core.tsRoot, login, 404
src/router/routes/modules/*.tsFeature routes, auto-loaded
src/router/routes/modules/dev/**Example gallery (stripped from generated projects)
src/views/Page components (todo/, _core/)
src/api/orpc.tsTyped oRPC client + query utils
src/api/http.tsExample REST client (dummyjson)
src/auth/better-auth Vue client, session store
src/adapter/Form + component adapters for taman-ui
src/locales/langs/App message JSON (en-US, id-ID)

Import alias: #/* → ./src/*.

API (apps/api)

PathRole
nitro.config.tsWorker name, Durable Object, queues, send_email, runtimeConfig, port 8788
server/routes/api/auth/[...all].tsbetter-auth
server/routes/api/rpc/[...path].tsoRPC
server/routes/healthz/Liveness { status: 'ok' }
server/routes/readyz/Readiness (database)
server/rpc/base.tsos / authed procedures
server/rpc/router.tsmenu + todo routers
server/domains/<feature>/repo + service
server/auth/better-auth instance, emails, org resolution
server/email/sender, dispatcher, queue consumer
server/realtime/publisher.tsDurable Object vs in-memory publisher
scripts/seed-admin.tsDev admin user and its demo organization
scripts/seed-todos.tsSample todos
exports.cloudflare.tsTodoPublisherObject Durable Object class

Import alias: #* → ./server/*.

Workspace packages

packages/shell

Browser-only. Stay in the generated project.

PackageRole
@taman/accessv-access directive, useAccess, generateAccessible
@taman/app-uiApp wrappers around taman-ui
@taman/composablesuseAppTamanConfig and related
@taman/designsTheme tokens, UnoCSS, virtual:pohon-theme
@taman/layoutsCore layout chrome (header, sidebar, tabs)
@taman/localesvue-i18n setup shared with the app
@taman/storesPinia stores (access, user, tabbar, …)
@taman/typesApp-level types
@taman/utilsRoute helpers, nprogress, loading overlay

packages/server

PackageRole
@taman/db-pgDrizzle client + src/schemas
@taman/emailsMaizzle templates (invitation, reset-password, verify-email)

packages/shared

Used by both apps.

PackageRole
@taman/api-contractoRPC contract (menu, todo)
@taman/rbacbetter-auth access control + USER_ROLES / ORGANIZATION_ROLES
@taman/constantsLOGIN_PATH, languages; re-exports taman-core constants

What generate removes

From template.manifest.ts:

  • packages/taman-core/**, taman-ui/**, request/**, create-taman/**, internal/**
  • .github/**, .changeset/**, scripts/release/**, scripts/deploy/**, docs/**, tasks/**
  • Example gallery: apps/web/src/views/examples/**, routes/modules/dev/examples.ts, locales/*/examples.json
  • CLAUDE.md, AGENTS.md, Graphify output, .gitpod.yml, template.manifest.ts, pnpm-lock.yaml

The todo feature stays as the reference implementation.