A multi-tenant publishing platform with an AI-assisted editor and AI visibility monitoring.
Features · Quick start · Stack · Verification · Production · Documentation
- 📝 AI-assisted publishing — Tiptap editor, article generation, drafts and translations.
- 🌐 Client sites — isolated tenants, subdomains, custom domains and configurable site widgets.
- 🔎 SEO & AI visibility — search insights, citation monitoring and content opportunities.
- 💬 Community — comments, follows and reader notifications.
- 💳 Billing — Stripe subscriptions and credit top-ups.
- 🔐 Access & localization — tenant access policies, OTP / 2FA and English, Czech, German and French.
Requirements: Bun 1.4.2, Node 24.21.0 and Docker. Versions are pinned in .prototools and .node-version; Node is needed for Vue type checking and browser tests.
1. Configure your environment
Copy .env.example to .env and configure the services needed for your work.
2. Install dependencies and generate the ORM
bun install --frozen-lockfile
bun run zenstack:generate3. Start the database, seed it and launch Nuxt
bun run db:up
bun run db:migrate:deploy
bun run db:seed
bun --bun run devThe database and cache start through db:up; dev starts Nuxt only.
Database management
db:reset and db:fresh delete local database and cache volumes.
bun run db:down # stop local services
bun run db:reset # delete volumes and recreate services
bun run db:fresh # reset, migrate and seedZenStack generates ignored schema metadata and TypeScript types in generated/zenstack/. The application uses ZenStack ORM directly; Prisma is an internal migration dependency of the ZenStack CLI.
| Area | Technology |
|---|---|
| Application | Nuxt 4 · Vue 3.5 · TypeScript |
| UI | Nuxt UI 4 · Tailwind CSS 4 · Reka UI |
| State & queries | Pinia · Pinia Colada |
| Data | ZenStack ORM 3 · PostgreSQL · pgvector |
| Editor | Tiptap 3 with custom extensions |
| AI | AI SDK 7 · Claude Haiku 5.5 · OpenAI |
| Runtime | Bun 1.4.2 · Node 24.21.0 |
Integrations and tooling
- Authentication: Better Auth, ZenStack adapter, argon2 and OTP / 2FA.
- Billing: Stripe subscriptions and credit top-ups.
- Media & email: AWS S3 / Rekognition / SES, Sharp, MJML 5, PDFKit and Takumi OG images.
- Cache: optional Redis / Valkey.
- AI visibility: native search adapters for visibility providers; each key in .env.example enables one.
- Testing: Vitest, Nuxt Test Utils, jsdom and Playwright.
- Code quality: ESLint, Prettier and vue-tsc.
Generate the ZenStack artifacts before checking a fresh checkout.
bun run zenstack:generate
bun run lint
bun run typecheck
bun run openapi:check
bun run test
bun run prettierWatch mode and coverage
bun run test:watch
bun run test:coverageDatabase and browser tests
PostgreSQL integration and browser tests require a separate disposable database in TEST_DATABASE_URL; they can apply migrations and clear test data. Never point this variable at a development or production database you want to keep.
bun x --no-install playwright install chromium webkit
bun run test:e2e
bun run test:e2e:releaseLive AI checks
These checks call provider APIs and consume credits. Model IDs are centralized in modelRegistry.ts.
bun run ai:smoke
bun run eval:ai
bun run knowledge:evalbun --bun run build # generate ZenStack artifacts, then build Nuxt
bun --bun run previewApply database migrations with bun run release (targets DATABASE_URL). bun run build:docker is an alias for the same build.
Docker and runtime details
The Dockerfile uses the same pinned Bun version and installs from the frozen lockfile, including the compatibility patch in patches/. Its prerelease stage runs bun release with the supplied DATABASE_URL before building. The final image contains only .output and starts server/index.mjs with Bun. CI applies migrations to its disposable database before the production browser smoke tests.
When invoking Nuxt through Node instead of Bun, use a supported Node version (^22.21.0, ^24.11.0 or >=26.0.0).
- 🗺️ Architecture — source layout, data flows and implementation details.
- 📐 Project conventions — coding standards and contribution rules.
Source layout
app/ Pages, components, composables, stores and styles
server/ Nitro APIs, routes, tasks and server utilities
shared/ Shared schemas, types and utilities
prisma/ ZenStack source schema and SQL migrations
generated/zenstack/ Generated ORM schema and types (ignored)
extensions/ Custom Tiptap extensions
emails/ MJML templates and translations
i18n/ Application translations for en, cs, de and fr
scripts/ Verification, backfill and maintenance commands
tests/ Unit, server, database, evaluation and browser tests
patches/ Reproducible dependency compatibility patches
Use translated UI strings, Vue Composition API with script setup and TypeScript, and template-first SFCs. Prefer Nuxt UI components and Tailwind utilities. Update MAP.md when changing the structure or adding functionality.