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. Use docker compose exec linkding python manage.py full_backup /etc/linkding/data/backup.zip for 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 …

Related: Wallabag and FreshRSS.

  • Self-Hosting
  • Docker
  • Productivity