{
  "version": "2",
  "generatedAt": "2026-11-03T22:49:39.280Z",
  "listing": {
    "slug": "sissbruecker--linkding",
    "name": "linkding",
    "tagline": "Minimal self-hosted bookmark manager with LD_* env config and a documented REST API.",
    "shortTagline": "Minimal self-hosted bookmarks",
    "description": "linkding is a Django bookmark manager built to be small, fast, and Docker-first: tags, markdown notes, read-it-later, archiving to local HTML or the Internet Archive, sharing, and browser extensions. Configuration is entirely LD_* environment variables, and the REST API with token auth covers bookmarks, assets, tags, and bundles.",
    "capabilities": [
      "adaptable",
      "operable"
    ],
    "vertical": "notes-knowledge",
    "alternativeTo": [
      "Raindrop.io",
      "Pinboard"
    ],
    "shape": "product",
    "formFactor": "web-app",
    "executionModel": "deterministic",
    "provenance": "human-written",
    "codeStack": {
      "languages": [
        "Python",
        "JavaScript"
      ],
      "frameworks": [
        "Django"
      ],
      "packageManager": "uv",
      "database": [
        "SQLite",
        "PostgreSQL"
      ],
      "hostingTarget": [
        "docker"
      ]
    },
    "modelStack": null,
    "repos": [
      {
        "url": "https://github.com/sissbruecker/linkding",
        "owner": "sissbruecker",
        "name": "linkding",
        "license": "MIT",
        "stars": 11139,
        "lastCommit": "2026-09-03"
      }
    ],
    "interface": {
      "kind": "api",
      "url": "https://linkding.link/api/",
      "official": true,
      "hosted": "local"
    },
    "operability": "official",
    "recommendedWrapper": null,
    "reach": [
      {
        "job": "Create, update, and delete bookmarks",
        "reachable": true,
        "evidence": "POST/PUT/PATCH/DELETE /api/bookmarks/ (docs/src/content/docs/api.md)"
      },
      {
        "job": "Search and list bookmarks",
        "reachable": true,
        "evidence": "GET /api/bookmarks/ with query, GET /api/bookmarks/check/?url="
      },
      {
        "job": "Archive and unarchive",
        "reachable": true,
        "evidence": "POST /api/bookmarks/<id>/archive/ and /unarchive/"
      },
      {
        "job": "Tag bookmarks",
        "reachable": true,
        "evidence": "GET/POST /api/tags/ and tag_names on bookmarks"
      },
      {
        "job": "Bundles (saved filters)",
        "reachable": true,
        "evidence": "GET/POST/PUT/PATCH/DELETE /api/bundles/"
      },
      {
        "job": "Store and download HTML snapshots",
        "reachable": true,
        "evidence": "/api/bookmarks/<id>/assets/ with upload and download"
      },
      {
        "job": "Share bookmarks with users or guests",
        "reachable": true,
        "evidence": "shared field on the bookmark resource"
      },
      {
        "job": "Markdown notes and read-it-later",
        "reachable": true,
        "evidence": "notes and unread fields on the bookmark resource"
      },
      {
        "job": "Import and export Netscape HTML",
        "reachable": false,
        "evidence": "settings UI only; no API endpoint"
      },
      {
        "job": "User administration",
        "reachable": false,
        "evidence": "Django admin panel; only GET /api/user/profile/ is exposed"
      }
    ],
    "editions": [
      {
        "name": "Free",
        "price": null,
        "open": true,
        "distributions": [
          {
            "kind": "source",
            "url": "https://github.com/sissbruecker/linkding"
          },
          {
            "kind": "container",
            "url": "https://linkding.link/installation",
            "command": "docker run --name linkding -p 9090:9090 -v ./data:/etc/linkding/data -d sissbruecker/linkding:latest"
          }
        ]
      }
    ],
    "skills": {
      "kind": "none",
      "paths": [],
      "install": null,
      "note": "No SKILL.md, Claude Code plugin, or published skill found in the repo."
    },
    "customization": {
      "summary": ".env.sample and docker-compose.yml are the whole surface. LD_SUPERUSER_NAME and LD_SUPERUSER_PASSWORD create the first user; LD_DB_ENGINE and LD_DB_* switch to Postgres; LD_ENABLE_AUTH_PROXY with LD_AUTH_PROXY_USERNAME_HEADER puts it behind your SSO; LD_DISABLE_BACKGROUND_TASKS, LD_DISABLE_URL_VALIDATION, and LD_CONTEXT_PATH tune behavior.",
      "envVars": [
        "LD_SUPERUSER_NAME",
        "LD_SUPERUSER_PASSWORD",
        "LD_HOST_PORT",
        "LD_HOST_DATA_DIR",
        "LD_CONTEXT_PATH",
        "LD_DB_ENGINE",
        "LD_DB_HOST",
        "LD_DB_PORT",
        "LD_DB_DATABASE",
        "LD_DB_USER",
        "LD_DB_PASSWORD",
        "LD_ENABLE_AUTH_PROXY",
        "LD_AUTH_PROXY_USERNAME_HEADER",
        "LD_AUTH_PROXY_LOGOUT_URL",
        "LD_DISABLE_LOGIN_FORM",
        "LD_DISABLE_BACKGROUND_TASKS",
        "LD_DISABLE_URL_VALIDATION",
        "LD_CSRF_TRUSTED_ORIGINS"
      ],
      "configFiles": [
        ".env",
        "docker-compose.yml"
      ],
      "promptFiles": [],
      "effort": "config-only",
      "editCount": 20
    },
    "useWhen": [
      "you want a bookmark service on a Raspberry Pi that an agent can post links to with a token",
      "you left Pinboard or del.icio.us and want tags, notes, and archives without a heavy stack"
    ],
    "accounts": [],
    "active": true,
    "lastActivity": "2026-09-03",
    "gotchas": [
      "Single-maintainer project that declines features outside its scope (README)",
      "Local HTML archiving requires the single-file sidecar image variant (linkding:latest-plus)",
      "Managed hosting on linkding.link is third-party (not a Builder edition)"
    ],
    "fit": {
      "adaptable": 3,
      "operable": 3
    },
    "evidence": {
      "formFactor": "README: Django web app, Docker install",
      "executionModel": "no model anywhere in the stack",
      "operability": "docs/src/content/docs/api.md in the repo, published at linkding.link/api",
      "effort": ".env.sample LD_* names; docker-compose.yml",
      "editions": "MIT; no paid edition; community managed hosting listed separately",
      "active": "pushedAt 2026-09-03",
      "provenance": "2019 project, no agent markers"
    },
    "confidence": {
      "formFactor": 0.95,
      "executionModel": 0.95,
      "operability": 0.95,
      "effort": 0.95,
      "reach": 0.9,
      "editions": 0.95,
      "provenance": 0.6
    },
    "openQuestions": [
      "chickenzord/linkding-mcp (15 stars, 2026-05-25) is the only wrapper; note as runner-up if the Curator prefers an MCP entry point"
    ],
    "sources": [
      {
        "url": "https://github.com/sissbruecker/linkding",
        "foundBy": "sourcing:notes-knowledge:curated"
      },
      {
        "url": "https://linkding.link/api/",
        "foundBy": "analysis"
      }
    ],
    "research": {
      "stage": "verified",
      "verdict": "unverified",
      "reason": "MIT, owner-documented LD_* surface, official REST API with near-complete Reach; the cleanest config-only example in the vertical.",
      "disputed": []
    },
    "url": "apps/sissbruecker--linkding.html",
    "coverage": "partial",
    "paid": false,
    "source": "research/verified/sissbruecker--linkding.json"
  }
}
