Repository Analysis

sissbruecker/linkding

Self-hosted bookmark manager that is designed be to be minimal, fast, and easy to set up using Docker.

18.2 Moderate AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of sissbruecker/linkding, a Python project with 10,841 GitHub stars. SynthScan v2.0 examined 56,829 lines of code across 331 source files, recording 1165 pattern matches distributed across 11 syntactic categories. The overall adjusted score of 18.2 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).

18.2
Adjusted Score
18.2
Raw Score
100%
Time Factor
2026-07-13
Last Push
10.8K
Stars
Python
Language
56.8K
Lines of Code
331
Files
1.2K
Pattern Hits
2026-07-14
Scan Date
0.01
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 2HIGH 0MEDIUM 9LOW 1154

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 1165 distinct pattern matches across 11 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 Identifiers1073 hits · 902 pts
SeverityFileLineSnippetContext
LOWbookmarks/admin.py141 def delete_selected_bookmarks(self, request, queryset: QuerySet):CODE
LOWbookmarks/admin.py156 def archive_selected_bookmarks(self, request, queryset: QuerySet):CODE
LOWbookmarks/admin.py171 def unarchive_selected_bookmarks(self, request, queryset: QuerySet):CODE
LOWbookmarks/queries.py139def _filter_search_query_legacy(CODE
LOWbookmarks/queries.py318def query_archived_bookmark_tags(CODE
LOWbookmarks/queries.py328def query_shared_bookmark_tags(CODE
LOWbookmarks/queries.py341def query_shared_bookmark_users(CODE
LOWbookmarks/queries.py368def get_shared_tags_for_query(CODE
LOWbookmarks/tests_e2e/e2e_test_bundle_preview.py8 def test_update_preview_on_filter_changes(self):CODE
LOWbookmarks/tests_e2e/e2e_test_dropdown.py20 def test_click_toggle_opens_and_closes_dropdown(self):CODE
LOWbookmarks/tests_e2e/e2e_test_dropdown.py34 def test_outside_click_closes_dropdown(self):CODE
LOWbookmarks/tests_e2e/e2e_test_dropdown.py48 def test_escape_closes_dropdown_and_restores_focus(self):CODE
LOWbookmarks/tests_e2e/e2e_test_dropdown.py67 def test_focus_out_closes_dropdown(self):CODE
LOWbookmarks/tests_e2e/e2e_test_dropdown.py83 def test_aria_expanded_attribute(self):CODE
LOWbookmarks/tests_e2e/e2e_test_settings_general.py9 def test_should_only_enable_public_sharing_if_sharing_is_enabled(self):CODE
LOWbookmarks/tests_e2e/e2e_test_settings_general.py56 def test_should_not_show_bookmark_description_max_lines_when_display_inline(self):CODE
LOWbookmarks/tests_e2e/e2e_test_settings_general.py68 def test_should_show_bookmark_description_max_lines_when_display_separate(self):CODE
LOWbookmarks/tests_e2e/e2e_test_settings_general.py80 def test_should_update_bookmark_description_max_lines_when_changing_display(self):CODE
LOWbookmarks/tests_e2e/e2e_test_filter_drawer.py8 def test_show_modal_close_modal(self):CODE
LOWbookmarks/tests_e2e/e2e_test_edit_bookmark_form.py29 def test_should_not_check_for_existing_bookmark(self):CODE
LOWbookmarks/tests_e2e/e2e_test_edit_bookmark_form.py37 def test_should_not_prefill_title_and_description(self):CODE
LOWbookmarks/tests_e2e/e2e_test_edit_bookmark_form.py50 def test_enter_url_should_not_prefill_title_and_description(self):CODE
LOWbookmarks/tests_e2e/e2e_test_edit_bookmark_form.py63 def test_refresh_button_should_be_visible_when_editing(self):CODE
LOWbookmarks/tests_e2e/e2e_test_collapse_side_panel.py23 def test_side_panel_should_be_visible_by_default(self):CODE
LOWbookmarks/tests_e2e/e2e_test_collapse_side_panel.py33 def test_side_panel_should_be_hidden_when_collapsed(self):CODE
LOWbookmarks/tests_e2e/e2e_test_bookmark_page_bulk_edit.py36 def test_active_bookmarks_bulk_select_across(self):CODE
LOWbookmarks/tests_e2e/e2e_test_bookmark_page_bulk_edit.py73 def test_archived_bookmarks_bulk_select_across(self):CODE
LOWbookmarks/tests_e2e/e2e_test_bookmark_page_bulk_edit.py110 def test_active_bookmarks_bulk_select_across_respects_query(self):CODE
LOWbookmarks/tests_e2e/e2e_test_bookmark_page_bulk_edit.py147 def test_archived_bookmarks_bulk_select_across_respects_query(self):CODE
LOWbookmarks/tests_e2e/e2e_test_bookmark_page_bulk_edit.py184 def test_select_all_toggles_all_checkboxes(self):CODE
LOWbookmarks/tests_e2e/e2e_test_bookmark_page_bulk_edit.py207 def test_select_all_shows_select_across(self):CODE
LOWbookmarks/tests_e2e/e2e_test_bookmark_page_bulk_edit.py223 def test_select_across_is_unchecked_when_toggling_all(self):CODE
LOWbookmarks/tests_e2e/e2e_test_bookmark_page_bulk_edit.py244 def test_select_across_is_unchecked_when_toggling_bookmark(self):CODE
LOWbookmarks/tests_e2e/e2e_test_bookmark_page_bulk_edit.py265 def test_execute_resets_all_checkboxes(self):CODE
LOWbookmarks/tests_e2e/e2e_test_bookmark_page_bulk_edit.py296 def test_update_select_across_bookmark_count(self):CODE
LOWbookmarks/tests_e2e/e2e_test_bookmark_page_bulk_edit.py323 def test_execute_button_is_disabled_when_no_bookmarks_selected(self):CODE
LOWbookmarks/tests_e2e/e2e_test_bookmark_item.py11 def test_toggle_notes_should_show_hide_notes(self):CODE
LOWbookmarks/tests_e2e/e2e_test_new_bookmark_form.py31 def test_enter_url_prefills_title_and_description(self):CODE
LOWbookmarks/tests_e2e/e2e_test_new_bookmark_form.py43 def test_enter_url_does_not_overwrite_modified_title_and_description(self):CODE
LOWbookmarks/tests_e2e/e2e_test_new_bookmark_form.py57 def test_with_initial_url_prefills_title_and_description(self):CODE
LOWbookmarks/tests_e2e/e2e_test_new_bookmark_form.py74 def test_with_initial_url_title_description_does_not_overwrite_title_and_description(CODE
LOWbookmarks/tests_e2e/e2e_test_new_bookmark_form.py92 def test_create_should_check_for_existing_bookmark(self):CODE
LOWbookmarks/tests_e2e/e2e_test_new_bookmark_form.py129 def test_enter_url_of_existing_bookmark_should_show_notes(self):CODE
LOWbookmarks/tests_e2e/e2e_test_new_bookmark_form.py142 def test_create_should_preview_auto_tags(self):CODE
LOWbookmarks/tests_e2e/e2e_test_new_bookmark_form.py163 def test_clear_buttons_only_shown_when_fields_have_content(self):CODE
LOWbookmarks/tests_e2e/e2e_test_new_bookmark_form.py193 def test_refresh_button_only_shown_for_existing_bookmarks(self):CODE
LOWbookmarks/tests_e2e/e2e_test_new_bookmark_form.py220 def test_refresh_from_website_button_updates_title_and_description(self):CODE
LOWbookmarks/tests_e2e/e2e_test_new_bookmark_form.py261 def test_refresh_from_website_button_does_not_modify_fields_if_metadata_is_same(CODE
LOWbookmarks/tests_e2e/e2e_test_new_bookmark_form.py303 def test_ctrl_enter_submits_form_from_description(self):CODE
LOWbookmarks/tests_e2e/e2e_test_a11y_navigation_focus.py8 def test_initial_page_load_focus(self):CODE
LOWbookmarks/tests_e2e/e2e_test_a11y_navigation_focus.py30 def test_page_navigation_focus(self):CODE
LOW…ks/tests_e2e/e2e_test_bookmark_page_partial_updates.py40 def test_partial_update_respects_query(self):CODE
LOW…ks/tests_e2e/e2e_test_bookmark_page_partial_updates.py52 def test_partial_update_respects_sort(self):CODE
LOW…ks/tests_e2e/e2e_test_bookmark_page_partial_updates.py66 def test_partial_update_respects_page(self):CODE
LOW…ks/tests_e2e/e2e_test_bookmark_page_partial_updates.py82 def test_multiple_partial_updates(self):CODE
LOW…ks/tests_e2e/e2e_test_bookmark_page_partial_updates.py101 def test_active_bookmarks_partial_update_on_archive(self):CODE
LOW…ks/tests_e2e/e2e_test_bookmark_page_partial_updates.py112 def test_active_bookmarks_partial_update_on_delete(self):CODE
LOW…ks/tests_e2e/e2e_test_bookmark_page_partial_updates.py124 def test_active_bookmarks_partial_update_on_mark_as_read(self):CODE
LOW…ks/tests_e2e/e2e_test_bookmark_page_partial_updates.py139 def test_active_bookmarks_partial_update_on_unshare(self):CODE
LOW…ks/tests_e2e/e2e_test_bookmark_page_partial_updates.py154 def test_active_bookmarks_partial_update_on_bulk_archive(self):CODE
1013 more matches not shown…
Self-Referential Comments9 hits · 30 pts
SeverityFileLineSnippetContext
MEDIUMbookmarks/settings/base.py265 # Creating a connection loads the ICU extension into the SQLiteCOMMENT
MEDIUMbookmarks/tests/test_assets_service.py498 # Create a bookmark with an existing latest_snapshotCOMMENT
MEDIUMbookmarks/tests/test_assets_service.py504 # Create a new snapshot asset that will failCOMMENT
MEDIUMbookmarks/tests/test_assets_service.py150 # Create a bookmark with a very long URLCOMMENT
MEDIUMbookmarks/tests/test_assets_service.py324 # Create a bookmark with a very long URLCOMMENT
MEDIUMbookmarks/tests/test_assets_service.py412 # Create a bookmark with a very long URLCOMMENT
MEDIUMbookmarks/tests/test_assets_service.py522 # Create a bookmark with an existing latest_snapshotCOMMENT
MEDIUMbookmarks/tests/test_assets_service.py541 # Create a bookmark with multiple snapshotsCOMMENT
MEDIUMbookmarks/tests/test_assets_service.py601 # Create a bookmark with multiple snapshotsCOMMENT
Excessive Try-Catch Wrapping22 hits · 22 pts
SeverityFileLineSnippetContext
LOWbookmarks/models.py123 except Exception as error:CODE
LOWbookmarks/models.py164 except Exception:CODE
LOWbookmarks/models.py179 except Exception as error:CODE
LOWbookmarks/middlewares.py25 except Exception:CODE
LOWbookmarks/utils.py16except Exception as exc:CODE
LOWbookmarks/management/commands/migrate_tasks.py57 except Exception:CODE
LOWbookmarks/management/commands/migrate_tasks.py71 except Exception:CODE
LOWbookmarks/api/routes.py123 except Exception as e:CODE
LOWbookmarks/api/routes.py209 except Exception as e:CODE
LOWbookmarks/api/routes.py235 except Exception as e:CODE
LOWbookmarks/views/health.py13 except Exception:CODE
LOWbookmarks/views/settings.py266 except Exception:CODE
LOWbookmarks/views/settings.py295 except Exception:CODE
LOWbookmarks/services/website_loader.py84 except Exception:CODE
LOWbookmarks/services/tasks.py41 except Exception as exc:CODE
LOWbookmarks/services/tasks.py224 except Exception as exc:CODE
LOWbookmarks/services/tasks.py308 except Exception as error:CODE
LOWbookmarks/services/importer.py69 except Exception:CODE
LOWbookmarks/services/importer.py195 except Exception:CODE
LOWbookmarks/services/assets.py49 except Exception as error:CODE
LOWbookmarks/services/assets.py213 except Exception as e:CODE
LOWbookmarks/services/bookmarks.py237 except Exception as e:CODE
Hallucination Indicators2 hits · 20 pts
SeverityFileLineSnippetContext
CRITICALbookmarks/queries.py5from django.core.exceptions import ValidationErrorCODE
CRITICALbookmarks/tests/test_bookmark_validation.py3from django.core.exceptions import ValidationErrorCODE
Deep Nesting17 hits · 17 pts
SeverityFileLineSnippetContext
LOWbookmarks/utils.py83CODE
LOWbookmarks/queries.py60CODE
LOWbookmarks/tests_e2e/helpers.py32CODE
LOWbookmarks/tests/test_tag_cloud_template.py33CODE
LOWbookmarks/management/commands/full_backup.py15CODE
LOWbookmarks/views/tags.py113CODE
LOWbookmarks/services/assets.py88CODE
LOWbookmarks/services/assets.py170CODE
LOWbookmarks/services/search_query_parser.py353CODE
LOWbookmarks/services/search_query_parser.py419CODE
LOWbookmarks/services/search_query_parser.py511CODE
LOWbookmarks/services/search_query_parser.py59CODE
LOWbookmarks/services/search_query_parser.py126CODE
LOWbookmarks/services/search_query_parser.py303CODE
LOWbookmarks/services/favicon_loader.py60CODE
LOWbookmarks/services/bookmarks.py226CODE
LOWbookmarks/services/preview_image_loader.py27CODE
Modern Structural Boilerplate15 hits · 15 pts
SeverityFileLineSnippetContext
LOWbookmarks/models.py18logger = logging.getLogger(__name__)CODE
LOWbookmarks/management/commands/enable_wal.py7logger = logging.getLogger(__name__)CODE
LOW…kmarks/management/commands/create_initial_superuser.py7logger = logging.getLogger(__name__)CODE
LOWbookmarks/management/commands/generate_secret_key.py7logger = logging.getLogger(__name__)CODE
LOWbookmarks/api/routes.py33logger = logging.getLogger(__name__)CODE
LOWbookmarks/views/settings.py28logger = logging.getLogger(__name__)CODE
LOWbookmarks/services/tags.py10logger = logging.getLogger(__name__)CODE
LOWbookmarks/services/singlefile.py14logger = logging.getLogger(__name__)CODE
LOWbookmarks/services/website_loader.py11logger = logging.getLogger(__name__)CODE
LOWbookmarks/services/tasks.py18logger = logging.getLogger(__name__)CODE
LOWbookmarks/services/importer.py12logger = logging.getLogger(__name__)CODE
LOWbookmarks/services/assets.py21logger = logging.getLogger(__name__)CODE
LOWbookmarks/services/favicon_loader.py14logger = logging.getLogger(__name__)CODE
LOWbookmarks/services/bookmarks.py9logger = logging.getLogger(__name__)CODE
LOWbookmarks/services/preview_image_loader.py12logger = logging.getLogger(__name__)CODE
AI Structural Patterns10 hits · 10 pts
SeverityFileLineSnippetContext
LOWbookmarks/models.py260CODE
LOWbookmarks/middlewares.py41CODE
LOWbookmarks/templatetags/shared.py67CODE
LOWbookmarks/templatetags/shared.py86CODE
LOWbookmarks/tests/helpers.py54CODE
LOWbookmarks/tests/helpers.py105CODE
LOWbookmarks/tests/helpers.py174CODE
LOWbookmarks/tests/helpers.py205CODE
LOWbookmarks/tests/helpers.py414CODE
LOWbookmarks/views/turbo.py26CODE
Unused Imports8 hits · 8 pts
SeverityFileLineSnippetContext
LOWbookmarks/tasks.py3CODE
LOWbookmarks/apps.py10CODE
LOWbookmarks/settings/__init__.py4CODE
LOWbookmarks/settings/__init__.py6CODE
LOWbookmarks/settings/dev.py9CODE
LOWbookmarks/settings/dev.py68CODE
LOWbookmarks/settings/prod.py12CODE
LOWbookmarks/settings/prod.py63CODE
Fake / Example Data5 hits · 6 pts
SeverityFileLineSnippetContext
LOWbookmarks/tests/test_auth_proxy_support.py21 "auth_proxy_user", "user@example.com", "password123"CODE
LOWbookmarks/tests/test_auth_proxy_support.py43 "auth_proxy_user", "user@example.com", "password123"CODE
LOWbookmarks/tests/test_auth_proxy_support.py53 "auth_proxy_user", "user@example.com", "password123"CODE
LOWbookmarks/tests/helpers.py281 user = User.objects.create_user(name, "user@example.com", "password123")CODE
LOW…environments/authelia-oidc/authelia/users_database.yml14 email: 'admin@example.com'CODE
Redundant / Tautological Comments2 hits · 3 pts
SeverityFileLineSnippetContext
LOWbookmarks/tests_e2e/helpers.py42 # Check if THIS test is in failures/errors (not just any test)COMMENT
LOWbookmarks/management/commands/migrate_tasks.py15 # Check if background_task table existsCOMMENT
Over-Commented Block2 hits · 2 pts
SeverityFileLineSnippetContext
LOWinstall-linkding.sh1#!/usr/bin/env bashCOMMENT
LOWdocs/src/env.d.ts1/// <reference path="../.astro/types.d.ts" />COMMENT