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.