Dreamtime Expeditions

June 23, 2026 · View on GitHub

Platform for a high-end private expedition cruise business on the Kimberley coast (Western Australia) — marketing site, booking, operations, and AI agents. Built as a monorepo; shipped in slices.

Tech stack

LayerChoice
MonorepoTurborepo + pnpm workspaces, TypeScript
FrontendNext.js 16 (App Router) · React 19 · Tailwind CSS v4
Runtime / hostingCloudflare Workers (via @opennextjs/cloudflare)
DatabaseSupabase Postgres, reached through Cloudflare Hyperdrive
ORMDrizzle ORM + drizzle-kit (code-first schema & migrations)
CMS (planned)Payload CMS v3 (Postgres-backed), media in Cloudflare R2
Payments (planned)Stripe, behind a FinanceProvider adapter
AI (later slices)Multi-agent + MCP servers, metered via OpenRouter
CI/CDGitHub Actions (mega-linter, CodeQL, gitleaks), Cloudflare Workers Builds

Layout

apps/
  web/            Next.js app (marketing, later: booking, console, AI portal)
packages/
  db/             Drizzle schema + client (single source of truth for ops tables)
  core/           shared domain types & rules        (stub)
  finance/        Stripe adapter                      (stub)
  ui/             shared design system                (stub)
docs/superpowers/ design specs & implementation plans

Commands

pnpm install                 # install the workspace

# Develop
pnpm dev                     # turbo → next dev for apps/web
pnpm --filter @dreamtime/web preview   # run on the real Workers runtime (workerd)

# Build / deploy
pnpm build                   # turbo → next build
pnpm run deploy              # opennextjs-cloudflare build && deploy (Cloudflare)

# Quality
pnpm typecheck
pnpm lint

# Database (Drizzle → Supabase)
pnpm --filter @dreamtime/db db:generate   # generate a migration from the TS schema
pnpm --filter @dreamtime/db db:migrate    # apply migrations to Supabase

Local env

apps/web/.dev.vars and packages/db/.env are gitignored. Copy the matching *.example files and fill in the Supabase connection string. The Hyperdrive local connection string is only needed for next dev/preview, not production.

Deployment

main is deployed automatically by Cloudflare Workers Builds (root directory apps/web, build npx opennextjs-cloudflare build, deploy npx opennextjs-cloudflare deploy). No code is committed to main directly — all changes land via a feature branch and PR.