Skip to main content

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.

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.
1
Install Silo
2
Choose the method that fits your platform:
3
Homebrew
brew install org-quicko/tap/silo
Docker
docker run -p 8090:8090 -v silo_data:/data labsatquicko/silo
dnf (Amazon Linux 2023 Fedora)
sudo curl -fsSL -o /etc/yum.repos.d/silo.repo \
  https://org-quicko.github.io/silo/silo.repo
sudo dnf install silo
sudo systemctl enable --now silo
Prebuilt binary
# Download the archive for your platform from:
# https://github.com/org-quicko/silo/releases
# Extract the archive and place the silo binary on your PATH.
# Each release includes a SHA256SUMS file signed with both Sigstore and GPG.
tar -xzf silo-*.tar.gz
mv silo /usr/local/bin/silo
4
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.
5
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.
6
Start the server
7
silo serve
8
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.
9
✦ root key (shown once): silo_sk_01J8XXXXXXXXXXXXXXXXXXX...
10
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:
silo keys create --preset root --label recovery
11
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.
12
Add the server in the admin UI
13
Open http://localhost:8090 in your browser. The admin UI will prompt you to add a server. Enter:
14
  • URL: http://localhost:8090
  • API key: the root key printed in the previous step
  • 15
    Once connected, you will see the project and environment Silo created by default: default / prod.
    16
    Create a collection
    17
    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:
    18
    {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "type": "object",
      "properties": {
        "title": { "type": "string" },
        "body":  { "type": "string" }
      },
      "required": ["title"]
    }
    
    19
    Silo validates every write against this schema. Save the schema and the admin immediately draws a form for it.
    20
    You can also create a collection via the API:
    curl -X POST http://localhost:8090/api/projects/default/envs/prod/collections \
      -H "Authorization: Bearer $SILO_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "name": "posts",
        "schema": {
          "$schema": "https://json-schema.org/draft/2020-12/schema",
          "type": "object",
          "properties": {
            "title": { "type": "string" },
            "body":  { "type": "string" }
          },
          "required": ["title"]
        }
      }'
    
    21
    Add your first entry
    22
    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:
    23
    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."}'
    
    24
    A successful response includes the entry in its Silo envelope — a ULID id, a rev, and UTC timestamps:
    25
    {
      "id": "01J8XXXXXXXXXXXXXXXXXXXX",
      "title": "Hello World",
      "body": "My first post.",
      "created_at": "2025-01-15T10:30:00Z",
      "updated_at": "2025-01-15T10:30:00Z"
    }
    
    26
    Make your first API call
    27
    Read all entries from the posts collection:
    28
    curl http://localhost:8090/api/projects/default/envs/prod/collections/posts \
      -H "Authorization: Bearer $SILO_KEY"
    
    29
    The response is paginated:
    30
    {
      "data": [
        {
          "id": "01J8XXXXXXXXXXXXXXXXXXXX",
          "title": "Hello World",
          "body": "My first post.",
          "created_at": "2025-01-15T10:30:00Z",
          "updated_at": "2025-01-15T10:30:00Z"
        }
      ],
      "total": 1,
      "limit": 50,
      "offset": 0
    }
    

    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_at to a list request. Filters are a small JSON AST over RFC 9535 JSONPath.
    • Search across collections — GET /api/search?q=hello searches everything the key can read.
    • Create scoped API keys — use the admin UI or silo keys create --preset write --label my-app to 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.gz bundles every schema, entry, and media file into a portable archive.
    You can also use the key as X-Api-Key: <key> instead of Authorization: Bearer <key> — both header forms are accepted on every route.

    Build docs developers (and LLMs) love