CLI to manage emails
This report summarizes scanner evidence for pimalaya/himalaya, a Rust project with 7,423 GitHub stars. SynthScan examined 52,654 lines of code across 644 source files, recording 321 pattern matches distributed across 3 syntactic categories. The legacy adjusted pattern signal is 7.3 (Moderate 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.
Can maintainers explain intent, assumptions, and trade-offs? 232 finding(s).
Are imports declared and package/API names verified? 53 finding(s).
Are wrappers, guards, and repeated structures necessary? 36 finding(s).
Which changes need focused human review? 321 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
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 321 distinct pattern matches across 3 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 |
|---|---|---|---|---|
| LOW | config.sample.toml | 1 | # ================================================================================ | COMMENT |
| LOW | config.sample.toml | 21 | # Global config | COMMENT |
| LOW | config.sample.toml | 41 | # themselves. | COMMENT |
| LOW | config.sample.toml | 61 | COMMENT | |
| LOW | config.sample.toml | 81 | # listing and to the protocol-specific ones alike, so one key covers every | COMMENT |
| LOW | config.sample.toml | 101 | # -------------------------------------------------------------------------------- | COMMENT |
| LOW | config.sample.toml | 121 | COMMENT | |
| LOW | config.sample.toml | 141 | # Gmail and Graph report their roles, IMAP and mbox the inbox alone for now, | COMMENT |
| LOW | config.sample.toml | 161 | # Address this account sends as, and the name it carries. They fill the `From` | COMMENT |
| LOW | config.sample.toml | 181 | #envelope.list.datetime-local-tz = false | COMMENT |
| LOW | config.sample.toml | 201 | #imap.server = "imaps://example.com:993" | COMMENT |
| LOW | config.sample.toml | 221 | COMMENT | |
| LOW | config.sample.toml | 241 | # SASL OAUTHBEARER, whose GS2 host and port come from the server URL. | COMMENT |
| LOW | config.sample.toml | 261 | # https://www.rfc-editor.org/rfc/rfc4959.html | COMMENT |
| LOW | config.sample.toml | 281 | # JMAP config | COMMENT |
| LOW | config.sample.toml | 301 | # Exactly one of `header`, `bearer` and `basic`. | COMMENT |
| LOW | config.sample.toml | 321 | # `drafts`-role one is used; `himalaya jmap mailbox query --role drafts` finds | COMMENT |
| LOW | config.sample.toml | 341 | # The mailbox owner, defaulting to "me", the authenticated user. | COMMENT |
| LOW | config.sample.toml | 361 | # -------------------------------------------------------------------------------- | COMMENT |
| LOW | config.sample.toml | 381 | #msgraph.alpn = ["http/1.1"] | COMMENT |
| LOW | config.sample.toml | 401 | # Read custom keywords from a body header instead: `x-keywords` is the | COMMENT |
| LOW | config.sample.toml | 421 | # `INBOX` mailbox is the file named so below the root. | COMMENT |
| LOW | config.sample.toml | 441 | # Himalaya keeps an index of each mbox file and the envelopes it already read | COMMENT |
| LOW | config.sample.toml | 461 | # under. Leave it unset: a store synced by one account is read as that one. Set | COMMENT |
| LOW | config.sample.toml | 481 | # a full URL, `smtp://` being cleartext with an optional STARTTLS upgrade. | COMMENT |
| LOW | config.sample.toml | 501 | # ALPN identifiers offered during the TLS handshake, defaulting to ["smtp"]. An | COMMENT |
| LOW | config.sample.toml | 521 | # SASL OAUTHBEARER, whose GS2 host and port come from the server URL. | COMMENT |
| LOW | config.sample.toml | 541 | # `sieves://` is for the deployments listening for a handshake straight away, | COMMENT |
| LOW | config.sample.toml | 561 | COMMENT | |
| LOW | src/error.rs | 1 | //! # Error codes | COMMENT |
| LOW | src/config.rs | 101 | /// himalaya-tui, whose own top-level fields are ignored here. | COMMENT |
| LOW | src/config.rs | 301 | } | COMMENT |
| LOW | src/config.rs | 321 | pub email: Option<String>, | COMMENT |
| LOW | src/config.rs | 341 | pub signature_delim: Option<String>, | COMMENT |
| LOW | src/config.rs | 361 | /// its own block names one. | COMMENT |
| LOW | src/config.rs | 381 | pub m2dir: Option<M2dirConfig>, | COMMENT |
| LOW | src/config.rs | 401 | #[serde(rename_all = "kebab-case", deny_unknown_fields)] | COMMENT |
| LOW | src/config.rs | 421 | #[serde(default)] | COMMENT |
| LOW | src/config.rs | 441 | pub name_color: Option<Color>, | COMMENT |
| LOW | src/config.rs | 461 | #[serde(default)] | COMMENT |
| LOW | src/config.rs | 481 | /// The written body above the quoted source body. | COMMENT |
| LOW | src/config.rs | 521 | /// `attachment list` rendering options under `attachment.list.*`. | COMMENT |
| LOW | src/config.rs | 561 | /// Per-column colors of the rendered table. | COMMENT |
| LOW | src/config.rs | 581 | pub struct EnvelopeListConfig { | COMMENT |
| LOW | src/config.rs | 621 | /// Color of the ATT column. | COMMENT |
| LOW | src/config.rs | 641 | pub struct TableConfig { | COMMENT |
| LOW | src/config.rs | 701 | pub struct ImapConfig { | COMMENT |
| LOW | src/config.rs | 721 | /// | COMMENT |
| LOW | src/config.rs | 741 | /// RFC 2971 `ID` extension quirks. | COMMENT |
| LOW | src/config.rs | 761 | pub fallback: Option<bool>, | COMMENT |
| LOW | src/config.rs | 781 | } | COMMENT |
| LOW | src/config.rs | 801 | /// dovecot-keywords file, which maps a lowercase info-section letter | COMMENT |
| LOW | src/config.rs | 821 | } | COMMENT |
| LOW | src/config.rs | 841 | pub root: PathBuf, | COMMENT |
| LOW | src/config.rs | 861 | } | COMMENT |
| LOW | src/config.rs | 881 | /// Per-account `mbox.lock.*` options, both locks taken by default. | COMMENT |
| LOW | src/config.rs | 921 | #[serde(deserialize_with = "shell_expanded_path")] | COMMENT |
| LOW | src/config.rs | 941 | /// verbatim, `smtp://` being cleartext with an optional STARTTLS | COMMENT |
| LOW | src/config.rs | 961 | default = "default_smtp_alpn", | COMMENT |
| LOW | src/config.rs | 981 | /// TLS provider and custom certificate used by the connection. | COMMENT |
| 172 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | config.sample.toml | 18 | # ================================================================================ | COMMENT |
| MEDIUM⚡ | config.sample.toml | 20 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config.sample.toml | 22 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config.sample.toml | 99 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config.sample.toml | 101 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config.sample.toml | 110 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config.sample.toml | 112 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config.sample.toml | 122 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config.sample.toml | 124 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config.sample.toml | 131 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config.sample.toml | 133 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config.sample.toml | 330 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config.sample.toml | 332 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config.sample.toml | 339 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config.sample.toml | 359 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config.sample.toml | 361 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config.sample.toml | 369 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config.sample.toml | 533 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config.sample.toml | 535 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | config.sample.toml | 1 | # ================================================================================ | COMMENT |
| MEDIUM | config.sample.toml | 75 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | config.sample.toml | 77 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | config.sample.toml | 150 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | config.sample.toml | 152 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | config.sample.toml | 191 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | config.sample.toml | 194 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | config.sample.toml | 280 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | config.sample.toml | 284 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | config.sample.toml | 389 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | config.sample.toml | 391 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | config.sample.toml | 410 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | config.sample.toml | 413 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | config.sample.toml | 445 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | config.sample.toml | 448 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | config.sample.toml | 475 | # -------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | config.sample.toml | 478 | # -------------------------------------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | config.sample.toml | 238 | #imap.sasl.login.username = "user@example.com" | COMMENT |
| LOW⚡ | config.sample.toml | 243 | #imap.sasl.oauthbearer.username = "user@example.com" | COMMENT |
| LOW⚡ | config.sample.toml | 249 | #imap.sasl.xoauth2.username = "user@example.com" | COMMENT |
| LOW⚡ | config.sample.toml | 254 | #imap.sasl.scram-sha-256.username = "user@example.com" | COMMENT |
| LOW⚡ | config.sample.toml | 518 | #smtp.sasl.login.username = "user@example.com" | COMMENT |
| LOW⚡ | config.sample.toml | 522 | #smtp.sasl.oauthbearer.username = "user@example.com" | COMMENT |
| LOW⚡ | config.sample.toml | 526 | #smtp.sasl.xoauth2.username = "user@example.com" | COMMENT |
| LOW⚡ | config.sample.toml | 530 | #smtp.sasl.scram-sha-256.username = "user@example.com" | COMMENT |
| LOW⚡ | config.sample.toml | 571 | #sieve.sasl.plain.username = "user@example.com" | COMMENT |
| LOW⚡ | config.sample.toml | 573 | #sieve.sasl.login.username = "user@example.com" | COMMENT |
| LOW⚡ | config.sample.toml | 575 | #sieve.sasl.scram-sha-256.username = "user@example.com" | COMMENT |
| LOW | config.sample.toml | 165 | #email = "alice@example.org" | COMMENT |
| LOW⚡ | config.sample.toml | 232 | imap.sasl.plain.username = "user@example.com" | CODE |
| LOW | config.sample.toml | 312 | #jmap.auth.basic.username = "user@example.com" | COMMENT |
| LOW⚡ | config.sample.toml | 513 | smtp.sasl.plain.username = "user@example.com" | CODE |
| LOW⚡ | MIGRATION.md | 148 | imap.sasl.plain.authcid = "user@example.com" | CODE |
| LOW⚡ | MIGRATION.md | 154 | imap.sasl.login.username = "user@example.com" | CODE |
| LOW⚡ | MIGRATION.md | 158 | imap.sasl.oauthbearer.username = "user@example.com" | CODE |
| LOW⚡ | MIGRATION.md | 164 | imap.sasl.xoauth2.username = "user@example.com" | CODE |
| LOW⚡ | MIGRATION.md | 168 | imap.sasl.scram-sha-256.username = "user@example.com" | CODE |
| LOW | MIGRATION.md | 215 | jmap.auth.basic.username = "user@example.com" | CODE |
| LOW | src/config.rs | 1582 | from = "alice@example.org" | CODE |
| LOW | src/config.rs | 1593 | assert_eq!(account.email.as_deref(), Some("alice@example.org")); | CODE |
| LOW | src/pimdir/backend.rs | 1867 | &format!("user{}@example.org", i % 5), | CODE |
| LOW | src/pimdir/backend.rs | 1871 | from.push(person("second@example.org", Some("Second"))); | CODE |
| LOW | src/pimdir/backend.rs | 1885 | to: vec![person("team@example.org", None)], | CODE |
| LOW⚡ | src/wizard/discover.rs | 413 | prompted_email("alice@example.org"), | CODE |
| LOW⚡ | src/wizard/discover.rs | 414 | Some("alice@example.org") | CODE |
| LOW⚡ | src/wizard/discover.rs | 419 | assert_eq!(prompted_email("@example.org"), None); | CODE |
| LOW | src/shared/message/handler.rs | 238 | "a@example.org", | CODE |
| LOW | src/shared/message/read.rs | 907 | { "name": null, "email": "dave@example.org" }, | CODE |
| LOW | src/shared/message/read.rs | 1360 | serde_json::json!([{ "name": null, "email": "dave@example.org" }]) | CODE |
| LOW⚡ | src/shared/message/builder.rs | 647 | |name: Option<&str>| vec![(name.map(str::to_owned), "alice@example.org".into())]; | CODE |
| LOW⚡ | src/shared/message/builder.rs | 652 | let mailboxes = parse_mailboxes("alice@example.org").unwrap(); | CODE |
| LOW⚡ | src/shared/message/builder.rs | 662 | assert_eq!(mailboxes[0], (None, "alice@example.org".into())); | CODE |
| LOW⚡ | src/shared/message/builder.rs | 663 | assert_eq!(mailboxes[1], (Some("Bob".into()), "bob@example.org".into())); | CODE |
| LOW⚡ | src/shared/message/builder.rs | 680 | assert_eq!(from.address(), Some("alice@example.org")); | CODE |
| LOW⚡ | src/shared/message/builder.rs | 686 | let raw = build(args("sender@example.org", &to, None, "hi"), None).unwrap(); | CODE |
| LOW⚡ | src/shared/message/builder.rs | 695 | assert_eq!(to_addr.address(), Some("alice@example.org")); | CODE |
| LOW⚡ | src/shared/message/builder.rs | 701 | "\"Doe, Alice\" <alice@example.org>, bob@example.org".to_string(), | CODE |
| LOW⚡ | src/shared/message/builder.rs | 702 | "carol@example.org".to_string(), | CODE |
| LOW⚡ | src/shared/message/builder.rs | 704 | let raw = build(args("sender@example.org", &to, None, "hi"), None).unwrap(); | CODE |
| LOW⚡ | src/shared/message/builder.rs | 710 | assert_eq!(to[0].address(), Some("alice@example.org")); | CODE |
| LOW⚡ | src/shared/message/builder.rs | 711 | assert_eq!(to[1].address(), Some("bob@example.org")); | CODE |
| LOW⚡ | src/shared/message/builder.rs | 712 | assert_eq!(to[2].address(), Some("carol@example.org")); | CODE |
| LOW | src/shared/envelope/list.rs | 387 | email: String::from("eve@example.org"), | CODE |
| LOW⚡ | src/account/context.rs | 649 | email: Some("alice@example.org".to_string()), | CODE |
| LOW⚡ | src/account/context.rs | 656 | (Some("alice@example.org"), Some("Alice")), | CODE |
| LOW⚡ | src/account/context.rs | 662 | account.resolve_from(Some("alias@example.org")), | CODE |
| LOW⚡ | src/account/context.rs | 663 | (Some("alias@example.org"), None), | CODE |
| LOW | src/gmail/search.rs | 173 | assert_eq!(q("to bob@example.org"), "to:bob@example.org"); | CODE |
| LOW | src/email/search/eval.rs | 159 | email: String::from("alice@example.org"), | CODE |
| LOW | src/email/search/eval.rs | 163 | email: String::from("team@example.org"), | CODE |