Linkwarden logo

Linkwarden

Self-hosted collaborative bookmark manager to collect, read, annotate, and fully preserve what matters, all in one place.

Alternative to: raindrop.io, pocket, instapaper


Linkwarden is a self-hosted, open-source collaborative bookmark manager that lets you collect, read, annotate, and fully preserve webpages in one place. It automatically captures a screenshot, PDF, and readable copy of every link so your bookmarks survive even if the original page disappears. Links can be organized into collections and tags, and shared or worked on together with a team, making it a self-hosted alternative to services like Raindrop.io, Pocket, and Instapaper.

Linkwarden Docker Compose example

Self-host Linkwarden on your own server, homelab, or VPS starting from this Docker Compose example. It runs Linkwarden in Docker containers using the official ghcr.io/linkwarden/linkwarden:latest, postgres:16-alpine, getmeili/meilisearch:latest images, with persistent volumes and automatic restarts preconfigured. Review the environment variables and adjust them to your setup, save the file as compose.yml (or docker-compose.yml), and start the stack with docker compose up -d.

services:
  linkwarden:
    image: ghcr.io/linkwarden/linkwarden:latest
    restart: unless-stopped
    depends_on:
      - postgres
      - meilisearch
    environment:
      # A random secret used to sign authentication tokens. Generate with: openssl rand -base64 32
      NEXTAUTH_SECRET: "changeme"
      # The full public URL of your instance, with /api/v1/auth appended.
      NEXTAUTH_URL: "http://localhost:3000/api/v1/auth"
      # Connection string to the bundled Postgres database. The password must match POSTGRES_PASSWORD below.
      DATABASE_URL: "postgresql://postgres:changeme@postgres:5432/postgres"
      # URL of the bundled Meilisearch full-text search engine.
      MEILI_HOST: "http://meilisearch:7700"
      # Master key for Meilisearch. Must match MEILI_MASTER_KEY on the meilisearch service and be at least 16 bytes.
      MEILI_MASTER_KEY: "changeme_changeme_changeme"
    volumes:
      - data:/data/data

  postgres:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      # Password for the bundled Postgres database. Must match the password in DATABASE_URL above.
      POSTGRES_PASSWORD: "changeme"
    volumes:
      - pgdata:/var/lib/postgresql/data

  meilisearch:
    image: getmeili/meilisearch:latest
    restart: unless-stopped
    environment:
      # Master key for Meilisearch. Must match MEILI_MASTER_KEY on the linkwarden service and be at least 16 bytes.
      MEILI_MASTER_KEY: "changeme_changeme_changeme"
    volumes:
      - meili_data:/meili_data

volumes:
  data:
  pgdata:
  meili_data:

Values set to changeme are required — replace them with your own values before starting Linkwarden.

Prefer a managed setup? WinterFlow installs, configures, and updates Linkwarden for you using this same Docker Compose configuration.