🗃 Open source self-hosted web archiving. Takes URLs/browser history/bookmarks/Pocket/Pinboard/etc., saves HTML, JS, PDFs, media, and more...
This report presents the forensic synthetic code analysis of ArchiveBox/ArchiveBox, a Python project with 28,199 GitHub stars. SynthScan v2.0 examined 203,275 lines of code across 659 source files, recording 2334 pattern matches distributed across 22 syntactic categories. The overall adjusted score of 16.3 places this repository in the Moderate AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 2334 distinct pattern matches across 22 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | old/TODO_hook_statemachine_cleanup.md | 127 | def has_running_background_hooks(self) -> bool: | CODE |
| LOW⚡ | old/TODO_fs_migrations.md | 305 | def reconcile_with_index_json(self): | CODE |
| LOW⚡ | old/TODO_fs_migrations.md | 465 | def move_directory_to_invalid(snapshot_dir: Path): | CODE |
| LOW | old/TODO_fs_migrations.md | 113 | def get_storage_path_for_version(self, version: str) -> Path: | CODE |
| LOW | old/TODO_fs_migrations.md | 284 | def _detect_fs_version_from_index(data: dict) -> str: | CODE |
| LOW | old/TODO_fs_migrations.md | 368 | def _merge_archive_results_from_index(self, index_data: dict): | CODE |
| LOW | old/TODO_fs_migrations.md | 387 | def _create_archive_result_if_missing(self, result_data: dict, existing: dict): | CODE |
| LOW | old/TODO_fs_migrations.md | 489 | def find_and_merge_duplicates(cls) -> int: | CODE |
| LOW | old/TODO_fs_migrations.md | 662 | def _cleanup_old_migration_dir(self, old_dir: Path): | CODE |
| LOW | old/TODO_fs_migrations.md | 787 | def import_orphans_from_archive(resume_from: str = None, batch_size: int = 100) -> dict: | CODE |
| LOW | old/TODO_fs_migrations.md | 891 | def process_filtered_snapshots( | CODE |
| LOW | old/TODO_fs_migrations.md | 1135 | def fix_invalid_folder_locations(out_dir: Path = DATA_DIR) -> Tuple[List[str], List[str]]: | CODE |
| LOW | old/TODO_process_tracking.md | 1108 | def has_running_background_hooks(self) -> bool: | CODE |
| LOW | old/TODO_process_tracking.md | 1126 | def has_running_background_hooks(self) -> bool: | CODE |
| LOW | old/TODO_process_tracking.md | 1828 | def stop_existing_supervisord_process(): | CODE |
| LOW | old/TODO_process_tracking.md | 1840 | def start_new_supervisord_process(): | CODE |
| LOW | old/TODO_process_tracking.md | 1852 | def stop_existing_supervisord_process(): | CODE |
| LOW | old/TODO_archivebox_jsonl_cli.md | 591 | def assert_jsonl_contains_type(stdout: str, record_type: str, min_count: int = 1): | CODE |
| LOW | old/TODO_archivebox_jsonl_cli.md | 600 | def assert_jsonl_pass_through(stdout: str, input_records: List[Dict[str, Any]]): | CODE |
| LOW | old/TODO_archivebox_jsonl_cli.md | 662 | def create_test_snapshot_json(url: str = None, **kwargs) -> Dict[str, Any]: | CODE |
| LOW | old/archivebox.ts | 6051 | // async function setupScreenrecordingWithAudio(page, wss) { | COMMENT |
| LOW | old/archivebox.ts | 1039 | async function getChromeExtensionsFromPersona({CHROME_EXTENSIONS, CHROMEWEBSTORE_EXTENSIONS_DIR}) { | CODE |
| LOW | old/archivebox.ts | 1061 | async function getChromeExtensionsFromCache({browser, extensions=CHROME_EXTENSIONS, extensions_dir=CHROMEWEBSTORE_EXTENS | CODE |
| LOW | old/archivebox.ts | 1715 | async function collectSnapshotDirVersionFiles(snap_dir) { | CODE |
| LOW | old/archivebox.ts | 1825 | async function symlinkBestSnapshotResults(snap_dir) { | CODE |
| LOW | old/archivebox.ts | 3380 | async function saveAIQualityAssuranceResult(page, {original_url, version}) { | CODE |
| LOW | old/TODO_hook_architecture.md | 1427 | def check_background_hook_completed(archiveresult: 'ArchiveResult') -> bool: | CODE |
| LOW | old/TODO_hook_architecture.md | 1583 | def test_background_hook_detection(): | CODE |
| LOW | old/TODO_hook_architecture.md | 1588 | def test_find_binary_by_abspath(): | CODE |
| LOW | old/TODO_hook_architecture.md | 1627 | def test_foreground_hook_execution(snapshot): | STRING |
| LOW | old/TODO_hook_architecture.md | 1646 | def test_background_hook_execution(snapshot): | STRING |
| LOW | old/TODO_hook_architecture.md | 1667 | def test_background_hook_finalization(snapshot): | STRING |
| LOW | archivebox/misc/db.py | 102 | def database_display_location() -> str: | CODE |
| LOW | archivebox/misc/db.py | 177 | def truncate_overlong_charfields(instance=None, **kwargs) -> None: | CODE |
| LOW | archivebox/misc/db.py | 204 | def rebuild_models_from_migration_state(apps, schema_editor, app_label: str, model_names: list[str]) -> None: | CODE |
| LOW | archivebox/misc/util.py | 25 | def filter_queryset_by_uuid_substring(queryset, slug: str, field: str = "id"): | CODE |
| LOW | archivebox/misc/util.py | 248 | def split_comma_separated_urls(url: str): | CODE |
| LOW | archivebox/misc/checks.py | 26 | def _migration_interrupt_message(*, before_apply: bool = False) -> str: | CODE |
| LOW | archivebox/misc/checks.py | 38 | def _exit_on_migration_interrupt(): | CODE |
| LOW⚡ | archivebox/misc/checks.py | 195 | def is_archivebox_source_root(path: Path | str | None = None) -> bool: | CODE |
| LOW⚡ | archivebox/misc/checks.py | 204 | def check_not_inside_source_dir(path: Path | str | None = None) -> None: | CODE |
| LOW⚡ | archivebox/misc/checks.py | 213 | def check_data_dir_permissions(config=None, **config_kwargs): | CODE |
| LOW | archivebox/misc/logging_util.py | 436 | def printable_dependency_version(name: str, dependency: dict) -> str: | CODE |
| LOW | archivebox/misc/serve_static.py | 115 | def _format_direntry_timestamp(stat_result: os.stat_result) -> str: | CODE |
| LOW | archivebox/misc/serve_static.py | 163 | def _build_directory_zip_response( | CODE |
| LOW | archivebox/misc/serve_static.py | 253 | async def _stream_ranged_file_async(ranged_file: "RangedFileReader"): | CODE |
| LOW | archivebox/misc/serve_static.py | 363 | def _extract_markdown_candidate(text: str) -> str: | CODE |
| LOW | archivebox/misc/serve_static.py | 387 | def _render_text_preview_document(text: str, title: str) -> str: | CODE |
| LOW | archivebox/misc/serve_static.py | 437 | def _render_image_preview_document(image_url: str, title: str) -> str: | CODE |
| LOW | archivebox/misc/serve_static.py | 487 | def _encoded_responses_image_url(image_url: str, page_url: str | None) -> str | None: | CODE |
| LOW | archivebox/misc/serve_static.py | 499 | def _index_responses_paths_for_html_images( | CODE |
| LOW | archivebox/misc/serve_static.py | 532 | def _rewrite_html_image_sources_to_responses( | CODE |
| LOW | archivebox/misc/serve_static.py | 564 | def _rewrite_html_image_sources_for_request( | CODE |
| LOW⚡ | archivebox/misc/serve_static.py | 580 | def _apply_transformed_html_preview_style(html_text: str) -> str: | CODE |
| LOW⚡ | archivebox/misc/serve_static.py | 588 | def _set_transformed_response_headers(response, fullpath: Path, statobj: os.stat_result, encoding: str | None, config) - | CODE |
| LOW⚡ | archivebox/misc/serve_static.py | 596 | def _render_markdown_fallback(text: str) -> str: | CODE |
| LOW | archivebox/misc/serve_static.py | 751 | def _render_markdown_document(markdown_text: str) -> str: | CODE |
| LOW | archivebox/misc/serve_static.py | 771 | def _is_risky_replay_document(fullpath: Path, content_type: str) -> bool: | CODE |
| LOW | archivebox/misc/serve_static.py | 788 | def _apply_archive_replay_headers( | CODE |
| LOW | archivebox/misc/serve_static.py | 831 | def serve_static_with_byterange_support(request, path, document_root=None, show_indexes=False, is_archive_replay: bool = | CODE |
| 1442 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | old/TODO_fs_migrations.md | 301 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | old/TODO_fs_migrations.md | 303 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | old/TODO_fs_migrations.md | 460 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | old/TODO_fs_migrations.md | 462 | # ========================================================================= | COMMENT |
| MEDIUM | old/TODO_fs_migrations.md | 79 | # ========================================================================= | COMMENT |
| MEDIUM | old/TODO_fs_migrations.md | 81 | # ========================================================================= | COMMENT |
| MEDIUM | old/TODO_fs_migrations.md | 145 | # ========================================================================= | COMMENT |
| MEDIUM | old/TODO_fs_migrations.md | 147 | # ========================================================================= | COMMENT |
| MEDIUM | old/TODO_archivebox_jsonl_cli.md | 467 | # ============================================================================= | COMMENT |
| MEDIUM | old/TODO_archivebox_jsonl_cli.md | 469 | # ============================================================================= | COMMENT |
| MEDIUM | old/TODO_archivebox_jsonl_cli.md | 532 | # ============================================================================= | COMMENT |
| MEDIUM | old/TODO_archivebox_jsonl_cli.md | 534 | # ============================================================================= | COMMENT |
| MEDIUM | old/TODO_archivebox_jsonl_cli.md | 574 | # ============================================================================= | COMMENT |
| MEDIUM | old/TODO_archivebox_jsonl_cli.md | 576 | # ============================================================================= | COMMENT |
| MEDIUM | old/TODO_archivebox_jsonl_cli.md | 619 | # ============================================================================= | COMMENT |
| MEDIUM | old/TODO_archivebox_jsonl_cli.md | 621 | # ============================================================================= | COMMENT |
| MEDIUM | old/TODO_archivebox_jsonl_cli.md | 636 | # ============================================================================= | COMMENT |
| MEDIUM | old/TODO_archivebox_jsonl_cli.md | 638 | # ============================================================================= | COMMENT |
| MEDIUM | archivebox/misc/db.py | 25 | # ============================================================================ | COMMENT |
| MEDIUM | archivebox/misc/db.py | 27 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | archivebox/core/models.py | 2113 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | archivebox/core/models.py | 2115 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | archivebox/core/models.py | 3566 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | archivebox/core/models.py | 3568 | # ========================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 294 | # ========================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 296 | # ========================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 397 | # ========================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 399 | # ========================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 494 | # ========================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 496 | # ========================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 1049 | # ========================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 1051 | # ========================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 1298 | # ========================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 1300 | # ========================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 1356 | # ========================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 1358 | # ========================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 1640 | # ========================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 1642 | # ========================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 2245 | # ========================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 2247 | # ========================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 3121 | # ========================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 3123 | # ========================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 3182 | # ========================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 3184 | # ========================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 3234 | # ========================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 3236 | # ========================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 3436 | # ========================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 3438 | # ========================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 3642 | # ============================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 3644 | # ============================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 4888 | # ============================================================================= | COMMENT |
| MEDIUM | archivebox/core/models.py | 4890 | # ============================================================================= | COMMENT |
| MEDIUM | archivebox/plugins/hooks.py | 83 | # ============================================================================= | COMMENT |
| MEDIUM | archivebox/plugins/hooks.py | 85 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | archivebox/plugins/hooks.py | 548 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | archivebox/plugins/hooks.py | 550 | # ============================================================================= | COMMENT |
| MEDIUM | archivebox/tests/conftest.py | 146 | # ============================================================================= | COMMENT |
| MEDIUM | archivebox/tests/conftest.py | 148 | # ============================================================================= | COMMENT |
| MEDIUM | archivebox/tests/conftest.py | 314 | # ============================================================================= | COMMENT |
| MEDIUM | archivebox/tests/conftest.py | 316 | # ============================================================================= | COMMENT |
| 117 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docs/test_codeblocks_manifest.py | 478 | f" (cd {ROOT} && UV_PROJECT_ENVIRONMENT={root_checkout_venv} {current_uv} --no-cache sync --loc | CODE |
| HIGH | archivebox/misc/checks.py | 112 | print(" docker compose pull && docker compose up -d", file=sys.stderr) | CODE |
| HIGH | archivebox/misc/hashing.py | 253 | # "num_subpaths": null, | COMMENT |
| HIGH⚡ | archivebox/core/widgets.py | 532 | return window.updateHiddenField_id_config || null; | CODE |
| HIGH⚡ | archivebox/core/widgets.py | 532 | return window.updateHiddenField_id_config || null; | CODE |
| HIGH⚡ | archivebox/core/widgets.py | 538 | return null; | CODE |
| HIGH⚡ | archivebox/core/widgets.py | 542 | return keyInput && keyInput.value.trim() === key; | CODE |
| HIGH⚡ | archivebox/core/widgets.py | 544 | return matches.length ? matches[0] : null; | CODE |
| HIGH⚡ | archivebox/core/widgets.py | 551 | return rows ? rows.lastElementChild : null; | CODE |
| HIGH⚡ | archivebox/core/widgets.py | 553 | return null; | CODE |
| HIGH⚡ | archivebox/core/widgets.py | 618 | if (!domain || seen[domain]) {{ | CODE |
| HIGH⚡ | archivebox/core/widgets.py | 623 | domains.push(domain); | CODE |
| HIGH⚡ | archivebox/core/widgets.py | 627 | var hostAndPort = String(parsed.host || parsed.hostname || '').toLowerCase(); | CODE |
| HIGH⚡ | archivebox/core/widgets.py | 629 | if (!hostAndPort || seen[pathKey]) {{ | CODE |
| HIGH⚡ | archivebox/core/widgets.py | 633 | paths.push({{ host: hostAndPort, path: pathname }}); | CODE |
| HIGH | archivebox/core/widgets.py | 134 | onkeypress="if(event.key==='Enter' || event.keyCode===13 || event.key===' ' || event.code==='Space' | | CODE |
| HIGH | archivebox/core/widgets.py | 144 | var autocompleteTimeout_{widget_id} = null; | CODE |
| HIGH | archivebox/core/widgets.py | 181 | if (!(options && options.skipHiddenUpdate)) {{ | CODE |
| HIGH | archivebox/core/widgets.py | 325 | if (isEnter || isSpace || isComma) {{ | CODE |
| HIGH | archivebox/core/widgets.py | 335 | }} else if (event.key === 'Backspace' && !value && currentTags_{widget_id}.length > 0) {{ | CODE |
| HIGH | archivebox/core/widgets.py | 349 | if (!query || query.length < 1) {{ | CODE |
| HIGH | archivebox/core/widgets.py | 471 | if (!trimmed || trimmed.charAt(0) === '#') {{ | CODE |
| HIGH | archivebox/core/widgets.py | 513 | if (!pathname || pathname === '/') {{ | CODE |
| HIGH | archivebox/core/widgets.py | 607 | var seen = Object.create(null); | CODE |
| HIGH | archivebox/core/admin_snapshots.py | 994 | "this.dataset.fallbacks && this.dataset.fallbacks.length ? " | CODE |
| HIGH | archivebox/core/admin_snapshots.py | 1021 | "this.dataset.fallbacks && this.dataset.fallbacks.length ? " | CODE |
| HIGH | archivebox/tests/test_release_workflow.py | 22 | assert checkout["with"]["token"] == "${{ secrets.RELEASE_GH_TOKEN || github.token }}" | CODE |
| HIGH⚡ | archivebox/tests/test_server_security_browser.py | 38 | finalUrl: null, | CODE |
| HIGH⚡ | archivebox/tests/test_server_security_browser.py | 39 | status: null, | CODE |
| HIGH⚡ | archivebox/tests/test_server_security_browser.py | 40 | error: null, | CODE |
| HIGH⚡ | archivebox/tests/test_server_security_browser.py | 49 | result.status = response ? response.status() : null; | CODE |
| HIGH⚡ | archivebox/tests/test_server_security_browser.py | 95 | consoleMessages.push({type: message.type(), text: message.text()}); | CODE |
| HIGH⚡ | archivebox/tests/test_server_security_browser.py | 98 | consoleMessages.push({type: "pageerror", text: String(error)}); | CODE |
| HIGH⚡ | archivebox/tests/test_server_security_browser.py | 101 | requestFailures.push({ | CODE |
| HIGH⚡ | archivebox/tests/test_server_security_browser.py | 113 | () => window.__dangerousScriptRan !== true || window.__probeResults !== undefined, | CODE |
| HIGH⚡ | archivebox/tests/test_server_security_browser.py | 113 | () => window.__dangerousScriptRan !== true || window.__probeResults !== undefined, | CODE |
| HIGH⚡ | archivebox/tests/test_server_security_browser.py | 120 | probeResults: window.__probeResults || null, | CODE |
| HIGH⚡ | archivebox/tests/test_server_security_browser.py | 120 | probeResults: window.__probeResults || null, | CODE |
| HIGH⚡ | archivebox/tests/test_server_security_browser.py | 128 | status: response ? response.status() : null, | CODE |
| HIGH⚡ | archivebox/tests/test_server_security_browser.py | 130 | contentSecurityPolicy: response ? response.headers()["content-security-policy"] || null : null, | CODE |
| HIGH⚡ | archivebox/tests/test_server_security_browser.py | 131 | archiveboxSecurityMode: response ? response.headers()["x-archivebox-security-mode"] || null : null, | CODE |
| HIGH⚡ | archivebox/tests/test_server_security_browser.py | 313 | consoleMessages.push({type: message.type(), text: message.text()}); | CODE |
| HIGH⚡ | archivebox/tests/test_server_security_browser.py | 316 | consoleMessages.push({type: "pageerror", text: String(error)}); | CODE |
| HIGH⚡ | archivebox/tests/test_server_security_browser.py | 319 | requestFailures.push({ | CODE |
| HIGH | archivebox/tests/test_server_security_browser.py | 209 | return saved.BASE_URL && saved.SERVER_SECURITY_MODE === "safe-onedomain-nojsreplay"; | CODE |
| HIGH | archivebox/tests/test_server_security_browser.py | 249 | return body || root || ""; | CODE |
| HIGH | archivebox/tests/test_server_security_browser.py | 266 | frameState.push({ | CODE |
| HIGH | archivebox/tests/test_server_security_browser.py | 273 | if (previewFrame && (frame === previewFrame || isDescendantOf(frame, previewFrame)) && text.includes(expectedText)) | CODE |
| HIGH | archivebox/tests/test_server_security_browser.py | 338 | status: response ? response.status() : null, | CODE |
| HIGH⚡ | archivebox/tests/test_ui_admin_config_widget.py | 93 | assert "window.history.replaceState(null, '', cleanUrl.pathname + cleanUrl.search + cleanUrl.hash)" in html | CODE |
| HIGH⚡ | archivebox/tests/test_ui_admin_config_widget.py | 225 | assert "var coreReachable = results.admin && results.api && results.index && results.web && results.snapshot;" in SE | CODE |
| HIGH⚡ | archivebox/tests/test_ui_admin_config_widget.py | 230 | assert "response.ok && response.headers.get('X-ArchiveBox-Health') === 'OK'" in SETUP_WIZARD_JS | CODE |
| HIGH | archivebox/tests/test_hooks.py | 9 | sudo -u testuser bash -c 'source .venv/bin/activate && python -m pytest archivebox/tests/test_hooks.py -v' | STRING |
| HIGH⚡ | archivebox/tests/test_setup_script.py | 96 | assert "if [ -t 1 ]; then\n clear || true\nfi" in script | CODE |
| HIGH | archivebox/crawls/admin.py | 312 | var cookieValue = null; | STRING |
| HIGH⚡ | archivebox/base_models/admin.py | 170 | if (!meta || meta.type === undefined || meta.type === null) {{ | CODE |
| HIGH⚡ | archivebox/base_models/admin.py | 170 | if (!meta || meta.type === undefined || meta.type === null) {{ | CODE |
| HIGH⚡ | archivebox/base_models/admin.py | 178 | return null; | CODE |
| HIGH⚡ | archivebox/base_models/admin.py | 224 | if (meta.minimum !== undefined || meta.maximum !== undefined) {{ | CODE |
| HIGH⚡ | archivebox/base_models/admin.py | 224 | if (meta.minimum !== undefined || meta.maximum !== undefined) {{ | CODE |
| 29 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | archivebox/tests/test_api_v1_crawls_crawl_crawl_id.py | 0 | from archivebox.workers.supervisord_util import get_existing_supervisord_process, stop_worker supervisor = get_existing_ | STRING |
| HIGH | …hivebox/tests/test_api_v1_core_snapshot_snapshot_id.py | 0 | from archivebox.workers.supervisord_util import get_existing_supervisord_process, stop_worker supervisor = get_existing_ | STRING |
| HIGH | archivebox/tests/test_ui_public_snapshot.py | 0 | from archivebox.workers.supervisord_util import get_existing_supervisord_process, stop_worker supervisor = get_existing_ | STRING |
| HIGH | archivebox/tests/test_ui_add_view_runtime.py | 0 | from archivebox.workers.supervisord_util import get_existing_supervisord_process, stop_worker supervisor = get_existing_ | STRING |
| HIGH | archivebox/tests/test_cli_add.py | 0 | <?xml version="1.0" encoding="utf-8"?> <rss version="2.0"> <channel> <title>archivebox rss import fixture</title> <link> | STRING |
| HIGH | archivebox/tests/test_api_v1_cli_add.py | 0 | <?xml version="1.0" encoding="utf-8"?> <rss version="2.0"> <channel> <title>archivebox rss import fixture</title> <link> | STRING |
| HIGH | archivebox/tests/test_ui_add_view_runtime.py | 0 | <?xml version="1.0" encoding="utf-8"?> <rss version="2.0"> <channel> <title>archivebox rss import fixture</title> <link> | STRING |
| HIGH | archivebox/tests/test_cli_add.py | 0 | <!doctype netscape-bookmark-file-1> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>bookmarks | STRING |
| HIGH | archivebox/tests/test_api_v1_cli_add.py | 0 | <!doctype netscape-bookmark-file-1> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>bookmarks | STRING |
| HIGH | archivebox/tests/test_ui_add_view_runtime.py | 0 | <!doctype netscape-bookmark-file-1> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>bookmarks | STRING |
| HIGH | archivebox/tests/test_cli_add.py | 0 | <!doctype html> <html> <head><title>dom import fixture</title></head> <body> <a href="{urls["dom"]}">iana example domain | STRING |
| HIGH | archivebox/tests/test_api_v1_cli_add.py | 0 | <!doctype html> <html> <head><title>dom import fixture</title></head> <body> <a href="{urls["dom"]}">iana example domain | STRING |
| HIGH | archivebox/tests/test_ui_add_view_runtime.py | 0 | <!doctype html> <html> <head><title>dom import fixture</title></head> <body> <a href="{urls["dom"]}">iana example domain | STRING |
| HIGH | archivebox/tests/test_cli_add.py | 0 | <?xml version="1.0"?> <!doctype rss [ <!entity localfile system "file:///etc/hosts"> ]> <rss version="2.0" xmlns:xi="htt | STRING |
| HIGH | archivebox/tests/test_api_v1_cli_add.py | 0 | <?xml version="1.0"?> <!doctype rss [ <!entity localfile system "file:///etc/hosts"> ]> <rss version="2.0" xmlns:xi="htt | STRING |
| HIGH | archivebox/tests/test_ui_add_view_runtime.py | 0 | <?xml version="1.0"?> <!doctype rss [ <!entity localfile system "file:///etc/hosts"> ]> <rss version="2.0" xmlns:xi="htt | STRING |
| HIGH | archivebox/cli/archivebox_archiveresult.py | 0 | list personas as jsonl with optional filters. exit codes: 0: success (even if no results) | STRING |
| HIGH | archivebox/cli/archivebox_process.py | 0 | list personas as jsonl with optional filters. exit codes: 0: success (even if no results) | STRING |
| HIGH | archivebox/cli/archivebox_tag.py | 0 | list personas as jsonl with optional filters. exit codes: 0: success (even if no results) | STRING |
| HIGH | archivebox/cli/archivebox_binary.py | 0 | list personas as jsonl with optional filters. exit codes: 0: success (even if no results) | STRING |
| HIGH | archivebox/cli/archivebox_snapshot.py | 0 | list personas as jsonl with optional filters. exit codes: 0: success (even if no results) | STRING |
| HIGH | archivebox/cli/archivebox_machine.py | 0 | list personas as jsonl with optional filters. exit codes: 0: success (even if no results) | STRING |
| HIGH | archivebox/cli/archivebox_crawl.py | 0 | list personas as jsonl with optional filters. exit codes: 0: success (even if no results) | STRING |
| HIGH | archivebox/cli/archivebox_persona.py | 0 | list personas as jsonl with optional filters. exit codes: 0: success (even if no results) | STRING |
| HIGH | archivebox/cli/archivebox_archiveresult.py | 0 | update personas from stdin jsonl. reads persona records from stdin and applies updates. uses patch semantics - only spec | STRING |
| HIGH | archivebox/cli/archivebox_tag.py | 0 | update personas from stdin jsonl. reads persona records from stdin and applies updates. uses patch semantics - only spec | STRING |
| HIGH | archivebox/cli/archivebox_binary.py | 0 | update personas from stdin jsonl. reads persona records from stdin and applies updates. uses patch semantics - only spec | STRING |
| HIGH | archivebox/cli/archivebox_snapshot.py | 0 | update personas from stdin jsonl. reads persona records from stdin and applies updates. uses patch semantics - only spec | STRING |
| HIGH | archivebox/cli/archivebox_crawl.py | 0 | update personas from stdin jsonl. reads persona records from stdin and applies updates. uses patch semantics - only spec | STRING |
| HIGH | archivebox/cli/archivebox_persona.py | 0 | update personas from stdin jsonl. reads persona records from stdin and applies updates. uses patch semantics - only spec | STRING |
| HIGH | archivebox/cli/archivebox_archiveresult.py | 0 | delete personas from stdin jsonl. requires --yes flag to confirm deletion. exit codes: 0: success 1: no input or missing | STRING |
| HIGH | archivebox/cli/archivebox_tag.py | 0 | delete personas from stdin jsonl. requires --yes flag to confirm deletion. exit codes: 0: success 1: no input or missing | STRING |
| HIGH | archivebox/cli/archivebox_binary.py | 0 | delete personas from stdin jsonl. requires --yes flag to confirm deletion. exit codes: 0: success 1: no input or missing | STRING |
| HIGH | archivebox/cli/archivebox_snapshot.py | 0 | delete personas from stdin jsonl. requires --yes flag to confirm deletion. exit codes: 0: success 1: no input or missing | STRING |
| HIGH | archivebox/cli/archivebox_crawl.py | 0 | delete personas from stdin jsonl. requires --yes flag to confirm deletion. exit codes: 0: success 1: no input or missing | STRING |
| HIGH | archivebox/cli/archivebox_persona.py | 0 | delete personas from stdin jsonl. requires --yes flag to confirm deletion. exit codes: 0: success 1: no input or missing | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | old/TODO_fs_migrations.md | 252 | def is_valid_timestamp(ts): | CODE |
| LOW | old/TODO_fs_migrations.md | 110 | except Exception: | CODE |
| LOW | old/TODO_fs_migrations.md | 673 | except Exception as e: | CODE |
| LOW | old/TODO_fs_migrations.md | 1153 | except Exception: | CODE |
| LOW | old/TODO_process_tracking.md | 1405 | except Exception as e: | CODE |
| LOW | old/TODO_hook_architecture.md | 145 | except Exception: | CODE |
| LOW | old/TODO_hook_architecture.md | 232 | except Exception as e: | CODE |
| LOW | old/TODO_hook_architecture.md | 1102 | except Exception as e: | CODE |
| LOW | docs/conf.py | 49 | except Exception: | CODE |
| LOW | docs/test_codeblocks_manifest.py | 288 | except Exception as error: | CODE |
| LOW | archivebox/misc/db.py | 98 | except Exception: | CODE |
| LOW | archivebox/misc/db.py | 172 | except Exception: | CODE |
| LOW | archivebox/misc/db.py | 294 | except Exception: | CODE |
| LOW⚡ | archivebox/misc/db.py | 308 | except Exception: | CODE |
| LOW⚡ | archivebox/misc/db.py | 314 | except Exception: | CODE |
| LOW⚡ | archivebox/misc/db.py | 323 | except Exception: | CODE |
| LOW | archivebox/misc/db.py | 580 | except Exception as err: | CODE |
| LOW⚡ | archivebox/misc/util.py | 522 | except Exception: | CODE |
| LOW⚡ | archivebox/misc/util.py | 527 | except Exception: | CODE |
| LOW⚡ | archivebox/misc/util.py | 532 | except Exception: | CODE |
| LOW | archivebox/misc/checks.py | 49 | except Exception: | CODE |
| LOW | archivebox/misc/checks.py | 264 | except Exception: | CODE |
| LOW | archivebox/misc/checks.py | 269 | except Exception: | CODE |
| LOW | archivebox/misc/checks.py | 317 | except Exception as e: | CODE |
| LOW | archivebox/misc/checks.py | 370 | except Exception as e: | CODE |
| MEDIUM | archivebox/misc/checks.py | 46 | def handle_shutdown(_signum, _frame): | CODE |
| LOW | archivebox/misc/logging_util.py | 70 | except Exception: | CODE |
| LOW | archivebox/misc/toml_util.py | 32 | except Exception: | CODE |
| LOW | archivebox/misc/toml_util.py | 37 | except Exception: | CODE |
| LOW | archivebox/misc/toml_util.py | 98 | except Exception: | CODE |
| LOW | archivebox/core/settings_logging.py | 100 | except Exception: | CODE |
| LOW | archivebox/core/admin_snapshots.py | 539 | except Exception as e: | CODE |
| LOW | archivebox/core/admin_snapshots.py | 1353 | except Exception: | CODE |
| MEDIUM | archivebox/core/admin_snapshots.py | 1317 | def _get_expected_hook_total(self, obj) -> int: | CODE |
| LOW⚡ | archivebox/core/takeover_util.py | 134 | except Exception: | CODE |
| LOW⚡ | archivebox/config/version.py | 55 | except Exception: | CODE |
| LOW⚡ | archivebox/config/version.py | 62 | except Exception: | CODE |
| LOW⚡ | archivebox/config/version.py | 68 | except Exception: | CODE |
| LOW⚡ | archivebox/config/version.py | 73 | except Exception: | CODE |
| LOW | archivebox/config/version.py | 109 | except Exception: | CODE |
| LOW | archivebox/config/paths.py | 56 | except Exception: | CODE |
| LOW | archivebox/config/paths.py | 96 | except Exception: | CODE |
| LOW | archivebox/config/paths.py | 102 | except Exception: | CODE |
| LOW | archivebox/config/paths.py | 155 | except Exception as e: | CODE |
| LOW | archivebox/config/paths.py | 223 | except Exception: | CODE |
| LOW | archivebox/config/paths.py | 237 | except Exception: | CODE |
| LOW | archivebox/config/paths.py | 264 | except Exception: | CODE |
| LOW | archivebox/config/paths.py | 301 | except Exception: | CODE |
| LOW | archivebox/config/paths.py | 377 | except Exception: | CODE |
| LOW | archivebox/config/collection.py | 226 | except Exception: | CODE |
| LOW | archivebox/config/collection.py | 326 | except Exception: | CODE |
| LOW | archivebox/plugins/hooks.py | 322 | except Exception: | CODE |
| LOW | archivebox/plugins/hooks.py | 456 | except Exception as e: | CODE |
| LOW⚡ | archivebox/plugins/hooks.py | 542 | except Exception: | CODE |
| LOW | archivebox/plugins/hooks.py | 623 | except Exception as e: | CODE |
| LOW | archivebox/plugins/discovery.py | 168 | except Exception: | CODE |
| LOW | archivebox/plugins/forms.py | 502 | except Exception: | CODE |
| LOW | archivebox/crawls/models.py | 548 | except Exception: | CODE |
| LOW | archivebox/crawls/models.py | 1641 | except Exception as e: | CODE |
| LOW⚡ | archivebox/cli/archivebox_binary.py | 101 | except Exception as e: | CODE |
| 77 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | bin/generate_ui_screenshot_gallery.py | 98 | CODE | |
| LOW | docs/test_codeblocks_manifest.py | 205 | CODE | |
| LOW | docs/test_codeblocks_manifest.py | 353 | CODE | |
| LOW | docs/test_codeblocks_manifest.py | 581 | CODE | |
| LOW | archivebox/misc/db.py | 143 | CODE | |
| LOW | archivebox/misc/db.py | 409 | CODE | |
| LOW | archivebox/misc/system.py | 19 | CODE | |
| LOW | archivebox/misc/system.py | 56 | CODE | |
| LOW | archivebox/misc/util.py | 495 | CODE | |
| LOW | archivebox/misc/checks.py | 97 | CODE | |
| LOW | archivebox/misc/logging_util.py | 257 | CODE | |
| LOW | archivebox/misc/hashing.py | 156 | CODE | |
| LOW | archivebox/misc/serve_static.py | 596 | CODE | |
| LOW | archivebox/misc/serve_static.py | 831 | CODE | |
| LOW | archivebox/core/admin_archiveresults.py | 82 | CODE | |
| LOW | archivebox/core/models.py | 168 | CODE | |
| LOW | archivebox/core/models.py | 199 | CODE | |
| LOW | archivebox/core/models.py | 1164 | CODE | |
| LOW | archivebox/core/models.py | 1303 | CODE | |
| LOW | archivebox/core/models.py | 1361 | CODE | |
| LOW | archivebox/core/models.py | 1461 | CODE | |
| LOW | archivebox/core/models.py | 1644 | CODE | |
| LOW | archivebox/core/models.py | 1742 | CODE | |
| LOW | archivebox/core/models.py | 1971 | CODE | |
| LOW | archivebox/core/models.py | 2012 | CODE | |
| LOW | archivebox/core/models.py | 2168 | CODE | |
| LOW | archivebox/core/models.py | 2479 | CODE | |
| LOW | archivebox/core/models.py | 2541 | CODE | |
| LOW | archivebox/core/models.py | 2780 | CODE | |
| LOW | archivebox/core/models.py | 3256 | CODE | |
| LOW | archivebox/core/models.py | 4098 | CODE | |
| LOW | archivebox/core/models.py | 4551 | CODE | |
| LOW | archivebox/core/widgets.py | 63 | CODE | |
| LOW | archivebox/core/widgets.py | 686 | CODE | |
| LOW | archivebox/core/forms.py | 36 | CODE | |
| LOW | archivebox/core/tag_util.py | 59 | CODE | |
| LOW | archivebox/core/admin_site.py | 102 | CODE | |
| LOW | archivebox/core/takeover_util.py | 225 | CODE | |
| LOW | archivebox/core/middleware.py | 120 | CODE | |
| LOW | archivebox/core/middleware.py | 124 | CODE | |
| LOW | archivebox/core/views.py | 492 | CODE | |
| LOW | archivebox/core/views.py | 702 | CODE | |
| LOW | archivebox/core/views.py | 1278 | CODE | |
| LOW | archivebox/core/templatetags/core_tags.py | 122 | CODE | |
| LOW | archivebox/core/sqlite_backend/base.py | 25 | CODE | |
| LOW | archivebox/config/django.py | 33 | CODE | |
| LOW | archivebox/config/paths.py | 43 | CODE | |
| LOW | archivebox/config/common.py | 202 | CODE | |
| LOW | archivebox/config/common.py | 513 | CODE | |
| LOW | archivebox/config/common.py | 1062 | CODE | |
| LOW | archivebox/config/collection.py | 198 | CODE | |
| LOW | archivebox/config/configset.py | 80 | CODE | |
| LOW | archivebox/config/views.py | 69 | CODE | |
| LOW | archivebox/config/views.py | 232 | CODE | |
| LOW | archivebox/plugins/hooks.py | 244 | CODE | |
| LOW | archivebox/plugins/hooks.py | 504 | CODE | |
| LOW | archivebox/plugins/hooks.py | 553 | CODE | |
| LOW | archivebox/plugins/discovery.py | 116 | CODE | |
| LOW | archivebox/plugins/forms.py | 348 | CODE | |
| LOW | archivebox/plugins/views.py | 259 | CODE | |
| 73 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | archivebox/core/admin_archiveresults.py | 13 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL⚡ | archivebox/core/recovery_util.py | 18 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | archivebox/tests/test_snapshot_url_length.py | 9 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | archivebox/crawls/models.py | 17 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | archivebox/api/v1_core.py | 18 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | archivebox/templates/static/jquery-3.7.1.slim.min.js | 2 | !function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):f | CODE |
| CRITICAL | archivebox/templates/static/jquery.min.js | 2 | !function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):f | CODE |
| CRITICAL | archivebox/services/snapshot_service.py | 8 | from django.core.exceptions import ValidationError | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pdm_build.py | 1 | CODE | |
| LOW | docs/test_codeblocks_manifest.py | 8 | CODE | |
| LOW | archivebox/__main__.py | 6 | CODE | |
| LOW | archivebox/misc/shell_welcome_message.py | 6 | CODE | |
| LOW | archivebox/misc/shell_welcome_message.py | 7 | CODE | |
| LOW | archivebox/misc/shell_welcome_message.py | 8 | CODE | |
| LOW | archivebox/misc/shell_welcome_message.py | 9 | CODE | |
| LOW | archivebox/misc/shell_welcome_message.py | 10 | CODE | |
| LOW | archivebox/misc/shell_welcome_message.py | 11 | CODE | |
| LOW | archivebox/misc/shell_welcome_message.py | 12 | CODE | |
| LOW | archivebox/misc/shell_welcome_message.py | 13 | CODE | |
| LOW | archivebox/misc/shell_welcome_message.py | 14 | CODE | |
| LOW | archivebox/misc/shell_welcome_message.py | 16 | CODE | |
| LOW | archivebox/misc/shell_welcome_message.py | 17 | CODE | |
| LOW | archivebox/misc/shell_welcome_message.py | 17 | CODE | |
| LOW | archivebox/misc/shell_welcome_message.py | 19 | CODE | |
| LOW | archivebox/misc/shell_welcome_message.py | 20 | CODE | |
| LOW | archivebox/misc/shell_welcome_message.py | 22 | CODE | |
| LOW | archivebox/core/models.py | 62 | CODE | |
| LOW | archivebox/core/routes_util.py | 1 | CODE | |
| LOW | archivebox/core/apps.py | 34 | CODE | |
| LOW | archivebox/core/tag_util.py | 1 | CODE | |
| LOW | archivebox/core/shutdown_util.py | 1 | CODE | |
| LOW | archivebox/core/admin_site.py | 32 | CODE | |
| LOW | archivebox/core/admin_site.py | 33 | CODE | |
| LOW | archivebox/core/admin_site.py | 35 | CODE | |
| LOW | archivebox/core/admin_site.py | 35 | CODE | |
| LOW | archivebox/core/settings.py | 558 | CODE | |
| LOW | archivebox/core/settings.py | 592 | CODE | |
| LOW | archivebox/core/permissions.py | 1 | CODE | |
| LOW | archivebox/core/recovery_util.py | 1 | CODE | |
| LOW | archivebox/core/takeover_util.py | 1 | CODE | |
| LOW | archivebox/core/wsgi.py | 10 | CODE | |
| LOW | archivebox/core/sqlite_backend/base.py | 1 | CODE | |
| LOW | archivebox/config/django.py | 55 | CODE | |
| LOW | archivebox/config/paths.py | 16 | CODE | |
| LOW | archivebox/config/common.py | 1 | CODE | |
| LOW | archivebox/tests/test_server_security_browser.py | 4 | CODE | |
| LOW | archivebox/crawls/schedule_util.py | 1 | CODE | |
| LOW | archivebox/crawls/locks.py | 1 | CODE | |
| LOW | archivebox/crawls/apps.py | 15 | CODE | |
| LOW | archivebox/cli/archivebox_update.py | 2 | CODE | |
| LOW | archivebox/cli/archivebox_add.py | 2 | CODE | |
| LOW | archivebox/search/sonic_daemon.py | 1 | CODE | |
| LOW | archivebox/personas/importers.py | 8 | CODE | |
| LOW | archivebox/machine/models.py | 1 | CODE | |
| LOW | archivebox/machine/apps.py | 19 | CODE | |
| LOW | archivebox/services/binary_service.py | 1 | CODE | |
| LOW | archivebox/services/runner.py | 1 | CODE | |
| LOW | archivebox/services/process_service.py | 1 | CODE | |
| LOW | archivebox/services/crawl_service.py | 1 | CODE | |
| LOW | archivebox/services/tag_service.py | 1 | CODE | |
| LOW | archivebox/services/__init__.py | 1 | CODE | |
| LOW | archivebox/services/__init__.py | 2 | CODE | |
| LOW | archivebox/services/__init__.py | 3 | CODE | |
| LOW | archivebox/services/__init__.py | 4 | CODE | |
| LOW | archivebox/services/__init__.py | 5 | CODE | |
| LOW | archivebox/services/__init__.py | 6 | CODE | |
| LOW | archivebox/services/__init__.py | 6 | CODE | |
| LOW | archivebox/services/__init__.py | 6 | CODE | |
| 7 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | old/TODO_hook_concurrency.md | 94 | ### Step 0: Pre-Setup | COMMENT |
| LOW⚡ | old/TODO_hook_concurrency.md | 99 | ### Step 1: Chrome Launch & Tab Creation | COMMENT |
| LOW⚡ | old/TODO_hook_concurrency.md | 106 | ### Step 2: Navigation & Settlement | COMMENT |
| LOW⚡ | old/TODO_hook_concurrency.md | 114 | ### Step 3: Page Adjustment | COMMENT |
| LOW⚡ | old/TODO_hook_concurrency.md | 124 | ### Step 4: Ready for Archiving | COMMENT |
| LOW⚡ | old/TODO_hook_concurrency.md | 131 | ### Step 5: DOM Extraction (Sequential, Non-BG) | COMMENT |
| LOW | old/TODO_hook_concurrency.md | 147 | ### Step 6: Post-DOM Extraction | COMMENT |
| LOW⚡ | old/TODO_hook_concurrency.md | 158 | ### Step 7: Chrome Cleanup | COMMENT |
| LOW⚡ | old/TODO_hook_concurrency.md | 165 | ### Step 8: Post-Processing | COMMENT |
| LOW⚡ | old/TODO_hook_concurrency.md | 174 | ### Step 9: Indexing & Finalization | COMMENT |
| LOW | old/TODO_hook_concurrency.md | 361 | # Step 5: DOM Extraction (sequential, non-background) | COMMENT |
| LOW | old/TODO_hook_concurrency.md | 372 | # Step 6: Post-DOM Extraction (background for long-running) | COMMENT |
| LOW | old/TODO_hook_concurrency.md | 380 | # Step 7: URL Extraction (parse_* hooks moved from step 6) | COMMENT |
| LOW | old/TODO_hook_architecture.md | 1693 | ### Step 1: Create migration | STRING |
| LOW⚡ | old/TODO_hook_architecture.md | 1704 | ### Step 3: Update run_hook() (Phase 5) | STRING |
| LOW⚡ | old/TODO_hook_architecture.md | 1710 | ### Step 4: Update ArchiveResult.run() (Phase 6) | STRING |
| LOW⚡ | old/TODO_hook_architecture.md | 1718 | ### Step 5: Add finalization helpers (Phase 7) | STRING |
| LOW⚡ | old/TODO_hook_architecture.md | 1723 | ### Step 6: Update SnapshotMachine.is_finished() (Phase 7) | STRING |
| LOW⚡ | old/TODO_hook_architecture.md | 1727 | ### Step 7: Rename background hooks (Phase 7) | STRING |
| LOW⚡ | old/TODO_hook_architecture.md | 1730 | ### Step 8: Test | STRING |
| LOW | old/TODO_Process_cleanup_unification.md | 192 | ### Step 1: Update Process.launch() (DONE - already exists) | COMMENT |
| LOW | old/TODO_Process_cleanup_unification.md | 195 | ### Step 2: Refactor run_hook() to use Process.launch() | COMMENT |
| LOW | old/TODO_Process_cleanup_unification.md | 234 | ### Step 3: Update SnapshotWorker to use Process methods | COMMENT |
| LOW | old/TODO_Process_cleanup_unification.md | 239 | ### Step 4: Update ArchiveResult.run() to use new run_hook() | COMMENT |
| LOW | old/TODO_Process_cleanup_unification.md | 263 | ### Step 5: Update Crawl.run() similarly | COMMENT |
| LOW⚡ | archivebox/machine/models.py | 2254 | # Step 1: Send SIGTERM for graceful shutdown | COMMENT |
| LOW⚡ | archivebox/machine/models.py | 2257 | # Step 2: Wait for graceful exit | COMMENT |
| LOW | archivebox/machine/models.py | 2270 | # Step 3: Force kill with SIGKILL | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker-compose.yml | 1 | # Usage: | COMMENT |
| LOW | docker-compose.yml | 41 | COMMENT | |
| LOW | docker-compose.yml | 61 | # or remote control it to set up a chrome profile w/ login credentials for sites you want to archive. | COMMENT |
| LOW | docker-compose.yml | 81 | COMMENT | |
| LOW | docker-compose.yml | 101 | # volumes: | COMMENT |
| LOW | docker-compose.yml | 121 | # driver_opts: | COMMENT |
| LOW | bin/export_browser_history.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | bin/docker_entrypoint.sh | 1 | #!/bin/bash | COMMENT |
| LOW | old/archivebox.ts | 81 | // 'https://browserleaks.com/canvas', | COMMENT |
| LOW | old/archivebox.ts | 101 | // 'https://docker-compose.archivebox.io', | COMMENT |
| LOW | old/archivebox.ts | 121 | // 'https://facebook.com/815781663692514/?comment_id=924451748966499', | COMMENT |
| LOW | old/archivebox.ts | 221 | isLandscape: false, | COMMENT |
| LOW | old/archivebox.ts | 261 | // { | COMMENT |
| LOW | old/archivebox.ts | 321 | // if (snap_id.startsWith('.')) continue | COMMENT |
| LOW | old/archivebox.ts | 341 | // if (fs.existsSync(dest_path)) { | COMMENT |
| LOW | old/archivebox.ts | 361 | COMMENT | |
| LOW | old/archivebox.ts | 481 | {webstore_id: 'ifibfemgeogfhoebkmokieepdoobkbpo', name: 'twocaptcha'}, // https://2captcha.com/blog/ | COMMENT |
| LOW | old/archivebox.ts | 661 | '--autoplay-policy=no-user-gesture-required', // auto-start videos so they trigger network requests + show up i | COMMENT |
| LOW | old/archivebox.ts | 1761 | if (snapshot_entry.sha256 == version_entry.sha256) { | COMMENT |
| LOW | old/archivebox.ts | 1781 | // mv ./data/archive/<snap_id>/example.txt -> ./data/archive/<snap_id>/versions/<version_id>/example.txt | COMMENT |
| LOW | old/archivebox.ts | 2101 | // ffmpeg_Path: '<path of ffmpeg_path>' || null, | COMMENT |
| LOW | old/archivebox.ts | 2421 | // await page.setCookie(...cookies) | COMMENT |
| LOW | old/archivebox.ts | 3121 | const recorder = page_state.recorder | COMMENT |
| LOW | old/archivebox.ts | 3241 | // const screenshot_jpg = SCREENSHOT_JPG_PATH(page) | COMMENT |
| LOW | old/archivebox.ts | 3261 | // cropped_bytes[idx + 1] = this.data[idx + 1]; | COMMENT |
| LOW | old/archivebox.ts | 3501 | // spawn( | COMMENT |
| LOW | old/archivebox.ts | 4541 | COMMENT | |
| LOW | old/archivebox.ts | 5341 | COMMENT | |
| LOW | old/archivebox.ts | 5361 | // mimeType: 'inode/directory' | COMMENT |
| LOW | old/archivebox.ts | 5461 | // { | COMMENT |
| LOW | old/archivebox.ts | 5501 | // example: detectFilename({url: 'https://example.com/favicon.png', extension: 'ico'}) outputs 'favicon.ico' | COMMENT |
| LOW | old/archivebox.ts | 6041 | COMMENT | |
| LOW | old/archivebox.ts | 6061 | // video: true, | COMMENT |
| LOW | docs/.readthedocs.yaml | 1 | # Read the Docs configuration file for ArchiveBox docs | COMMENT |
| LOW | archivebox/misc/hashing.py | 241 | # "mime_type": "inode/directory", | COMMENT |
| LOW | archivebox/core/models.py | 4121 | # missing delete_at values from fresh Snapshot/Crawl config when the | COMMENT |
| LOW | archivebox/core/settings.py | 301 | # "OPTIONS": { | COMMENT |
| LOW | archivebox/core/settings.py | 381 | SECURE_CONTENT_TYPE_NOSNIFF = True | COMMENT |
| LOW | archivebox/machine/detect.py | 81 | hw_product += " " + line.split(":", 1)[-1].strip() | COMMENT |
| LOW | archivebox/machine/detect.py | 321 | # 'os_arch': 'arm64', | COMMENT |
| LOW | archivebox/machine/detect.py | 341 | # 'cpu_boot_time': '2024-09-24T21:20:16', | COMMENT |
| LOW | archivebox/templates/admin/base.html | 281 | font-size: 13px; | COMMENT |
| LOW | archivebox/templates/static/setup_wizard.css | 1 | #archivebox-setup-wizard { position:fixed; inset:0; z-index:2147483647; display:flex; align-items:center; justify-conten | COMMENT |
| LOW | archivebox/templates/static/setup_wizard.css | 21 | #archivebox-setup-wizard .abx-url-comparison { display:grid; gap:4px; margin-top:10px; padding:10px 12px; border-radius: | COMMENT |
| LOW | archivebox/templates/static/setup_wizard.css | 41 | #archivebox-setup-wizard .abx-check input { width:18px; height:18px; margin-top:2px; } | COMMENT |
| LOW | archivebox/templates/static/setup_wizard.css | 61 | #archivebox-setup-wizard code { padding:1px 4px; border-radius:4px; background:#eef2f7; color:#334155; } | COMMENT |
| LOW | archivebox/base_models/admin.py | 921 | path("<hexuuid:object_id>/change/", self.admin_site.admin_view(self.change_view), name="{}_{}_change".format | COMMENT |
| LOW | archivebox/services/runner.py | 2301 | if daemon: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | archivebox/misc/logging_util.py | 351 | # Create a Rich Text object for proper formatting | COMMENT |
| MEDIUM | archivebox/core/templatetags/core_tags.py | 724 | # Create a mini template and render it with context | STRING |
| MEDIUM | archivebox/config/collection.py | 20 | "# This file is kept in sync 1:1 with Machine.config in the index DB —\n" | CODE |
| MEDIUM | archivebox/plugins/hooks.py | 457 | # Create a failed Process record for exceptions | COMMENT |
| MEDIUM⚡ | archivebox/tests/test_cli_status.py | 100 | # Create an orphaned directory | COMMENT |
| MEDIUM | archivebox/tests/test_cli_crawl.py | 242 | # Create a crawl | COMMENT |
| MEDIUM | archivebox/tests/migrations_helpers.py | 762 | # Create a user | COMMENT |
| MEDIUM | archivebox/tests/migrations_helpers.py | 933 | # Create a user | COMMENT |
| MEDIUM | archivebox/tests/test_cli_archiveresult.py | 34 | # Create a snapshot first | COMMENT |
| MEDIUM | archivebox/cli/archivebox_update.py | 673 | # Create a new crawl (created_by will default to system user) | COMMENT |
| MEDIUM | archivebox/cli/archivebox_persona.py | 15 | # Create a new persona | STRING |
| MEDIUM | archivebox/machine/models.py | 799 | # Create the derived convenience bin dir if it doesn't exist. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/Web-Archiving-Community.md | 218 | - [ReadableWebProxy](https://github.com/fake-name/ReadableWebProxy) A proxying archiver that downloads content from site | CODE |
| LOW | archivebox/core/admin_tags.py | 45 | "placeholder": "research, receipts, product-design...", | CODE |
| LOW | archivebox/core/forms.py | 103 | "placeholder": ( | CODE |
| LOW | archivebox/core/forms.py | 135 | "placeholder": "0 = unlimited", | CODE |
| LOW | archivebox/core/forms.py | 145 | "placeholder": "0 = unlimited, or e.g. 45mb / 1gb", | CODE |
| LOW | archivebox/core/forms.py | 157 | "placeholder": "0, 300, 1.5m, or 1hr", | CODE |
| LOW⚡ | archivebox/core/forms.py | 168 | "placeholder": "60, 1.5m, or 1hr", | CODE |
| LOW⚡ | archivebox/core/forms.py | 178 | "placeholder": "0 = unlimited, or e.g. 45mb / 1gb", | CODE |
| LOW⚡ | archivebox/core/forms.py | 188 | "placeholder": "0 = keep forever, or e.g. 1d / 6mo", | CODE |
| LOW | archivebox/core/forms.py | 209 | "placeholder": "Optional notes about this crawl", | CODE |
| LOW | archivebox/core/forms.py | 270 | "placeholder": "e.g., daily, weekly, 0 */6 * * * (every 6 hours)", | CODE |
| LOW | archivebox/tests/test_cli_manage.py | 69 | "admin@example.com", | CODE |
| LOW | archivebox/tests/test_server_security_browser.py | 402 | defaults={"email": "admin@example.com", "is_staff": True, "is_superuser": True}, | CODE |
| LOW | archivebox/tests/migrations_helpers.py | 767 | 'admin@example.com', 1, 1, datetime('now')) | CODE |
| LOW | archivebox/tests/migrations_helpers.py | 938 | 'admin@example.com', 1, 1, datetime('now')) | CODE |
| LOW | archivebox/tests/test_ui_add_view.py | 43 | placeholder = form.fields["url"].widget.attrs["placeholder"] | CODE |
| LOW | archivebox/tests/test_urls.py | 229 | defaults={"email": "admin@example.com", "is_staff": True, "is_superuser": True}, | STRING |
| LOW | archivebox/crawls/admin.py | 403 | "placeholder": "https://example.com\nhttps://example2.com\n# Comments start with #", | CODE |
| LOW | archivebox/personas/forms.py | 65 | "placeholder": "/Users/alice/Library/Application Support/Google/Chrome or http://127.0.0.1:9222 or w | CODE |
| LOW | archivebox/personas/forms.py | 76 | "placeholder": "Default or Profile 1", | CODE |
| LOW | …onitor/templates/progressmonitor/progress_monitor.html | 1108 | preview.classList.add('placeholder'); | CODE |
| LOW | …onitor/templates/progressmonitor/progress_monitor.html | 1189 | type: 'placeholder', | CODE |
| LOW | …onitor/templates/progressmonitor/progress_monitor.html | 1210 | type: 'placeholder', | CODE |
| LOW | …onitor/templates/progressmonitor/progress_monitor.html | 1222 | type: 'placeholder', | CODE |
| LOW | …onitor/templates/progressmonitor/progress_monitor.html | 1261 | type: 'placeholder', | CODE |
| LOW | …onitor/templates/progressmonitor/progress_monitor.html | 1268 | if (target.type === 'placeholder') { | CODE |
| LOW | …onitor/templates/progressmonitor/progress_monitor.html | 1282 | if (screencastPanel.dataset.mode === 'placeholder' && screencastPanel.dataset.key === placeholderKey) { | CODE |
| LOW | …onitor/templates/progressmonitor/progress_monitor.html | 1285 | screencastPanel.dataset.mode = 'placeholder'; | CODE |
| LOW | archivebox/templates/static/select2.min.js | 2 | !function(n){"function"==typeof define&&define.amd?define(["jquery"],n):"object"==typeof module&&module.exports?module.e | CODE |
| LOW | archivebox/templates/static/jquery.dataTables.min.js | 41 | g):j+g,b=h("<div/>",{id:!f.f?c+"_filter":null,"class":b.sFilter}).append(h("<label/>").append(j)),f=function(){var b=!th | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | bin/docker_entrypoint.sh | 80 | # Check if user attempted to run it in the root of their home folder or hard drive (common mistake) | COMMENT |
| LOW | archivebox/core/models.py | 3025 | # Check if any ARs are still pending/started | COMMENT |
| LOW | archivebox/core/models.py | 3075 | # Check if sealed | COMMENT |
| LOW | archivebox/plugins/hooks.py | 227 | # Check if this is a plugin directory (not the root plugins dir) | COMMENT |
| LOW | archivebox/plugins/hooks.py | 593 | # Check if discovered snapshot exceeds crawl max_depth | COMMENT |
| LOW | archivebox/crawls/models.py | 473 | # Check if crawl already exists by ID | COMMENT |
| LOW | archivebox/crawls/models.py | 946 | # Check if already in urls (parse existing JSONL entries) | COMMENT |
| LOW | archivebox/crawls/models.py | 1467 | # Check if any snapshots exist for this crawl | COMMENT |
| LOW | archivebox/crawls/models.py | 1630 | # Set retry_at to near future so tick() can poll and check is_finished() | COMMENT |
| LOW | archivebox/cli/archivebox_update.py | 689 | # Check if needs migration (0.8.x → 0.9.x) | COMMENT |
| LOW | archivebox/cli/archivebox_extract.py | 379 | # Output results as JSONL (when piped) or human-readable (when TTY) | COMMENT |
| LOW | archivebox/cli/archivebox_extract.py | 431 | # Check if input looks like existing ArchiveResult IDs to process | COMMENT |
| LOW | archivebox/cli/archivebox_version.py | 144 | # Check if LDAP is enabled (simple config lookup) | COMMENT |
| LOW⚡ | archivebox/cli/archivebox_persona.py | 206 | # Check if resolved_path is a child of personas_dir | COMMENT |
| LOW | archivebox/progressmonitor/views.py | 831 | # Check if crawl can start (for debugging stuck crawls) | COMMENT |
| LOW | archivebox/progressmonitor/views.py | 847 | # Check if retry_at is in the future (would prevent worker from claiming) | COMMENT |
| LOW | archivebox/machine/models.py | 824 | # Check if it's already pointing to the right place | COMMENT |
| LOW | archivebox/machine/models.py | 1628 | # Check if too old (PID definitely reused) | COMMENT |
| LOW | archivebox/machine/models.py | 1632 | # Check if OS process still exists with matching start time | COMMENT |
| LOW | archivebox/machine/models.py | 2350 | # Check if process exited | COMMENT |
| LOW | archivebox/machine/models.py | 2654 | # Check if installation succeeded by looking at updated status | COMMENT |
| LOW | archivebox/workers/supervisord_util.py | 1263 | # Check if the monitored process has exited | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | old/TODO_process_tracking.md | 711 | Wait for process to exit, polling periodically. Args: timeout: Max seconds to wait (None = | STRING |
| HIGH | archivebox/plugins/hooks.py | 89 | Check if a hook is a background hook (doesn't block foreground progression). Background hooks have '.bg.' in t | STRING |
| HIGH | archivebox/plugins/hooks.py | 152 | Find all hook scripts for an event family. Searches both built-in and user plugin directories. Filters out | STRING |
| HIGH | archivebox/machine/models.py | 2197 | Wait for process to exit, polling periodically. Args: timeout: Max seconds to wait (None = | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | archivebox/uuid_compat.py | 48 | __all__ = ["CompactUUID", "CompactUUIDField", "compact_uuid", "uuid7"] | CODE |
| LOW⚡ | archivebox/misc/serve_static.py | 588 | def _set_transformed_response_headers(response, fullpath: Path, statobj: os.stat_result, encoding: str | None, config) - | CODE |
| LOW | archivebox/core/models.py | 4833 | def _set_binary_from_cmd(self, cmd: list) -> None: | CODE |
| LOW | archivebox/core/settings.py | 29 | logger = logging.getLogger(__name__) | CODE |
| LOW | archivebox/tests/conftest.py | 81 | def _set_test_source_pythonpath(env: dict[str, str]) -> None: | CODE |
| LOW | archivebox/tests/test_opencode_agent.py | 33 | def _set_archivebox_config(data_dir: Path, *values: str, env: dict[str, str] | None = None) -> None: | CODE |
| LOW | archivebox/tests/test_crawl_runner.py | 641 | async def update_config_between_snapshots(event: SnapshotCompletedEvent) -> None: | CODE |
| LOW | archivebox/tests/test_urls.py | 316 | def _setup_data_dir(self, real_archive_with_example: Path) -> None: | CODE |
| LOW | archivebox/tests/test_urls.py | 339 | def _set_config(self, *settings: str) -> None: | CODE |
| LOW | archivebox/crawls/models.py | 640 | def set_url_filters(self, allowlist, denylist) -> None: | CODE |
| LOW⚡ | archivebox/cli/__init__.py | 93 | def _setup_django_for_lazy_import(cls, cmd_name: str) -> None: | CODE |
| LOW | archivebox/api/webhooks.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | archivebox/workers/models.py | 41 | logger = logging.getLogger(__name__) | CODE |
| LOW | archivebox/services/__init__.py | 10 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | bin/fuzz_test.sh | 4 | # This is intentionally not a test harness: it does not assert success/failure. | COMMENT |
| LOW | archivebox/misc/util.py | 460 | # if response is non-test (e.g. image or other binary files), just return the filename instead | COMMENT |
| MEDIUM | archivebox/core/models.py | 4619 | # these properties provide seamless access to Process data through ArchiveResult | COMMENT |
| LOW | archivebox/core/views.py | 1515 | # We can't just call request.build_absolute_uri in the template, because it would include query parameters | COMMENT |
| LOW | archivebox/cli/archivebox_archiveresult.py | 115 | # If no id, we could create it, but for now just pass through | COMMENT |
| LOW | archivebox/cli/archivebox_crawl.py | 94 | # Handle existing Crawl records (just pass through with id) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | archivebox/core/models.py | 3482 | CODE | |
| LOW | archivebox/core/tag_util.py | 268 | CODE | |
| LOW | archivebox/config/common.py | 1062 | CODE | |
| LOW | archivebox/tests/conftest.py | 201 | CODE | |
| LOW | archivebox/tests/test_cli_status.py | 24 | CODE | |
| LOW | archivebox/cli/archivebox_schedule.py | 12 | CODE | |
| LOW | archivebox/cli/archivebox_update.py | 182 | CODE | |
| LOW | archivebox/cli/archivebox_remove.py | 29 | CODE | |
| LOW | archivebox/cli/archivebox_add.py | 54 | CODE | |
| LOW | archivebox/workers/supervisord_util.py | 1442 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | old/TODO_hook_statemachine_cleanup.md | 74 | # 1. State Machine orchestrates transitions | COMMENT |
| MEDIUM | docs/Setting-up-Search.md | 225 | - [#1139 Feature Request: Add AI-assisted summarization, tagging, search, and more using LLMs / RAG](https://github.com/ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker-compose.yml | 1 | # Usage: | COMMENT |
| LOW | bin/export_browser_history.sh | 4 | # Usage: | COMMENT |
| LOW | archivebox/machine/detect.py | 307 | # Example usage | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | archivebox/machine/models.py | 2254 | # Step 1: Send SIGTERM for graceful shutdown | COMMENT |
| LOW⚡ | archivebox/machine/models.py | 2257 | # Step 2: Wait for graceful exit | COMMENT |
| LOW | archivebox/machine/models.py | 2270 | # Step 3: Force kill with SIGKILL | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pyproject.toml | 96 | # to use sonic make sure you have a sonic server running in docker (archivebox/sonic) or locally: | COMMENT |
| LOW | archivebox/core/admin_snapshots.py | 1479 | f"Successfully deleted {total} Snapshots ({deleted_count} total objects including related records). Don' | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | archivebox/mcp/server.py | 502 | def handle_request(self, request: dict) -> dict | None: | CODE |