$ show karakeep-app/karakeep
Karakeep is a self-hostable bookmarking and read-it-later application. It supports saving links, notes, images, PDFs, and videos, with AI-powered auto-tagging, summarization, and semantic search. The system consists of a Next.js web app, an Expo React Native mobile app, a browser extension (Chrome/Firefox/Safari), a CLI, a Model Context Protocol (MCP) server, and a set of background workers (crawler, embeddings, feeds, webhooks, rule engine, backups). The backend uses tRPC for API, Drizzle ORM with SQLite, and a plugin system for swapping infrastructure (asset stores, queues, search, rate limiting). The architecture is monorepo with shared packages for types, server utilities, and React hooks. It is actively maintained with frequent releases and a large community.
The LLM identified 5 files worth highlighting for reuse:
Implements a priority-based semaphore with group fairness, leases, and pause/resume capabilities. Used internally for queue job concurrency but could be extracted as a standalone concurrency primitive for any async system requiring prioritized access with fairness guarantees.
SSRF-safe HTTP client with URL validation, DNS resolution with caching and pinning to prevent rebinding attacks, proxy rotation per request, and redirect handling. Demonstrates security-conscious networking that can be reused in any application needing to fetch external URLs safely.
Provides an AsyncSemaphore class and a limitConcurrency utility for bounding parallel async operations. Self-contained and testable, it can be reused directly in any TypeScript project needing concurrency control.
A generic batching queue that groups document add/delete operations into configurable batches with deduplication. Designed for Meilisearch indexing but the pattern is reusable for any bulk operation system requiring debounced batch processing.
Parses a search query language supporting tags, URLs, date ranges, type filters, and boolean operators using typescript-parsec. Returns an AST that can be translated to any query backend. Reusable in any application needing a custom search query parser.