Skip to content

Monorepo Orientation

Kubuli is a pnpm workspace + Turborepo monorepo. All apps are in apps/ and shared code lives in packages/.

Repository layout

kubuli-monorepo/
├── apps/
│   ├── web/        # Nuxt 4 — marketing site + discovery platform
│   ├── api/        # HonoX — backend API
│   ├── admin/      # Laravel 13 — CMS and content console
│   ├── mobile/     # React Native — iOS and Android
│   └── docs/       # VitePress — this site
├── packages/
│   └── database/   # @kubuli/database — Prisma client + mirrored schema for TS apps
├── docs/           # Monorepo-wide architecture records
├── turbo.json      # Turborepo task pipeline
└── pnpm-workspace.yaml

Apps

apps/web — Discovery platform

Framework: Nuxt 4 (Vue 3) Purpose: Marketing site, real-time events feed, POI map, cultural explorer Port: 3000 Deploys to: Cloudflare Workers Key patterns: Composition API with <script setup>, Nuxt Content for static pages, Nuxt SEO

apps/api — Backend API

Framework: HonoX (Hono 4 + Vite) Purpose: RESTful data layer for web and mobile — events, places, culture, auth, tours Port: 3001 Language: TypeScript strict Key patterns: File-based routing under app/routes/api/, shared auth middleware, Prisma via @kubuli/database

apps/admin — CMS console

Framework: Laravel 13, Filament v5 Purpose: Content ingestion review, event/place/culture/media management, user roles Server: FrankenPHP (Octane) Key patterns: Filament resources for each content type, Spatie roles/permissions, n8n ingestion integration

apps/mobile — Mobile app

Framework: React Native Purpose: Native iOS and Android client Status: Early stage

apps/docs — Documentation site

Framework: VitePress Purpose: Audience-first docs for admins, developers, and integrators Port: 4173

Shared packages

@kubuli/database

Prisma schema mirror plus the shared Prisma client singleton for the TypeScript apps. All apps that need Prisma access import from here.

ts
import { prisma } from "@kubuli/database";
import type { Event, Place } from "@kubuli/database";

Commands:

bash
pnpm --filter=@kubuli/database db:generate   # Regenerate Prisma client after db pull
pnpm --filter=@kubuli/database db:studio     # Open Prisma Studio

Laravel owns the shared schema migrations in apps/admin. After those migrations run, sync Prisma from the live database with prisma db pull, then regenerate the client.

Cross-app data flow

Ingestion agents (n8n)
  → POST /admin/api/ingest/{type}
      Admin CMS (Laravel + Filament)
          → Curator reviews, approves, promotes
              PostgreSQL (shared database)
                  ← API reads canonical records
                      Web / Mobile clients

Turborepo task pipeline

Tasks are defined in turbo.json. Key tasks:

TaskRuns inCache
buildAll apps/packagesYes — dist/**
devAll apps/packagesNo — persistent
testAll apps/packagesYes
lintAll apps/packagesYes
type-checkTS apps/packagesYes

Ownership and context files

Each app ships an AGENTS.md with AI agent context and a README.md with developer setup. Architecture decisions that span multiple apps live in docs/architecture/. Per-app decisions live in apps/{app}/docs/.

Built with VitePress