{
  "version": "2",
  "generatedAt": "2026-11-03T22:49:39.280Z",
  "listing": {
    "slug": "karakeep-app--karakeep",
    "name": "Karakeep",
    "tagline": "Self-hosted bookmark-everything app with an official MCP server, CLI, and REST API.",
    "shortTagline": "Bookmark-everything app",
    "description": "Karakeep (formerly Hoarder) stores links, notes, images, and PDFs, archives full pages, and tags them with an LLM you choose. The Builder ships an MCP server (apps/mcp, published as @karakeep/mcp) on top of the REST API, so an agent can create, search, list, tag, and highlight bookmarks against a self-hosted instance.",
    "capabilities": [
      "adaptable",
      "operable"
    ],
    "vertical": "notes-knowledge",
    "alternativeTo": [
      "Raindrop.io",
      "Pocket"
    ],
    "shape": "business-app",
    "formFactor": "web-app",
    "executionModel": "hybrid",
    "provenance": "mixed",
    "codeStack": {
      "languages": [
        "TypeScript"
      ],
      "frameworks": [
        "Next.js",
        "Drizzle",
        "tRPC"
      ],
      "packageManager": "pnpm",
      "database": [
        "SQLite",
        "Meilisearch"
      ],
      "hostingTarget": [
        "docker"
      ]
    },
    "modelStack": {
      "providers": [
        "OpenAI-compatible",
        "Ollama"
      ],
      "models": [],
      "requiredKeys": [
        "OPENAI_API_KEY",
        "OPENAI_BASE_URL",
        "OLLAMA_BASE_URL",
        "INFERENCE_TEXT_MODEL",
        "INFERENCE_IMAGE_MODEL",
        "EMBEDDING_OPENAI_API_KEY"
      ],
      "promptLocations": [],
      "tools": [
        "search-bookmarks",
        "get-bookmark",
        "get-bookmark-content",
        "create-bookmark",
        "update-bookmark",
        "delete-bookmark",
        "get-lists",
        "create-list",
        "update-list",
        "add-bookmark-to-list",
        "get-tags",
        "attach-tag-to-bookmark",
        "get-asset",
        "list-highlights",
        "create-highlight"
      ]
    },
    "repos": [
      {
        "url": "https://github.com/karakeep-app/karakeep",
        "owner": "karakeep-app",
        "name": "karakeep",
        "license": "AGPL-3.0",
        "stars": 28741,
        "lastCommit": "2026-08-31"
      }
    ],
    "interface": {
      "kind": "mcp",
      "url": "https://github.com/karakeep-app/karakeep/tree/main/apps/mcp",
      "official": true,
      "hosted": "local"
    },
    "operability": "official",
    "recommendedWrapper": null,
    "reach": [
      {
        "job": "Bookmark links, notes, images, and PDFs",
        "reachable": true,
        "evidence": "create-bookmark creates text and URL bookmarks; get-asset covers stored files (apps/mcp/README.md)"
      },
      {
        "job": "Full text and semantic search",
        "reachable": true,
        "evidence": "search-bookmarks tool"
      },
      {
        "job": "Sort bookmarks into lists and smart lists",
        "reachable": true,
        "evidence": "get-lists, create-list, update-list (query field for smart lists), add-bookmark-to-list"
      },
      {
        "job": "Tag bookmarks",
        "reachable": true,
        "evidence": "get-tags, update-tag, attach-tag-to-bookmark, detach-tag-from-bookmark"
      },
      {
        "job": "Highlight and annotate stored content",
        "reachable": true,
        "evidence": "list-highlights, create-highlight, update-highlight, delete-highlight"
      },
      {
        "job": "Full page archival and video archiving",
        "reachable": true,
        "evidence": "crawler runs automatically after create-bookmark; no tool to re-archive on demand"
      },
      {
        "job": "LLM auto-tagging and summarization",
        "reachable": true,
        "evidence": "runs server-side on new bookmarks when inference env vars are set; no tool to trigger it explicitly"
      },
      {
        "job": "Share a list with collaborators or publicly",
        "reachable": true,
        "evidence": "update-list accepts the public flag; collaborator invites not in the tool list"
      },
      {
        "job": "Subscribe to RSS feeds for auto-hoarding",
        "reachable": false,
        "evidence": "no feed tool in apps/mcp; REST API and web UI only"
      },
      {
        "job": "Rule engine, webhooks, and user administration",
        "reachable": false,
        "evidence": "not exposed by the MCP server; web UI and REST API only"
      }
    ],
    "editions": [
      {
        "name": "Free",
        "price": null,
        "open": true,
        "distributions": [
          {
            "kind": "source",
            "url": "https://github.com/karakeep-app/karakeep"
          },
          {
            "kind": "container",
            "url": "https://docs.karakeep.app/Installation/docker",
            "command": "docker compose up -d"
          },
          {
            "kind": "installable",
            "url": "https://www.npmjs.com/package/@karakeep/mcp",
            "command": "npx @karakeep/mcp"
          }
        ]
      }
    ],
    "skills": {
      "kind": "bundled",
      "paths": [
        "skills/SKILL.md"
      ],
      "install": null,
      "note": "Ships a single skill alongside the app and its MCP server."
    },
    "customization": {
      "summary": "Everything is env-driven; docs.karakeep.app/configuration says no config file is used. Point DATA_DIR at a volume, set NEXTAUTH_SECRET and NEXTAUTH_URL, then pick an inference backend (OPENAI_API_KEY plus INFERENCE_TEXT_MODEL, or OLLAMA_BASE_URL) and toggle INFERENCE_ENABLE_AUTO_TAGGING, INFERENCE_ENABLE_AUTO_SUMMARIZATION, and SEMANTIC_SEARCH_ENABLED. Crawler behavior (screenshots, PDFs, full-page archive, yt-dlp) is a set of CRAWLER_* switches. The MCP client needs KARAKEEP_API_ADDR and KARAKEEP_API_KEY.",
      "envVars": [
        "DATA_DIR",
        "NEXTAUTH_SECRET",
        "NEXTAUTH_URL",
        "PORT",
        "DISABLE_SIGNUPS",
        "OAUTH_WELLKNOWN_URL",
        "OAUTH_CLIENT_ID",
        "OAUTH_CLIENT_SECRET",
        "OPENAI_API_KEY",
        "OPENAI_BASE_URL",
        "OLLAMA_BASE_URL",
        "INFERENCE_TEXT_MODEL",
        "INFERENCE_IMAGE_MODEL",
        "INFERENCE_LANG",
        "INFERENCE_ENABLE_AUTO_TAGGING",
        "INFERENCE_ENABLE_AUTO_SUMMARIZATION",
        "SEMANTIC_SEARCH_ENABLED",
        "EMBEDDING_TEXT_MODEL",
        "MEILI_ADDR",
        "MEILI_MASTER_KEY",
        "BROWSER_WEB_URL",
        "CRAWLER_FULL_PAGE_ARCHIVE",
        "CRAWLER_STORE_SCREENSHOT",
        "CRAWLER_VIDEO_DOWNLOAD",
        "OCR_LANGS",
        "ASSET_STORE_S3_BUCKET",
        "SMTP_HOST",
        "KARAKEEP_API_ADDR",
        "KARAKEEP_API_KEY"
      ],
      "configFiles": [
        "docker-compose.yml",
        ".env"
      ],
      "promptFiles": [],
      "effort": "config-only",
      "editCount": 31
    },
    "useWhen": [
      "you want an agent to file every link you send it into lists and tags on a server you control",
      "you are replacing Pocket or Omnivore and want full-page archives with LLM tagging from a local Ollama"
    ],
    "accounts": [
      "OpenAI or another OpenAI-compatible provider (optional, for tagging)",
      "Ollama (optional, local alternative)"
    ],
    "active": true,
    "lastActivity": "2026-08-31",
    "gotchas": [
      "AGPL-3.0: a modified instance you host for others must publish its source",
      "docker-compose expects Meilisearch and a headless Chrome sidecar; without them search and crawling degrade",
      "MCP server exposes tools only, no resources; RSS feeds, rules, and admin stay in the UI or REST API"
    ],
    "fit": {
      "adaptable": 2,
      "operable": 3
    },
    "evidence": {
      "formFactor": "README: NextJS web app with app router; docker install docs",
      "executionModel": "README: LLM-based automatic tagging and summarization, local models through Ollama; core CRUD needs no model",
      "operability": "apps/mcp in the same repo and org; README 'Supported Tools' list",
      "effort": "docs.karakeep.app/configuration: configuration handled entirely through environment variables",
      "editions": "README: self-hosting first; no paid edition found on karakeep.app",
      "active": "pushedAt 2026-08-31; release 0.33.1 on HN 2026-08-01",
      "provenance": "CLAUDE.md and AGENTS.md at repo root; project predates them (2024)"
    },
    "confidence": {
      "formFactor": 0.95,
      "executionModel": 0.8,
      "operability": 0.95,
      "effort": 0.9,
      "reach": 0.9,
      "editions": 0.85,
      "provenance": 0.4
    },
    "openQuestions": [
      "Does the REST API expose feed subscriptions and rules so a second interface could reach them?",
      "Confirm the CLI (docs.karakeep.app/integrations/command-line) covers admin tasks the MCP omits"
    ],
    "sources": [
      {
        "url": "https://github.com/karakeep-app/karakeep",
        "foundBy": "sourcing:notes-knowledge:community"
      },
      {
        "url": "https://github.com/karakeep-app/karakeep/tree/main/apps/mcp",
        "foundBy": "analysis"
      },
      {
        "url": "https://docs.karakeep.app/configuration",
        "foundBy": "analysis"
      }
    ],
    "research": {
      "stage": "verified",
      "verdict": "unverified",
      "reason": "Both capabilities: official in-repo MCP with near-complete Reach over bookmarks, lists, tags, and highlights; env-only config surface; AGPL caps Adaptable at 2.",
      "disputed": []
    },
    "url": "apps/karakeep-app--karakeep.html",
    "coverage": "partial",
    "paid": false,
    "source": "research/verified/karakeep-app--karakeep.json"
  }
}
