A self-hostable bookmark-everything app (links, notes and images) with AI-based automatic tagging and full text search
This report summarizes scanner evidence for karakeep-app/karakeep, a TypeScript project with 30,183 GitHub stars. SynthScan examined 435,511 lines of code across 1805 source files, recording 342 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 1.6 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 174 finding(s).
Are imports declared and package/API names verified? 168 finding(s).
Are wrappers, guards, and repeated structures necessary? 131 finding(s).
Which changes need focused human review? 342 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 342 distinct pattern matches across 11 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tools/compare-models/README.md | 78 | KARAKEEP_API_KEY=your_api_key | CODE |
| HIGH | tools/compare-models/README.md | 97 | export KARAKEEP_API_KEY=your_api_key | CODE |
| HIGH | docs/docs/05-integrations/03-mcp.md | 45 | "KARAKEEP_API_KEY": "<YOUR_TOKEN>" | CODE |
| HIGH | docs/docs/05-integrations/03-mcp.md | 64 | "KARAKEEP_API_KEY=<YOUR_TOKEN>", | CODE |
| HIGH | docs/docs/03-configuration/02-different-ai-providers.md | 79 | OPENAI_API_KEY=YOUR_API_KEY | CODE |
| HIGH | docs/docs/03-configuration/02-different-ai-providers.md | 93 | OPENAI_API_KEY=YOUR_API_KEY | CODE |
| HIGH | docs/docs/03-configuration/02-different-ai-providers.md | 127 | OPENAI_API_KEY=YOUR_API_KEY | CODE |
| HIGH | …rsioned_docs/version-v0.31.0/05-integrations/03-mcp.md | 28 | "KARAKEEP_API_KEY": "<YOUR_TOKEN>" | CODE |
| HIGH | …rsioned_docs/version-v0.31.0/05-integrations/03-mcp.md | 47 | "KARAKEEP_API_KEY=<YOUR_TOKEN>", | CODE |
| HIGH | …-v0.31.0/03-configuration/02-different-ai-providers.md | 67 | OPENAI_API_KEY=YOUR_API_KEY | CODE |
| HIGH | …-v0.31.0/03-configuration/02-different-ai-providers.md | 78 | OPENAI_API_KEY=YOUR_API_KEY | CODE |
| HIGH | …-v0.31.0/03-configuration/02-different-ai-providers.md | 111 | OPENAI_API_KEY=YOUR_API_KEY | CODE |
| HIGH | …rsioned_docs/version-v0.32.0/05-integrations/03-mcp.md | 28 | "KARAKEEP_API_KEY": "<YOUR_TOKEN>" | CODE |
| HIGH | …rsioned_docs/version-v0.32.0/05-integrations/03-mcp.md | 47 | "KARAKEEP_API_KEY=<YOUR_TOKEN>", | CODE |
| HIGH | …-v0.32.0/03-configuration/02-different-ai-providers.md | 67 | OPENAI_API_KEY=YOUR_API_KEY | CODE |
| HIGH | …-v0.32.0/03-configuration/02-different-ai-providers.md | 78 | OPENAI_API_KEY=YOUR_API_KEY | CODE |
| HIGH | …-v0.32.0/03-configuration/02-different-ai-providers.md | 111 | OPENAI_API_KEY=YOUR_API_KEY | CODE |
| HIGH | docs/versioned_docs/version-v0.28.0/09-mcp.md | 28 | "KARAKEEP_API_KEY": "<YOUR_TOKEN>" | CODE |
| HIGH | docs/versioned_docs/version-v0.28.0/09-mcp.md | 47 | "KARAKEEP_API_KEY=<YOUR_TOKEN>", | CODE |
| HIGH | …version-v0.28.0/14-guides/05-different-ai-providers.md | 41 | OPENAI_API_KEY=YOUR_API_KEY | CODE |
| HIGH | …version-v0.28.0/14-guides/05-different-ai-providers.md | 52 | OPENAI_API_KEY=YOUR_API_KEY | CODE |
| HIGH | …version-v0.28.0/14-guides/05-different-ai-providers.md | 85 | OPENAI_API_KEY=YOUR_API_KEY | CODE |
| HIGH | …rsioned_docs/version-v0.33.0/05-integrations/03-mcp.md | 45 | "KARAKEEP_API_KEY": "<YOUR_TOKEN>" | CODE |
| HIGH | …rsioned_docs/version-v0.33.0/05-integrations/03-mcp.md | 64 | "KARAKEEP_API_KEY=<YOUR_TOKEN>", | CODE |
| HIGH | …-v0.33.0/03-configuration/02-different-ai-providers.md | 79 | OPENAI_API_KEY=YOUR_API_KEY | CODE |
| HIGH | …-v0.33.0/03-configuration/02-different-ai-providers.md | 93 | OPENAI_API_KEY=YOUR_API_KEY | CODE |
| HIGH | …-v0.33.0/03-configuration/02-different-ai-providers.md | 127 | OPENAI_API_KEY=YOUR_API_KEY | CODE |
| HIGH | docs/versioned_docs/version-v0.29.0/09-mcp.md | 28 | "KARAKEEP_API_KEY": "<YOUR_TOKEN>" | CODE |
| HIGH | docs/versioned_docs/version-v0.29.0/09-mcp.md | 47 | "KARAKEEP_API_KEY=<YOUR_TOKEN>", | CODE |
| HIGH | …version-v0.29.0/14-guides/05-different-ai-providers.md | 41 | OPENAI_API_KEY=YOUR_API_KEY | CODE |
| HIGH | …version-v0.29.0/14-guides/05-different-ai-providers.md | 52 | OPENAI_API_KEY=YOUR_API_KEY | CODE |
| HIGH | …version-v0.29.0/14-guides/05-different-ai-providers.md | 85 | OPENAI_API_KEY=YOUR_API_KEY | CODE |
| HIGH | …rsioned_docs/version-v0.30.0/05-integrations/03-mcp.md | 28 | "KARAKEEP_API_KEY": "<YOUR_TOKEN>" | CODE |
| HIGH | …rsioned_docs/version-v0.30.0/05-integrations/03-mcp.md | 47 | "KARAKEEP_API_KEY=<YOUR_TOKEN>", | CODE |
| HIGH | …-v0.30.0/03-configuration/02-different-ai-providers.md | 41 | OPENAI_API_KEY=YOUR_API_KEY | CODE |
| HIGH | …-v0.30.0/03-configuration/02-different-ai-providers.md | 52 | OPENAI_API_KEY=YOUR_API_KEY | CODE |
| HIGH | …-v0.30.0/03-configuration/02-different-ai-providers.md | 85 | OPENAI_API_KEY=YOUR_API_KEY | CODE |
| HIGH | …rsioned_docs/version-v0.34.0/05-integrations/03-mcp.md | 45 | "KARAKEEP_API_KEY": "<YOUR_TOKEN>" | CODE |
| HIGH | …rsioned_docs/version-v0.34.0/05-integrations/03-mcp.md | 64 | "KARAKEEP_API_KEY=<YOUR_TOKEN>", | CODE |
| HIGH | …-v0.34.0/03-configuration/02-different-ai-providers.md | 79 | OPENAI_API_KEY=YOUR_API_KEY | CODE |
| HIGH | …-v0.34.0/03-configuration/02-different-ai-providers.md | 93 | OPENAI_API_KEY=YOUR_API_KEY | CODE |
| HIGH | …-v0.34.0/03-configuration/02-different-ai-providers.md | 127 | OPENAI_API_KEY=YOUR_API_KEY | CODE |
| HIGH | apps/mcp/README.md | 58 | "KARAKEEP_API_KEY": "<YOUR_TOKEN>", | CODE |
| HIGH | apps/mcp/README.md | 78 | "KARAKEEP_API_KEY=<YOUR_TOKEN>", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | packages/trpc/routers/prompts.ts | 20 | const prompt = await opts.ctx.db.query.customPrompts.findFirst({ | CODE |
| CRITICAL | packages/trpc/routers/rules.ts | 53 | const userTags = await opts.ctx.db.query.bookmarkTags.findMany({ | CODE |
| CRITICAL | packages/trpc/models/users.ts | 214 | const settings = await this.ctx.db.query.users.findFirst({ | CODE |
| CRITICAL | packages/trpc/models/users.ts | 294 | ? this.ctx.db.query.assets.findFirst({ | CODE |
| CRITICAL | packages/trpc/models/users.ts | 305 | ? this.ctx.db.query.assets.findFirst({ | CODE |
| CRITICAL | packages/trpc/models/users.ts | 403 | const userObj = await this.ctx.db.query.users.findFirst({ | CODE |
| CRITICAL | packages/trpc/models/users.ts | 700 | const userObj = await this.ctx.db.query.users.findFirst({ | CODE |
| CRITICAL | packages/trpc/models/lists.ts | 741 | await this.ctx.db.query.listCollaborators.findMany({ | CODE |
| CRITICAL | packages/trpc/models/lists.ts | 913 | this.ctx.db.query.listCollaborators.findMany({ | CODE |
| CRITICAL | packages/trpc/models/lists.ts | 935 | const owner = await this.ctx.db.query.users.findFirst({ | CODE |
| CRITICAL | packages/trpc/models/lists.ts | 1179 | const bookmark = await this.ctx.db.query.bookmarks.findFirst({ | CODE |
| CRITICAL | packages/trpc/models/lists.ts | 1229 | const bookmark = await this.ctx.db.query.bookmarks.findFirst({ | CODE |
| CRITICAL | packages/trpc/models/tags.ts | 359 | await this.ctx.db.query.tagsOnBookmarks.findMany({ | CODE |
| CRITICAL | packages/api/routes/public/assets.ts | 40 | const assetDb = await c.var.ctx.db.query.assets.findFirst({ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/src/theme/DocSidebarItem/Category/index.tsx | 53 | function useAutoExpandActiveCategory({ | CODE |
| LOW | docs/src/theme/DocSidebarItem/Category/index.tsx | 79 | function useCategoryHrefWithSSRFallback( | CODE |
| LOW | packages/plugins/vectorstore-meilisearch/src/index.ts | 27 | function filterToMeiliSearchFilter(filter: VectorFilterQuery): string { | CODE |
| LOW | packages/plugins/search-meilisearch/src/index.ts | 18 | function filterToMeiliSearchFilter(filter: FilterQuery): string { | CODE |
| LOW | packages/trpc/stats.ts | 29 | function getOrCreateMetric<T extends Metric>( | CODE |
| LOW | packages/trpc/testUtils.ts | 101 | export async function getApiKeyCallerForPlainKey(db: TestDB, plainKey: string) { | CODE |
| LOW | packages/trpc/index.ts | 97 | .use(function rejectMutationsInReadOnlyModes(opts) { | CODE |
| LOW | packages/trpc/index.ts | 182 | export function createScopedAuthedProcedure(resource: ZApiKeyScopeResource) { | CODE |
| LOW | packages/trpc/index.ts | 204 | export function createAdminScopedProcedure( | CODE |
| LOW | packages/trpc/routers/bookmarks.ts | 156 | return async function bookmarksQueriedMiddleware(opts: { | CODE |
| LOW | packages/trpc/routers/bookmarks.ts | 174 | return function semanticSearchRateLimitMiddleware(opts: { | CODE |
| LOW | packages/trpc/routers/bookmarks.ts | 217 | async function shouldUseLowPriorityQueues( | CODE |
| LOW | packages/trpc/routers/subscriptions.ts | 91 | function computeSubscriptionTransition( | CODE |
| LOW | packages/trpc/lib/revenueCat.ts | 122 | export function computeInAppSubscriptionState( | CODE |
| LOW | packages/trpc/lib/revenueCat.ts | 241 | export function syncRevenueCatDataToDatabase( | CODE |
| LOW | packages/trpc/lib/revenueCat.ts | 272 | async function fetchAndStoreRevenueCatState( | CODE |
| LOW | packages/trpc/lib/revenueCat.ts | 351 | export function isValidRevenueCatWebhookAuthorization( | CODE |
| LOW | packages/trpc/lib/revenueCat.ts | 369 | export function getRevenueCatWebhookAppUserIds( | CODE |
| LOW | packages/trpc/lib/search.ts | 59 | export async function getBookmarksConditionFromMatcher( | CODE |
| LOW | packages/trpc/lib/search.ts | 292 | export async function getBookmarkIdsFromMatcher( | CODE |
| LOW | packages/trpc/lib/impersonate.ts | 8 | export async function buildImpersonatingAuthedContext( | CODE |
| LOW | packages/trpc/lib/subscriptionEntitlements.ts | 15 | export function getActivePaidSubscriptionProvider( | CODE |
| LOW | packages/shared/inference.ts | 31 | function validateEmbeddingDimensions(embeddings: number[][]): void { | CODE |
| LOW | packages/shared/prompts.ts | 53 | export function constructTextTaggingPrompt( | CODE |
| LOW | packages/shared/prompts.ts | 112 | export function buildTextPromptUntruncated( | CODE |
| LOW | packages/shared/prompts.ts | 131 | export function buildSummaryPromptUntruncated( | CODE |
| LOW | packages/shared/types/apiKeys.ts | 86 | function getReadWriteScopeForReadScope(scope: ZApiKeyScope) { | CODE |
| LOW | packages/shared/utils/tag.ts | 39 | export function getPotentialRelevantTagsPrompt( | CODE |
| LOW | packages/shared/utils/reading-progress-dom.ts | 151 | function getReadingPositionWithViewport( | CODE |
| LOW | packages/shared/utils/userName.ts | 5 | export function containsUnsafeUserNameMarkup(input: string): boolean { | CODE |
| LOW | packages/shared/utils/url.ts | 1 | export function setUrlHostnameFromResolvedAddress(url: URL, address: string) { | CODE |
| LOW | packages/shared/utils/bookmarkUtils.ts | 4 | export function getBookmarkLinkAssetIdOrUrl(bookmark: ZBookmarkedLink) { | CODE |
| LOW | packages/shared/utils/bookmarkUtils.ts | 44 | export function isBookmarkStillSummarizing(bookmark: ZBookmark) { | CODE |
| LOW | packages/shared/utils/bookmarkUtils.ts | 56 | export function getBookmarkRefreshInterval( | CODE |
| LOW | packages/shared/utils/assetUtils.ts | 7 | export function humanFriendlyNameForAssertType(type: ZAssetType) { | CODE |
| LOW | packages/shared/import-export/parsers.ts | 53 | function parseNetscapeBookmarkFile(textContent: string): ParsedBookmark[] { | CODE |
| LOW | packages/shared/import-export/parsers.ts | 183 | function parseKarakeepBookmarkFile(textContent: string): ParsedImportFile { | CODE |
| LOW | packages/shared/import-export/parsers.ts | 240 | function parseOmnivoreBookmarkFile(textContent: string): ParsedBookmark[] { | CODE |
| LOW | packages/shared/import-export/parsers.ts | 270 | function parseLinkwardenBookmarkFile(textContent: string): ParsedBookmark[] { | CODE |
| LOW | packages/shared/import-export/parsers.ts | 326 | function parseTabSessionManagerStateFile( | CODE |
| LOW | packages/shared/import-export/parsers.ts | 426 | function parseInstapaperBookmarkFile(textContent: string): ParsedBookmark[] { | CODE |
| LOW | packages/shared/import-export/parsers.ts | 498 | function parseReadwiseReaderBookmarkFile( | CODE |
| LOW | packages/api/middlewares/rateLimit.ts | 9 | export function createRateLimitMiddleware(config: RateLimitConfig) { | CODE |
| LOW | packages/api/utils/readableContent.ts | 15 | export function encodeReadableContentCursor( | CODE |
| LOW | packages/api/utils/readableContent.ts | 21 | export function decodeReadableContentCursor( | CODE |
| LOW | packages/e2e_tests/tests/assetdb/assetdb-utils.ts | 125 | export function createLocalFileSystemStore( | CODE |
| LOW | packages/shared-react/hooks/bookmarks.ts | 12 | export function useAutoRefreshingBookmarkQuery( | CODE |
| LOW | packages/shared-react/hooks/bookmarks.ts | 51 | export function useCreateBookmarkWithPostHook( | CODE |
| LOW | packages/shared-react/hooks/bookmarks.ts | 222 | export function useBookmarkPostCreationHook() { | CODE |
| LOW | packages/shared-react/hooks/query-invalidation.ts | 27 | export function scheduleInvalidateQueries( | CODE |
| LOW | packages/shared-react/hooks/bookmark-grid-context.tsx | 11 | export function BookmarkGridContextProvider({ | CODE |
| LOW | packages/shared-react/hooks/lists.ts | 115 | export function useRemoveBookmarkFromList( | CODE |
| LOW | packages/shared-react/hooks/lists.ts | 180 | export function augmentBookmarkListsWithInitialData( | CODE |
| LOW | packages/shared-react/hooks/bookmark-list-context.tsx | 11 | export function BookmarkListContextProvider({ | CODE |
| LOW | apps/web/components/ui/collapsible.tsx | 13 | function CollapsibleTriggerTriangle({ | CODE |
| LOW | apps/web/components/ui/collapsible.tsx | 33 | function CollapsibleTriggerChevron({ | CODE |
| LOW | …ents/dashboard/sidebar/InvitationNotificationBadge.tsx | 7 | export function InvitationNotificationBadge() { | CODE |
| LOW | …eb/components/dashboard/lists/BookmarkListSelector.tsx | 132 | function BookmarkListSingleSelector({ | CODE |
| LOW | …eb/components/dashboard/lists/BookmarkListSelector.tsx | 180 | function BookmarkListMultiSelector({ | CODE |
| LOW | …nents/dashboard/lists/DeleteListConfirmationDialog.tsx | 13 | export default function DeleteListConfirmationDialog({ | CODE |
| 71 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/trpc/routers/subscriptions.revenueCat.test.ts | 125 | async function createFreeUser(db: TestDB, email = "test@test.com") { | CODE |
| LOW | packages/trpc/routers/subscriptions.test.ts | 113 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/subscriptions.test.ts | 139 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/subscriptions.test.ts | 180 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/subscriptions.test.ts | 207 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/subscriptions.test.ts | 238 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/subscriptions.test.ts | 269 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/subscriptions.test.ts | 336 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/subscriptions.test.ts | 417 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/subscriptions.test.ts | 700 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/subscriptions.test.ts | 740 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/subscriptions.test.ts | 762 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/subscriptions.test.ts | 799 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/subscriptions.test.ts | 839 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/subscriptions.test.ts | 864 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/subscriptions.test.ts | 898 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/subscriptions.test.ts | 915 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/subscriptions.test.ts | 941 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/subscriptions.test.ts | 1010 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/subscriptions.test.ts | 1085 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/subscriptions.test.ts | 1158 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/subscriptions.test.ts | 1219 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/subscriptions.test.ts | 1311 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/subscriptions.test.ts | 1456 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/subscriptions.test.ts | 1539 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/subscriptions.test.ts | 1623 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/apiKeys.test.ts | 38 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/apiKeys.test.ts | 83 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/apiKeys.test.ts | 110 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/apiKeys.test.ts | 166 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/apiKeys.test.ts | 194 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/apiKeys.test.ts | 246 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/apiKeys.test.ts | 271 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/apiKeys.test.ts | 296 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/apiKeys.test.ts | 324 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/apiKeys.test.ts | 374 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/apiKeys.test.ts | 396 | email: "test@test.com", | CODE |
| LOW | packages/trpc/routers/apiKeys.test.ts | 738 | email: "test@test.com", | CODE |
| LOW | packages/trpc/lib/__tests__/ruleEngine.test.ts | 96 | .values({ name: "Test User", email: "test@test.com" }) | CODE |
| LOW | packages/api/middlewares/rateLimit.test.ts | 64 | email: "user@example.com", | CODE |
| LOW | packages/e2e_tests/setup/seed.ts | 10 | email: "admin@example.com", | CODE |
| LOW | packages/e2e_tests/setup/seed.ts | 15 | email: "admin@example.com", | CODE |
| LOW⚡ | apps/web/server/auth.test.ts | 202 | await signUp("user@example.com"); | CODE |
| LOW⚡ | apps/web/server/auth.test.ts | 204 | body: { email: "user@example.com", password: "password123" }, | CODE |
| LOW⚡ | apps/web/server/auth.test.ts | 210 | email: "user@example.com", | CODE |
| LOW⚡ | apps/web/server/auth.test.ts | 220 | const { cookie } = await signUp("user@example.com"); | CODE |
| LOW⚡ | apps/web/server/auth.test.ts | 274 | expect((await signIn("user@example.com", "old-password")).status).toBe(401); | CODE |
| LOW⚡ | apps/web/server/auth.test.ts | 275 | expect((await signIn("user@example.com", "new-password")).status).toBe(200); | CODE |
| LOW⚡ | apps/web/server/auth.test.ts | 280 | await signUp("user@example.com"); | CODE |
| LOW⚡ | apps/web/server/auth.test.ts | 282 | body: { email: "user@example.com" }, | CODE |
| LOW⚡ | apps/web/server/auth.test.ts | 314 | expect(verificationUrl.searchParams.get("email")).toBe("user@example.com"); | CODE |
| LOW⚡ | apps/web/server/auth.test.ts | 321 | const wrongPassword = await signIn("user@example.com", "wrong-password"); | CODE |
| LOW⚡ | apps/web/server/auth.test.ts | 323 | const unverified = await signIn("user@example.com"); | CODE |
| LOW⚡ | apps/web/server/auth.test.ts | 331 | expect((await signIn("user@example.com")).status).toBe(200); | CODE |
| LOW⚡ | apps/web/server/auth.test.ts | 334 | const duplicate = await signUp("user@example.com"); | CODE |
| LOW⚡ | apps/web/server/auth.test.ts | 340 | await signUp("user@example.com", "old-password"); | CODE |
| LOW⚡ | apps/web/server/auth.test.ts | 342 | await signIn("user@example.com", "old-password"); | CODE |
| LOW⚡ | apps/web/server/auth.test.ts | 411 | expect((await signUp("user@example.com")).status).toBe(403); | CODE |
| LOW⚡ | apps/web/server/auth.test.ts | 412 | expect((await signIn("user@example.com")).status).toBe(403); | CODE |
| LOW⚡ | apps/web/server/auth.test.ts | 414 | body: { email: "user@example.com" }, | CODE |
| 50 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/trpc/models/lists.ts | 432 | // For owner lists, we need to check if they actually have collaborators | COMMENT |
| LOW | packages/e2e_tests/tests/api/backups.test.ts | 158 | // Step 1: Create some test bookmarks | COMMENT |
| LOW | packages/e2e_tests/tests/api/backups.test.ts | 193 | // Step 2: Trigger a backup | COMMENT |
| LOW | packages/e2e_tests/tests/api/backups.test.ts | 206 | // Step 3: Poll until backup is completed or failed | COMMENT |
| LOW⚡ | packages/e2e_tests/tests/api/backups.test.ts | 231 | // Step 4: Verify backup completed successfully | COMMENT |
| LOW⚡ | packages/e2e_tests/tests/api/backups.test.ts | 238 | // Step 5: Download the backup | COMMENT |
| LOW | packages/e2e_tests/tests/api/backups.test.ts | 257 | // Step 6: Unzip and validate the backup contents | COMMENT |
| LOW | packages/e2e_tests/tests/api/backups.test.ts | 322 | // Step 7: Verify the backup appears in the list with updated status | COMMENT |
| LOW | apps/workers/workers/crawlerWorker.ts | 2143 | // Archival is a heavy operation, so we need to check if the user is within reasonable quota before proceeding | COMMENT |
| LOW | apps/workers/workers/backupWorker.ts | 208 | // Step 1: Stream bookmarks to JSON file | COMMENT |
| LOW | apps/workers/workers/backupWorker.ts | 231 | // Step 2: Compress the JSON file as zip | COMMENT |
| LOW⚡ | apps/workers/workers/backupWorker.ts | 247 | // Step 3: Check quota and store as asset | COMMENT |
| LOW⚡ | apps/workers/workers/backupWorker.ts | 256 | // Step 4: Create asset record | COMMENT |
| LOW | apps/workers/workers/backupWorker.ts | 277 | // Step 5: Update backup record | COMMENT |
| LOW | apps/workers/workers/backupWorker.ts | 289 | // Step 6: Clean up old backups based on retention | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/e2e_tests/tests/api/backups.test.ts | 158 | // Step 1: Create some test bookmarks | COMMENT |
| LOW | packages/e2e_tests/tests/api/backups.test.ts | 193 | // Step 2: Trigger a backup | COMMENT |
| LOW | packages/e2e_tests/tests/api/backups.test.ts | 206 | // Step 3: Poll until backup is completed or failed | COMMENT |
| LOW⚡ | packages/e2e_tests/tests/api/backups.test.ts | 231 | // Step 4: Verify backup completed successfully | COMMENT |
| LOW⚡ | packages/e2e_tests/tests/api/backups.test.ts | 238 | // Step 5: Download the backup | COMMENT |
| LOW | packages/e2e_tests/tests/api/backups.test.ts | 257 | // Step 6: Unzip and validate the backup contents | COMMENT |
| LOW | packages/e2e_tests/tests/api/backups.test.ts | 322 | // Step 7: Verify the backup appears in the list with updated status | COMMENT |
| LOW | apps/workers/workers/backupWorker.ts | 208 | // Step 1: Stream bookmarks to JSON file | COMMENT |
| LOW | apps/workers/workers/backupWorker.ts | 231 | // Step 2: Compress the JSON file as zip | COMMENT |
| LOW⚡ | apps/workers/workers/backupWorker.ts | 247 | // Step 3: Check quota and store as asset | COMMENT |
| LOW⚡ | apps/workers/workers/backupWorker.ts | 256 | // Step 4: Create asset record | COMMENT |
| LOW | apps/workers/workers/backupWorker.ts | 277 | // Step 5: Update backup record | COMMENT |
| LOW | apps/workers/workers/backupWorker.ts | 289 | // Step 6: Clean up old backups based on retention | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | README.md | 27 | - LLM Agents (e.g. OpenClaw, Hermes) friendly with powerful [CLI](https://docs.karakeep.com/integrations/command-line), | CODE |
| MEDIUM | docs/docs/01-getting-started/01-intro.md | 19 | - LLM Agents (e.g. OpenClaw, Hermes) friendly with powerful [CLI](https://docs.karakeep.com/integrations/command-line), | CODE |
| MEDIUM | …ed_docs/version-v0.32.0/01-getting-started/01-intro.md | 20 | - 🤖 LLM Agents (e.g. OpenClaw, Hermes) friendly with powerful [CLI](https://docs.karakeep.com/integrations/command-line) | CODE |
| MEDIUM | …ed_docs/version-v0.33.0/01-getting-started/01-intro.md | 19 | - LLM Agents (e.g. OpenClaw, Hermes) friendly with powerful [CLI](https://docs.karakeep.com/integrations/command-line), | CODE |
| MEDIUM | …ed_docs/version-v0.34.0/01-getting-started/01-intro.md | 19 | - LLM Agents (e.g. OpenClaw, Hermes) friendly with powerful [CLI](https://docs.karakeep.com/integrations/command-line), | CODE |
| MEDIUM | release-notes/2026-05-08-v0.32.0.md | 22 | * We're publishing an official skill for karakeep on ClawHub and skills.sh (details [here](https://docs.karakeep.app/n | COMMENT |
| MEDIUM | apps/landing/public/llms.txt | 27 | - [Agent skills documentation](https://docs.karakeep.com/integrations/agentic-skills) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/dev-worktree.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | .github/workflows/pullfrog.yml | 41 | DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }} | COMMENT |
| LOW | .github/workflows/pullfrog.yml | 61 | # VERTEX_MODEL_ID: <vertex-model-id> | COMMENT |
| LOW | apps/landing/vite-env.d.ts | 1 | /// <reference types="vite-plugin-svgr/client" /> | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | start-dev.sh | 13 | # Check if Docker is installed | COMMENT |
| LOW | start-dev.sh | 19 | # Check if pnpm is installed | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .github/workflows/ci.yml | 14 | # You can leverage Vercel Remote Caching with Turbo to speed up your builds | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/dev-worktree.sh | 6 | # Usage: | COMMENT |