{
  "version": "2",
  "generatedAt": "2026-11-03T22:49:39.280Z",
  "listing": {
    "slug": "linkwarden--linkwarden",
    "name": "Linkwarden",
    "tagline": "Collaborative bookmark manager that preserves pages, with an official REST API and a paid cloud edition.",
    "shortTagline": "Collaborative bookmark manager",
    "description": "Linkwarden captures a screenshot, PDF, and single-file HTML of every link, adds reader view with highlights, optional AI tagging, collections with member permissions, RSS subscriptions, and native mobile apps. The documented REST API with bearer tokens is the agent interface; there is no official MCP server.",
    "capabilities": [
      "adaptable",
      "operable"
    ],
    "vertical": "notes-knowledge",
    "alternativeTo": [
      "Raindrop.io",
      "Pocket"
    ],
    "shape": "business-app",
    "formFactor": "web-app",
    "executionModel": "hybrid",
    "provenance": "human-written",
    "codeStack": {
      "languages": [
        "TypeScript"
      ],
      "frameworks": [
        "Next.js",
        "Prisma",
        "Playwright"
      ],
      "packageManager": "yarn",
      "database": [
        "PostgreSQL",
        "Meilisearch"
      ],
      "hostingTarget": [
        "docker"
      ]
    },
    "modelStack": {
      "providers": [
        "OpenAI",
        "Anthropic",
        "Ollama",
        "OpenRouter",
        "Azure OpenAI",
        "Perplexity",
        "custom OpenAI-compatible"
      ],
      "models": [],
      "requiredKeys": [
        "OPENAI_API_KEY",
        "ANTHROPIC_API_KEY",
        "OPENROUTER_API_KEY",
        "AZURE_API_KEY",
        "PERPLEXITY_API_KEY",
        "NEXT_PUBLIC_OLLAMA_ENDPOINT_URL"
      ],
      "promptLocations": [],
      "tools": []
    },
    "repos": [
      {
        "url": "https://github.com/linkwarden/linkwarden",
        "owner": "linkwarden",
        "name": "linkwarden",
        "license": "AGPL-3.0",
        "stars": 19666,
        "lastCommit": "2026-09-02"
      }
    ],
    "interface": {
      "kind": "api",
      "url": "https://docs.linkwarden.app/api/api-introduction",
      "official": true,
      "hosted": "both"
    },
    "operability": "official",
    "recommendedWrapper": null,
    "reach": [
      {
        "job": "Save, update, and delete links",
        "reachable": true,
        "evidence": "apps/web/pages/api/v1/links and links/{id}"
      },
      {
        "job": "Retrieve preserved formats (screenshot, PDF, HTML)",
        "reachable": true,
        "evidence": "api/v1/archives/{id} and links/{id}/archive"
      },
      {
        "job": "Organize into collections and sub-collections",
        "reachable": true,
        "evidence": "api/v1/collections and collections/{id}"
      },
      {
        "job": "Tag links",
        "reachable": true,
        "evidence": "tags in the link payload; docs list tags endpoints"
      },
      {
        "job": "Highlight and annotate in reader view",
        "reachable": true,
        "evidence": "api/v1/highlights and links/{id}/highlights"
      },
      {
        "job": "Full text search",
        "reachable": true,
        "evidence": "search parameters on links index; docs list search"
      },
      {
        "job": "RSS feed subscriptions",
        "reachable": true,
        "evidence": "docs API introduction lists RSS subscriptions"
      },
      {
        "job": "Share collections publicly",
        "reachable": true,
        "evidence": "api/v1/public/collections and public/links"
      },
      {
        "job": "AI tagging",
        "reachable": false,
        "evidence": "runs automatically on save when a provider is configured; no endpoint to trigger it"
      },
      {
        "job": "Send to Wayback Machine",
        "reachable": null,
        "evidence": "optional per-save behavior; no explicit endpoint seen"
      }
    ],
    "editions": [
      {
        "name": "Self-hosted",
        "price": null,
        "open": true,
        "distributions": [
          {
            "kind": "source",
            "url": "https://github.com/linkwarden/linkwarden"
          },
          {
            "kind": "container",
            "url": "https://docs.linkwarden.app/self-hosting/installation",
            "command": "docker compose up -d"
          }
        ]
      },
      {
        "name": "Cloud",
        "price": null,
        "open": false,
        "distributions": [
          {
            "kind": "hosted",
            "url": "https://linkwarden.app/#pricing"
          }
        ]
      }
    ],
    "skills": {
      "kind": "none",
      "paths": [],
      "install": null,
      "note": "No SKILL.md, Claude Code plugin, or published skill found in the repo."
    },
    "customization": {
      "summary": ".env.sample is exhaustive: NEXTAUTH_SECRET, NEXTAUTH_URL, DATABASE_URL, and BASE_URL are required; STORAGE_FOLDER or SPACES_* choose local or S3 archives; NEXT_PUBLIC_DISABLE_REGISTRATION and MAX_LINKS_PER_USER gate signups; one provider key plus its *_MODEL var turns on AI tagging; MEILI_HOST and MEILI_MASTER_KEY enable search; dozens of SSO providers each have *_CLIENT_ID, *_CLIENT_SECRET, and NEXT_PUBLIC_*_ENABLED.",
      "envVars": [
        "NEXTAUTH_SECRET",
        "NEXTAUTH_URL",
        "DATABASE_URL",
        "BASE_URL",
        "STORAGE_FOLDER",
        "SPACES_BUCKET_NAME",
        "SPACES_ENDPOINT",
        "SPACES_KEY",
        "SPACES_SECRET",
        "NEXT_PUBLIC_DISABLE_REGISTRATION",
        "NEXT_PUBLIC_CREDENTIALS_ENABLED",
        "MAX_LINKS_PER_USER",
        "ARCHIVE_TAKE_COUNT",
        "OPENAI_API_KEY",
        "OPENAI_MODEL",
        "ANTHROPIC_API_KEY",
        "ANTHROPIC_MODEL",
        "OLLAMA_MODEL",
        "NEXT_PUBLIC_OLLAMA_ENDPOINT_URL",
        "OPENROUTER_API_KEY",
        "MEILI_HOST",
        "MEILI_MASTER_KEY",
        "EMAIL_SERVER",
        "EMAIL_FROM",
        "OIDC_WELLKNOWN_URL",
        "OIDC_CLIENT_ID",
        "OIDC_CLIENT_SECRET",
        "PLAYWRIGHT_WS_URL",
        "PROXY"
      ],
      "configFiles": [
        ".env",
        "docker-compose.yml"
      ],
      "promptFiles": [],
      "effort": "config-only",
      "editCount": 31
    },
    "useWhen": [
      "your team collects research links and needs the pages preserved even after they vanish",
      "you want an agent saving links with tags into shared collections through a plain REST API"
    ],
    "accounts": [
      "an AI provider (optional, for tagging)",
      "S3-compatible storage (optional)",
      "Linkwarden Cloud account (cloud edition)"
    ],
    "active": true,
    "lastActivity": "2026-09-02",
    "gotchas": [
      "AGPL-3.0",
      "Archiving runs a Playwright browser; expect memory use and a separate worker",
      "SSO is limited to enterprise and self-hosted users",
      "Community MCP wrappers (ni-c/linkwarden-mcp, homeserverhq/linkwarden-mcp) have near-zero stars; use the REST API directly"
    ],
    "fit": {
      "adaptable": 2,
      "operable": 3
    },
    "evidence": {
      "formFactor": "README and stack: Next.js web app with Docker install",
      "executionModel": "optional AI tagging with OpenAI, Anthropic, Ollama, OpenRouter, Azure, Perplexity keys in .env.sample",
      "operability": "docs.linkwarden.app/api: OpenAPI 1.0.0 with bearer auth; routes under apps/web/pages/api/v1; no mcp in the repo tree",
      "effort": ".env.sample with documented variables; docs self-hosting guide",
      "editions": "README: official Cloud with 14-day trial; self-host free",
      "active": "pushedAt 2026-09-02; 2.15 release on HN 2026-07-10",
      "provenance": "project from 2023, no agent markers in repo"
    },
    "confidence": {
      "formFactor": 0.95,
      "executionModel": 0.85,
      "operability": 0.9,
      "effort": 0.9,
      "reach": 0.8,
      "editions": 0.7,
      "provenance": 0.5
    },
    "openQuestions": [
      "Cloud plan names and prices (linkwarden.app pricing section did not render)",
      "Whether tags and users have dedicated v1 endpoints or ride on links"
    ],
    "sources": [
      {
        "url": "https://github.com/linkwarden/linkwarden",
        "foundBy": "sourcing:notes-knowledge:community"
      },
      {
        "url": "https://docs.linkwarden.app/api/api-introduction",
        "foundBy": "analysis"
      }
    ],
    "research": {
      "stage": "verified",
      "verdict": "unverified",
      "reason": "Official REST API with near-complete Reach, config-only .env surface, paid cloud proves a real product; AGPL caps Adaptable at 2; no official MCP so interface kind is api.",
      "disputed": []
    },
    "url": "apps/linkwarden--linkwarden.html",
    "coverage": "partial",
    "paid": false,
    "source": "research/verified/linkwarden--linkwarden.json"
  }
}
