Sign inSign up

b10cks/cms

By b10cks

•Updated 15 days ago

Headless CMS. Nestable blocks, live collaborative editing, versioning, cached REST API. AGPLv3.

Image
Content management system
0

4.3K

b10cks/cms repository overview

⁠b10cks CMS

The opinionated headless CMS. Model content as reusable blocks, edit it visually with your team in real time, deliver it anywhere through a fast, cached Data API.

Self-host the full product under AGPL-3.0 — no enterprise edition, no license keys, no feature gates — or use b10cks Cloud⁠.

Website⁠ · Documentation⁠ · GitHub⁠ · Discord⁠


⁠Quick start

On any machine with Docker:

curl -fsSL https://get.b10cks.com | sh

The installer writes a compose stack into ./b10cks, generates a database password, starts everything, and waits for the health check. It is scripts/install.sh⁠ — read it before piping it to a shell, as you should with any such command.

Then open http://localhost:8000⁠ and create the first account. Do this immediately: a fresh instance accepts open sign-ups only until the first account exists — that account becomes the owner and everyone after joins by invitation.

⁠Or by hand
curl -LO https://raw.githubusercontent.com/b10cks/cms/main/docker-compose.yml
curl -Lo .env https://raw.githubusercontent.com/b10cks/cms/main/.env.docker.example
# edit .env: APP_URL, DB_ROOT_PASSWORD, mail settings
docker compose up -d

On first boot the container generates an APP_KEY (persisted on the storage volume) and runs the installer automatically. Optional services sit behind compose profiles:

docker compose --profile redis --profile opensearch --profile reverb up -d

⁠Tags & platforms

TagMeaning
latestNewest release
v2026.7.29-5acd0668A specific release⁠ — pin this in production

Multi-arch manifests for linux/amd64 and linux/arm64; Docker picks the right one automatically. Mirrored to ghcr.io/b10cks/cms — useful if you hit Docker Hub's unauthenticated pull limit.

Images are published with build provenance attestations and an SBOM.

⁠What's in the image

FrankenPHP (PHP 8.5, Alpine) running Laravel Octane under supervisord, plus the queue workers and the scheduler — one container is a complete, working instance. ffmpeg, libvips and libheif are included for video previews and fast image processing.

  • Ports: 8000 (HTTP), 8001 (Reverb websockets)
  • Volume: /app/storage — uploads, transfers, SQLite space databases, and the generated APP_KEY
  • Health check: GET /mgmt/v1/health
  • Runs as an unprivileged user (app, uid 1000); application code is root-owned and read-only to the runtime

The same image serves the websocket process — set B10CKS_SUPERVISORD_CONF=/etc/supervisord-reverb.conf (the bundled compose file does this for you under the reverb profile).

⁠Configuration

Everything is standard Laravel .env configuration. The essentials:

VariableDefaultPurpose
APP_URLhttp://localhost:8000Public URL of the instance
APP_KEYgeneratedEncrypts secrets at rest — back it up
B10CKS_EDITIONself-hostedDisables the SaaS billing surface, seeds one unlimited plan
B10CKS_INSTALL_PROFILEstandardstandard = one database per space (needs admin DB credentials); shared = one database with per-space table prefixes
B10CKS_AUTO_SETUPtrueRun the installer/upgrader on boot
DB_*—MySQL 8.0+ / MariaDB connection
QUEUE_CONNECTION / CACHE_STORE / SESSION_DRIVERdatabase / file / databaseRedis recommended at scale
FILESYSTEM_DISKlocallocal, s3, or gcs for uploaded assets
BROADCAST_DRIVERnullSet to reverb for live collaboration and presence
OPENSEARCH_HOST—Optional; MySQL fulltext is the default search driver
AI_MODE / OPENROUTER_API_KEYsingle / emptyOptional AI features; empty key disables them
MAIL_*logInvites, notifications, password resets
TRUSTED_PROXIES / TRUSTED_HOSTSemptyRequired behind a load balancer or CDN

Full reference: Configuration⁠.

The stack speaks plain HTTP and binds to 127.0.0.1 by default. Put a TLS reverse proxy in front of anything reachable from other machines. If you proxy media, forward Range headers and don't buffer whole responses.

⁠Upgrading

Set B10CKS_IMAGE_TAG to the new release tag, then:

docker compose pull
docker compose up -d

On boot the container compares the image's version against the one recorded on the storage volume and runs b10cks:upgrade when they differ — migrating the management database and every space database. An ordinary restart costs nothing; a real upgrade is never forgotten.

docker compose logs app | grep -i upgrad   # confirm it ran

⁠Backups

Three things: all databases (one per space on the standard profile), /app/storage, and .env.

docker compose exec db mariadb-dump -uroot -p"$DB_ROOT_PASSWORD" \
  --all-databases --single-transaction | gzip > b10cks-db-$(date +%F).sql.gz
docker compose exec app tar -czf - -C /app storage | cat > b10cks-storage-$(date +%F).tar.gz
cp .env b10cks-env-$(date +%F)

Losing APP_KEY is unrecoverable. It encrypts API tokens and integration credentials at rest; a database restore without the matching key leaves that data permanently unreadable. If you never set it in .env, the container generated one at storage/app/setup/app.key — copy it somewhere safe now.

Named volumes survive docker compose down and image upgrades, but not docker compose down -v. Volumes are not backups. See Backup & restore⁠ for the full restore procedure.

⁠Features

  • Git-like content history — every save is a commit with author and message; history branches instead of overwriting, with schema-aware diffs
  • Live collaboration — Figma-style presence and real-time co-editing down to individual blocks, comments included
  • The Canvas — plan and restructure whole site sections on an infinite whiteboard, then apply in one click
  • A real query API — 16 filter operators, sorting by your own fields, language fallback, revision-based caching, all in plain GET requests
  • Your own Iconify registry — brand icons served through the Iconify protocol
  • Multi-tenant spaces with optionally isolated per-space databases

Plus block-based content modeling, releases with atomic publishing, scheduled publication, a hierarchical asset library with on-the-fly WebP/AVIF transformations, localization, full-text search, AI-assisted workflows, redirects, backups, and space-to-space migrations.

⁠Not using Docker?

A webhost package (pre-built archive with a browser installer, for shared hosting — no Docker, no Composer, no shell) ships with every release⁠. Manual installs from source are supported too; see the installation guide⁠.

⁠License & support

AGPL-3.0⁠. Report vulnerabilities responsibly via the security policy⁠.

Questions: Discord⁠ · GitHub Discussions⁠

Tag summary

Content type

Image

Digest

sha256:c7554d79e…

Size

211.3 MB

Last updated

15 days ago

docker pull b10cks/cms