A minimal, customizable and portable headless CMS available as a single binary
146
A small, standards-based headless CMS. Define your collections in JSON Schema. You get an admin UI with generated forms, a REST API, and data you can move anywhere.
silo is one TypeScript process on Bun, with six runtime dependencies. It keeps content as plain JSON documents in SQLite or in flat files, it serves its own React admin UI, and each moving part sits behind an interface you can replace. There is no proprietary field language, query language, or file format in it. What silo stores, your other tools can already read.
docker run -p 8090:8090 -v silo_data:/data labsatquicko/silo
The image is on Docker Hub as
labsatquicko/silo, and on the GitHub registry as ghcr.io/org-quicko/silo.
Every release is tagged with its version, :latest points at the newest one,
and each tag carries both an amd64 and an arm64 image, signed with Sigstore and
carrying build provenance. Deployment has the two
commands that check them. To build it yourself instead:
docker build --pull -t silo .
docker run -p 8090:8090 -v silo_data:/data silo
On the first start of an empty instance, silo makes a root API key and prints it one time, to the console. Store it. You need it to connect the admin UI.
Open http://localhost:8090, add the server with its URL and that key, and you can create a collection, fill in a generated form, add entries, mint more keys, upload media, and move data between instances.
If you lose every key, mint a new one against the data directory. No server has to be running:
silo keys create --preset root --label recovery
| Term | What it is |
|---|---|
| Instance | One data directory with one instance_id. Everything below is inside it. |
| Project | A named container, for example a tenant or an application. |
| Environment | A named container inside a project, for example prod or staging. |
| Collection | A name and a JSON Schema document, identified by (project, environment, name). |
| Entry | A JSON document in a silo envelope: a ULID id, a rev, a seq, and UTC timestamps. |
| Variable | A name declared once in a project, valued per environment, and put into each {{NAME}} an entry holds. |
| API key | A key with explicit claims. silo has no users and no sessions. |
Projects and environments are plain string containers with no metadata of their own. All three of projects, environments and collections are keyed records, so you can rename any of them, and the claims that name them follow.
Entries are documents. silo does not map a schema to tables. Every write is validated against the collection's schema, and there is no way to turn that off. A read is not validated, so a schema can never make stored data unreadable.
A collection keeps its schema while it holds entries. To change the fields, delete the entries first, or export them and import them into a new collection. The access setting, the search fields and the labels stay editable at any time, because they do not decide whether an entry is valid. A later release will allow a schema change over existing data, with a plan that states what happens to those entries.
Names that start with _ belong to silo. API keys, for example, live in the
reserved _system/_system scope as a _keys collection. silo stores them
exactly like your own content, which is why every storage driver and the export
engine handle them with no special code.
x-silo-* keywords in a schema control how the admin renders and
protects a collection.PUT and DELETE on an entry take the revision
you expect, as If-Match. A mismatch is a 409, so two admin tabs cannot
overwrite each other in silence.staging and prod. Declare the name once in the project, value it
in each environment, and silo puts the value into each {{NAME}} on the way
out.cp, replicate with rsync, or review in git. You can also pull an export
straight from another running silo./api/mcp with an API key and the model gets silo's tools: browse projects
and schemas, read, search, create and update entries. Every tool is one API
route called with that key, so the key's claims decide what the model may do.Content type
Image
Digest
sha256:f52db63aa…
Size
42.6 MB
Last updated
4 days ago
docker pull labsatquicko/silo