Skip to main content

Self-Host Linkwarden: Social Bookmark Manager 2026

·OSSAlt Team
linkwardenbookmarksarchivingpocketself-hostingdocker2026

TL;DR

Linkwarden (AGPL 3.0, ~8K GitHub stars, TypeScript/Next.js) is a self-hosted bookmark manager with automatic page archiving. When you save a link, Linkwarden captures a screenshot, a readable text snapshot (Readability), and preserves the page as a PDF — so you always have the content even if the original page goes offline. Replace Pocket (now owned by Mozilla/going paid) or Instapaper with your own archiving system.

Key Takeaways

  • Linkwarden: AGPL 3.0, ~8K stars, TypeScript — bookmarks + automatic archiving
  • Archiving: Screenshots + readable text + PDF snapshots per bookmark
  • Browser extension: Chrome and Firefox extensions for one-click saving
  • Collections: Organize links into collections, shareable with others
  • Tags: Flexible tagging system
  • Search: Full-text search across bookmarks and archived content
  • RSS feeds: Import links from RSS feeds automatically

Linkwarden vs Pocket vs Pinboard

FeatureLinkwarden (self-hosted)PocketPinboard
LicenseAGPL 3.0ProprietaryProprietary
CostFree (hosting)Free / $5/mo$11/year
Page archivingYes (auto)Premium onlyYes (paid)
ScreenshotsYesNoNo
Full-text searchYesYes (premium)Yes
TagsYesYesYes
CollectionsYesNoNo
SharingYesNoYes
Browser extensionYesYesYes
Self-hostedYesNoNo

Part 1: Docker Setup

# docker-compose.yml
services:
  linkwarden:
    image: ghcr.io/linkwarden/linkwarden:latest
    container_name: linkwarden
    restart: unless-stopped
    ports:
      - "3000:3000"
    volumes:
      - linkwarden_data:/data/data
    environment:
      DATABASE_URL: "postgresql://postgres:${POSTGRES_PASSWORD}@db:5432/linkwarden"
      NEXTAUTH_SECRET: "${NEXTAUTH_SECRET}"
      NEXTAUTH_URL: "https://links.yourdomain.com"
      NEXT_PUBLIC_DISABLE_REGISTRATION: "false"    # Set true after creating account
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_DB: linkwarden
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s

volumes:
  linkwarden_data:
  postgres_data:
# Generate NEXTAUTH_SECRET:
openssl rand -hex 32

docker compose up -d

Part 2: HTTPS with Caddy

links.yourdomain.com {
    reverse_proxy localhost:3000
}

Visit https://links.yourdomain.com → register your account.


Part 3: Browser Extension

Install the Linkwarden browser extension to save links from any page:

Setup:

  1. Install extension
  2. Click extension icon → Settings
  3. Instance URL: https://links.yourdomain.com
  4. Enter your credentials
  5. Click extension icon on any page → Save link

Part 4: Organize with Collections

Collections are the primary organization structure:

  1. Sidebar → Collections → + New Collection
  2. Name: "Dev Resources", "Recipes", "Articles to Read", "Research"
  3. Color: pick a color for visual organization
  4. Optional: share collection with other users (view or edit access)

Save links to collections:

  • Via browser extension: select collection in the save dialog
  • Via web UI: Add Link → select collection

Part 5: Tags

Add tags for cross-collection organization:

  1. When saving a link → add tags: javascript, docker, tutorial
  2. Tag view: Click any tag in the sidebar → see all links with that tag
  3. Search by tag: Use the search bar with tag filter

Part 6: Archiving and Snapshots

When a link is saved, Linkwarden automatically:

  1. Screenshots: Full-page screenshot of the page
  2. Readable: Extracts the article text (Mozilla Readability)
  3. PDF: Creates a PDF snapshot of the page

View archives:

  • Click any saved link → Archive tab → view screenshot/readable/PDF

This means you keep the content even if:

  • The original page is deleted
  • The domain expires
  • The article is paywalled later
  • The site goes offline

Manual re-archive: Click the refresh icon on any link to re-capture.


Part 7: Import Existing Bookmarks

From Browser (HTML export)

  1. Chrome/Firefox: Bookmarks Manager → Export to HTML file
  2. Linkwarden → Settings → Import → Browser bookmarks → upload HTML

From Pocket

  1. Pocket: Settings → Export (creates HTML)
  2. Import the HTML file into Linkwarden

From Raindrop.io

  1. Raindrop → Settings → Backups → Export CSV
  2. Linkwarden → Settings → Import → CSV

Part 8: Share Collections

Collaborate on bookmark collections:

  1. Collection → Settings → Sharing
  2. Public: Anyone with the link can view
  3. Invite by email: Specific users can view or edit

Share URL: https://links.yourdomain.com/public/collection/COLLECTION_ID

Team use case: Shared "Team Resources" collection → all team members add useful links.


Part 9: RSS Feed Import

Automatically import links from RSS feeds:

  1. Settings → RSS Feeds → Add RSS Feed
  2. URL: https://news.ycombinator.com/rss (or any RSS feed)
  3. Collection: where to save imported items
  4. Fetch interval: hourly, daily

All new items from the RSS feed appear in your chosen collection automatically.


Part 10: API Access

# Get API key from Settings → API Keys → Create New

# Get all links:
curl https://links.yourdomain.com/api/v1/links \
  -H "Authorization: Bearer YOUR_API_KEY"

# Create a link:
curl -X POST https://links.yourdomain.com/api/v1/links \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com","name":"Example Site","tags":["example"]}'

# Get collections:
curl https://links.yourdomain.com/api/v1/collections \
  -H "Authorization: Bearer YOUR_API_KEY"

Use the API with n8n or scripts to automatically save links from other sources.


Maintenance

# Update Linkwarden:
docker compose pull
docker compose up -d

# Backup:
# Database:
docker exec linkwarden-db-1 pg_dump -U postgres linkwarden | gzip \
  > linkwarden-db-$(date +%Y%m%d).sql.gz

# Archived content (screenshots, PDFs):
tar -czf linkwarden-data-$(date +%Y%m%d).tar.gz \
  $(docker volume inspect linkwarden_linkwarden_data --format '{{.Mountpoint}}')

# Logs:
docker compose logs -f linkwarden

See all open source productivity and bookmarking tools at OSSAlt.com/alternatives/pocket.

Comments