Linkding on a VPS: Self-Hosted Bookmark Manager with Full-Text Search and Browser Extension

Linkding on a VPS: Self-Hosted Bookmark Manager with Full-Text Search and Browser Extension

Linkding is a minimalist, self-hosted bookmark manager — fast, lightweight, and focused on doing one thing well. It stores bookmarks with tags, provides full-text search (including snapshots of webpage content), has browser extensions for Chrome and Firefox, supports multi-user access, and offers a REST API for programmatic bookmark management. For developers and researchers who accumulate hundreds of bookmarks, Linkding’s tag-based organization and full-text search beat browser bookmark folders.

Why Linkding Over Browser Bookmarks

  • Cross-browser and cross-device: Same bookmarks on Chrome, Firefox, Safari, and mobile
  • Full-text search: Search within saved page content, not just titles and URLs
  • Tag-based organization: Flexible tagging vs rigid folder hierarchy
  • Snapshots: Saves a copy of page content — bookmarks survive link rot
  • Privacy: Your bookmarks never leave your infrastructure
  • API: Integrate with other tools and workflows

Step 1: Docker Compose Setup

<code">mkdir -p /opt/linkding && cd /opt/linkding
nano docker-compose.yml
<code">version: '3.8'

services:
  linkding:
    image: sissbruecker/linkding:latest
    container_name: linkding
    restart: always
    ports:
      - "127.0.0.1:9090:9090"
    environment:
      LD_SUPERUSER_NAME: admin
      LD_SUPERUSER_PASSWORD: ${ADMIN_PASSWORD}
      LD_DISABLE_BACKGROUND_TASKS: "False"   # Enable snapshots
      LD_ENABLE_AUTH_PROXY: "False"
      # Enable automatic snapshots (saves page content)
      LD_ENABLE_RSS: "True"
    volumes:
      - linkding_data:/etc/linkding/data

volumes:
  linkding_data:
<code">echo "ADMIN_PASSWORD=StrongLinkdingPassword!" > .env
chmod 600 .env
docker compose up -d
docker compose logs -f linkding

Step 2: Nginx Reverse Proxy

<code">sudo nano /etc/nginx/sites-available/linkding
<code">server {
    listen 80;
    server_name bookmarks.yourdomain.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name bookmarks.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/bookmarks.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/bookmarks.yourdomain.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:9090;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
<code">sudo ln -s /etc/nginx/sites-available/linkding /etc/nginx/sites-enabled/
sudo certbot --nginx -d bookmarks.yourdomain.com
sudo systemctl reload nginx

Step 3: Import Existing Bookmarks

<code"># Export from browsers:
# Chrome: Bookmarks → ⋮ → Bookmark Manager → ⋮ → Export bookmarks (HTML)
# Firefox: Bookmarks → Manage Bookmarks → Import and Backup → Export

# Import in Linkding:
# Settings → Import → Upload HTML file
# Linkding parses folder structure → creates tags from folder names

# Import from Pinboard, Pocket, etc.:
# Export as Netscape HTML format (most bookmark tools support this)
# → same import process

Step 4: Install Browser Extension

<code"># Chrome extension: "Linkding extension" (search Chrome Web Store)
# Firefox add-on: "linkding extension" (search Firefox Add-ons)

# Configure extension:
# Extension Settings → Linkding URL: https://bookmarks.yourdomain.com
# → API Token: (from Linkding Settings → API Auth Token)

# Usage:
# While browsing → click extension icon → save current page
# Add tags, title, description inline
# Press Enter → saved to your Linkding instance

Step 5: Full-Text Search with Snapshots

<code"># Enable snapshots in docker-compose.yml:
LD_DISABLE_BACKGROUND_TASKS: "False"

# Snapshots are created automatically for saved bookmarks
# They save the page content so you can search within article text

# Search syntax in Linkding:
# Search: "kubernetes deployment yaml"  → finds bookmarks with those words in title/URL/description/snapshot
# Tag filter: #devops #kubernetes       → only show bookmarks with both tags
# Combined: kubernetes #devops          → word search within devops-tagged bookmarks

# The snapshot feature prevents link rot:
# When a page goes down, you still have the snapshot of the content

Step 6: REST API Usage

<code"># Get API token: Linkding UI → Settings → REST API → Token

# Add a bookmark via API:
curl -X POST https://bookmarks.yourdomain.com/api/bookmarks/ \
  -H "Authorization: Token YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/article",
    "title": "Great Article About VPS",
    "description": "Must read for VPS operators",
    "tag_names": ["vps", "devops", "must-read"]
  }'

# Search bookmarks:
curl "https://bookmarks.yourdomain.com/api/bookmarks/?q=nginx+performance" \
  -H "Authorization: Token YOUR_API_TOKEN" | python3 -m json.tool

# Get all bookmarks with tag:
curl "https://bookmarks.yourdomain.com/api/bookmarks/?tag_names=devops" \
  -H "Authorization: Token YOUR_API_TOKEN"

# Export all bookmarks (backup):
curl "https://bookmarks.yourdomain.com/api/bookmarks/?limit=9999" \
  -H "Authorization: Token YOUR_API_TOKEN" > bookmarks-backup.json

Step 7: Multi-User Setup and Sharing

<code"># Create additional users:
docker exec -it linkding python manage.py createsuperuser
# Or from Admin UI: admin/admin → Django admin → Users → Add user

# Each user has a separate bookmark library (not shared by default)
# Sharing: mark bookmarks as "Public" to allow access without login
# Public bookmark: https://bookmarks.yourdomain.com/public?user=username

# RSS feed per tag (for reading in RSS reader):
# https://bookmarks.yourdomain.com/feeds/all/?token=RSS_TOKEN&tag=devops

Getting Started

Linkding uses 50–100 MB RAM — among the lightest self-hosted applications available. It runs comfortably on a 1 GB Ubuntu VPS at VPS.DO alongside many other services. The SQLite database handles tens of thousands of bookmarks without performance issues. For users currently sharing bookmarks across multiple browsers and devices without a consistent system, Linkding provides the organizational layer that browser sync doesn’t.

Conclusion

Linkding provides fast, tag-based bookmark management with browser extensions for one-click saving, full-text search through saved page snapshots, multi-user support, and a REST API for programmatic management. At 50 MB RAM and a single Docker container, it’s one of the easiest self-hosted applications to maintain. For researchers, developers, and anyone who accumulates hundreds of meaningful URLs, self-hosted Linkding provides permanent, searchable, private bookmark storage that outlasts any cloud bookmark service.

Fast • Reliable • Affordable VPS - DO It Now!

Get top VPS hosting with VPS.DO’s fast, low-cost plans. Try risk-free with our 7-day no-questions-asked refund and start today!