Repository Analysis

jarun/buku

:bookmark: Personal mini-web in text

4.9 Likely human-written View on GitHub

Analysis Overview

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).

4.9
Adjusted Score
4.9
Raw Score
100%
Time Factor
2026-08-16
Last Push
7.2K
Stars
Python
Language
41.4K
Lines of Code
108
Files
216
Pattern Hits
2026-08-29
Scan Date
0.00
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

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.

No multi-scan history yet — run the scanner again to build trend data.

Severity Breakdown

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.

CRITICAL 0HIGH 0MEDIUM 26LOW 190

Directory Score Breakdown

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.

Pattern Findings

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.

Hyper-Verbose Identifiers62 hits · 55 pts
SeverityFileLineSnippetContext
LOWbuku.py1739 def search_keywords_and_filter_by_tags(CODE
LOWbuku.py1784 def exclude_results_from_search(self, search_results, without, deep=False, markers=False):CODE
LOWbuku.py3440def convert_tags_to_org_mode_tags(tags: str) -> str:STRING
LOWbuku.py3569def get_firefox_profile_names(path):STRING
LOWbuku.py5759def monkeypatch_textwrap_for_cjk():STRING
LOWbukuserver/views.py333 def scaffold_sortable_columns(self):CODE
LOWbukuserver/views.py493 def scaffold_sortable_columns(self):CODE
LOWbukuserver/static/bukuserver/js/Chart.js2036function computeFlexCategoryTraits(index, ruler, options) {CODE
LOWbukuserver/static/bukuserver/js/Chart.js12150function createNewTitleBlockAndAttach(chart, titleOpts) {CODE
LOWbukuserver/static/bukuserver/js/Chart.js13297 function adjustPointPositionForLabelHeight(angle, textSize, position) {CODE
LOWbukuserver/static/bukuserver/js/Chart.js13857function determineUnitForAutoTicks(minUnit, min, max, capacity) {CODE
LOWbukuserver/static/bukuserver/js/Chart.js13876function determineUnitForFormatting(ticks, minUnit, min, max) {CODE
LOWtests/test_bukuDb.py264 def test_append_tag_at_all_indices(self):CODE
LOWtests/test_bukuDb.py308 def test_search_keywords_and_filter_by_tags(self):CODE
LOWtests/test_bukuDb.py400 def test_search_by_multiple_tags_search_any(self):CODE
LOWtests/test_bukuDb.py451 def test_search_by_multiple_tags_search_all(self):CODE
LOWtests/test_bukuDb.py482 def test_search_by_tags_enforces_space_seprations_search_all(self):CODE
LOWtests/test_bukuDb.py540 def test_search_by_tags_exclusion(self):CODE
LOWtests/test_bukuDb.py581 def test_search_by_tags_enforces_space_seprations_exclusion(self):CODE
LOWtests/test_bukuDb.py639 def test_search_and_open_in_browser_by_range(self):CODE
LOWtests/test_bukuDb.py669 def test_search_and_open_all_in_browser(self):CODE
LOWtests/test_bukuDb.py1296def test_delete_rec_range_and_delay_commit(CODE
LOWtests/test_bukuDb.py1329def test_delete_rec_index_and_delay_commit(bukuDb, index, delay_commit, input_retval):CODE
LOWtests/test_bukuDb.py1375def test_delete_rec_on_empty_database(bukuDb, index, is_range, low, high):CODE
LOWtests/test_bukuDb.py1404def test_delete_rec_on_non_integer(CODE
LOWtests/test_bukuDb.py1430def test_add_rec_add_invalid_url(bukuDb, caplog, url):CODE
LOWtests/test_bukuDb.py1511def test_update_rec_invalid_tag(bukuDb, caplog, invalid_tag):CODE
LOWtests/test_bukuDb.py1529def test_update_rec_update_all_bookmark(CODE
LOWtests/test_bukuDb.py1546def test_edit_update_rec_with_invalid_input(bukuDb, get_system_editor_retval, index, exp_res):CODE
LOWtests/test_bukuDb.py1607def test_load_chrome_database(bukuDb, chrome_db, add_pt):CODE
LOWtests/test_bukuDb.py1649def test_load_firefox_database(bukuDb, firefox_db, add_pt):CODE
LOWtests/test_bukuDb.py1860def test_search_keywords_and_filter_by_tags(bukuDb, keyword_results, stag_results, exp_res):CODE
LOWtests/test_bukuDb.py1872def test_exclude_results_from_search(bukuDb, search_results, exclude_results, exp_res):CODE
LOWtests/test_bukuDb.py1960def split_and_test_membership(a, b):CODE
LOWtests/test_views.py92def test_tag_model_view_get_list_empty_db(tmv_instance):CODE
LOWtests/test_views.py107def test_tag_model_view_get_list(tmv_instance, sort_field, sort_desc, filters, exp_res):CODE
LOWtests/test_views.py316def test_env_entry_render_params(bukudb, app, client, mode, favicons, new_tab):CODE
LOWtests/test_views.py325def test_env_entry_render_params_blanks(bukudb, app, client, mode, url, netloc, title):CODE
LOWtests/test_views.py328def _test_env_entry_render_params(bukudb, app, client, mode, favicons, new_tab, url, netloc, title):CODE
LOWtests/test_views.py387def test_env_reverse_proxy_path(proxy_path, client):CODE
LOWtests/test_requirements.py25def test_bukuserver_requirement(pyproject: dict[str, Any]):CODE
LOWtests/test_import_firefox_json.py97def test_load_invalid_typecode():CODE
LOWtests/test_import_firefox_json.py124def test_load_folder_with_no_children():CODE
LOWtests/test_import_firefox_json.py185def test_load_one_container_child():STRING
LOWtests/test_import_firefox_json.py246def test_load_container_no_title():STRING
LOWtests/test_import_firefox_json.py276def test_load_hierarchical_container_without_ignore():STRING
LOWtests/test_import_firefox_json.py307def test_load_hierarchical_container_with_ignore():STRING
LOWtests/test_buku.py19def check_import_html_results_contains(result, expected_result):CODE
LOWtests/test_buku.py192def test_print_rec_with_filter(capfd, field_filter, exp_res):CODE
LOWtests/test_buku.py315def test_check_upstream_release(status_code, latest_release):CODE
LOWtests/test_buku.py372def test_sigint_handler_with_mock():CODE
LOWtests/test_buku.py415def test_to_temp_file_content(url, title_in, tags_in, desc):CODE
LOWtests/test_buku.py463def test_parse_temp_file_content(content, exp_res):CODE
LOWtests/test_buku.py734def test_import_html_and_add_parent():CODE
LOWtests/test_buku.py795def test_import_html_and_add_all_parent(add_all_parent, exp_res):CODE
LOWtests/test_buku.py829def test_import_html_and_new_tag():STRING
LOWtests/test_buku.py904def test_get_firefox_profile_names(_os_path_exists, profiles, expected):STRING
LOWtests/test_buku.py923def test_get_firefox_db_paths(profiles, specified, expected):STRING
LOWtests/test_buku.py1041def test_convert_bookmark_set(export_type, exp_res, monkeypatch):STRING
LOWtests/test_buku.py1076def test_convert_tags_to_org_mode_tags(tags, data):STRING
2 more matches not shown…
Excessive Try-Catch Wrapping64 hits · 47 pts
SeverityFileLineSnippetContext
MEDIUMbuku.py242def __init__(self, iterations=8, dbfile=None, encfile=None, password=None, replaCODE
MEDIUMbuku.py3814def extract_desc(entry):CODE
LOWbuku.py285 except Exception as e:CODE
LOWbuku.py311 except Exception as e:CODE
LOWbuku.py543 except Exception as e:CODE
LOWbuku.py581 except Exception as e:CODE
LOWbuku.py886 except Exception as e:CODE
LOWbuku.py2122 except Exception as e:CODE
LOWbuku.py2370 except Exception as e:CODE
LOWbuku.py2546 except Exception as e:CODE
LOWbuku.py2859 except Exception as e:CODE
LOWbuku.py2961 except Exception as e:CODE
LOWbuku.py2978 except Exception as e:CODE
LOWbuku.py2991 except Exception as e:CODE
LOWbuku.py3056 except Exception as e:CODE
LOWbuku.py3066 except Exception as e:CODE
LOWbuku.py3093 except Exception as e:CODE
LOWbuku.py3150 except Exception as e:CODE
LOWbuku.py3165 except Exception:CODE
LOWbuku.py3217 except Exception:CODE
LOWbuku.py3262 except Exception:CODE
LOWbuku.py3279 except Exception:CODE
LOWbuku.py6184 except Exception:CODE
LOWbuku.py6260 except Exception:CODE
LOWbuku.py6387 except Exception:CODE
LOWbuku.py6526 except Exception as e:CODE
LOWbuku.py3809 except Exception:STRING
LOWbuku.py3821 except Exception:STRING
LOWbuku.py3829 except Exception:STRING
LOWbuku.py3840 except Exception:STRING
LOWbuku.py3871 except Exception as e:STRING
LOWbuku.py4063 except Exception as e:STRING
LOWbuku.py4202 except Exception as e:STRING
LOWbuku.py4218 except Exception as e:STRING
LOWbuku.py4236 except Exception as e:STRING
LOWbuku.py4276 except Exception as e:STRING
LOWbuku.py4307 except Exception as e:STRING
LOWbuku.py4428 except Exception as e:STRING
LOWbuku.py4671 except Exception as e:STRING
LOWbuku.py4828 except Exception:STRING
LOWbuku.py4903 except Exception:STRING
LOWbuku.py5129 except Exception as e:STRING
LOWbuku.py5205 except Exception:STRING
LOWbuku.py5270 except Exception as e:STRING
LOWbuku.py5309 except Exception as e:STRING
LOWbukuserver/server.py43 except Exception as e:CODE
LOWbukuserver/__init__.py15 except Exception:CODE
LOWbukuserver/api.py103 except Exception as e:CODE
LOWbukuserver/api.py138 except Exception as e:CODE
MEDIUMbukuserver/api.py127def reorder_bookmarks():CODE
LOWbukuserver/views.py239 except Exception as ex:CODE
LOWbukuserver/views.py252 except Exception as ex:CODE
LOWbukuserver/views.py431 except Exception as ex:CODE
LOWbukuserver/views.py578 except Exception as ex:CODE
LOWbukuserver/views.py596 except Exception as ex:CODE
MEDIUMbukuserver/views.py223def create_model(self, form):CODE
MEDIUMbukuserver/views.py248def delete_model(self, model):CODE
MEDIUMbukuserver/views.py587def update_model(self, form, model):CODE
LOWtests/test_buku.py45 except Exception as e:CODE
LOWtests/test_buku.py1121 except Exception as e:STRING
4 more matches not shown…
Decorative Section Separators14 hits · 40 pts
SeverityFileLineSnippetContext
MEDIUMbuku.py5994 # ------------------------COMMENT
MEDIUMbuku.py5996 # ------------------------COMMENT
MEDIUMbuku.py6006 # ----------------COMMENT
MEDIUMbuku.py6008 # ----------------COMMENT
MEDIUMbuku.py5889 # ---------------------COMMENT
MEDIUMbuku.py5891 # ---------------------COMMENT
MEDIUMbuku.py5926 # ------------------COMMENT
MEDIUMbuku.py5928 # ------------------COMMENT
MEDIUMbuku.py5953 # --------------------COMMENT
MEDIUMbuku.py5955 # --------------------COMMENT
MEDIUMbuku.py3432# ----------------STRING
MEDIUMbuku.py3434# ----------------STRING
MEDIUMbuku.py5428# ---------------------STRING
MEDIUMbuku.py5430# ---------------------STRING
Deep Nesting50 hits · 30 pts
SeverityFileLineSnippetContext
LOWbuku.py3452CODE
LOWbuku.py3569CODE
LOWbuku.py3644CODE
LOWbuku.py3704CODE
LOWbuku.py3769CODE
LOWbuku.py3901CODE
LOWbuku.py3985CODE
LOWbuku.py4178CODE
LOWbuku.py4358CODE
LOWbuku.py4625CODE
LOWbuku.py4945CODE
LOWbuku.py5635CODE
LOWbuku.py5798CODE
LOWbuku.py5842CODE
LOWbuku.py513CODE
LOWbuku.py776CODE
LOWbuku.py890CODE
LOWbuku.py941CODE
LOWbuku.py1018CODE
LOWbuku.py1234CODE
LOWbuku.py1527CODE
LOWbuku.py1589CODE
LOWbuku.py1612CODE
LOWbuku.py1882CODE
LOWbuku.py2151CODE
LOWbuku.py2284CODE
LOWbuku.py2424CODE
LOWbuku.py2457CODE
LOWbuku.py2552CODE
LOWbuku.py2620CODE
LOWbuku.py2728CODE
LOWbuku.py2798CODE
LOWbuku.py2890CODE
LOWbuku.py3000CODE
LOWbuku.py3834CODE
LOWbuku.py5644CODE
LOWbuku.py1345CODE
LOWbuku.py5645CODE
LOWbukuserver/api.py259CODE
LOWbukuserver/filters.py108CODE
LOWbukuserver/filters.py194CODE
LOWbukuserver/views.py341CODE
LOWbukuserver/translations/__init__.py52CODE
LOWtests/test_bukuDb.py1329CODE
LOWtests/test_bukuDb.py1562CODE
LOWtests/test_bukuDb.py725CODE
LOWtests/test_cli.py185CODE
LOWtests/test_cli.py221CODE
LOWbukuserver-runner/buku-server.py136CODE
LOWbukuserver-runner/buku-server.py148CODE
Self-Referential Comments3 hits · 9 pts
SeverityFileLineSnippetContext
MEDIUMbuku.py152# Define the default path to ca-certificatesCOMMENT
MEDIUMbuku.py563 # Create a connectionCOMMENT
MEDIUMdocs/source/conf.py7# This file is execfile()d with the current directory set to itsCOMMENT
Over-Commented Block9 hits · 8 pts
SeverityFileLineSnippetContext
LOWbuku.py1#!/usr/bin/env python3COMMENT
LOW.readthedocs.yaml21COMMENT
LOWpackagecore.yaml1name: buku-cliCOMMENT
LOWbukuserver/static/bukuserver/js/Chart.js6361 // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlaysCOMMENT
LOWbukuserver/static/bukuserver/js/Chart.js6381 // |----------------------------------------------------|COMMENT
LOWbukuserver/static/bukuserver/js/Chart.js11401 onHover: null,COMMENT
LOWdocs/source/conf.py1#!/usr/bin/env python3COMMENT
LOWdocs/source/conf.py61# |version| and |release|, also used in various other places throughout theCOMMENT
LOWdocs/source/conf.py81# The name of the Pygments (syntax highlighting) style to use.COMMENT
Unused Imports4 hits · 4 pts
SeverityFileLineSnippetContext
LOWbuku.py19CODE
LOWbukuserver/__init__.py2CODE
LOWbukuserver/__init__.py4CODE
LOWbukuserver/middleware/__init__.py1CODE
AI Structural Patterns5 hits · 3 pts
SeverityFileLineSnippetContext
LOWbuku.py5700CODE
LOWbuku.py776CODE
LOWbuku.py1018CODE
LOWbuku.py1234CODE
LOWtests/test_cli.py115CODE
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMbukuserver/static/bukuserver/js/Chart.js6357 // Essentially we now have any number of boxes on each of the 4 sides.COMMENT
Modern Structural Boilerplate2 hits · 2 pts
SeverityFileLineSnippetContext
LOWbukuserver/__init__.py18__all__ = ['_', '_p', '_l', '_lp', '_key', 'gettext', 'pgettext', 'ngettext', 'lazy_gettext', 'lazy_pgettext', 'LazyStriCODE
LOWbukuserver/middleware/__init__.py3__all__ = ['ReverseProxyPrefixFix']CODE
Structural Annotation Overuse1 hit · 2 pts
SeverityFileLineSnippetContext
LOWbukuserver/static/bukuserver/js/Chart.js6590 // Step 7 - Position the boxesCOMMENT
Overly Generic Function Names1 hit · 1 pts
SeverityFileLineSnippetContext
LOWbukuserver/forms.py33 def process_data(self, value):CODE