Externa

Open-source CMS for structured content and files

Admin UI, Public API, permissions, optional in-app AI — self-hosted.

Built on Laravel, Herd, PHP, Postgres, MySQL, Redis, Docker, Inertia, React, Vite, and Tailwind — open source

Laravel
Herd
PHP
Postgres
MySQL
Redis
Docker
React
Inertia
Vite
Tailwind CSS

One admin for content, files, access, and ops.

Dashboard insights, collection packs, a file tree, activity logs, and health tabs — the same UI your operators use every day.

Externa admin dashboard

Platform

Everything operators need — without filing a ticket.

Collections

Model content your way

Define collections and typed fields, create items with locales, or bootstrap from packs — Articles, Products, Pages, SEO, and more.

Files

Hierarchical file manager

Folders, uploads, tags, duplicate, and async zip downloads — a real tree, not a flat dump.

Keyboard

Built for power users

Keyboard-first admin on React and Inertia — dashboard Overview and Health, with the assistant one click away.

Access

Roles, groups, permissions

Spatie RBAC plus user groups — effective permissions gate the admin UI and every AI tool the same way.

Anywhere

Self-host on your stack

SQLite for local, MySQL or Postgres in production. Optional Redis + Horizon + Reverb + Pulse when you need the full ops surface.

AI assistant

Ship content faster with permission-aware AI.

In-app assistant on laravel/ai — tools gated by effective permissions, with cloud or local providers.

Local AI
User
Assistant
Collections
Files
Imports
Activity

Every tool call checks the signed-in user’s effective permissions — same gate as the admin UI.

  • Permission-aware tools

    Collections, files, imports, and activity tools only run when the user is allowed.

  • Imports & sync

    Chat attachments and import jobs stay inside the same operator workflow.

  • Local + cloud

    Point LOCAL_AI_* at an OpenAI-compatible gateway, or use a cloud provider.

  • Same RBAC as admin

    Spatie effective permissions gate the UI and every assistant tool the same way.

Headless

Ship APIs on the same source of truth.

public-cms-api
GET/api/v1/items/articles
{ "data": [{ "id": 1, "status": "published" }] }
POST/api/v1/items/products
{ "data": { "id": 42, "sku": "EXT-100" } }
GQL{ collections { name fields { type } } }

Public CMS API

REST for websites and apps

Headless /api/v1 with a per-collection create/read/update/delete matrix for anonymous public access and Bearer API keys.

Integrations

Webhooks & GraphQL

HMAC-signed outbound events plus GraphQL — connect frontends and automation without inventing another auth story.

Teams

Operators and builders together

Content teams manage collections; platform teams ship branding, locales, modules, and webhooks from project settings.

Providers

On-machine gateway

LOCAL_AI_BASE_URL=http://127.0.0.1:11434

Local AI

Run models on your machine

Point LOCAL_AI_* at an OpenAI-compatible gateway — no cloud required for the optional assistant. See the AI showcase · Configure local AI

Open source

Clone it. Seed it. Own the deployment.

Externa ships as externa-core — Laravel, Inertia + React 19, Spatie permission & activitylog, Vite, and Tailwind. No SaaS lock-in: you control the database, the queue worker, and the AI gateway.

  1. Install with Laravel Herd — composer setup, seed, storage:link, then composer run dev.
  2. Sign in as super admin and explore collections, files, users, and settings.
  3. Keep a queue worker running for zip, duplicate, and import jobs. Optional: point LOCAL_AI_* at an OpenAI-compatible gateway.