:bookmark: Personal mini-web in text
This report presents the forensic synthetic code analysis of jarun/buku, a Python project with 7,187 GitHub stars. SynthScan v2.0 examined 41,381 lines of code across 108 source files, recording 216 pattern matches distributed across 12 syntactic categories. The overall adjusted score of 4.9 places this repository in the Likely human-written 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).
Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.
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 216 distinct pattern matches across 12 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 | buku.py | 1739 | def search_keywords_and_filter_by_tags( | CODE |
| LOW | buku.py | 1784 | def exclude_results_from_search(self, search_results, without, deep=False, markers=False): | CODE |
| LOW⚡ | buku.py | 3440 | def convert_tags_to_org_mode_tags(tags: str) -> str: | STRING |
| LOW | buku.py | 3569 | def get_firefox_profile_names(path): | STRING |
| LOW | buku.py | 5759 | def monkeypatch_textwrap_for_cjk(): | STRING |
| LOW | bukuserver/views.py | 333 | def scaffold_sortable_columns(self): | CODE |
| LOW | bukuserver/views.py | 493 | def scaffold_sortable_columns(self): | CODE |
| LOW | bukuserver/static/bukuserver/js/Chart.js | 2036 | function computeFlexCategoryTraits(index, ruler, options) { | CODE |
| LOW | bukuserver/static/bukuserver/js/Chart.js | 12150 | function createNewTitleBlockAndAttach(chart, titleOpts) { | CODE |
| LOW | bukuserver/static/bukuserver/js/Chart.js | 13297 | function adjustPointPositionForLabelHeight(angle, textSize, position) { | CODE |
| LOW | bukuserver/static/bukuserver/js/Chart.js | 13857 | function determineUnitForAutoTicks(minUnit, min, max, capacity) { | CODE |
| LOW | bukuserver/static/bukuserver/js/Chart.js | 13876 | function determineUnitForFormatting(ticks, minUnit, min, max) { | CODE |
| LOW | tests/test_bukuDb.py | 264 | def test_append_tag_at_all_indices(self): | CODE |
| LOW | tests/test_bukuDb.py | 308 | def test_search_keywords_and_filter_by_tags(self): | CODE |
| LOW | tests/test_bukuDb.py | 400 | def test_search_by_multiple_tags_search_any(self): | CODE |
| LOW | tests/test_bukuDb.py | 451 | def test_search_by_multiple_tags_search_all(self): | CODE |
| LOW | tests/test_bukuDb.py | 482 | def test_search_by_tags_enforces_space_seprations_search_all(self): | CODE |
| LOW | tests/test_bukuDb.py | 540 | def test_search_by_tags_exclusion(self): | CODE |
| LOW | tests/test_bukuDb.py | 581 | def test_search_by_tags_enforces_space_seprations_exclusion(self): | CODE |
| LOW | tests/test_bukuDb.py | 639 | def test_search_and_open_in_browser_by_range(self): | CODE |
| LOW | tests/test_bukuDb.py | 669 | def test_search_and_open_all_in_browser(self): | CODE |
| LOW | tests/test_bukuDb.py | 1296 | def test_delete_rec_range_and_delay_commit( | CODE |
| LOW | tests/test_bukuDb.py | 1329 | def test_delete_rec_index_and_delay_commit(bukuDb, index, delay_commit, input_retval): | CODE |
| LOW | tests/test_bukuDb.py | 1375 | def test_delete_rec_on_empty_database(bukuDb, index, is_range, low, high): | CODE |
| LOW | tests/test_bukuDb.py | 1404 | def test_delete_rec_on_non_integer( | CODE |
| LOW | tests/test_bukuDb.py | 1430 | def test_add_rec_add_invalid_url(bukuDb, caplog, url): | CODE |
| LOW | tests/test_bukuDb.py | 1511 | def test_update_rec_invalid_tag(bukuDb, caplog, invalid_tag): | CODE |
| LOW | tests/test_bukuDb.py | 1529 | def test_update_rec_update_all_bookmark( | CODE |
| LOW | tests/test_bukuDb.py | 1546 | def test_edit_update_rec_with_invalid_input(bukuDb, get_system_editor_retval, index, exp_res): | CODE |
| LOW | tests/test_bukuDb.py | 1607 | def test_load_chrome_database(bukuDb, chrome_db, add_pt): | CODE |
| LOW | tests/test_bukuDb.py | 1649 | def test_load_firefox_database(bukuDb, firefox_db, add_pt): | CODE |
| LOW | tests/test_bukuDb.py | 1860 | def test_search_keywords_and_filter_by_tags(bukuDb, keyword_results, stag_results, exp_res): | CODE |
| LOW | tests/test_bukuDb.py | 1872 | def test_exclude_results_from_search(bukuDb, search_results, exclude_results, exp_res): | CODE |
| LOW | tests/test_bukuDb.py | 1960 | def split_and_test_membership(a, b): | CODE |
| LOW | tests/test_views.py | 92 | def test_tag_model_view_get_list_empty_db(tmv_instance): | CODE |
| LOW | tests/test_views.py | 107 | def test_tag_model_view_get_list(tmv_instance, sort_field, sort_desc, filters, exp_res): | CODE |
| LOW⚡ | tests/test_views.py | 316 | def test_env_entry_render_params(bukudb, app, client, mode, favicons, new_tab): | CODE |
| LOW⚡ | tests/test_views.py | 325 | def test_env_entry_render_params_blanks(bukudb, app, client, mode, url, netloc, title): | CODE |
| LOW⚡ | tests/test_views.py | 328 | def _test_env_entry_render_params(bukudb, app, client, mode, favicons, new_tab, url, netloc, title): | CODE |
| LOW | tests/test_views.py | 387 | def test_env_reverse_proxy_path(proxy_path, client): | CODE |
| LOW | tests/test_requirements.py | 25 | def test_bukuserver_requirement(pyproject: dict[str, Any]): | CODE |
| LOW | tests/test_import_firefox_json.py | 97 | def test_load_invalid_typecode(): | CODE |
| LOW | tests/test_import_firefox_json.py | 124 | def test_load_folder_with_no_children(): | CODE |
| LOW | tests/test_import_firefox_json.py | 185 | def test_load_one_container_child(): | STRING |
| LOW | tests/test_import_firefox_json.py | 246 | def test_load_container_no_title(): | STRING |
| LOW | tests/test_import_firefox_json.py | 276 | def test_load_hierarchical_container_without_ignore(): | STRING |
| LOW | tests/test_import_firefox_json.py | 307 | def test_load_hierarchical_container_with_ignore(): | STRING |
| LOW | tests/test_buku.py | 19 | def check_import_html_results_contains(result, expected_result): | CODE |
| LOW | tests/test_buku.py | 192 | def test_print_rec_with_filter(capfd, field_filter, exp_res): | CODE |
| LOW | tests/test_buku.py | 315 | def test_check_upstream_release(status_code, latest_release): | CODE |
| LOW | tests/test_buku.py | 372 | def test_sigint_handler_with_mock(): | CODE |
| LOW | tests/test_buku.py | 415 | def test_to_temp_file_content(url, title_in, tags_in, desc): | CODE |
| LOW | tests/test_buku.py | 463 | def test_parse_temp_file_content(content, exp_res): | CODE |
| LOW | tests/test_buku.py | 734 | def test_import_html_and_add_parent(): | CODE |
| LOW | tests/test_buku.py | 795 | def test_import_html_and_add_all_parent(add_all_parent, exp_res): | CODE |
| LOW | tests/test_buku.py | 829 | def test_import_html_and_new_tag(): | STRING |
| LOW | tests/test_buku.py | 904 | def test_get_firefox_profile_names(_os_path_exists, profiles, expected): | STRING |
| LOW | tests/test_buku.py | 923 | def test_get_firefox_db_paths(profiles, specified, expected): | STRING |
| LOW | tests/test_buku.py | 1041 | def test_convert_bookmark_set(export_type, exp_res, monkeypatch): | STRING |
| LOW | tests/test_buku.py | 1076 | def test_convert_tags_to_org_mode_tags(tags, data): | STRING |
| 2 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | buku.py | 242 | def __init__(self, iterations=8, dbfile=None, encfile=None, password=None, repla | CODE |
| MEDIUM | buku.py | 3814 | def extract_desc(entry): | CODE |
| LOW | buku.py | 285 | except Exception as e: | CODE |
| LOW | buku.py | 311 | except Exception as e: | CODE |
| LOW | buku.py | 543 | except Exception as e: | CODE |
| LOW | buku.py | 581 | except Exception as e: | CODE |
| LOW | buku.py | 886 | except Exception as e: | CODE |
| LOW | buku.py | 2122 | except Exception as e: | CODE |
| LOW | buku.py | 2370 | except Exception as e: | CODE |
| LOW | buku.py | 2546 | except Exception as e: | CODE |
| LOW | buku.py | 2859 | except Exception as e: | CODE |
| LOW | buku.py | 2961 | except Exception as e: | CODE |
| LOW | buku.py | 2978 | except Exception as e: | CODE |
| LOW | buku.py | 2991 | except Exception as e: | CODE |
| LOW | buku.py | 3056 | except Exception as e: | CODE |
| LOW | buku.py | 3066 | except Exception as e: | CODE |
| LOW | buku.py | 3093 | except Exception as e: | CODE |
| LOW | buku.py | 3150 | except Exception as e: | CODE |
| LOW | buku.py | 3165 | except Exception: | CODE |
| LOW | buku.py | 3217 | except Exception: | CODE |
| LOW | buku.py | 3262 | except Exception: | CODE |
| LOW | buku.py | 3279 | except Exception: | CODE |
| LOW | buku.py | 6184 | except Exception: | CODE |
| LOW | buku.py | 6260 | except Exception: | CODE |
| LOW | buku.py | 6387 | except Exception: | CODE |
| LOW | buku.py | 6526 | except Exception as e: | CODE |
| LOW | buku.py | 3809 | except Exception: | STRING |
| LOW | buku.py | 3821 | except Exception: | STRING |
| LOW | buku.py | 3829 | except Exception: | STRING |
| LOW | buku.py | 3840 | except Exception: | STRING |
| LOW | buku.py | 3871 | except Exception as e: | STRING |
| LOW | buku.py | 4063 | except Exception as e: | STRING |
| LOW | buku.py | 4202 | except Exception as e: | STRING |
| LOW | buku.py | 4218 | except Exception as e: | STRING |
| LOW | buku.py | 4236 | except Exception as e: | STRING |
| LOW | buku.py | 4276 | except Exception as e: | STRING |
| LOW | buku.py | 4307 | except Exception as e: | STRING |
| LOW | buku.py | 4428 | except Exception as e: | STRING |
| LOW | buku.py | 4671 | except Exception as e: | STRING |
| LOW | buku.py | 4828 | except Exception: | STRING |
| LOW | buku.py | 4903 | except Exception: | STRING |
| LOW | buku.py | 5129 | except Exception as e: | STRING |
| LOW | buku.py | 5205 | except Exception: | STRING |
| LOW | buku.py | 5270 | except Exception as e: | STRING |
| LOW | buku.py | 5309 | except Exception as e: | STRING |
| LOW | bukuserver/server.py | 43 | except Exception as e: | CODE |
| LOW | bukuserver/__init__.py | 15 | except Exception: | CODE |
| LOW | bukuserver/api.py | 103 | except Exception as e: | CODE |
| LOW | bukuserver/api.py | 138 | except Exception as e: | CODE |
| MEDIUM | bukuserver/api.py | 127 | def reorder_bookmarks(): | CODE |
| LOW | bukuserver/views.py | 239 | except Exception as ex: | CODE |
| LOW | bukuserver/views.py | 252 | except Exception as ex: | CODE |
| LOW | bukuserver/views.py | 431 | except Exception as ex: | CODE |
| LOW | bukuserver/views.py | 578 | except Exception as ex: | CODE |
| LOW | bukuserver/views.py | 596 | except Exception as ex: | CODE |
| MEDIUM | bukuserver/views.py | 223 | def create_model(self, form): | CODE |
| MEDIUM | bukuserver/views.py | 248 | def delete_model(self, model): | CODE |
| MEDIUM | bukuserver/views.py | 587 | def update_model(self, form, model): | CODE |
| LOW | tests/test_buku.py | 45 | except Exception as e: | CODE |
| LOW | tests/test_buku.py | 1121 | except Exception as e: | STRING |
| 4 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | buku.py | 5994 | # ------------------------ | COMMENT |
| MEDIUM⚡ | buku.py | 5996 | # ------------------------ | COMMENT |
| MEDIUM⚡ | buku.py | 6006 | # ---------------- | COMMENT |
| MEDIUM⚡ | buku.py | 6008 | # ---------------- | COMMENT |
| MEDIUM | buku.py | 5889 | # --------------------- | COMMENT |
| MEDIUM | buku.py | 5891 | # --------------------- | COMMENT |
| MEDIUM | buku.py | 5926 | # ------------------ | COMMENT |
| MEDIUM | buku.py | 5928 | # ------------------ | COMMENT |
| MEDIUM | buku.py | 5953 | # -------------------- | COMMENT |
| MEDIUM | buku.py | 5955 | # -------------------- | COMMENT |
| MEDIUM⚡ | buku.py | 3432 | # ---------------- | STRING |
| MEDIUM⚡ | buku.py | 3434 | # ---------------- | STRING |
| MEDIUM | buku.py | 5428 | # --------------------- | STRING |
| MEDIUM | buku.py | 5430 | # --------------------- | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | buku.py | 3452 | CODE | |
| LOW | buku.py | 3569 | CODE | |
| LOW | buku.py | 3644 | CODE | |
| LOW | buku.py | 3704 | CODE | |
| LOW | buku.py | 3769 | CODE | |
| LOW | buku.py | 3901 | CODE | |
| LOW | buku.py | 3985 | CODE | |
| LOW | buku.py | 4178 | CODE | |
| LOW | buku.py | 4358 | CODE | |
| LOW | buku.py | 4625 | CODE | |
| LOW | buku.py | 4945 | CODE | |
| LOW | buku.py | 5635 | CODE | |
| LOW | buku.py | 5798 | CODE | |
| LOW | buku.py | 5842 | CODE | |
| LOW | buku.py | 513 | CODE | |
| LOW | buku.py | 776 | CODE | |
| LOW | buku.py | 890 | CODE | |
| LOW | buku.py | 941 | CODE | |
| LOW | buku.py | 1018 | CODE | |
| LOW | buku.py | 1234 | CODE | |
| LOW | buku.py | 1527 | CODE | |
| LOW | buku.py | 1589 | CODE | |
| LOW | buku.py | 1612 | CODE | |
| LOW | buku.py | 1882 | CODE | |
| LOW | buku.py | 2151 | CODE | |
| LOW | buku.py | 2284 | CODE | |
| LOW | buku.py | 2424 | CODE | |
| LOW | buku.py | 2457 | CODE | |
| LOW | buku.py | 2552 | CODE | |
| LOW | buku.py | 2620 | CODE | |
| LOW | buku.py | 2728 | CODE | |
| LOW | buku.py | 2798 | CODE | |
| LOW | buku.py | 2890 | CODE | |
| LOW | buku.py | 3000 | CODE | |
| LOW | buku.py | 3834 | CODE | |
| LOW | buku.py | 5644 | CODE | |
| LOW | buku.py | 1345 | CODE | |
| LOW | buku.py | 5645 | CODE | |
| LOW | bukuserver/api.py | 259 | CODE | |
| LOW | bukuserver/filters.py | 108 | CODE | |
| LOW | bukuserver/filters.py | 194 | CODE | |
| LOW | bukuserver/views.py | 341 | CODE | |
| LOW | bukuserver/translations/__init__.py | 52 | CODE | |
| LOW | tests/test_bukuDb.py | 1329 | CODE | |
| LOW | tests/test_bukuDb.py | 1562 | CODE | |
| LOW | tests/test_bukuDb.py | 725 | CODE | |
| LOW | tests/test_cli.py | 185 | CODE | |
| LOW | tests/test_cli.py | 221 | CODE | |
| LOW | bukuserver-runner/buku-server.py | 136 | CODE | |
| LOW | bukuserver-runner/buku-server.py | 148 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | buku.py | 152 | # Define the default path to ca-certificates | COMMENT |
| MEDIUM | buku.py | 563 | # Create a connection | COMMENT |
| MEDIUM | docs/source/conf.py | 7 | # This file is execfile()d with the current directory set to its | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | buku.py | 1 | #!/usr/bin/env python3 | COMMENT |
| LOW | .readthedocs.yaml | 21 | COMMENT | |
| LOW | packagecore.yaml | 1 | name: buku-cli | COMMENT |
| LOW | bukuserver/static/bukuserver/js/Chart.js | 6361 | // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays | COMMENT |
| LOW | bukuserver/static/bukuserver/js/Chart.js | 6381 | // |----------------------------------------------------| | COMMENT |
| LOW | bukuserver/static/bukuserver/js/Chart.js | 11401 | onHover: null, | COMMENT |
| LOW | docs/source/conf.py | 1 | #!/usr/bin/env python3 | COMMENT |
| LOW | docs/source/conf.py | 61 | # |version| and |release|, also used in various other places throughout the | COMMENT |
| LOW | docs/source/conf.py | 81 | # The name of the Pygments (syntax highlighting) style to use. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | buku.py | 19 | CODE | |
| LOW | bukuserver/__init__.py | 2 | CODE | |
| LOW | bukuserver/__init__.py | 4 | CODE | |
| LOW | bukuserver/middleware/__init__.py | 1 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | buku.py | 5700 | CODE | |
| LOW | buku.py | 776 | CODE | |
| LOW | buku.py | 1018 | CODE | |
| LOW | buku.py | 1234 | CODE | |
| LOW | tests/test_cli.py | 115 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | bukuserver/static/bukuserver/js/Chart.js | 6357 | // Essentially we now have any number of boxes on each of the 4 sides. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | bukuserver/__init__.py | 18 | __all__ = ['_', '_p', '_l', '_lp', '_key', 'gettext', 'pgettext', 'ngettext', 'lazy_gettext', 'lazy_pgettext', 'LazyStri | CODE |
| LOW | bukuserver/middleware/__init__.py | 3 | __all__ = ['ReverseProxyPrefixFix'] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | bukuserver/static/bukuserver/js/Chart.js | 6590 | // Step 7 - Position the boxes | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | bukuserver/forms.py | 33 | def process_data(self, value): | CODE |