Anki is a smart spaced repetition flashcard program
This report presents the forensic synthetic code analysis of ankitects/anki, a Rust project with 29,113 GitHub stars. SynthScan v2.0 examined 189,024 lines of code across 1394 source files, recording 1102 pattern matches distributed across 17 syntactic categories. The overall adjusted score of 6.2 places this repository in the Low 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 1102 distinct pattern matches across 17 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 | tools/mintlify_hooks.py | 3 | CODE | |
| LOW | tools/__init__.py | 3 | CODE | |
| LOW | tools/tests/test_mintlify_hooks.py | 3 | CODE | |
| LOW | pylib/hatch_build.py | 5 | CODE | |
| LOW | pylib/hatch_build.py | 6 | CODE | |
| LOW | pylib/tools/hookslib.py | 8 | CODE | |
| LOW | pylib/tests/test_stats.py | 7 | CODE | |
| LOW | pylib/tests/test_exporting.py | 4 | CODE | |
| LOW | pylib/tests/test_exporting.py | 10 | CODE | |
| LOW | pylib/tests/test_schedv3.py | 5 | CODE | |
| LOW | pylib/tests/test_schedv3.py | 7 | CODE | |
| LOW | pylib/tests/test_schedv3.py | 8 | CODE | |
| LOW | pylib/tests/test_schedv3.py | 10 | CODE | |
| LOW | pylib/tests/test_schedv3.py | 12 | CODE | |
| LOW | pylib/tests/test_schedv3.py | 13 | CODE | |
| LOW | pylib/tests/test_collection.py | 8 | CODE | |
| LOW | pylib/tests/test_collection.py | 12 | CODE | |
| LOW | pylib/tests/shared.py | 4 | CODE | |
| LOW | pylib/tests/test_importing.py | 9 | CODE | |
| LOW | pylib/tests/test_importing.py | 11 | CODE | |
| LOW | pylib/tests/test_find.py | 8 | CODE | |
| LOW | pylib/tests/test_models.py | 6 | CODE | |
| LOW | pylib/tests/test_models.py | 11 | CODE | |
| LOW | pylib/tests/test_httpclient.py | 4 | CODE | |
| LOW | pylib/anki/tags.py | 12 | CODE | |
| LOW | pylib/anki/lang.py | 4 | CODE | |
| LOW | pylib/anki/sound.py | 10 | CODE | |
| LOW | pylib/anki/db.py | 12 | CODE | |
| LOW | pylib/anki/hooks.py | 14 | CODE | |
| LOW | pylib/anki/hooks.py | 22 | CODE | |
| LOW | pylib/anki/media.py | 4 | CODE | |
| LOW | pylib/anki/media.py | 15 | CODE | |
| LOW | pylib/anki/config.py | 20 | CODE | |
| LOW | pylib/anki/httpclient.py | 8 | CODE | |
| LOW | pylib/anki/models.py | 4 | CODE | |
| LOW | pylib/anki/models.py | 19 | CODE | |
| LOW | pylib/anki/_backend.py | 4 | CODE | |
| LOW | pylib/anki/_backend.py | 14 | CODE | |
| LOW | pylib/anki/stdmodels.py | 4 | CODE | |
| LOW | pylib/anki/cards.py | 4 | CODE | |
| LOW | pylib/anki/cards.py | 17 | CODE | |
| LOW | pylib/anki/notes.py | 4 | CODE | |
| LOW | pylib/anki/consts.py | 4 | CODE | |
| LOW | pylib/anki/exporting.py | 5 | CODE | |
| LOW | pylib/anki/utils.py | 4 | CODE | |
| LOW | pylib/anki/dbproxy.py | 4 | CODE | |
| LOW | pylib/anki/dbproxy.py | 13 | CODE | |
| LOW | pylib/anki/stats.py | 5 | CODE | |
| LOW | pylib/anki/stats.py | 15 | CODE | |
| LOW | pylib/anki/collection.py | 4 | CODE | |
| LOW | pylib/anki/collection.py | 78 | CODE | |
| LOW | pylib/anki/template.py | 29 | CODE | |
| LOW | pylib/anki/find.py | 5 | CODE | |
| LOW | pylib/anki/errors.py | 4 | CODE | |
| LOW | pylib/anki/rsbackend.py | 9 | CODE | |
| LOW | pylib/anki/rsbackend.py | 10 | CODE | |
| LOW | pylib/anki/rsbackend.py | 10 | CODE | |
| LOW | pylib/anki/rsbackend.py | 11 | CODE | |
| LOW | pylib/anki/rsbackend.py | 12 | CODE | |
| LOW | pylib/anki/rsbackend.py | 13 | CODE | |
| 340 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/tests/test_mintlify_hooks.py | 10 | def test_signature_includes_arguments_and_return_type() -> None: | CODE |
| LOW | tools/tests/test_mintlify_hooks.py | 22 | def test_render_hook_marks_deprecated_docstring() -> None: | CODE |
| LOW | tools/tests/test_mintlify_hooks.py | 45 | def test_render_hook_marks_obsolete_docstring() -> None: | CODE |
| LOW | tools/tests/test_mintlify_hooks.py | 56 | def test_safe_escapes_mdx_sensitive_text() -> None: | CODE |
| LOW | pylib/tests/test_utils.py | 52 | def test_int_version_rejects_garbage(): | CODE |
| LOW | pylib/tests/test_schedv3.py | 627 | def test_filt_reviewing_early_normal(): | CODE |
| LOW⚡ | pylib/tests/test_sound.py | 9 | def test_sound_tag_path_relative_joins_media_folder(tmp_path): | CODE |
| LOW⚡ | pylib/tests/test_sound.py | 14 | def test_sound_tag_path_absolute_ignores_media_folder(): | CODE |
| LOW⚡ | pylib/tests/test_sound.py | 20 | def test_sound_tag_path_with_directory_separator_uses_abspath(): | CODE |
| LOW⚡ | pylib/tests/test_sound.py | 29 | def test_sound_tag_path_applies_media_file_filter(monkeypatch, tmp_path): | CODE |
| LOW⚡ | pylib/tests/test_sound.py | 41 | def test_strip_av_refs_removes_play_tag(): | CODE |
| LOW⚡ | pylib/tests/test_sound.py | 45 | def test_strip_av_refs_leaves_unrelated_text_unchanged(): | CODE |
| LOW⚡ | pylib/tests/test_sound.py | 49 | def test_strip_av_refs_removes_multiple_tags(): | CODE |
| LOW⚡ | pylib/tests/test_sound.py | 53 | def test_av_ref_re_matches_question_side(): | CODE |
| LOW⚡ | pylib/tests/test_sound.py | 60 | def test_av_ref_re_matches_answer_side(): | CODE |
| LOW⚡ | pylib/tests/test_sound.py | 67 | def test_av_ref_re_does_not_match_legacy_sound_tag(): | CODE |
| LOW | pylib/tests/test_importing.py | 244 | def test_tsv_tag_multiple_tags(): | CODE |
| LOW | pylib/tests/test_importing.py | 278 | def test_csv_tag_only_if_modified(): | CODE |
| LOW⚡ | pylib/tests/test_hooks.py | 17 | def test_run_hook_calls_registered_callback(): | CODE |
| LOW⚡ | pylib/tests/test_hooks.py | 26 | def test_hook_callback_is_retrievable_by_name(): | CODE |
| LOW⚡ | pylib/tests/test_hooks.py | 35 | def test_run_filter_transforms_and_returns_value(): | CODE |
| LOW⚡ | pylib/tests/test_hooks.py | 43 | def test_run_filter_chains_multiple_functions(): | CODE |
| LOW | pylib/tests/test_hooks.py | 55 | def test_rem_hook_prevents_callback_from_being_called(): | CODE |
| LOW | pylib/tests/test_hooks.py | 64 | def test_exception_in_hook_does_not_silently_swallow(): | CODE |
| LOW | pylib/tests/test_hooks.py | 75 | def test_exception_in_hook_stops_subsequent_hooks(): | CODE |
| LOW | pylib/tests/test_hooks.py | 92 | def test_exception_in_filter_does_not_silently_swallow(): | CODE |
| LOW | pylib/tests/test_hooks.py | 101 | def test_wrap_after_calls_old_then_new(): | CODE |
| LOW | pylib/tests/test_hooks.py | 117 | def test_wrap_before_calls_new_then_old(): | CODE |
| LOW | pylib/tests/test_hooks.py | 133 | def test_wrap_around_receives_old_as_callable(): | CODE |
| LOW | pylib/tests/test_cards.py | 68 | def test_empty_cards_special_fields(): | CODE |
| LOW⚡ | pylib/tests/test_httpclient.py | 14 | def test_http_client_mounts_system_store_adapter() -> None: | CODE |
| LOW⚡ | pylib/tests/test_httpclient.py | 23 | def test_system_store_adapter_does_not_use_certifi_for_default_verification( | CODE |
| LOW⚡ | pylib/tests/test_httpclient.py | 26 | def fail_if_parent_verification_is_used(*_args, **_kwargs) -> None: | CODE |
| LOW | pylib/tests/test_httpclient.py | 45 | def test_noverifyssl_disables_ssl_verification( | CODE |
| LOW | pylib/anki/lang.py | 245 | def without_unicode_isolation(string: str) -> str: | CODE |
| LOW | pylib/anki/lang.py | 249 | def with_collapsed_whitespace(string: str) -> str: | CODE |
| LOW | pylib/anki/media.py | 23 | def media_paths_from_col_path(col_path: str) -> tuple[str, str]: | CODE |
| LOW | pylib/anki/media.py | 103 | def add_extension_based_on_mime(self, fname: str, content_type: str) -> str: | CODE |
| LOW | pylib/anki/media.py | 152 | def extract_static_media_files(self, mid: NotetypeId) -> Sequence[str]: | CODE |
| LOW | pylib/anki/models.py | 380 | def get_single_notetype_of_notes( | CODE |
| LOW | pylib/anki/models.py | 410 | def restore_notetype_to_stock( | CODE |
| LOW | pylib/anki/_backend.py | 153 | def compute_params_from_items(self, items: Iterable[FsrsItem]) -> Sequence[float]: | CODE |
| LOW | pylib/anki/_backend.py | 203 | def backend_exception_to_pylib(err: backend_pb2.BackendError) -> Exception: | CODE |
| LOW⚡ | pylib/anki/stdmodels.py | 74 | def _legacy_add_basic_typing_model( | CODE |
| LOW⚡ | pylib/anki/stdmodels.py | 82 | def _legacy_add_forward_reverse( | CODE |
| LOW⚡ | pylib/anki/stdmodels.py | 90 | def _legacy_add_forward_optional_reverse( | CODE |
| LOW | pylib/anki/cards.py | 206 | def replay_question_audio_on_answer_side(self) -> bool: | CODE |
| LOW⚡ | pylib/anki/collection.py | 890 | def load_browser_card_columns(self) -> list[str]: | CODE |
| LOW⚡ | pylib/anki/collection.py | 902 | def load_browser_note_columns(self) -> list[str]: | CODE |
| LOW⚡ | pylib/anki/collection.py | 992 | def _get_load_balancer_enabled(self) -> bool: | CODE |
| LOW⚡ | pylib/anki/collection.py | 995 | def _set_load_balancer_enabled(self, value: bool) -> None: | CODE |
| LOW⚡ | pylib/anki/collection.py | 1002 | def _get_enable_fsrs_short_term_with_steps(self) -> bool: | CODE |
| LOW⚡ | pylib/anki/collection.py | 1005 | def _set_enable_fsrs_short_term_with_steps(self, value: bool) -> None: | CODE |
| LOW | pylib/anki/collection.py | 142 | def initialize_backend_logging() -> None: | CODE |
| LOW | pylib/anki/collection.py | 360 | def export_collection_package( | CODE |
| LOW | pylib/anki/collection.py | 431 | def export_dataset_for_research( | CODE |
| LOW | pylib/anki/collection.py | 442 | def add_image_occlusion_notetype(self) -> None: | CODE |
| LOW | pylib/anki/collection.py | 469 | def update_image_occlusion_note( | CODE |
| LOW | pylib/anki/collection.py | 591 | def default_deck_for_notetype(self, notetype_id: NotetypeId) -> DeckId | None: | CODE |
| LOW | pylib/anki/collection.py | 618 | def remove_cards_and_orphaned_notes( | CODE |
| 260 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pylib/anki/lang.py | 186 | def set_lang(lang: str) -> None: | CODE |
| LOW | pylib/anki/db.py | 105 | def set_progress_handler(self, *args: Any) -> None: | CODE |
| LOW | pylib/anki/db.py | 121 | def set_autocommit(self, autocommit: bool) -> None: | CODE |
| LOW | pylib/anki/models.py | 104 | def _update_cache(self, notetype: NotetypeDict) -> None: | CODE |
| LOW | pylib/anki/models.py | 327 | def set_sort_index(self, notetype: NotetypeDict, idx: int) -> None: | CODE |
| LOW | pylib/anki/models.py | 537 | def set_current(self, m: NotetypeDict) -> None: | CODE |
| LOW | pylib/anki/_backend.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | pylib/anki/cards.py | 172 | def set_render_output(self, output: anki.template.TemplateRenderOutput) -> None: | CODE |
| LOW | pylib/anki/cards.py | 235 | def set_user_flag(self, flag: int) -> None: | CODE |
| LOW | pylib/anki/notes.py | 193 | def set_tags_from_str(self, tags: str) -> None: | CODE |
| LOW | pylib/anki/consts.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | pylib/anki/collection.py | 898 | def set_browser_card_columns(self, columns: list[str]) -> None: | CODE |
| LOW⚡ | pylib/anki/collection.py | 910 | def set_browser_note_columns(self, columns: list[str]) -> None: | CODE |
| LOW⚡ | pylib/anki/collection.py | 995 | def _set_load_balancer_enabled(self, value: bool) -> None: | CODE |
| LOW⚡ | pylib/anki/collection.py | 1005 | def _set_enable_fsrs_short_term_with_steps(self, value: bool) -> None: | CODE |
| LOW | pylib/anki/collection.py | 101 | logger = logging.getLogger(__name__) | CODE |
| LOW | pylib/anki/collection.py | 239 | def set_v3_scheduler(self, enabled: bool) -> None: | CODE |
| LOW | pylib/anki/collection.py | 309 | def set_schema_modified(self) -> None: | CODE |
| LOW | pylib/anki/collection.py | 1136 | def set_wants_abort(self) -> None: | CODE |
| LOW | pylib/anki/decks.py | 327 | def update_config(self, conf: DeckConfigDict, preserve_usn: bool = False) -> None: | CODE |
| LOW | pylib/anki/decks.py | 362 | def set_config_id_for_deck_dict(self, deck: DeckDict, id: DeckConfigId) -> None: | CODE |
| LOW | pylib/anki/decks.py | 557 | def set_deck(self, cids: list[anki.cards.CardId], did: DeckId) -> None: | CODE |
| LOW | pylib/anki/scheduler/legacy.py | 102 | def _updateStats(self, card: Card, type: str, cnt: int = 1) -> None: | CODE |
| LOW | qt/hatch_build.py | 36 | def _set_anki_dependency(self, version: str, build_data: Dict[str, Any]) -> None: | CODE |
| LOW | qt/aqt/package.py | 44 | def update_progress(progress: Progress, update: ProgressUpdate) -> None: | CODE |
| LOW | qt/aqt/deckchooser.py | 40 | def _setup_ui(self, show_label: bool) -> None: | CODE |
| LOW | qt/aqt/deckchooser.py | 86 | def _update_button_label(self) -> None: | CODE |
| LOW | qt/aqt/sound.py | 784 | def _setup_dialog(self) -> None: | CODE |
| LOW | qt/aqt/notetypechooser.py | 58 | def _setup_ui(self, show_label: bool) -> None: | CODE |
| LOW | qt/aqt/notetypechooser.py | 160 | def _update_button_label(self) -> None: | CODE |
| LOW | qt/aqt/theme.py | 98 | def set_night_mode(self, val: bool) -> None: | CODE |
| LOW | qt/aqt/theme.py | 329 | def _update_stat_colors(self) -> None: | CODE |
| LOW | qt/aqt/addons.py | 603 | def update_supported_versions(self, items: list[AddonInfo]) -> None: | CODE |
| LOW | qt/aqt/addons.py | 658 | def set_config_help_action(self, module: str, action: Callable[[], str]) -> None: | CODE |
| LOW | qt/aqt/addons.py | 1525 | def update_info_received(future: Future) -> None: | CODE |
| LOW | qt/aqt/addons.py | 1596 | def update_info_received(future: Future) -> None: | CODE |
| LOW | qt/aqt/schema_change_tracker.py | 38 | def set_unchanged(self) -> None: | CODE |
| LOW⚡ | qt/aqt/editor_legacy.py | 587 | def set_cloze_button(self) -> None: | CODE |
| LOW⚡ | qt/aqt/editor_legacy.py | 595 | def set_image_occlusion_button(self) -> None: | CODE |
| LOW | qt/aqt/editor_legacy.py | 1242 | def update_occlusions_field(self) -> None: | CODE |
| LOW | qt/aqt/editor_legacy.py | 1396 | def _updateForegroundButton(self) -> None: | CODE |
| LOW | qt/aqt/editor_legacy.py | 730 | def _update_duplicate_display(self, result: NoteFieldsCheckResult.V) -> None: | STRING |
| LOW | qt/aqt/mediacheck.py | 62 | def _set_progress_enabled(self, enabled: bool) -> None: | CODE |
| LOW | qt/aqt/preferences.py | 75 | def _setup_webview(self) -> None: | CODE |
| LOW | qt/aqt/preferences.py | 174 | def update_collection(self, on_done: Callable[[], None]) -> None: | CODE |
| LOW | qt/aqt/preferences.py | 221 | def update_profile(self) -> None: | CODE |
| LOW | qt/aqt/preferences.py | 255 | def update_login_status(self) -> None: | CODE |
| LOW | qt/aqt/preferences.py | 316 | def update_network(self) -> None: | CODE |
| LOW | qt/aqt/preferences.py | 402 | def update_global(self) -> None: | CODE |
| LOW | qt/aqt/preferences.py | 477 | def update_video_driver(self) -> None: | CODE |
| LOW | qt/aqt/__init__.py | 325 | def _set_windows_shutdown_block_reason(self, reason: str) -> None: | CODE |
| LOW⚡ | qt/aqt/addcards_legacy.py | 62 | def set_deck(self, deck_id: DeckId) -> None: | CODE |
| LOW⚡ | qt/aqt/addcards_legacy.py | 65 | def set_note_type(self, note_type_id: NotetypeId) -> None: | CODE |
| LOW⚡ | qt/aqt/addcards_legacy.py | 68 | def set_note(self, note: Note, deck_id: DeckId | None = None) -> None: | CODE |
| LOW | qt/aqt/deckdescription.py | 33 | def _setup_and_show(self, deck: DeckDict) -> None: | CODE |
| LOW | qt/aqt/deckdescription.py | 41 | def _setup_ui(self) -> None: | CODE |
| LOW | qt/aqt/clayout.py | 106 | def update_current_ordinal_and_redraw(self, idx: int) -> None: | CODE |
| LOW | qt/aqt/debug_console.py | 83 | def _setup_scripts(self) -> None: | CODE |
| LOW | qt/aqt/debug_console.py | 89 | def _setup_actions(self) -> None: | CODE |
| LOW | qt/aqt/debug_console.py | 243 | def _setup_context_menu(self) -> None: | CODE |
| 95 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tools/reload_webviews.py | 20 | print(f"Error: {message}", file=sys.stderr) | CODE |
| LOW | tools/reload_webviews.py | 42 | except Exception as e: | CODE |
| LOW | pylib/tools/hookslib.py | 129 | except Exception: | CODE |
| LOW | pylib/tools/hookslib.py | 165 | except Exception: | CODE |
| LOW | pylib/tests/test_importing.py | 28 | except Exception: | CODE |
| LOW | pylib/anki/lang.py | 212 | except Exception: | CODE |
| LOW | pylib/anki/hooks.py | 37 | except Exception: | CODE |
| LOW | pylib/anki/hooks.py | 48 | except Exception: | CODE |
| LOW | pylib/anki/syncserver.py | 15 | except Exception as exc: | CODE |
| LOW | pylib/anki/_backend.py | 120 | except Exception as error: | CODE |
| LOW | pylib/anki/_backend.py | 163 | except Exception as error: | CODE |
| LOW | pylib/anki/notes.py | 163 | except Exception as exc: | CODE |
| LOW | pylib/anki/utils.py | 31 | except Exception: | CODE |
| LOW | pylib/anki/utils.py | 217 | except Exception: | CODE |
| LOW | pylib/anki/utils.py | 291 | except Exception: | CODE |
| LOW | pylib/anki/stats.py | 725 | except Exception: | CODE |
| LOW | pylib/anki/latex.py | 173 | except Exception: | CODE |
| LOW | pylib/anki/importing/apkg.py | 42 | except Exception as exc: | CODE |
| LOW⚡ | pylib/anki/importing/csvfile.py | 101 | except Exception: | CODE |
| LOW⚡ | pylib/anki/importing/csvfile.py | 104 | except Exception: | CODE |
| LOW⚡ | pylib/anki/importing/csvfile.py | 109 | except Exception: | CODE |
| LOW | pylib/anki/importing/csvfile.py | 128 | except Exception: | CODE |
| LOW | qt/aqt/sync.py | 52 | except Exception as e: | CODE |
| LOW | qt/aqt/sync.py | 112 | except Exception as err: | CODE |
| LOW | qt/aqt/sync.py | 261 | except Exception as err: | CODE |
| LOW | qt/aqt/sync.py | 293 | except Exception as err: | CODE |
| LOW | qt/aqt/sync.py | 323 | except Exception as err: | CODE |
| LOW | qt/aqt/deckconf.py | 270 | except Exception: | CODE |
| LOW | qt/aqt/sound.py | 377 | except Exception as e: | CODE |
| LOW | qt/aqt/sound.py | 390 | except Exception as e: | CODE |
| LOW | qt/aqt/sound.py | 570 | except Exception as e: | CODE |
| LOW | qt/aqt/sound.py | 870 | except Exception as e: | CODE |
| LOW | qt/aqt/theme.py | 357 | except Exception: | CODE |
| LOW | qt/aqt/importing.py | 213 | except Exception as e: | CODE |
| LOW | qt/aqt/importing.py | 365 | except Exception as e: | CODE |
| LOW | qt/aqt/importing.py | 404 | except Exception as e: | CODE |
| LOW | qt/aqt/ankihub.py | 42 | except Exception as exc: | CODE |
| LOW | qt/aqt/addons.py | 250 | except Exception: | CODE |
| LOW | qt/aqt/addons.py | 343 | except Exception: | CODE |
| LOW | qt/aqt/addons.py | 501 | except Exception: | CODE |
| LOW | qt/aqt/addons.py | 655 | except Exception: | CODE |
| LOW | qt/aqt/addons.py | 1134 | except Exception as e: | CODE |
| LOW | qt/aqt/addons.py | 1607 | except Exception as exc: | CODE |
| LOW | qt/aqt/addons.py | 1719 | except Exception as e: | CODE |
| LOW | qt/aqt/editor_legacy.py | 874 | except Exception as e: | CODE |
| LOW | qt/aqt/editor_legacy.py | 885 | except Exception as e: | CODE |
| LOW | qt/aqt/editor_legacy.py | 1153 | except Exception as e: | CODE |
| LOW | qt/aqt/preferences.py | 458 | except Exception: | CODE |
| LOW | qt/aqt/mpv.py | 398 | except Exception: | CODE |
| LOW | qt/aqt/tts.py | 499 | except Exception as exc: | CODE |
| LOW | qt/aqt/tts.py | 515 | except Exception: | CODE |
| LOW | qt/aqt/tts.py | 521 | except Exception: | CODE |
| LOW | qt/aqt/__init__.py | 233 | except Exception: | CODE |
| LOW | qt/aqt/__init__.py | 583 | except Exception: | CODE |
| LOW | qt/aqt/__init__.py | 657 | except Exception: | CODE |
| LOW | qt/aqt/__init__.py | 741 | except Exception: | CODE |
| LOW | qt/aqt/debug_console.py | 351 | except Exception: | CODE |
| LOW | qt/aqt/changenotetype.py | 91 | except Exception as e: | CODE |
| LOW | qt/aqt/exporting.py | 194 | except Exception as exc: | CODE |
| LOW | qt/aqt/utils.py | 1041 | except Exception as exc: | STRING |
| 38 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pylib/anki/_backend.py | 203 | CODE | |
| LOW | pylib/anki/exporting.py | 199 | CODE | |
| LOW | pylib/anki/utils.py | 272 | CODE | |
| LOW | pylib/anki/stats.py | 211 | CODE | |
| LOW | pylib/anki/stats.py | 959 | CODE | |
| LOW | pylib/anki/collection.py | 217 | CODE | |
| LOW | pylib/anki/foreign_data/mnemosyne.py | 175 | CODE | |
| LOW | pylib/anki/scheduler/v3.py | 66 | CODE | |
| LOW | pylib/anki/scheduler/v3.py | 152 | CODE | |
| LOW | pylib/anki/scheduler/v3.py | 188 | CODE | |
| LOW | pylib/anki/scheduler/v3.py | 216 | CODE | |
| LOW | pylib/anki/importing/noteimp.py | 116 | CODE | |
| LOW | pylib/anki/importing/anki2.py | 92 | CODE | |
| LOW | pylib/anki/importing/csvfile.py | 29 | CODE | |
| LOW | pylib/anki/importing/csvfile.py | 92 | CODE | |
| LOW | pylib/anki/importing/mnemo.py | 19 | CODE | |
| LOW | qt/aqt/sync.py | 138 | CODE | |
| LOW | qt/aqt/sound.py | 364 | CODE | |
| LOW | qt/aqt/customstudy.py | 90 | CODE | |
| LOW | qt/aqt/customstudy.py | 158 | CODE | |
| LOW | qt/aqt/customstudy.py | 177 | CODE | |
| LOW | qt/aqt/theme.py | 211 | CODE | |
| LOW | qt/aqt/importing.py | 338 | CODE | |
| LOW | qt/aqt/importing.py | 165 | CODE | |
| LOW | qt/aqt/importing.py | 389 | CODE | |
| LOW | qt/aqt/editor_legacy.py | 434 | CODE | |
| LOW | qt/aqt/editor_legacy.py | 1004 | CODE | |
| LOW | qt/aqt/editor_legacy.py | 1056 | CODE | |
| LOW | qt/aqt/editor_legacy.py | 1711 | CODE | |
| LOW | qt/aqt/preferences.py | 484 | CODE | |
| LOW | qt/aqt/mpv.py | 173 | CODE | |
| LOW | qt/aqt/mpv.py | 249 | CODE | |
| LOW | qt/aqt/__init__.py | 479 | CODE | |
| LOW | qt/aqt/__init__.py | 408 | CODE | |
| LOW | qt/aqt/__init__.py | 491 | CODE | |
| LOW | qt/aqt/addcards_legacy.py | 218 | CODE | |
| LOW | qt/aqt/addcards_legacy.py | 314 | CODE | |
| LOW | qt/aqt/studydeck.py | 104 | CODE | |
| LOW | qt/aqt/overview.py | 96 | CODE | |
| LOW | qt/aqt/overview.py | 152 | CODE | |
| LOW | qt/aqt/utils.py | 290 | CODE | |
| LOW | qt/aqt/utils.py | 940 | CODE | |
| LOW | qt/aqt/utils.py | 127 | CODE | |
| LOW | qt/aqt/reviewer.py | 203 | CODE | |
| LOW | qt/aqt/reviewer.py | 221 | CODE | |
| LOW | qt/aqt/reviewer.py | 502 | CODE | |
| LOW | qt/aqt/reviewer.py | 675 | CODE | |
| LOW | qt/aqt/editor.py | 341 | CODE | |
| LOW | qt/aqt/webview.py | 635 | CODE | |
| LOW | qt/aqt/main.py | 876 | CODE | |
| LOW | qt/aqt/deckbrowser.py | 105 | CODE | |
| LOW | qt/aqt/mediasrv.py | 338 | CODE | |
| LOW | qt/aqt/mediasrv.py | 450 | CODE | |
| LOW | qt/aqt/mediasrv.py | 498 | CODE | |
| LOW | qt/aqt/browser/browser.py | 183 | CODE | |
| LOW | qt/aqt/browser/browser.py | 220 | CODE | |
| LOW | qt/aqt/browser/previewer.py | 206 | CODE | |
| LOW | qt/aqt/browser/sidebar/tree.py | 273 | CODE | |
| LOW | qt/aqt/browser/sidebar/tree.py | 455 | CODE | |
| LOW | qt/aqt/browser/sidebar/tree.py | 519 | CODE | |
| 4 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ftl/copy-core-string.sh | 1 | #!/bin/bash | COMMENT |
| LOW | ftl/remove-unused.sh | 1 | #!/bin/bash | COMMENT |
| LOW | ftl/src/main.rs | 21 | COMMENT | |
| LOW | pylib/tests/test_schedv3.py | 61 | # t = mm.new_template("Reverse") | COMMENT |
| LOW | qt/aqt/addons.py | 181 | "properties": { | COMMENT |
| LOW | qt/aqt/mpv.py | 1 | # ------------------------------------------------------------------------------ | COMMENT |
| LOW | …ux-template/{{ cookiecutter.format }}/bootstrap/main.c | 1 | // | COMMENT |
| LOW | rslib/linkchecker/src/lib.rs | 1 | // Copyright: Ankitects Pty Ltd and contributors | COMMENT |
| LOW | rslib/proto_gen/src/lib.rs | 21 | use prost_reflect::MessageDescriptor; | COMMENT |
| LOW | rslib/src/import_export/text/csv/metadata.rs | 201 | } | COMMENT |
| LOW | rslib/src/scheduler/fsrs/params.rs | 381 | (items, card_ids, review_count) | COMMENT |
| LOW | rslib/src/sync/version.rs | 21 | /// | COMMENT |
| LOW | rslib/src/revlog/mod.rs | 41 | /// - 0 represents manual rescheduling. | COMMENT |
| LOW | ts/lib/domlib/surround/surround.test.ts | 281 | }); | COMMENT |
| LOW | ts/lib/domlib/surround/surround.test.ts | 301 | // expect(removedNodes).toHaveLength(0); | COMMENT |
| LOW | ts/lib/domlib/surround/surround.test.ts | 321 | // }); | COMMENT |
| LOW | ts/lib/domlib/surround/surround.test.ts | 341 | COMMENT | |
| LOW | ts/lib/domlib/surround/unsurround.test.ts | 21 | unsurround(range, body, easyBold); | COMMENT |
| LOW | ts/lib/domlib/surround/unsurround.test.ts | 61 | }); | COMMENT |
| LOW | ts/lib/domlib/surround/unsurround.test.ts | 81 | // }); | COMMENT |
| LOW | ts/lib/domlib/surround/unsurround.test.ts | 121 | unsurround(range, body, easyBold); | COMMENT |
| LOW | ts/routes/graphs/graph-styles.ts | 1 | // Copyright: Ankitects Pty Ltd and contributors | COMMENT |
| LOW | ts/routes/tmp/_page.ts | 1 | // Copyright: Ankitects Pty Ltd and contributors | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | qt/aqt/url_schemes.py | 57 | tr.preferences_url_scheme_warning(link=url.toString(), scheme=url.scheme()) | CODE |
| HIGH | qt/aqt/editor_legacy.py | 1703 | url = qurl.toString() | CODE |
| HIGH | qt/aqt/webview.py | 972 | f"if(globalThis.anki && globalThis.anki.onOperationDidExecute) globalThis.anki.onOperationDidExecute({change | CODE |
| HIGH | qt/aqt/profiles.py | 415 | (name text primary key collate nocase, data blob not null);""" | STRING |
| HIGH | qt/tests/launch_anki_for_e2e.py | 69 | "create table profiles (name text primary key collate nocase, data blob not null)" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pylib/tools/genhooks.py | 133 | # This file is automatically generated; edit tools/genhooks.py instead. | COMMENT |
| MEDIUM | qt/tools/genhooks_gui.py | 18 | # This file is automatically generated; edit tools/genhooks_gui.py instead. | COMMENT |
| MEDIUM | qt/aqt/sound.py | 651 | # Create the audio source with the chosen format | COMMENT |
| MEDIUM | qt/aqt/log.py | 42 | # Create a new add-on logger | COMMENT |
| MEDIUM | qt/aqt/webview.py | 159 | # Create a new profile if not cached | STRING |
| MEDIUM | qt/mac/build.sh | 15 | # Create the wheel using uv | COMMENT |
| MEDIUM | rslib/i18n/python.rs | 67 | # This file is automatically generated from the *.ftl files. | COMMENT |
| MEDIUM | .github/scripts/setup_apple_signing.sh | 9 | # Create a temporary keychain | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | qt/aqt/mpv.py | 1 | # ------------------------------------------------------------------------------ | COMMENT |
| MEDIUM | qt/aqt/mpv.py | 25 | # ------------------------------------------------------------------------------ | COMMENT |
| MEDIUM | ts/tests/e2e/context-switching.spec.ts | 168 | // ─── 1. Chooser UI and session behaviour ───────────────────────────────────── | COMMENT |
| MEDIUM | ts/tests/e2e/context-switching.spec.ts | 200 | // ─── 2. addNote payload ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | ts/tests/e2e/context-switching.spec.ts | 242 | // ─── 3. Mode B: context behaviour (default) ────────────────────────────────── | COMMENT |
| MEDIUM | ts/tests/e2e/context-switching.spec.ts | 386 | // ─── 4. Mode A: reopen context (deck-centric) ──────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | qt/aqt/editor_legacy.py | 1788 | path = os.path.join(self.editor.mw.col.media.dir(), file_name) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | ts/tests/e2e/context-switching.spec.ts | 251 | // Step 1: Establish _nt_{cloze}_lastDeck = testDeckId. | COMMENT |
| LOW⚡ | ts/tests/e2e/context-switching.spec.ts | 258 | // Step 2: Reset to Basic + Default so the starting state is deterministic. | COMMENT |
| LOW⚡ | ts/tests/e2e/context-switching.spec.ts | 264 | // Step 3: Switch to Cloze. NoteEditor reads _nt_{cloze}_lastDeck and | COMMENT |
| LOW⚡ | ts/tests/e2e/context-switching.spec.ts | 268 | // Step 4: Deck chooser must update on its own. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | ts/tests/e2e/context-switching.spec.ts | 251 | // Step 1: Establish _nt_{cloze}_lastDeck = testDeckId. | COMMENT |
| LOW⚡ | ts/tests/e2e/context-switching.spec.ts | 258 | // Step 2: Reset to Basic + Default so the starting state is deterministic. | COMMENT |
| LOW⚡ | ts/tests/e2e/context-switching.spec.ts | 264 | // Step 3: Switch to Cloze. NoteEditor reads _nt_{cloze}_lastDeck and | COMMENT |
| LOW⚡ | ts/tests/e2e/context-switching.spec.ts | 268 | // Step 4: Deck chooser must update on its own. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | qt/hatch_build.py | 56 | # For editable installs, just add anki without version constraint | COMMENT |
| MEDIUM | qt/tests/launch_anki_for_e2e.py | 102 | # Headless Qt: the e2e harness only needs mediasrv's HTTP stack, | COMMENT |
| MEDIUM | ts/licenses.json | 789 | "repository": "https://github.com/mourner/robust-predicates", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | qt/aqt/sound.py | 705 | # Check if we need to convert float samples to int16 | COMMENT |
| LOW | qt/aqt/importing.py | 142 | # Check if the entered value is valid and if not fallback to default | COMMENT |
| LOW | docs/syncserver/entrypoint.sh | 15 | # Check if group exists, create if not | COMMENT |
| LOW | docs/syncserver/entrypoint.sh | 20 | # Check if user exists, create if not | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pylib/anki/media.py | 182 | CODE | |
| LOW | qt/aqt/studydeck.py | 30 | CODE | |
| LOW | qt/aqt/utils.py | 342 | CODE | |
| LOW | qt/aqt/utils.py | 127 | CODE | |
| LOW | qt/aqt/mediasrv.py | 744 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | qt/aqt/importing.py | 446 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | qt/aqt/mediasrv.py | 450 | def handle_request(pathin: str) -> Response: | CODE |