A lightweight, self-hosted home for your images.
ImageSilo is a Docker-first image host built as one Go process with SQLite and local file storage. It provides authenticated uploads, stable public URLs, historical aliases, scoped API tokens, image processing, and a responsive React administration interface without Redis, an external database, or a background job service.
The current release is
v0.1.0-rc.3. Every successful release also updates the mutablelatesttag. Production deployments should still pin an immutable version tag or digest.
- Store JPEG, PNG, WebP, and GIF images with strict decoding and a 16 MP safety limit
- Preserve original bytes or explicitly compress and convert static images to WebP
- Deliver public images, historical aliases, and path-preserving migration files with Range, conditional request, and HEAD support
- Keep the delivery hot path in memory, with no SQLite lookup per image request
- Manage public/private visibility, administrator sessions, CSRF protection, login rate limits, and scoped API tokens
- Upload, search, filter, inspect, batch-update, and permanently delete images from the built-in web interface
- Import legacy URLs, verify bytes by SHA-256, inspect storage, and rebuild in-memory indexes
- Run as a non-root, multi-architecture container with image processing concurrency set to
1by default
Docker is the supported production runtime. The following starts a local evaluation instance with a named volume:
export IMAGESILO_IMAGE=ghcr.io/willxup/imagesilo:v0.1.0-rc.3
docker pull "$IMAGESILO_IMAGE"
docker volume create imagesilo-data
docker run --detach \
--name imagesilo \
--restart unless-stopped \
--publish 127.0.0.1:8080:8080 \
--env IMAGESILO_COOKIE_SECURE=false \
--env IMAGESILO_PROCESSING_CONCURRENCY=1 \
--volume imagesilo-data:/data \
"$IMAGESILO_IMAGE"On the first launch, run docker logs -f imagesilo and copy the bootstrap_token printed by ImageSilo. Open http://127.0.0.1:8080/admin/setup, enter that token, and create the administrator account. The token exists only in memory, is replaced after an uninitialized restart, and is erased after setup succeeds. The imagesilo admin create command remains available for scripted deployments.
For production, terminate HTTPS at a reverse proxy, keep IMAGESILO_COOKIE_SECURE=true, and back up the complete /data directory while writes are stopped. See the deployment guide before exposing the service.
To preserve an existing image URL tree without creating one alias at a time, mount it read-only at /data/migrations. A file mounted as /data/migrations/i/2022/04/example.jpg is immediately available at /i/2022/04/example.jpg. Managed historical aliases take precedence when both sources contain the same path; only JPEG, PNG, WebP, and GIF files are exposed.
| Area | ImageSilo V1 |
|---|---|
| Runtime | One Go process in one container |
| Metadata | SQLite in /data/db |
| Images | Local files in /data/images |
| Path-preserving migrations | Read-only image tree in /data/migrations |
| Cache | Local thumbnails in /data/cache |
| Processing | libvips, concurrency 1 by default |
| Delivery | File streaming with ETag revalidation; unlimited by default (0), optionally capped |
| Platforms | linux/amd64, linux/arm64 |
| Production storage | Docker named volume or local bind mount |
NFS and SMB are not supported. Do not run two ImageSilo containers against the same writable /data directory.
- Go 1.26.5
- Node.js 26.5.0
- npm
npm --prefix web ci
make check
make buildCreate an administrator and run the local binary:
IMAGESILO_DATA_DIR="$PWD/data" \
./bin/imagesilo admin create --email admin@example.com
IMAGESILO_DATA_DIR="$PWD/data" \
IMAGESILO_COOKIE_SECURE=false \
./bin/imagesilo serveUse /healthz for liveness and /readyz for SQLite readiness. Run make e2e for the single-worker browser workflow.
| Topic | Guide |
|---|---|
| Docker deployment, backup, upgrade, and rollback | Deployment |
| API tokens, curl, PicGo, and ShareX | API token usage |
| Legacy image and URL migration | Imports |
| Inspection, cleanup, and index rebuilds | Operations |
| Architecture and data model | Architecture · Data model |
| Security and lightweight resource evidence | Security audit · Performance baseline |
| Release images and acceptance checks | Release guide |
| HTTP API contract | OpenAPI |
| Bundled third-party licenses | Third-party notices |
Stages 0–7 are complete, including native amd64/arm64 verification and the public v0.1.0-rc.3 release candidate. Production migration remains a separate, environment-specific step. See development status for the current evidence and remaining work.