Repository Analysis

modoboa/modoboa

Mail hosting made simple

7.2 Low AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of modoboa/modoboa, a Python project with 3,528 GitHub stars. SynthScan v2.0 examined 95,829 lines of code across 784 source files, recording 549 pattern matches distributed across 13 syntactic categories. The overall adjusted score of 7.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).

7.2
Adjusted Score
7.2
Raw Score
100%
Time Factor
2026-07-14
Last Push
3.5K
Stars
Python
Language
95.8K
Lines of Code
784
Files
549
Pattern Hits
2026-07-14
Scan Date
0.02
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

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.

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 10HIGH 5MEDIUM 4LOW 530

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 549 distinct pattern matches across 13 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 Identifiers383 hits · 397 pts
SeverityFileLineSnippetContext
LOWmodoboa/ldapsync/lib.py192def import_accounts_from_ldap(config):CODE
LOWmodoboa/ldapsync/lib.py257def _check_dovecot_conf_value(name, value):CODE
LOWmodoboa/ldapsync/lib.py265def update_dovecot_config_file(config):CODE
LOWmodoboa/ldapsync/tests.py37 def test_username_with_dn_metacharacters_is_escaped(self):CODE
LOWmodoboa/ldapsync/tests.py97 def test_invalid_conf_file_path(self):CODE
LOWmodoboa/rspamd/api/v2/serializers.py45 def validate_selector_map_path(self, value):CODE
LOWmodoboa/calendars/tests.py76 def test_rights_file_generation(self):CODE
LOWmodoboa/calendars/tests.py112 def test_rights_file_generation_with_admin(self):CODE
LOWmodoboa/calendars/tests.py170 def test_create_calendar_rejects_rights_injection(self, client_mock):CODE
LOWmodoboa/calendars/tests.py278 def test_create_calendar_rejects_unowned_domain(self, client_mock):CODE
LOWmodoboa/calendars/tests.py376 def test_create_accessrule_denied_mailbox(self):CODE
LOWmodoboa/calendars/tests.py393 def test_create_accessrule_mailbox_not_found(self):CODE
LOWmodoboa/calendars/tests.py408 def test_create_accessrule_denied_calendar(self):CODE
LOWmodoboa/calendars/tests.py430 def test_update_accessrule_denied_calendar(self):CODE
LOWmodoboa/calendars/tests.py454 def test_rights_generation_excludes_forged_rule(self):CODE
LOWmodoboa/calendars/tests.py512 def test_update_accessrule_permission(self):CODE
LOWmodoboa/calendars/tests.py569 def test_get_user_events_wrong_calendar(self):CODE
LOWmodoboa/calendars/tests.py650 def test_move_event_between_cals(self):CODE
LOWmodoboa/calendars/tests.py672 def test_shared_events_own_domain(self):CODE
LOWmodoboa/calendars/tests.py679 def test_shared_events_cross_domain_denied(self):CODE
LOWmodoboa/calendars/tests.py711 def test_shared_events_import_cross_domain_denied(self):CODE
LOWmodoboa/policyd/handlers.py37def set_mailbox_message_limit(sender, instance, created, **kwargs):CODE
LOWmodoboa/policyd/core.py91def get_notification_recipients():CODE
LOWmodoboa/policyd/core.py276def start_reset_counters_coro():CODE
LOWmodoboa/policyd/tests.py309 def test_domain_signal_handler(self):CODE
LOWmodoboa/policyd/tests.py331 def test_domain_sent_messages_none_counter(self):CODE
LOWmodoboa/policyd/tests.py339 def test_mailbox_sent_messages_none_counter(self):CODE
LOWmodoboa/imap_migration/checks.py23def check_auto_creation_is_enabled(app_configs, **kwargs):CODE
LOWmodoboa/imap_migration/apps.py7def load_imapmigration_settings():CODE
LOWmodoboa/imap_migration/tests.py68 def test_authentication_forbidden_characters(self, mock_imap):CODE
LOWmodoboa/imap_migration/tests.py85 def test_authenticate_and_rename(self, mock_imap):CODE
LOWmodoboa/imap_migration/tests.py98 def test_authenticate_conflicts(self, mock_imap):CODE
LOWmodoboa/imap_migration/tests.py126 def test_generate_offlineimap_config(self):CODE
LOWmodoboa/imap_migration/tests.py182 def test_migration_list_cross_tenant_isolation(self):CODE
LOWmodoboa/imap_migration/tests.py236 def test_check_connection_denied_to_simple_users(self):CODE
LOWmodoboa/imap_migration/tests.py319 def test_folder_filters_reject_code_injection(self):CODE
LOWmodoboa/imap_migration/tests.py344 def test_folder_filter_exclude_rejects_invalid_regex(self):CODE
LOWmodoboa/imap_migration/tests.py349 def test_legitimate_folder_filters_accepted(self):CODE
LOWmodoboa/imap_migration/api/v2/serializers.py15def validate_no_code_injection(value):CODE
LOWmodoboa/imap_migration/api/v2/serializers.py47 def validate_folder_filter_exclude(self, value):CODE
LOWmodoboa/imap_migration/api/v2/serializers.py57 def validate_folder_filter_include(self, value):CODE
LOWmodoboa/transport/handlers.py19def serialize_transport_settings(sender, instance, **kwargs):CODE
LOWmodoboa/core/models.py46 def is_password_scheme_in_use(self, password_hasher: type[PasswordHasher]) -> bool:CODE
LOWmodoboa/core/checks.py70def check_rsa_private_key_exists(app_configs, **kwargs):CODE
LOWmodoboa/core/jobs.py33def communicate_with_public_api():CODE
LOWmodoboa/core/extensions.py52 def get_frontend_menu_entries(self) -> list[dict]:CODE
LOWmodoboa/core/extensions.py82 def get_frontend_ui_extensions(self) -> dict[str, list[dict]]:CODE
LOWmodoboa/core/utils.py92def check_for_deprecated_password_schemes() -> Optional[type[PasswordHasher]]: # NOQACODE
LOWmodoboa/core/mocks.py40def modo_api_versions_no_update(url, request):CODE
LOWmodoboa/core/password_hashers/__init__.py36def get_configured_password_hasher() -> type[PasswordHasher]:CODE
LOWmodoboa/core/password_hashers/utils.py70def cache_available_password_hasher(bypass_cache: bool = False):CODE
LOWmodoboa/core/password_hashers/base.py111 def get_deprecated_password_hashers(cls) -> list[type["PasswordHasher"]]:CODE
LOWmodoboa/core/tests/test_ldap.py26 def activate_ldap_authentication(self):CODE
LOWmodoboa/core/tests/test_ldap.py100 def test_searchbind_authentication(self):CODE
LOWmodoboa/core/tests/test_ldap.py123 def test_directbind_authentication(self):CODE
LOWmodoboa/core/tests/test_ldap.py154 def test_update_password_ldap(self):CODE
LOWmodoboa/core/tests/test_extensions.py118 def test_remote_url_passthrough(self):CODE
LOWmodoboa/core/tests/test_extensions.py131 def test_remote_static_path_resolved_via_static_url(self):CODE
LOWmodoboa/core/tests/test_extensions.py146 def test_remote_url_takes_precedence_over_static_path(self):CODE
LOWmodoboa/core/tests/test_extensions.py158 def test_remote_none_when_not_declared(self):CODE
323 more matches not shown…
Hallucination Indicators10 hits · 105 pts
SeverityFileLineSnippetContext
CRITICALmodoboa/core/password_validation.py3from django.core.exceptions import ValidationErrorCODE
CRITICALmodoboa/core/api/v1/serializers.py6from django.core.exceptions import ValidationErrorCODE
CRITICALmodoboa/core/api/v2/serializers.py13from django.core.exceptions import ValidationError as djangoValidationErrorCODE
CRITICALmodoboa/admin/lib.py14from django.core.exceptions import ValidationErrorCODE
CRITICALmodoboa/admin/models/alias.py7from django.core.exceptions import ValidationErrorCODE
CRITICALmodoboa/admin/models/domain.py7from django.core.exceptions import ValidationErrorCODE
CRITICALmodoboa/admin/api/v1/serializers.py6from django.core.exceptions import ValidationErrorCODE
CRITICALmodoboa/admin/api/v2/serializers.py7from django.core.exceptions import ValidationErrorCODE
CRITICALmodoboa/lib/validators.py5from django.core.exceptions import ValidationErrorCODE
CRITICALmodoboa/lib/tests/test_validators.py3from django.core.exceptions import ValidationErrorCODE
Unused Imports64 hits · 64 pts
SeverityFileLineSnippetContext
LOWmodoboa/ldapsync/apps.py8CODE
LOWmodoboa/rspamd/apps.py29CODE
LOWmodoboa/calendars/apps.py13CODE
LOWmodoboa/policyd/apps.py13CODE
LOWmodoboa/imap_migration/apps.py34CODE
LOWmodoboa/transport/apps.py8CODE
LOWmodoboa/core/apps.py37CODE
LOWmodoboa/core/password_hashers/__init__.py3CODE
LOWmodoboa/core/password_hashers/__init__.py3CODE
LOWmodoboa/core/password_hashers/__init__.py3CODE
LOWmodoboa/core/password_hashers/__init__.py3CODE
LOWmodoboa/core/password_hashers/__init__.py3CODE
LOWmodoboa/core/password_hashers/__init__.py3CODE
LOWmodoboa/core/password_hashers/__init__.py11CODE
LOWmodoboa/core/password_hashers/__init__.py11CODE
LOWmodoboa/core/password_hashers/base.py10CODE
LOWmodoboa/core/password_hashers/base.py11CODE
LOWmodoboa/core/views/__init__.py3CODE
LOWmodoboa/core/views/__init__.py3CODE
LOWmodoboa/core/views/__init__.py3CODE
LOWmodoboa/core/views/__init__.py3CODE
LOWmodoboa/core/views/__init__.py3CODE
LOWmodoboa/core/views/__init__.py3CODE
LOWmodoboa/core/views/__init__.py3CODE
LOWmodoboa/amavis/apps.py14CODE
LOWmodoboa/amavis/apps.py15CODE
LOWmodoboa/amavis/checks/__init__.py2CODE
LOWmodoboa/contacts/apps.py10CODE
LOWmodoboa/admin/apps.py17CODE
LOWmodoboa/admin/models/__init__.py3CODE
LOWmodoboa/admin/models/__init__.py4CODE
LOWmodoboa/admin/models/__init__.py4CODE
LOWmodoboa/admin/models/__init__.py4CODE
LOWmodoboa/admin/models/__init__.py5CODE
LOWmodoboa/admin/models/__init__.py6CODE
LOWmodoboa/admin/models/__init__.py7CODE
LOWmodoboa/admin/models/__init__.py8CODE
LOWmodoboa/admin/models/__init__.py8CODE
LOWmodoboa/admin/models/__init__.py8CODE
LOWmodoboa/admin/models/__init__.py8CODE
LOWmodoboa/admin/models/__init__.py9CODE
LOWmodoboa/admin/models/__init__.py9CODE
LOWmodoboa/limits/apps.py31CODE
LOWmodoboa/webmail/lib/__init__.py1CODE
LOWmodoboa/webmail/lib/__init__.py1CODE
LOWmodoboa/webmail/lib/__init__.py1CODE
LOWmodoboa/webmail/lib/__init__.py6CODE
LOWmodoboa/webmail/lib/__init__.py6CODE
LOWmodoboa/webmail/lib/__init__.py6CODE
LOWmodoboa/webmail/lib/__init__.py7CODE
LOWmodoboa/webmail/lib/__init__.py7CODE
LOWmodoboa/webmail/lib/__init__.py7CODE
LOWmodoboa/webmail/lib/__init__.py7CODE
LOWmodoboa/webmail/lib/__init__.py8CODE
LOWmodoboa/webmail/lib/__init__.py9CODE
LOWmodoboa/webmail/lib/imaputils.py12CODE
LOWmodoboa/lib/tests/__init__.py26CODE
LOWmodoboa/pdfcredentials/apps.py35CODE
LOWmodoboa/relaydomains/apps.py13CODE
LOWmodoboa/relaydomains/apps.py14CODE
4 more matches not shown…
Deep Nesting43 hits · 43 pts
SeverityFileLineSnippetContext
LOWmodoboa/ldapsync/lib.py192CODE
LOWmodoboa/rspamd/api/v2/serializers.py10CODE
LOWmodoboa/imap_migration/api/v2/serializers.py109CODE
LOWmodoboa/transport/backends.py31CODE
LOWmodoboa/core/password_hashers/utils.py17CODE
LOWmodoboa/core/api/v2/serializers.py243CODE
LOWmodoboa/amavis/lib.py179CODE
LOWmodoboa/amavis/sql_connector.py91CODE
LOWmodoboa/amavis/viewsets.py171CODE
LOWmodoboa/amavis/serializers.py36CODE
LOWmodoboa/contacts/lib/carddav.py346CODE
LOWmodoboa/contacts/lib/carddav.py382CODE
LOWmodoboa/admin/dns_checker.py123CODE
LOWmodoboa/admin/lib.py178CODE
LOWmodoboa/admin/lib.py247CODE
LOWmodoboa/admin/lib.py334CODE
LOWmodoboa/admin/handlers.py277CODE
LOW…doboa/admin/management/commands/subcommands/_import.py45CODE
LOW…doboa/admin/management/commands/subcommands/_import.py84CODE
LOW…doboa/admin/management/commands/subcommands/_repair.py26CODE
LOWmodoboa/admin/models/alias.py184CODE
LOWmodoboa/sievefilters/rfc6266.py57CODE
LOWmodoboa/sievefilters/api/v2/serializers.py69CODE
LOWmodoboa/sievefilters/api/v2/serializers.py125CODE
LOWmodoboa/webmail/mocks.py16CODE
LOWmodoboa/webmail/mocks.py42CODE
LOWmodoboa/webmail/tests/test_fetch_parser.py11CODE
LOWmodoboa/webmail/lib/fetch_parser.py131CODE
LOWmodoboa/webmail/lib/fetch_parser.py235CODE
LOWmodoboa/webmail/lib/rfc6266.py57CODE
LOWmodoboa/webmail/lib/imaputils.py147CODE
LOWmodoboa/webmail/lib/imaputils.py324CODE
LOWmodoboa/webmail/lib/imapemail.py143CODE
LOWmodoboa/webmail/lib/imapemail.py195CODE
LOWmodoboa/parameters/tools.py104CODE
LOWmodoboa/lib/email_utils.py121CODE
LOWmodoboa/lib/imap_utf7.py96CODE
LOWmodoboa/pdfcredentials/api/v2/serializers.py72CODE
LOWmodoboa/pdfcredentials/api/v2/tests.py49CODE
LOWmodoboa/pdfcredentials/api/v2/tests.py68CODE
LOWmodoboa/dmarc/lib.py169CODE
LOWmodoboa/dmarc/lib.py295CODE
LOWmodoboa/maillog/management/commands/logparser.py364CODE
Cross-File Repetition4 hits · 20 pts
SeverityFileLineSnippetContext
HIGHmodoboa/rspamd/apps.py0load core settings. this function must be manually called (see :file:`urls.py`) in order to load base settings.STRING
HIGHmodoboa/imap_migration/apps.py0load core settings. this function must be manually called (see :file:`urls.py`) in order to load base settings.STRING
HIGHmodoboa/core/apps.py0load core settings. this function must be manually called (see :file:`urls.py`) in order to load base settings.STRING
HIGHmodoboa/pdfcredentials/apps.py0load core settings. this function must be manually called (see :file:`urls.py`) in order to load base settings.STRING
Redundant / Tautological Comments12 hits · 18 pts
SeverityFileLineSnippetContext
LOWmodoboa/imap_migration/auth_backends.py77 # Check if old addresses must be convertedCOMMENT
LOWmodoboa/core/tests/test_core.py223 # Check if same hostname is not added more than onceCOMMENT
LOWmodoboa/admin/tests/test_alias_targets.py48 # Check if local domain is still allowedCOMMENT
LOWmodoboa/admin/models/domain.py256 # Check if domain's limit for domain admins is not reached yetCOMMENT
LOWmodoboa/admin/api/v2/tests.py352 # Check if self alias has been createdCOMMENT
LOWmodoboa/admin/api/v2/tests.py479 # Check if self alias has been deletedCOMMENT
LOWmodoboa/admin/api/v2/tests.py562 # Check if self aliases have been deletedCOMMENT
LOWmodoboa/admin/api/v2/tests.py696 # Check if self alias has been updatedCOMMENT
LOWmodoboa/limits/tests/test_domain_limits.py112 # Check if defined limit can't be exceededCOMMENT
LOWmodoboa/webmail/lib/fetch_parser.py152 # Check if we are parsing a list of mime part or aCOMMENT
LOWmodoboa/webmail/lib/fetch_parser.py173 # Check if previous element was a mime part. If so, we areCOMMENT
LOWmodoboa/pdfcredentials/api/v2/tests.py75 # Check if link is present in listing pageCOMMENT
Excessive Try-Catch Wrapping7 hits · 9 pts
SeverityFileLineSnippetContext
LOWmodoboa/core/context_processors.py17 except Exception:CODE
LOWmodoboa/core/management/commands/load_initial_data.py98 except Exception as e:CODE
LOWmodoboa/webmail/lib/attachments.py85 except Exception as e:CODE
LOWmodoboa/webmail/lib/attachments.py118 except Exception as e:CODE
LOW…tials/management/commands/reencrypt_pdf_credentials.py40 except Exception as exc:CODE
MEDIUMmodoboa/dmarc/lib.py228 print("Error: the attachment does not match the mimetype")CODE
MEDIUMmodoboa/maillog/lib.py20 print("Error: failed to convert date and time", file=sys.stderr)CODE
Over-Commented Block9 hits · 9 pts
SeverityFileLineSnippetContext
LOWmodoboa/core/management/commands/load_initial_data.py201# policy = create_user_and_policy("@{0}".format(dom.name))COMMENT
LOWmodoboa/amavis/models.py1# This is an auto-generated Django model module.COMMENT
LOWmodoboa/contacts/lib/carddav.py1# vim: set ts=4 sw=4 expandtab sts=4:COMMENT
LOWmodoboa/admin/tests/test_export.py101COMMENT
LOWmodoboa/admin/tests/test_export.py121COMMENT
LOWmodoboa/admin/tests/test_export.py141COMMENT
LOWfrontend/vite.config.js1// PluginsCOMMENT
LOWtest_project/test_project/settings.py281COMMENT
LOWtest_project/test_project/settings.py461 "ATOMIC_REQUESTS": True,COMMENT
Modern Structural Boilerplate8 hits · 8 pts
SeverityFileLineSnippetContext
LOWmodoboa/rspamd/jobs.py101def update_rspamd_maps(domain_ids: list[int]) -> None:CODE
LOWmodoboa/core/models.py134 def set_password(self, raw_value: str, curvalue: str | None = None) -> None:CODE
LOWmodoboa/core/views/__init__.py13__all__ = [CODE
LOWmodoboa/admin/models/__init__.py11__all__ = [CODE
LOWmodoboa/webmail/lib/__init__.py12__all__ = [CODE
LOWmodoboa/webmail/lib/imapheader.py15__all__ = [CODE
LOWmodoboa/parameters/tools.py237 def set_values(self, values: dict, app: str | None = None) -> None:CODE
LOWmodoboa/lib/imap_utf7.py169__all__ = [CODE
Self-Referential Comments2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMmodoboa/amavis/tests/test_handlers.py33 # Create a domain aliasCOMMENT
MEDIUMmodoboa/admin/api/v2/tests.py767 # Create an alias for another userCOMMENT
Magic Placeholder Names1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHdoc-ng/rest_api.md42 Authorization: Token <YOUR_TOKEN>CODE
AI Structural Patterns3 hits · 3 pts
SeverityFileLineSnippetContext
LOWmodoboa/calendars/mocks.py74CODE
LOWmodoboa/webmail/tests/test_fetch_parser.py29CODE
LOWmodoboa/parameters/tools.py71CODE
Fake / Example Data3 hits · 3 pts
SeverityFileLineSnippetContext
LOWmodoboa/autoconfig/tests.py37 resp = self.client.post(url, {"EmailAddress": "test@test.com"})CODE
LOWmodoboa/sievefilters/mocks.py31if anyof (header :contains "From" "user@example.com") {CODE
LOWmodoboa/sievefilters/api/v2/tests.py261 email_filter = "user@example.com"CODE