Silo ships a first-class media library. Upload images, videos, documents, and other files; organize them in folders; tag them for filtering; and reference them from your entries by ID. Because entries store an asset’sDocumentation 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.
id rather than its URL, you can rename or move a file without touching a single entry.
Uploading a file
Send amultipart/form-data request to POST /api/media. The required field is file; the optional folder field places the asset in a folder path.
url field to serve the file to end users. Store the silo://media/<id> reference in entries so the URL resolves correctly even after a rename or move.
The file type must be in the configured allowlist. SVG is excluded from the default list for security reasons — SVG files can carry embedded script. To permit SVG uploads, add
svg to the [media] extensions list in silo.toml.Referencing a media asset from an entry
Store the asset’sid using the silo://media/<id> URI scheme. In your collection schema, mark the field with "x-silo-type": "media" so the admin UI renders a media picker:
url from the asset record.
Storage backends
Silo supports two storage backends, configured insilo.toml under [blob_storage].
Local disk (default)
Files are stored at
<data dir>/media. No extra configuration needed. Best for single-server deployments where the data directory is on durable storage. The driver name is fs.S3-compatible
AWS S3, MinIO, Cloudflare R2, DigitalOcean Spaces, or any other S3-compatible service. Set
driver = "s3" and supply your credentials and bucket in [blob_storage].Media URLs
How a media URL is formed depends on yourbase_url setting and your storage backend configuration.
base_url sets the host used in all media URLs. Set it to your public domain so asset URLs work outside localhost.
| Setup | URL shape | Who serves the file |
|---|---|---|
Local disk (any base_url) | <base_url>/media/<id> | Silo streams from disk |
S3 bucket, public_read = true | Bucket’s own URL | The bucket serves directly |
S3 bucket, public_read = false | <base_url>/media/<id> | Silo proxies from the bucket |
Range: bytes=... request returns 206 Partial Content, so video and audio players can seek correctly.
Folder management
Folders are plain path strings. Create them explicitly or let an upload create them implicitly via thefolder field.
Rename or move a folder
images is updated to reflect the new path.Asset operations
Rename, move, or retag
media:create claim. The url field in the asset record stays stable; only the storage path changes.Replace file content
id, filename, and url. Every entry that references it immediately shows the new file — nothing needs to be rewritten. The replacement file must be the same type. Requires media:replace and entries:update at each scope that references the asset.Bulk operations
200 with a deleted / failed breakdown. The purge endpoint additionally reports the number of folders removed. Purge requires both the media:delete and media:purge claims.
Usage tracking
Before deleting an asset, you can check which entries reference it:total (the true referrer count), visible (how many this key can read), visible_capped (whether the sample was cut short), and referrers — up to 20 entries that reference this asset. A key may not have read access to every referencing environment, so visible can be less than total.
Extensions endpoint
To populate a file-type filter in your own UI, fetch the distinct extensions currently held in the library:["jpg", "mp4", "pdf"]) that the library actually holds, matching what the admin UI uses for its Type filter.