Silo ships as a self-contained binary that includes both the server and the admin UI. Pick the installation method that fits your environment, start the server, and you will have a live REST API and a generated admin interface in minutes.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/org-quicko/silo/llms.txt
Use this file to discover all available pages before exploring further.
The Docker image is available as
labsatquicko/silo on Docker Hub and as ghcr.io/org-quicko/silo on the GitHub registry. Every release tag carries both amd64 and arm64 images, signed with Sigstore and carrying build provenance.Running from source? Replace every
silo command in this guide with bun run apps/server/src/main.ts. The two are the same program. Requires Bun 1.3 or later.On the first start of an empty instance, Silo generates a root API key and prints it once to the console. Copy it now — you will need it in the next step and it is never shown again.
Store the root key somewhere safe immediately. If you lose every key, you can mint a new one directly against the data directory — no server needs to be running:
By default, Silo listens on
http://localhost:8090 and stores data in ./silo_data. Run silo init first to write a silo.toml with all defaults if you want to customise the port or data path before the first start.Open http://localhost:8090 in your browser. The admin UI will prompt you to add a server. Enter:
In the admin UI, navigate to your project and environment, then create a new collection. Give it a name — for example
posts — and paste in a JSON Schema:{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"title": { "type": "string" },
"body": { "type": "string" }
},
"required": ["title"]
}
Silo validates every write against this schema. Save the schema and the admin immediately draws a form for it.
Use the generated form in the admin UI to fill in a title and body and save the entry. Or create one directly with the API:
curl -X POST http://localhost:8090/api/projects/default/envs/prod/collections/posts \
-H "Authorization: Bearer $SILO_KEY" \
-H "Content-Type: application/json" \
-d '{"title": "Hello World", "body": "My first post."}'
A successful response includes the entry in its Silo envelope — a ULID
id, a rev, and UTC timestamps:{
"id": "01J8XXXXXXXXXXXXXXXXXXXX",
"title": "Hello World",
"body": "My first post.",
"created_at": "2025-01-15T10:30:00Z",
"updated_at": "2025-01-15T10:30:00Z"
}
curl http://localhost:8090/api/projects/default/envs/prod/collections/posts \
-H "Authorization: Bearer $SILO_KEY"
What’s next
Now that your first entry is in, here are a few things to explore:- Filter and sort entries — append
?filter=<url-encoded JSON>&sort=-$.updated_atto a list request. Filters are a small JSON AST over RFC 9535 JSONPath. - Search across collections —
GET /api/search?q=hellosearches everything the key can read. - Create scoped API keys — use the admin UI or
silo keys create --preset write --label my-appto mint a key with limited claims for your application. - Upload media — open the Media Library in the admin UI to upload files. Silo stores them on local disk by default, or in any S3-compatible bucket.
- Export your data —
silo export --out backup.tar.gzbundles every schema, entry, and media file into a portable archive.