Repository Analysis

M66B/FairEmail

Fully featured, open source, privacy friendly email app for Android

2.7 Likely human-written View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of M66B/FairEmail, a Java project with 4,487 GitHub stars. SynthScan v2.0 examined 853,070 lines of code across 2301 source files, recording 330 pattern matches distributed across 7 syntactic categories. The overall adjusted score of 2.7 places this repository in the Likely human-written band.

The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).

2.7
Adjusted Score
2.7
Raw Score
100%
Time Factor
2026-07-14
Last Push
4.5K
Stars
Java
Language
853.1K
Lines of Code
2.3K
Files
330
Pattern Hits
2026-07-14
Scan Date
0.07
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 168HIGH 1MEDIUM 2LOW 159

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 330 distinct pattern matches across 7 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.

Hallucination Indicators168 hits · 2100 pts
SeverityFileLineSnippetContext
CRITICALindex.html184 at io.requery.android.database.sqlite.SQLiteConnection.nativeExecute(SourceFile:-2)CODE
CRITICALindex.html185 at io.requery.android.database.sqlite.SQLiteConnection.execute(SQLiteConnection:595)CODE
CRITICALindex.html186 at io.requery.android.database.sqlite.SQLiteSession.endTransactionUnchecked(SQLiteSession:447)CODE
CRITICALindex.html187 at io.requery.android.database.sqlite.SQLiteSession.endTransaction(SQLiteSession:411)CODE
CRITICALindex.html188 at io.requery.android.database.sqlite.SQLiteDatabase.endTransaction(SQLiteDatabase:551)CODE
CRITICALFAQ.md191 at io.requery.android.database.sqlite.SQLiteConnection.nativeExecute(SourceFile:-2)CODE
CRITICALFAQ.md192 at io.requery.android.database.sqlite.SQLiteConnection.execute(SQLiteConnection:595)CODE
CRITICALFAQ.md193 at io.requery.android.database.sqlite.SQLiteSession.endTransactionUnchecked(SQLiteSession:447)CODE
CRITICALFAQ.md194 at io.requery.android.database.sqlite.SQLiteSession.endTransaction(SQLiteSession:411)CODE
CRITICALFAQ.md195 at io.requery.android.database.sqlite.SQLiteDatabase.endTransaction(SQLiteDatabase:551)CODE
CRITICALapp/src/main/java/androidx/room/TableInfo.java694 ? Collections.nCopies(columns.size(), androidx.room.Index.Order.ASC.name())CODE
CRITICAL…java/androidx/emoji2/text/flatbuffer/MetadataList.java34 public androidx.emoji2.text.flatbuffer.MetadataItem.Vector listVector() { return listVector(new androidx.emoji2.text.fCODE
CRITICALapp/src/main/java/javax/mail/EventQueue.java165 at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireInterruptibly(AbstractQueuedSynchronizer.java:1248)CODE
CRITICALapp/src/main/java/javax/mail/EventQueue.java166 at java.util.concurrent.locks.ReentrantLock.lockInterruptibly(ReentrantLock.java:344)CODE
CRITICALapp/src/main/java/javax/mail/internet/MimeUtility.java1340 javax.mail.internet.MimeUtility.class.getResourceAsStream(CODE
CRITICALapp/src/main/java/eu/faircode/email/MessageHelper.java4945 if (!org.apache.poi.hsmf.datatypes.MAPIProperty.RTF_COMPRESSED.equals(attr.getProperty()) &&CODE
CRITICALapp/src/main/java/eu/faircode/email/MessageHelper.java4946 !org.apache.poi.hsmf.datatypes.MAPIProperty.BODY_HTML.equals(attr.getProperty()))CODE
CRITICALapp/src/main/java/eu/faircode/email/MessageHelper.java5305 at com.sun.mail.util.ASCIIUtility.getBytes(ASCIIUtility:279)CODE
CRITICAL…p/src/main/java/eu/faircode/email/EditTextCompose.java814 // at com.android.internal.inputmethod.EditableInputConnection.commitText(EditableInputConnectionCOMMENT
CRITICAL…/src/main/java/eu/faircode/email/EncryptionHelper.java34 at org.apache.harmony.security.utils.JarUtils.verifySignature(JarUtils.java:223)CODE
CRITICALapp/src/main/java/eu/faircode/email/FragmentOAuth.java425 at net.openid.appauth.browser.CustomTabManager.bind(SourceFile:27)CODE
CRITICALapp/src/main/java/eu/faircode/email/EditTextPlain.java88 at com.android.internal.widget.EditableInputConnection.commitText(EditableInputConnection.jaCODE
CRITICALapp/src/main/java/eu/faircode/email/EditTextPlain.java91 at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.CODE
CRITICALapp/src/main/java/eu/faircode/email/EditTextPlain.java113 at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.jaCODE
CRITICALapp/src/main/java/eu/faircode/email/ActivityMain.java377 java.lang.NullPointerException: Attempt to invoke virtual method 'int com.android.seCODE
CRITICALapp/src/main/java/eu/faircode/email/ActivityMain.java392 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)CODE
CRITICALapp/src/main/java/eu/faircode/email/ActivityMain.java397 at com.android.server.am.TaskChangeNotificationController.forAllLocalListeners(TCODE
CRITICALapp/src/main/java/eu/faircode/email/ActivityMain.java398 at com.android.server.am.TaskChangeNotificationController.notifyTaskStackChangedCODE
CRITICALapp/src/main/java/eu/faircode/email/Helper.java1375 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)CODE
CRITICALapp/src/main/java/eu/faircode/email/Helper.java2773 at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBCODE
CRITICALapp/src/main/java/eu/faircode/email/Helper.java2774 at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:157)CODE
CRITICALapp/src/main/java/eu/faircode/email/Helper.java2775 at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.CODE
CRITICALapp/src/main/java/eu/faircode/email/Helper.java2776 at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.CODE
CRITICALapp/src/main/java/eu/faircode/email/Helper.java3360 at androidx.core.hardware.fingerprint.FingerprintManagerCompat.isHardwareDetected(SourceFile:3)CODE
CRITICALapp/src/main/java/eu/faircode/email/Helper.java3617 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941)CODE
CRITICAL…rc/main/java/eu/faircode/email/ServiceSynchronize.java1115 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)CODE
CRITICAL…rc/main/java/eu/faircode/email/ServiceSynchronize.java1983 at com.sun.mail.imap.IMAPFolder.open(SourceFile:61)CODE
CRITICAL…rc/main/java/eu/faircode/email/ServiceSynchronize.java1984 at com.sun.mail.imap.IMAPFolder.open(SourceFile:1)CODE
CRITICAL…rc/main/java/eu/faircode/email/ServiceSynchronize.java1990 at com.sun.mail.iap.Protocol.handleResult(SourceFile:8)CODE
CRITICAL…rc/main/java/eu/faircode/email/ServiceSynchronize.java1991 at com.sun.mail.imap.protocol.IMAPProtocol.select(SourceFile:19)CODE
CRITICAL…rc/main/java/eu/faircode/email/ServiceSynchronize.java1992 at com.sun.mail.imap.IMAPFolder.open(SourceFile:16)CODE
CRITICAL…rc/main/java/eu/faircode/email/ServiceSynchronize.java2001 at com.sun.mail.imap.IMAPFolder.open(SourceFile:61)CODE
CRITICAL…rc/main/java/eu/faircode/email/ServiceSynchronize.java2002 at com.sun.mail.imap.IMAPFolder.open(SourceFile:1)CODE
CRITICAL…rc/main/java/eu/faircode/email/ServiceSynchronize.java2013 at com.sun.mail.iap.Protocol.handleResult(SourceFile:8)CODE
CRITICAL…rc/main/java/eu/faircode/email/ServiceSynchronize.java2014 at com.sun.mail.imap.protocol.IMAPProtocol.select(SourceFile:19)CODE
CRITICAL…rc/main/java/eu/faircode/email/ServiceSynchronize.java2015 at com.sun.mail.imap.IMAPFolder.open(SourceFile:16)CODE
CRITICAL…rc/main/java/eu/faircode/email/ServiceSynchronize.java2114 at com.sun.mail.imap.IMAPFolder.handleIdle(SourceFile:252)CODE
CRITICAL…rc/main/java/eu/faircode/email/ServiceSynchronize.java2115 at com.sun.mail.imap.IMAPFolder.idle(SourceFile:7)CODE
CRITICAL…rc/main/java/eu/faircode/email/ServiceSynchronize.java2380 at com.sun.mail.imap.IMAPFolder.open(SourceFCODE
CRITICAL…rc/main/java/eu/faircode/email/ServiceSynchronize.java2381 at com.sun.mail.imap.IMAPFolder.open(SourceFCODE
CRITICAL…rc/main/java/eu/faircode/email/ServiceSynchronize.java2390 at com.sun.mail.iap.Protocol.handleResult(SoCODE
CRITICAL…rc/main/java/eu/faircode/email/ServiceSynchronize.java2391 at com.sun.mail.imap.protocol.IMAPProtocol.sCODE
CRITICAL…rc/main/java/eu/faircode/email/ServiceSynchronize.java2392 at com.sun.mail.imap.IMAPFolder.open(SourceFCODE
CRITICALapp/src/main/java/eu/faircode/email/StyleHelper.java1934 at androidx.core.content.res.ResourcesCompat.loadFont(SourceFile:17)CODE
CRITICALapp/src/main/java/eu/faircode/email/StyleHelper.java1935 at androidx.core.content.res.ResourcesCompat.loadFont(SourceFile:3)CODE
CRITICALapp/src/main/java/eu/faircode/email/StyleHelper.java1936 at androidx.core.content.res.ResourcesCompat.getFont(SourceFile:2)CODE
CRITICAL…p/src/main/java/eu/faircode/email/FixedScrollView.java94 at com.android.internal.policy.DecorView.onLayout(DecorView.java:889)CODE
CRITICALapp/src/main/java/eu/faircode/email/Core.java2837 06-21 10:02:38.035 9927 10024 E fairemail: at com.sun.mail.imap.IMAPStore.newIMAPFolder(SourceCODE
CRITICALapp/src/main/java/eu/faircode/email/Core.java2838 06-21 10:02:38.035 9927 10024 E fairemail: at com.sun.mail.imap.DefaultFolder.listSubscribed(SCODE
CRITICALapp/src/main/java/eu/faircode/email/Core.java3816 at com.sun.mail.pop3.POP3Message.loadHeaders(SourceFile:15)CODE
108 more matches not shown…
Over-Commented Block154 hits · 152 pts
SeverityFileLineSnippetContext
LOWapp/src/extra/java/eu/faircode/email/Bimi.java241 // https://datatracker.ietf.org/doc/html/rfc3709#page-6COMMENT
LOWapp/src/main/java/androidx/emoji2/text/EmojiCompat.java561 @SuppressWarnings("GuardedBy") // same rationale as double-check lockCOMMENT
LOW…/androidx/recyclerview/selection/SelectionTracker.java781 ResetManager<K> resetMgr = new ResetManager<>();COMMENT
LOWapp/src/main/java/eu/faircode/email/MessageHelper.java381 // FlagsCOMMENT
LOWapp/src/main/java/eu/faircode/email/MessageHelper.java3201 // By-domain = "BY" FWS Extended-Domain CFWSCOMMENT
LOW…/main/java/eu/faircode/email/AlarmManagerCompatEx.java41 try {COMMENT
LOW…p/src/main/java/eu/faircode/email/EditTextCompose.java801 }COMMENT
LOWapp/src/main/java/eu/faircode/email/EmailProvider.java761 // <socketType>SSL</socketType>COMMENT
LOWapp/src/main/java/eu/faircode/email/Core.java641 // com.sun.mail.iap.BadCommandException: BAD [TOOBIG] Message too largeCOMMENT
LOWapp/src/main/java/eu/faircode/email/Core.java661 // Fetch: BAD Error in IMAP command FETCH: Invalid messageset (n.nnn + n .nnn secs).COMMENT
LOWapp/src/main/java/eu/faircode/email/Core.java681 // Move: NO mailbox selected READ-ONLYCOMMENT
LOWapp/src/main/java/eu/faircode/email/Core.java701 // Add: NO [OVERQUOTA] Quota exceeded (mailbox for user is full) (n.nnn + n.nnn secs).COMMENT
LOW…/src/main/java/eu/faircode/email/ConnectionHelper.java741 static boolean[] has46(Context context) {COMMENT
LOWapp/src/main/java/eu/faircode/email/Log.java381 }COMMENT
LOWapp/src/main/java/eu/faircode/email/Log.java401 // at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:273)COMMENT
LOWapp/src/main/java/eu/faircode/email/Log.java1581 return null;COMMENT
LOWapp/src/main/java/eu/faircode/email/EntityIdentity.java281 json.put("unicode", unicode);COMMENT
LOWapp/src/main/java/eu/faircode/email/EmailService.java181 // can be configured in the range 1024 to 16384.COMMENT
LOWapp/src/main/java/eu/faircode/email/ApplicationEx.java341 WorkerSync.init(this);COMMENT
LOW…c/main/java/eu/faircode/email/FragmentDialogPrint.java481 PrintDocumentAdapter adapter = printWebView.createPrintDocumentAdapter(jobName);COMMENT
LOWapp/src/main/jni/cld_3/protos/task_spec.pb.h1// Generated by the protocol buffer compiler. DO NOT EDIT!COMMENT
LOWapp/src/main/jni/cld_3/protos/task_spec.pb.h21COMMENT
LOWapp/src/main/jni/cld_3/protos/sentence.pb.h1// Generated by the protocol buffer compiler. DO NOT EDIT!COMMENT
LOWapp/src/main/jni/cld_3/protos/sentence.pb.h21COMMENT
LOWapp/src/main/jni/cld_3/protos/feature_extractor.pb.h1// Generated by the protocol buffer compiler. DO NOT EDIT!COMMENT
LOWapp/src/main/jni/cld_3/protos/feature_extractor.pb.h21COMMENT
LOWapp/src/main/jni/cld_3/src/feature_types.h21#include <algorithm>COMMENT
LOWapp/src/main/jni/cld_3/src/feature_types.h61COMMENT
LOWapp/src/main/jni/cld_3/src/feature_types.h121};COMMENT
LOW…/src/main/jni/cld_3/src/language_identifier_features.h21#include "feature_extractor.h"COMMENT
LOW…/src/main/jni/cld_3/src/language_identifier_features.h41 FeatureValue GetDomainSize() const override;COMMENT
LOW…/src/main/jni/cld_3/src/language_identifier_features.h81 // in the input). Otherwise, weighs each unique ngram by (ngram count) /COMMENT
LOWapp/src/main/jni/cld_3/src/casts.h21#ifndef CASTS_H_COMMENT
LOWapp/src/main/jni/cld_3/src/casts.h41// int i = * reinterpret_cast<int*>(&f); // WRONGCOMMENT
LOWapp/src/main/jni/cld_3/src/casts.h61//COMMENT
LOWapp/src/main/jni/cld_3/src/unicodetext.h1// Copyright (C) 2006 Google Inc.COMMENT
LOWapp/src/main/jni/cld_3/src/unicodetext.h21#include <utility>COMMENT
LOWapp/src/main/jni/cld_3/src/unicodetext.h41// 0x10FFFF], but UnicodeText has the additional restriction that itCOMMENT
LOWapp/src/main/jni/cld_3/src/fml_parser.h21//COMMENT
LOWapp/src/main/jni/cld_3/src/registry.h21//COMMENT
LOWapp/src/main/jni/cld_3/src/registry.h41//COMMENT
LOWapp/src/main/jni/cld_3/src/workspace.h21#define WORKSPACE_H_COMMENT
LOWapp/src/main/jni/cld_3/src/float16.h21#include "base.h"COMMENT
LOWapp/src/main/jni/cld_3/src/feature_extractor.h21// A feature extractor consists of a hierarchy of feature functions. EachCOMMENT
LOWapp/src/main/jni/cld_3/src/feature_extractor.h41#include <string>COMMENT
LOWapp/src/main/jni/cld_3/src/feature_extractor.h121// The generic feature extractor is the type-independent part of a featureCOMMENT
LOWapp/src/main/jni/cld_3/src/feature_extractor.h201COMMENT
LOWapp/src/main/jni/cld_3/src/feature_extractor.h321// OBJ: The "object" from which features are extracted; e.g., a sentence. ThisCOMMENT
LOWapp/src/main/jni/cld_3/src/feature_extractor.h381// are of type NES, which may be different from the type of the parent function.COMMENT
LOW…p/src/main/jni/cld_3/src/embedding_feature_extractor.h21#include <vector>COMMENT
LOWapp/src/main/jni/cld_3/src/nnet_language_identifier.h21#include "base.h"COMMENT
LOWapp/src/main/jni/cld_3/src/nnet_language_identifier.h81 // bytes and max_num_bytes_. If N is less than min_num_bytes_ long, then thisCOMMENT
LOWapp/src/main/jni/cld_3/src/nnet_language_identifier.h161 ContinuousBagOfNgramsFunction ngram_function_;COMMENT
LOWapp/src/main/jni/cld_3/src/relevant_script_feature.h21#include "sentence_features.h"COMMENT
LOWapp/src/main/jni/cld_3/src/embedding_network_params.h141 // are treated as repeated fields with 0 or 1 instances. As such, we haveCOMMENT
LOWapp/src/main/jni/cld_3/src/embedding_network.h21#include "embedding_network_params.h"COMMENT
LOWapp/src/main/jni/cld_3/src/base.h41#define CLD3_DISALLOW_COPY_AND_ASSIGN(TypeName) \COMMENT
LOWapp/src/main/jni/cld_3/src/base.h81 (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))COMMENT
LOWapp/src/main/jni/cld_3/src/script_span/stringpiece.h1// Copyright 2013 Google Inc. All Rights Reserved.COMMENT
LOWapp/src/main/jni/cld_3/src/script_span/port.h1// Copyright 2013 Google Inc. All Rights Reserved.COMMENT
94 more matches not shown…
AI Slop Vocabulary2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUM…dx/recyclerview/selection/DefaultSelectionTracker.java363 // representation of it. But there are some nuanced areas cases whereCOMMENT
MEDIUM…idx/recyclerview/selection/GestureSelectionHelper.java152 // Essentially, since this means all gesture movement is over, reset everything and applyCOMMENT
AI Response Leakage1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHFAQ.md1489If you can't solve the problem, [please contact me](#get-support), and I'll explain how to send the debug info for a proCODE
Fake / Example Data2 hits · 2 pts
SeverityFileLineSnippetContext
LOWapp/src/main/res/layout/include_message_addresses.xml364 android:text="user@example.org"CODE
LOWdecrypt/purify.min.js2!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&defineCODE
Hyper-Verbose Identifiers2 hits · 2 pts
SeverityFileLineSnippetContext
LOWapp/src/main/java/javax/mail/internet/MimeBodyPart.java1690 static class MimePartDataHandler extends DataHandler {CODE
LOWapp/src/main/java/javax/activation/DataHandler.java69public class DataHandler /*implements Transferable*/ {CODE
Slop Phrases1 hit · 1 pts
SeverityFileLineSnippetContext
LOWapp/src/main/java/javax/mail/package.html67Don't forget to see theCODE