How to Self-Host Shiori: Minimal Bookmark Manager 2026
TL;DR
Shiori (MIT, ~9K GitHub stars, Go) is a simple self-hosted bookmark manager and read-later tool. It's a lightweight alternative to Pocket or Pinboard: save URLs, archive the page content (offline readable copy), add tags, full-text search. The entire server is a single Go binary. Compare Shiori vs Linkwarden: Shiori is simpler (no PDF archiving, no collections/collaborative); Linkwarden has richer archiving and team features. Shiori is perfect for a solo, minimal setup.
Key Takeaways
- Shiori: MIT, ~9K stars, Go — single binary, SQLite, bookmark + offline archive
- Offline reading: Saves a clean readable copy of every page (no images by default)
- Browser extensions: Chrome and Firefox extensions for one-click save
- Full-text search: Search archived content, not just titles/tags
- REST API: Automate bookmarking from scripts or other tools
- Pocket import: Import your Pocket export directly
Shiori vs Linkwarden vs Wallabag
| Feature | Shiori | Linkwarden | Wallabag |
|---|---|---|---|
| License | MIT | AGPL 3.0 | MIT |
| GitHub Stars | ~9K | ~8K | ~10K |
| Storage | SQLite/PostgreSQL | PostgreSQL | MySQL/SQLite |
| Archive: Readable | Yes | Yes | Yes |
| Archive: Screenshot | No | Yes | No |
| Archive: PDF | No | Yes | No |
| Collections | No (tags only) | Yes | Yes |
| Multi-user | Yes | Yes | Yes |
| Browser extension | Yes (Chrome/Firefox) | Yes | Yes |
| Highlights/annotations | No | No | Yes |
| RSS feed | No | No | Yes |
| Pocket import | Yes | No | Yes |
| Tech | Go | TypeScript/Next.js | PHP |
| RAM | ~30MB | ~200MB | ~100MB |
Part 1: Docker Setup
# docker-compose.yml
services:
shiori:
image: ghcr.io/go-shiori/shiori:latest
container_name: shiori
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- shiori_data:/shiori
environment:
SHIORI_DIR: /shiori
SHIORI_HTTP_PORT: 8080
SHIORI_HTTP_ROOT_PATH: ""
volumes:
shiori_data:
docker compose up -d
Visit http://your-server:8080 — first user to register becomes admin.
Part 2: HTTPS with Caddy
bookmarks.yourdomain.com {
reverse_proxy localhost:8080
}
Part 3: First-Time Setup
- Visit
https://bookmarks.yourdomain.com - Register your account (first account = admin)
- Immediately disable registration if this is a personal instance:
environment:
SHIORI_HTTP_DISABLE_SIGNUP: "true"
Or set from CLI after first user:
docker exec shiori shiori account add -u bob --password secret
Part 4: Adding Bookmarks
Web UI
- Click + New Bookmark
- Paste URL
- Shiori fetches the title, description, and optionally archives the page
- Add tags (comma-separated)
- Save
Browser Extension
Install the Shiori extension:
Configure in extension settings:
- Server:
https://bookmarks.yourdomain.com - Username + password
Click the extension icon on any page → one-click save with optional tag.
CLI
# Add a bookmark:
docker exec -it shiori shiori add https://example.com -t "tech,reference"
# List bookmarks:
docker exec -it shiori shiori print
# Search:
docker exec -it shiori shiori print -s "docker"
REST API
# Get session token:
TOKEN=$(curl -s -X POST https://bookmarks.yourdomain.com/api/login \
-H "Content-Type: application/json" \
-d '{"username":"alice","password":"your-password"}' \
| jq -r .session)
# Add bookmark:
curl -X POST https://bookmarks.yourdomain.com/api/bookmarks \
-H "X-Session-Id: $TOKEN" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com","tags":[{"name":"tech"}],"createArchive":true}'
# Search bookmarks:
curl "https://bookmarks.yourdomain.com/api/bookmarks?keyword=docker&tags=ops" \
-H "X-Session-Id: $TOKEN"
# Delete bookmark:
curl -X DELETE https://bookmarks.yourdomain.com/api/bookmarks \
-H "X-Session-Id: $TOKEN" \
-H "Content-Type: application/json" \
-d '{"ids":[42]}'
Part 5: Archiving
Shiori can save an offline readable copy of every bookmark:
Archive on save:
- Check Create archive when adding a bookmark
- Or set auto-archive by default in settings
Archive existing bookmarks:
# Archive all bookmarks that don't have an archive:
docker exec -it shiori shiori update -i all --create-archive
The archive strips ads and navigation, keeping the main article content readable offline. Images are not stored by default (keeps storage small).
Enable image archiving (larger storage):
environment:
SHIORI_HTTP_ARCHIVE_IMAGES: "true"
Part 6: Import from Pocket
Export your Pocket data and import into Shiori:
- In Pocket: Settings → Export → HTML
- Import:
docker cp pocket-export.html shiori:/tmp/
docker exec -it shiori shiori import /tmp/pocket-export.html
Import from Netscape Bookmarks (browser export)
# Export from Chrome/Firefox as HTML
docker cp bookmarks.html shiori:/tmp/
docker exec -it shiori shiori import /tmp/bookmarks.html
Part 7: PostgreSQL for Production
For larger libraries, switch from SQLite to PostgreSQL:
services:
shiori:
image: ghcr.io/go-shiori/shiori:latest
environment:
SHIORI_DIR: /shiori
SHIORI_DATABASE_URL: "postgres://shiori:${POSTGRES_PASSWORD}@postgres:5432/shiori"
depends_on:
- postgres
postgres:
image: postgres:16-alpine
environment:
POSTGRES_DB: shiori
POSTGRES_USER: shiori
POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
shiori_data:
postgres_data:
Part 8: Tags and Search
Shiori uses tags for organization (no folders or collections):
# In the search box:
docker ← full-text search across title, description, archived content
#docker ← filter by tag "docker"
#docker #ops ← bookmarks with both tags
Bulk tagging:
# Tag all bookmarks matching a search:
docker exec -it shiori shiori update -s "kubernetes" -t "k8s,ops,devops"
Maintenance
# Update Shiori:
docker compose pull
docker compose up -d
# Logs:
docker compose logs -f shiori
# Backup (SQLite):
docker exec shiori cp /shiori/shiori.db /shiori/shiori.db.backup
tar -czf shiori-backup-$(date +%Y%m%d).tar.gz \
$(docker volume inspect shiori_shiori_data --format '{{.Mountpoint}}')
# CLI account management:
docker exec -it shiori shiori account print # list accounts
docker exec -it shiori shiori account add -u bob # add user
See all open source bookmark and read-later tools at OSSAlt.com/categories/productivity.