Collaborative trip planning built as a flat, feature-oriented monorepo.
web/
app/
src/features/
src/server/
packages/
config-eslint/
config-typescript/
contracts/
db/
route-engine/
trip-analysis/
trip-domain/
trip-editor/
trip-fixtures/
docs/
*.mdweb/app: Next.js routes onlyweb/src/features: client-side features onlyweb/src/server: server-only orchestration and HTTP helpersweb/src/features/trip-planner: one feature with fixed internal layers:model / ui / shell / editor / services / shared / stylesweb/src/features/trip-planner/editor: split by editing subdomain:layout / timeline / place-binding / planner / workspaceweb/src/features/trip-planner/services: split by transport/persistence responsibility:http / auth / workspace / planner / localpackages/trip-domain: pure types, selectors, factoriespackages/trip-editor: pure document commandspackages/trip-fixtures: demo data and default seed contentpackages/route-engine: deterministic route planning and providerspackages/trip-analysis: user-facing analysis derived from domain datapackages/contracts: request and response schemaspackages/db: database runtime and schema onlypackages/db: SQLite runtime-first package with Prisma schema as the schema source of truth
Each module exposes a small public surface through its package index.ts or module index.ts.
Internal files are free to change without becoming public API.
web/app/api is intentionally flat. Route handlers live one level under app/api:
auth-loginauth-registerauth-sessionauth-logoutplaces-searchplanner-feasibilityworkspace-bootstraptrip-createtrip-itemtrip-invitetrip-join
corepack enable
pnpm install
pnpm devOpen http://localhost:3000.
pnpm lint
pnpm typecheck
pnpm test
pnpm buildexport NEXT_PUBLIC_MAP_PROVIDER=auto
export NEXT_PUBLIC_AMAP_KEY=your_amap_web_key
export NEXT_PUBLIC_AMAP_SECURITY_CODE=your_amap_security_code
export AMAP_WEB_SERVICE_KEY=your_amap_web_service_key