linkding is a minimal, fast, self-hosted bookmark manager. Save links with tags and notes, find them instantly with search, and optionally archive web pages so they don’t disappear. It’s a single small container with SQLite that runs on the tiniest VPS, with browser extensions for Firefox and Chrome and a REST API.
Why self-host bookmarks?
- One bookmark collection across all browsers and devices, without a third-party account.
- Tags and full-text search beat nested folders.
- Archiving: keep a copy of pages, in case sites change or disappear.
- Shared bookmarks for a team or family.
Requirements
- Any small VPS: about 100 MB RAM for linkding itself.
- If you enable full HTML snapshots (Chromium-based), give it more RAM, roughly 1 GB.
Install with Docker
# /opt/linkding/compose.yaml
services:
linkding:
image: sissbruecker/linkding:latest-plus # "plus" includes Chromium for HTML snapshots
restart: unless-stopped
ports:
- "127.0.0.1:9090:9090"
volumes:
- ./data:/etc/linkding/data
environment:
LD_SUPERUSER_NAME: admin
LD_SUPERUSER_PASSWORD: change-me-long-password
LD_CSRF_TRUSTED_ORIGINS: https://links.example.com
cd /opt/linkding && docker compose up -d
Use the latest tag (without -plus) for a smaller image if you don’t need HTML snapshots. You can also create the admin user later with:
docker compose exec linkding python manage.py createsuperuser --username=admin [email protected]
HTTPS with Nginx
server {
server_name links.example.com;
location / {
proxy_pass http://127.0.0.1:9090;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# listen 443 ssl; certbot --nginx -d links.example.com
}
LD_CSRF_TRUSTED_ORIGINS must match the HTTPS URL, or logins and forms fail with a CSRF error. See Let’s Encrypt.
Saving bookmarks
- Browser extension (Firefox, Chrome): click to save the current page with tags. Set your server URL and API token (Settings → Integrations) in the extension options.
- Bookmarklet for other browsers.
- Mobile: use the web app’s share target (as a PWA on Android), or the community iOS shortcut.
- Titles, descriptions and favicons are fetched automatically.
Search and organise
- Search syntax: plain words,
#tag,!unread, and combinations. - Mark bookmarks as unread to use linkding as a read-it-later list.
- Bundles (saved searches) group views such as “#work #docs”.
- Share bookmarks with other users, or publicly (optional).
Archiving
- HTML snapshots (plus image): a full page copy saved locally, viewable even if the site goes offline.
- Internet Archive integration: linkding can request a Wayback Machine snapshot of new bookmarks.
Snapshots use disk space: watch the data folder. See disk usage.
Import and export
Settings → General → Import a Netscape HTML bookmarks file (exported from any browser, Pocket, Pinboard and others). Export works the same way, so you’re never locked in.
REST API
curl -H "Authorization: Token <api-token>" "https://links.example.com/api/bookmarks/?q=%23docker"
The API lets scripts and automations (for example n8n) add or search bookmarks.
linkding vs alternatives
| Tool | Focus |
|---|---|
| linkding | Minimal, fast bookmarks with tags and archiving |
| Wallabag | Read-it-later with full-text article extraction |
| Linkwarden | Collections, team sharing, screenshots and PDFs |
| Shaarli | Very lightweight, no database |
Users and SSO
Create extra users in the admin panel (/admin). For SSO, linkding supports OIDC (LD_ENABLE_OIDC), or auth-proxy headers behind Authelia or Authentik. See Authelia.
Backups and updates
- Everything is in
./data: the SQLite database (db.sqlite3), snapshots and favicons. Usedocker compose exec linkding python manage.py full_backup /etc/linkding/data/backup.zipfor a consistent copy, or stop the container and copy the folder. See backup strategy. - Update with
docker compose pull && docker compose up -d. See updating self-hosted apps.
Quick reference
| Item | Value |
|---|---|
| Port | 9090 |
| Data | /etc/linkding/data |
| Image | latest or latest-plus (HTML snapshots) |
| CSRF setting | LD_CSRF_TRUSTED_ORIGINS |
| API | /api/bookmarks/ with Authorization: Token … |