Sign inSign up

b10cks/cms

By b10cks

Updated about 3 hours ago

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

Image
Content management system
0

3.0K

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_HOSTOptional; 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:255f65e9f

Size

211.7 MB

Last updated

about 3 hours ago

docker pull b10cks/cms