@filo-cms/cms
v0.3.2
Published
Filo CMS — self-hosted headless/hybrid CMS as a Nuxt layer. Add `extends: ["@filo-cms/cms"]` to your nuxt.config to get the full admin panel and API.
Readme
@filo-cms/cms
Filo CMS — a self-hosted headless/hybrid CMS shipped as a Nuxt layer. One dependency gives your project the full admin panel (/admin), a REST delivery API (/api/v1), authentication with RBAC and API keys, media library, content modeling, live preview and a plugin system.
Built on Nuxt 4, Nitro, PostgreSQL and Drizzle ORM.
Quick start (recommended)
npm create filo-cms@latest my-app
cd my-app
docker compose up -d # if you chose the generated Postgres
npm run devOn first boot the CMS runs migrations and seeds the database automatically, then creates the admin account from ADMIN_EMAIL / ADMIN_PASSWORD in .env. Log in at http://localhost:3000/admin.
Manual install
npm install @filo-cms/cms nuxt// nuxt.config.ts
export default defineNuxtConfig({
compatibilityDate: "2025-07-01",
extends: ["@filo-cms/cms"],
});Required environment variables:
| Variable | Purpose |
|---|---|
| DATABASE_URL | file: (SQLite), libsql:// (Turso) or postgres:// (PostgreSQL) |
| NUXT_SESSION_PASSWORD | seals session cookies (min. 32 chars) |
| NUXT_ENCRYPTION_KEY | encrypts OAuth secrets at rest (32-byte hex) |
| NUXT_PUBLIC_APP_URL | public URL of the instance |
| ADMIN_EMAIL / ADMIN_PASSWORD | first admin account, ensured on boot |
Optional tuning: NUXT_FILO_AUTO_MIGRATE, NUXT_FILO_AUTO_SEED, NUXT_FILO_CORS_ORIGINS, NUXT_FILO_PUBLIC_RATE_LIMIT, NUXT_FILO_AUTH_RATE_LIMIT, UPLOADS_DIR, NUXT_FILO_CONTENT_TYPE_BUILDER (content-type builder is dev-only by default, Strapi-style).
What you get
- Admin panel at
/admin: content types built in the UI (text, richtext, media, relations, components, dynamic zones), draft → review → publish workflow, scheduling, revisions, media library, users/roles/permissions, API keys, webhooks, audit log, import/export - REST delivery API:
GET /api/v1is a machine-readable index of every endpoint on your instance; entries support Strapi-style querying —?filter[price][gte]=100&sort=publishedAt:desc&search=nuxt - Auth: email+password sessions, OAuth/OIDC configured from the panel, scoped
filo_...API keys, granular RBAC - Live preview: point a content type at a preview route on your site (Settings → Live preview) and the entry editor streams drafts into it as you type — see
@filo-cms/sdk
Extend it like Strapi
Your project's server/ directory merges with the CMS. Filo's utilities are auto-imported:
// server/api/my-endpoint.get.ts
export default defineEventHandler(async (event) => {
await requirePermission(event, "content_entries.view"); // sessions AND API keys
const db = useDb(); // Drizzle client
return { ok: true };
});server/middleware/* runs on every request. Files in your app/ directory override the layer's UI (e.g. your own app/pages/login.vue). Custom permissions, content types and admin pages are registered with @filo-cms/plugin-kit.
CLI
npx filo migrate # apply DB migrations
npx filo seed # seed core data
npx filo create-admin --email [email protected] --password secretEcosystem
| Package | Purpose |
|---|---|
| create-filo-cms | one-command project scaffolder |
| @filo-cms/sdk | typed API client + live preview for consuming sites |
| @filo-cms/plugin-kit | author CMS plugins as Nuxt modules |
| @filo-cms/db | Drizzle schema, migrations, seed |
| @filo-cms/types | shared TypeScript contracts |
