Experience email the way you want with Mail0 – the first open source email app that puts your privacy and safety first. Join the discord: https://mail0.link/discord
This report summarizes scanner evidence for Mail-0/Zero, a TypeScript project with 10,872 GitHub stars. SynthScan examined 135,256 lines of code across 600 source files, recording 108 pattern matches distributed across 8 syntactic categories. The legacy adjusted pattern signal is 1.2 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 72 finding(s).
Are imports declared and package/API names verified? 36 finding(s).
Are wrappers, guards, and repeated structures necessary? 19 finding(s).
Which changes need focused human review? 108 finding(s).
Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 108 distinct pattern matches across 8 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | apps/server/src/trpc/trpc.ts | 41 | await ctx.c.var.auth.api.signOut({ headers: ctx.c.req.raw.headers }); | CODE |
| CRITICAL | apps/server/src/trpc/routes/user.ts | 6 | const { success, message } = await ctx.c.var.auth.api.deleteUser({ | CODE |
| CRITICAL | apps/server/src/lib/driver/google.ts | 119 | const response = await this.gmail.users.messages.attachments.get( | CODE |
| CRITICAL | apps/server/src/lib/driver/google.ts | 277 | const settings = await this.gmail.users.settings.sendAs.list({ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/docker/replace-placeholder.sh | 1 | # The MIT License (MIT) | COMMENT |
| LOW | apps/mail/app/(routes)/settings/shortcuts/page.tsx | 21 | description={m['pages.settings.shortcuts.description']()} | COMMENT |
| LOW | apps/mail/app/(routes)/settings/shortcuts/page.tsx | 101 | const displayKeys = formatDisplayKeys(keys); | COMMENT |
| LOW | apps/mail/app/(routes)/mail/create/page.tsx | 21 | // // Need to await searchParams in Next.js 15+ | COMMENT |
| LOW | apps/mail/app/(routes)/mail/create/page.tsx | 41 | // card: 'summary_large_image', | COMMENT |
| LOW | apps/mail/config/navigation.ts | 121 | // url: "/mail/inbox?category=social", | COMMENT |
| LOW | apps/mail/config/navigation.ts | 201 | }, | COMMENT |
| LOW | apps/mail/config/shortcuts.ts | 81 | const threadDisplayShortcuts: Shortcut[] = [ | COMMENT |
| LOW | apps/mail/config/shortcuts.ts | 261 | }, | COMMENT |
| LOW | apps/mail/config/shortcuts.ts | 301 | description: 'Exit selection mode', | COMMENT |
| LOW | apps/mail/config/shortcuts.ts | 321 | // action: 'expandEmailView', | COMMENT |
| LOW | apps/mail/config/shortcuts.ts | 341 | // { | COMMENT |
| LOW | apps/mail/providers/voice-provider.tsx | 21 | startConversation: (context?: VoiceConversationContext) => Promise<void>; | COMMENT |
| LOW | apps/mail/providers/voice-provider.tsx | 61 | setLastToolCall(null); | COMMENT |
| LOW | apps/mail/providers/voice-provider.tsx | 81 | // setLastToolCall(null); | COMMENT |
| LOW | …ps/mail/components/context/command-palette-context.tsx | 701 | // onClick: () => { | COMMENT |
| LOW | apps/mail/components/mail/mail-display.tsx | 761 | // ? getListUnsubscribeAction({ | COMMENT |
| LOW | apps/mail/components/create/email-composer.tsx | 841 | COMMENT | |
| LOW | apps/mail/lib/hotkeys/use-hotkey-utils.ts | 1 | // TODO: Implement shortcuts syncing and caching | COMMENT |
| LOW | apps/mail/lib/hotkeys/use-hotkey-utils.ts | 21 | COMMENT | |
| LOW | apps/server/src/lib/auth-providers.ts | 61 | // clientId: env.MICROSOFT_CLIENT_ID, | COMMENT |
| LOW | apps/server/src/lib/shortcuts.ts | 61 | // { keys: ['/'], action: 'search', type: 'single', description: 'Search', scope: 'global' }, | COMMENT |
| LOW | apps/server/src/lib/shortcuts.ts | 121 | // }, | COMMENT |
| LOW | apps/server/src/lib/shortcuts.ts | 141 | // scope: 'mail-list', | COMMENT |
| LOW | apps/server/src/lib/shortcuts.ts | 161 | // description: 'Move to folder', | COMMENT |
| LOW | apps/server/src/lib/driver/microsoft.ts | 1221 | // if (inReplyToHeader) inReplyTo = inReplyToHeader.value || undefined; | COMMENT |
| LOW | apps/server/src/lib/driver/microsoft.ts | 1301 | address: rec.email, | COMMENT |
| LOW | apps/server/src/routes/agent/mcp.ts | 561 | // }, | COMMENT |
| LOW | apps/server/src/routes/agent/mcp.ts | 581 | // ], | COMMENT |
| LOW | apps/server/src/routes/agent/mcp.ts | 601 | // type: 'text', | COMMENT |
| LOW | apps/server/src/routes/agent/tools.ts | 61 | // const askZeroMailbox = (connectionId: string) => | COMMENT |
| LOW | apps/server/src/routes/agent/tools.ts | 81 | // if (!threadResults.matches.length) { | COMMENT |
| LOW | apps/server/src/routes/agent/tools.ts | 101 | // execute: async ({ threadId, question }) => { | COMMENT |
| LOW | apps/server/src/routes/agent/tools.ts | 241 | // tool({ | COMMENT |
| LOW | apps/server/src/routes/agent/index.ts | 2021 | // } | COMMENT |
| LOW | apps/server/src/routes/agent/index.ts | 3881 | // JSON.stringify({ | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/mail/messages/tr.json | 70 | "placeholder": "Bir komut yazın veya arayın...", | CODE |
| LOW | apps/mail/messages/hu.json | 70 | "placeholder": "Írj be egy parancsot vagy keress...", | CODE |
| LOW | apps/mail/messages/nl.json | 70 | "placeholder": "Typ een opdracht of zoek...", | CODE |
| LOW | apps/mail/messages/zh_CN.json | 70 | "placeholder": "输入命令或搜索...", | CODE |
| LOW | apps/mail/messages/ja.json | 70 | "placeholder": "コマンドを入力するか検索...", | CODE |
| LOW | apps/mail/messages/de.json | 70 | "placeholder": "Befehl eingeben oder suchen...", | CODE |
| LOW | apps/mail/messages/ru.json | 70 | "placeholder": "Введите команду или поиск...", | CODE |
| LOW | apps/mail/messages/pl.json | 70 | "placeholder": "Wpisz polecenie lub szukaj...", | CODE |
| LOW | apps/mail/messages/pt.json | 70 | "placeholder": "Digite um comando ou pesquise...", | CODE |
| LOW | apps/mail/messages/en.json | 70 | "placeholder": "Type a command or search...", | CODE |
| LOW | apps/mail/messages/fr.json | 70 | "placeholder": "Tapez une commande ou recherchez...", | CODE |
| LOW | apps/mail/messages/hi.json | 70 | "placeholder": "कोई आदेश लिखें या खोजें...", | CODE |
| LOW | apps/mail/messages/ca.json | 70 | "placeholder": "Escriu una ordre o cerca...", | CODE |
| LOW | apps/mail/messages/ko.json | 70 | "placeholder": "명령어 입력 또는 검색...", | CODE |
| LOW | apps/mail/messages/vi.json | 70 | "placeholder": "Nhập lệnh hoặc tìm kiếm...", | CODE |
| LOW | apps/mail/messages/fa.json | 70 | "placeholder": "یک دستور را تایپ کنید یا جستجو کنید...", | CODE |
| LOW | apps/mail/messages/cs.json | 70 | "placeholder": "Napište příkaz nebo vyhledejte...", | CODE |
| LOW | apps/mail/messages/zh_TW.json | 70 | "placeholder": "輸入指令或搜尋...", | CODE |
| LOW | apps/mail/messages/lv.json | 70 | "placeholder": "Ieraksti komandu vai meklē...", | CODE |
| LOW | apps/mail/messages/es.json | 70 | "placeholder": "Escriba un comando o búsqueda...", | CODE |
| LOW | apps/mail/messages/ar.json | 70 | "placeholder": "اكتب أمرًا أو ابحث...", | CODE |
| LOW | apps/mail/lib/prompts.ts | 355 | <example>sendEmail({ to: [{ email: "user@example.com" }], subject: "Hello", message: "Body" })</example> | CODE |
| LOW | apps/mail/lib/auth-recovery.test.ts | 26 | 'user@example.com', | CODE |
| LOW | apps/mail/lib/auth-recovery.test.ts | 30 | expect(url.searchParams.get('login_hint')).toBe('user@example.com'); | CODE |
| LOW | apps/server/src/lib/gmail-quota-auth.test.ts | 43 | expect(governor.reserve).toHaveBeenCalledWith('user@example.com', 40, 'backfill'); | CODE |
| LOW | apps/server/src/lib/gmail-quota-auth.test.ts | 76 | expect(governor.reserve.mock.calls).toContainEqual(['user@example.com', 40, 'backfill']); | CODE |
| LOW | apps/server/src/lib/gmail-quota-auth.test.ts | 77 | expect(governor.reserve.mock.calls).toContainEqual(['user@example.com', 1, 'foreground']); | CODE |
| LOW | apps/server/src/lib/gmail-quota-auth.test.ts | 96 | 'user@example.com', | CODE |
| LOW | apps/server/src/lib/prompts.ts | 484 | <example>sendEmail({ to: [{ email: "user@example.com" }], subject: "Hello", message: "Body" })</example> | CODE |
| LOW | apps/server/src/lib/gmail-quota-client.test.ts | 71 | expect(store.status('user@example.com', Date.now()).mailboxUsed).toBe(400); | CODE |
| LOW | apps/server/src/lib/gmail-quota-client.test.ts | 86 | 'user@example.com', | CODE |
| LOW | apps/server/src/lib/imap/discovery.test.ts | 55 | 'me@example.org', | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/mail/config/shortcuts.ts | 29 | export function getDisplayKeysForShortcut(shortcut: Shortcut): string[] { | CODE |
| LOW | apps/mail/config/shortcuts.ts | 73 | export function enhanceShortcutsWithMapping(shortcuts: Shortcut[]): EnhancedShortcut[] { | CODE |
| LOW | apps/mail/components/ui/ai-sidebar.tsx | 365 | function useClearAiChatStateWhenDisabled() { | CODE |
| LOW | apps/mail/components/ui/chart.tsx | 293 | function getPayloadConfigFromPayload(config: ChartConfig, payload: unknown, key: string) { | CODE |
| LOW | apps/mail/lib/utils.ts | 422 | export function parseNaturalLanguageSearch(query: string): string { | CODE |
| LOW | apps/mail/lib/notes-utils.ts | 86 | export function borderToBackgroundColorClass(borderClass: string): string { | CODE |
| LOW | apps/mail/lib/notes-utils.ts | 130 | export function assignOrdersAfterPinnedReorder(notes: Note[]): Note[] { | CODE |
| LOW | apps/mail/lib/notes-utils.ts | 137 | export function assignOrdersAfterUnpinnedReorder(notes: Note[], pinnedNotesCount: number): Note[] { | CODE |
| LOW | apps/server/src/lib/mail-label-policy.ts | 26 | export function normalizeDurableLabelMutation(add: string[], remove: string[]) { | CODE |
| LOW | apps/server/src/lib/utils.ts | 214 | export function parseNaturalLanguageSearch(query: string): string { | CODE |
| LOW | apps/server/src/lib/assistant-forward.ts | 85 | export function materializeForwardAttachments(body: string, files: ForwardAttachment[]) { | CODE |
| LOW | apps/server/src/lib/assistant.ts | 171 | export async function bindAssistantConversation(userId: string, conversationId: string) { | CODE |
| LOW | apps/server/src/lib/assistant.ts | 379 | export async function authorizedAssistantContext( | CODE |
| LOW | apps/server/src/lib/gmail-push.ts | 17 | export function gmailSubscriptionConnection(subscription: string, projectId: string) { | CODE |
| LOW | apps/server/src/lib/chat-attachments.ts | 104 | export async function resolveAttachmentsForModel( | CODE |
| LOW | apps/server/src/lib/thread-list-summary.ts | 94 | export function repairStoredThreadSummary( | CODE |
| LOW | apps/server/src/lib/thread-list-summary.ts | 132 | export function resolveStoredThreadSummary( | CODE |
| LOW | …ver/src/lib/factories/subscription-factory.registry.ts | 21 | export function getAllRegisteredProviders(): EProviders[] { | CODE |
| LOW | apps/server/src/lib/analyze/interests.ts | 36 | export async function generateWhatUserCaresAbout( | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/README.md | 65 | ### Step 1: Create a new script file | COMMENT |
| LOW | scripts/README.md | 92 | ### Step 2: Register the command | COMMENT |
| LOW | scripts/README.md | 113 | ### Step 3: Run your script | COMMENT |
| LOW⚡ | scripts/register-elevenlabs-tools.ts | 500 | // Step 1: List existing tools | COMMENT |
| LOW⚡ | scripts/register-elevenlabs-tools.ts | 510 | // Step 2: Delete existing tools | COMMENT |
| LOW | scripts/register-elevenlabs-tools.ts | 525 | // Step 3: Prepare new tools | COMMENT |
| LOW | scripts/register-elevenlabs-tools.ts | 577 | // Step 4: Create new tools | COMMENT |
| LOW | scripts/register-elevenlabs-tools.ts | 608 | // Step 5: Update agent with tools (if agent ID provided) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | scripts/register-elevenlabs-tools.ts | 500 | // Step 1: List existing tools | COMMENT |
| LOW⚡ | scripts/register-elevenlabs-tools.ts | 510 | // Step 2: Delete existing tools | COMMENT |
| LOW | scripts/register-elevenlabs-tools.ts | 525 | // Step 3: Prepare new tools | COMMENT |
| LOW | scripts/register-elevenlabs-tools.ts | 577 | // Step 4: Create new tools | COMMENT |
| LOW | scripts/register-elevenlabs-tools.ts | 608 | // Step 5: Update agent with tools (if agent ID provided) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | apps/mail/components/create/email-phrases.ts | 70 | 'Let me know if you need any clarification ', | CODE |
| MEDIUM | apps/server/src/lib/brain.fallback.prompts.ts | 103 | <body>The mail team has sent out the 83(b) election. I've attached the proof of mailing. Let me kn | CODE |
| MEDIUM | apps/server/src/lib/brain.fallback.prompts.ts | 177 | <body>The mail team has sent out the 83(b) election. I've attached the proof of mailing. Let me kn | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/mail/app/entry.server.tsx | 7 | export default async function handleRequest( | CODE |