:bookmark: Personal mini-web in text
This report summarizes scanner evidence for jarun/buku, a Python project with 7,216 GitHub stars. SynthScan examined 41,536 lines of code across 109 source files, recording 241 pattern matches distributed across 13 syntactic categories. The legacy adjusted pattern signal is 6.8 (Moderate pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 138 finding(s).
Are imports declared and package/API names verified? 4 finding(s).
Are wrappers, guards, and repeated structures necessary? 172 finding(s).
Which changes need focused human review? 241 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 241 distinct pattern matches across 13 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | buku.py | 5774 | except AttributeError: | CODE |
| HIGH | buku.py | 3174 | except Exception: | CODE |
| HIGH | buku.py | 3226 | except Exception: | CODE |
| HIGH | buku.py | 5860 | except ImportError: | CODE |
| HIGH | buku.py | 5877 | except KeyboardInterrupt: | CODE |
| HIGH | buku.py | 6396 | except Exception: | CODE |
| HIGH | buku.py | 3271 | except Exception: | CODE |
| HIGH | buku.py | 3288 | except Exception: | CODE |
| HIGH | buku.py | 3598 | except NoOptionError: | CODE |
| HIGH | buku.py | 3610 | except NoOptionError: | CODE |
| HIGH | buku.py | 3616 | except NoOptionError: | CODE |
| HIGH | buku.py | 5191 | except IOError: | CODE |
| HIGH | buku.py | 5195 | except IOError: | CODE |
| HIGH | tests/test_bukuDb.py | 657 | except StopIteration: | CODE |
| HIGH | tests/test_bukuDb.py | 686 | except StopIteration: | CODE |
| HIGH | bukuserver-runner/buku-server.py | 73 | except FileNotFoundError: | CODE |
| HIGH | bukuserver-runner/buku-server.py | 144 | except FileNotFoundError: | CODE |
| HIGH | bukuserver-runner/buku-server.py | 201 | except ValueError: | CODE |
| 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 | 3449 | def convert_tags_to_org_mode_tags(tags: str) -> str: | STRING |
| LOW | buku.py | 3578 | def get_firefox_profile_names(path): | STRING |
| LOW | buku.py | 5768 | 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 | 265 | def test_append_tag_at_all_indices(self): | CODE |
| LOW | tests/test_bukuDb.py | 309 | def test_search_keywords_and_filter_by_tags(self): | CODE |
| LOW | tests/test_bukuDb.py | 401 | def test_search_by_multiple_tags_search_any(self): | CODE |
| LOW | tests/test_bukuDb.py | 452 | def test_search_by_multiple_tags_search_all(self): | CODE |
| LOW | tests/test_bukuDb.py | 483 | def test_search_by_tags_enforces_space_seprations_search_all(self): | CODE |
| LOW | tests/test_bukuDb.py | 541 | def test_search_by_tags_exclusion(self): | CODE |
| LOW | tests/test_bukuDb.py | 582 | def test_search_by_tags_enforces_space_seprations_exclusion(self): | CODE |
| LOW | tests/test_bukuDb.py | 640 | def test_search_and_open_in_browser_by_range(self): | CODE |
| LOW | tests/test_bukuDb.py | 670 | def test_search_and_open_all_in_browser(self): | CODE |
| LOW | tests/test_bukuDb.py | 1297 | def test_delete_rec_range_and_delay_commit( | CODE |
| LOW | tests/test_bukuDb.py | 1330 | def test_delete_rec_index_and_delay_commit(bukuDb, index, delay_commit, input_retval): | CODE |
| LOW | tests/test_bukuDb.py | 1376 | def test_delete_rec_on_empty_database(bukuDb, index, is_range, low, high): | CODE |
| LOW | tests/test_bukuDb.py | 1405 | def test_delete_rec_on_non_integer( | CODE |
| LOW | tests/test_bukuDb.py | 1431 | def test_add_rec_add_invalid_url(bukuDb, caplog, url): | CODE |
| LOW | tests/test_bukuDb.py | 1512 | def test_update_rec_invalid_tag(bukuDb, caplog, invalid_tag): | CODE |
| LOW | tests/test_bukuDb.py | 1530 | def test_update_rec_update_all_bookmark( | CODE |
| LOW | tests/test_bukuDb.py | 1547 | def test_edit_update_rec_with_invalid_input(bukuDb, get_system_editor_retval, index, exp_res): | CODE |
| LOW | tests/test_bukuDb.py | 1608 | def test_load_chrome_database(bukuDb, chrome_db, add_pt): | CODE |
| LOW | tests/test_bukuDb.py | 1657 | def test_auto_import_chromium_bookmark_files(bukuDb, chromium_profile, browser, filenames, capsys): | CODE |
| LOW | tests/test_bukuDb.py | 1673 | def test_auto_import_chromium_duplicate_urls(bukuDb, chromium_profile): | CODE |
| LOW | tests/test_bukuDb.py | 1692 | def test_auto_import_chromium_prompt_once(bukuDb, chromium_profile, import_answer): | CODE |
| LOW | tests/test_bukuDb.py | 1709 | def test_auto_import_chromium_invalid_file_keeps_other_source(bukuDb, chromium_profile, invalid_filename, capsys, caplog | CODE |
| LOW | tests/test_bukuDb.py | 1725 | def test_auto_import_chromium_all_files_invalid(bukuDb, chromium_profile, capsys, caplog): | CODE |
| LOW | tests/test_bukuDb.py | 1739 | def test_auto_import_chromium_empty_account_roots(bukuDb, chromium_profile, capsys): | CODE |
| LOW | tests/test_bukuDb.py | 1764 | def test_load_firefox_database(bukuDb, firefox_db, add_pt): | CODE |
| LOW | tests/test_bukuDb.py | 1975 | def test_search_keywords_and_filter_by_tags(bukuDb, keyword_results, stag_results, exp_res): | CODE |
| LOW | tests/test_bukuDb.py | 1987 | def test_exclude_results_from_search(bukuDb, search_results, exclude_results, exp_res): | CODE |
| LOW | tests/test_bukuDb.py | 2075 | 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 |
| 8 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 | 3823 | 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 | 2966 | except Exception as e: | CODE |
| LOW | buku.py | 2970 | except Exception as e: | CODE |
| LOW | buku.py | 2987 | except Exception as e: | CODE |
| LOW | buku.py | 3000 | except Exception as e: | CODE |
| LOW | buku.py | 3065 | except Exception as e: | CODE |
| LOW | buku.py | 3075 | except Exception as e: | CODE |
| LOW | buku.py | 3102 | except Exception as e: | CODE |
| LOW | buku.py | 3159 | except Exception as e: | CODE |
| LOW | buku.py | 3174 | except Exception: | CODE |
| LOW | buku.py | 3226 | except Exception: | CODE |
| LOW | buku.py | 3271 | except Exception: | CODE |
| LOW | buku.py | 3288 | except Exception: | CODE |
| LOW | buku.py | 6193 | except Exception: | CODE |
| LOW | buku.py | 6269 | except Exception: | CODE |
| LOW | buku.py | 6396 | except Exception: | CODE |
| LOW | buku.py | 6535 | except Exception as e: | CODE |
| LOW | buku.py | 3818 | except Exception: | STRING |
| LOW | buku.py | 3830 | except Exception: | STRING |
| LOW | buku.py | 3838 | except Exception: | STRING |
| LOW | buku.py | 3849 | except Exception: | STRING |
| LOW | buku.py | 3880 | except Exception as e: | STRING |
| LOW | buku.py | 4072 | except Exception as e: | STRING |
| LOW | buku.py | 4211 | except Exception as e: | STRING |
| LOW | buku.py | 4227 | except Exception as e: | STRING |
| LOW | buku.py | 4245 | except Exception as e: | STRING |
| LOW | buku.py | 4285 | except Exception as e: | STRING |
| LOW | buku.py | 4316 | except Exception as e: | STRING |
| LOW | buku.py | 4437 | except Exception as e: | STRING |
| LOW | buku.py | 4680 | except Exception as e: | STRING |
| LOW | buku.py | 4837 | except Exception: | STRING |
| LOW | buku.py | 4912 | except Exception: | STRING |
| LOW | buku.py | 5138 | except Exception as e: | STRING |
| LOW | buku.py | 5214 | except Exception: | STRING |
| LOW | buku.py | 5279 | except Exception as e: | STRING |
| LOW | buku.py | 5318 | 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 |
| 5 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | buku.py | 6003 | # ------------------------ | COMMENT |
| MEDIUM⚡ | buku.py | 6005 | # ------------------------ | COMMENT |
| MEDIUM⚡ | buku.py | 6015 | # ---------------- | COMMENT |
| MEDIUM⚡ | buku.py | 6017 | # ---------------- | COMMENT |
| MEDIUM | buku.py | 5898 | # --------------------- | COMMENT |
| MEDIUM | buku.py | 5900 | # --------------------- | COMMENT |
| MEDIUM | buku.py | 5935 | # ------------------ | COMMENT |
| MEDIUM | buku.py | 5937 | # ------------------ | COMMENT |
| MEDIUM | buku.py | 5962 | # -------------------- | COMMENT |
| MEDIUM | buku.py | 5964 | # -------------------- | COMMENT |
| MEDIUM⚡ | buku.py | 3441 | # ---------------- | STRING |
| MEDIUM⚡ | buku.py | 3443 | # ---------------- | STRING |
| MEDIUM | buku.py | 5437 | # --------------------- | STRING |
| MEDIUM | buku.py | 5439 | # --------------------- | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | buku.py | 3461 | CODE | |
| LOW | buku.py | 3578 | CODE | |
| LOW | buku.py | 3653 | CODE | |
| LOW | buku.py | 3713 | CODE | |
| LOW | buku.py | 3778 | CODE | |
| LOW | buku.py | 3910 | CODE | |
| LOW | buku.py | 3994 | CODE | |
| LOW | buku.py | 4187 | CODE | |
| LOW | buku.py | 4367 | CODE | |
| LOW | buku.py | 4634 | CODE | |
| LOW | buku.py | 4954 | CODE | |
| LOW | buku.py | 5644 | CODE | |
| LOW | buku.py | 5807 | CODE | |
| LOW | buku.py | 5851 | 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 | 3009 | CODE | |
| LOW | buku.py | 3843 | CODE | |
| LOW | buku.py | 5653 | CODE | |
| LOW | buku.py | 1345 | CODE | |
| LOW | buku.py | 5654 | 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 | 1330 | CODE | |
| LOW | tests/test_bukuDb.py | 1563 | CODE | |
| LOW | tests/test_bukuDb.py | 726 | 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 | 5709 | 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 |