A privacy-first, open-source platform for knowledge management and collaboration. Download link: http://github.com/logseq/logseq/releases. roadmap: https://logseq.io/p/NX4mc_ggEV
This report summarizes scanner evidence for logseq/logseq, a Clojure project with 45,435 GitHub stars. SynthScan examined 108,958 lines of code across 514 source files, recording 87 pattern matches distributed across 14 syntactic categories. The legacy adjusted pattern signal is 1.2 (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? 58 finding(s).
Are imports declared and package/API names verified? 19 finding(s).
Are wrappers, guards, and repeated structures necessary? 37 finding(s).
Which changes need focused human review? 87 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 87 distinct pattern matches across 14 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 |
|---|---|---|---|---|
| LOW | …/logseq/cli/e2e/random_bidirectional_block_ops_test.py | 16 | def test_default_profile_is_faster_than_high_stress(monkeypatch) -> None: | CODE |
| LOW | …/logseq/cli/e2e/random_bidirectional_block_ops_test.py | 72 | def test_explicit_rounds_override_profile_default(monkeypatch) -> None: | CODE |
| LOW | …-e2e/test/logseq/cli/e2e/compare_graph_queries_test.py | 16 | def test_parse_args_supports_repeated_queries(monkeypatch) -> None: | CODE |
| LOW | …-e2e/test/logseq/cli/e2e/compare_graph_queries_test.py | 48 | def test_main_batches_multiple_queries_in_one_process(tmp_path: Path) -> None: | CODE |
| LOW | cli-e2e/test/logseq/cli/e2e/wait_sync_status_test.py | 15 | def test_resolved_status_command_is_built_once_and_reused() -> None: | CODE |
| LOW | cli-e2e/test/logseq/cli/e2e/wait_sync_status_test.py | 34 | def test_run_status_uses_precomputed_command() -> None: | CODE |
| LOW | cli-e2e/scripts/db_sync_server.py | 112 | def auth_cognito_from_auth_file(auth_path: Path) -> Dict[str, str]: | CODE |
| LOW | cli-e2e/scripts/graph_deletion_lifecycle_test.py | 137 | def test_cli_owned_worker_and_explicit_recreate(self): | STRING |
| LOW | cli-e2e/scripts/graph_deletion_lifecycle_test.py | 148 | def test_cli_removes_desktop_owned_worker(self): | STRING |
| LOW | cli-e2e/scripts/graph_deletion_lifecycle_test.py | 158 | def test_changed_runtime_identity_is_rejected_before_shutdown(self): | STRING |
| LOW | cli-e2e/scripts/graph_deletion_lifecycle_test.py | 173 | def test_missing_graph_orphan_cleanup_reports_absence(self): | STRING |
| LOW | cli-e2e/scripts/graph_deletion_lifecycle_test.py | 185 | def test_stopped_graph_removal_and_output_modes(self): | STRING |
| LOW | cli-e2e/scripts/graph_deletion_lifecycle_test.py | 194 | def test_other_graph_and_same_name_other_root_remain_available(self): | STRING |
| LOW | cli-e2e/scripts/graph_deletion_lifecycle_test.py | 205 | def test_unregistered_sqlite_owner_prevents_move(self): | STRING |
| LOW | cli-e2e/scripts/agent_bridge_e2e.py | 412 | def run_comment_mention_check(cli, repo_root, root_dir, config, graph, tmp_dir): | CODE |
| LOW | cli-e2e/scripts/agent_bridge_e2e.py | 490 | def run_parallel_assignment_check(cli, repo_root, root_dir, config, graph, tmp_dir): | CODE |
| LOW | cli-e2e/scripts/agent_bridge_e2e.py | 562 | def run_duplicate_bridge_check(cli, repo_root, root_dir, config, graph, tmp_dir): | CODE |
| LOW | cli-e2e/scripts/sync_asset_download.py | 122 | def sync_asset_download_by_id(cli: Path, root_dir: Path, config: Path, graph: str, asset_id: Any) -> Dict[str, Any]: | CODE |
| LOW | cli-e2e/scripts/sync_asset_download.py | 129 | def sync_asset_download_by_uuid(cli: Path, root_dir: Path, config: Path, graph: str, asset_uuid: str) -> Dict[str, Any]: | CODE |
| LOW | resources/forge.config.test.js | 18 | function isCoveredByExtraResources(targetPath, extraResources) { | CODE |
| LOW | libs/guides/db_properties_references.md | 392 | async function setupSchemaWithInheritance() { | CODE |
| LOW | libs/src/LSPlugin.user.ts | 144 | function normalizeCommandKeybinding( | CODE |
| LOW | libs/src/LSPlugin.user.ts | 339 | function normalizeCommandExecutionKey(key: string) { | CODE |
| LOW | libs/src/LSPlugin.core.ts | 482 | function convertToExternalLSPResource( | CODE |
| LOW | deps/db-sync/worker/scripts/download_graph_db.js | 33 | function sanitizeGraphIdForFilename(graphId) { | CODE |
| LOW | deps/db-sync/worker/scripts/delete_user_totally.js | 119 | function isDeleteConfirmationAccepted(answer, userId) { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | cli-e2e/scripts/db_sync_server.py | 137 | except (urllib.error.URLError, TimeoutError, socket.timeout): | CODE |
| HIGH | cli-e2e/scripts/db_sync_server.py | 239 | except OSError: | CODE |
| HIGH | cli-e2e/scripts/graph_deletion_lifecycle_test.py | 124 | except OSError: | CODE |
| HIGH | .agents/skills/logseq-repl/scripts/start-repl.py | 321 | except OSError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/i18n-key-naming.md | 83 | ## Step 1: Choose the Owner | COMMENT |
| LOW | docs/i18n-key-naming.md | 393 | ## Step 2: Apply the Decision Tree | COMMENT |
| LOW | docs/i18n-key-naming.md | 456 | ## Step 3: Decide Whether a Subdomain Is Needed | COMMENT |
| LOW | docs/i18n-key-naming.md | 560 | ## Step 4: Choose the Leaf | COMMENT |
| LOW⚡ | libs/src/postmate/index.ts | 327 | // Step 1: Remove listener from window to avoid duplicate message handling | COMMENT |
| LOW⚡ | libs/src/postmate/index.ts | 330 | // Step 2: Update messagePort reference (this affects this.listener validation logic) | COMMENT |
| LOW⚡ | libs/src/postmate/index.ts | 333 | // Step 3: Add the same listener to MessagePort (now all communication goes through port) | COMMENT |
| LOW⚡ | libs/src/postmate/index.ts | 341 | // Step 4: Clean up the channel-ready event listener | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …/logseq/cli/e2e/random_bidirectional_block_ops_test.py | 1 | CODE | |
| LOW | …-e2e/test/logseq/cli/e2e/compare_graph_queries_test.py | 1 | CODE | |
| LOW | cli-e2e/test/logseq/cli/e2e/wait_sync_status_test.py | 1 | CODE | |
| LOW | cli-e2e/scripts/prepare_sync_config.py | 4 | CODE | |
| LOW | cli-e2e/scripts/db_sync_server.py | 4 | CODE | |
| LOW | cli-e2e/scripts/wait_sync_status.py | 4 | CODE | |
| LOW | cli-e2e/scripts/compare_graph_queries.py | 4 | CODE | |
| LOW | cli-e2e/scripts/random_bidirectional_block_ops.py | 4 | CODE | |
| LOW | cli-e2e/scripts/sync_asset_download.py | 4 | CODE | |
| LOW | cli-e2e/scripts/sync_asset_download.py | 13 | CODE | |
| LOW | …ills/logseq-review-workflow-eval/scripts/setup_eval.py | 4 | CODE | |
| LOW | …logseq-review-workflow-eval/scripts/compare_outputs.py | 4 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | resources/404.html | 1 | <!DOCTYPE html> | COMMENT |
| LOW | ios/App/App/FolderPicker.m | 1 | // | COMMENT |
| LOW | ios/App/App/App-Bridging-Header.h | 1 | // | COMMENT |
| LOW | ios/App/App/FileContainer.m | 1 | // | COMMENT |
| LOW | libs/tsconfig.json | 21 | /* Generates corresponding '.map' file. */ | COMMENT |
| LOW | libs/tsconfig.json | 41 | /* Enable strict null checks. */ | COMMENT |
| LOW | libs/tsconfig.json | 61 | // "typeRoots": [], /* List of folders to include type definitions from. */ | COMMENT |
| LOW | libs/guides/db_properties_references.md | 481 | // { | COMMENT |
| LOW | …t/resources/exporter-test-graph/journals/2025_06_12.md | 61 | #+END_QUOTE | COMMENT |
| LOW | src/main/frontend/extensions/pdf/finder.js | 61 | function normalize (text) { | COMMENT |
| LOW | src/main/frontend/extensions/pdf/finder.js | 81 | // [6, 0], [8, 3]]. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | resources/js/lsplugin.core.js | 2 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.am | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .i18n-lint.toml | 8 | # ── Shared settings ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | .i18n-lint.toml | 83 | # ── [lint] settings ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | .i18n-lint.toml | 306 | # ── [check-keys] settings ────────────────────────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | libs/src/postmate/index.ts | 327 | // Step 1: Remove listener from window to avoid duplicate message handling | COMMENT |
| LOW⚡ | libs/src/postmate/index.ts | 330 | // Step 2: Update messagePort reference (this affects this.listener validation logic) | COMMENT |
| LOW⚡ | libs/src/postmate/index.ts | 333 | // Step 3: Add the same listener to MessagePort (now all communication goes through port) | COMMENT |
| LOW⚡ | libs/src/postmate/index.ts | 341 | // Step 4: Clean up the channel-ready event listener | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .i18n-lint.toml | 76 | "placeholder", | CODE |
| LOW | resources/js/lsplugin.user.js | 2 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.am | CODE |
| LOW | resources/js/lsplugin.core.js | 2 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.am | CODE |
| LOW | libs/guides/db_properties_references.md | 272 | await logseq.Editor.upsertBlockProperty(page.uuid, 'author', 'John Doe') | CODE |
| LOW | libs/guides/db_tag_property_idents_guide.md | 39 | 'John Doe' | CODE |
| LOW | libs/guides/db_tag_property_idents_guide.md | 329 | 'John Doe' | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …ure/2026-08-24-logseq-runtime-and-engineering-guide.md | 517 | #### Outliner performance guardrails | COMMENT |
| MEDIUM | libs/guides/starter_guide.md | 33 | ## Create plugin package from scaffold | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | cli-e2e/scripts/db_sync_server.py | 128 | CODE | |
| LOW | cli-e2e/scripts/graph_deletion_lifecycle_test.py | 102 | CODE | |
| LOW | cli-e2e/scripts/graph_deletion_lifecycle_test.py | 112 | CODE | |
| LOW | cli-e2e/scripts/created_entity_results.py | 11 | CODE | |
| LOW | cli-e2e/scripts/random_bidirectional_block_ops.py | 262 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .agents/skills/logseq-repl/scripts/start-repl.py | 144 | print("Error: standard Logseq REPL ports are still occupied after cleanup.", file=sys.stderr) | CODE |
| LOW | sidecar/embedding_server.py | 96 | except Exception as error: | CODE |
| LOW | sidecar/embedding_server.py | 148 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/install-linux.sh | 191 | # Check if running as root for system-wide installation | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | cli-e2e/scripts/agent_bridge_e2e.py | 161 | CODE |