Zedis: A blazing-fast, native Redis GUI built with Rust and GPUI.
This report summarizes scanner evidence for vicanso/zedis, a Rust project with 2,140 GitHub stars. SynthScan examined 223,803 lines of code across 462 source files, recording 871 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 4.7 (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.
Can maintainers explain intent, assumptions, and trade-offs? 806 finding(s).
Are imports declared and package/API names verified? 1 finding(s).
Are wrappers, guards, and repeated structures necessary? 64 finding(s).
Which changes need focused human review? 871 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 871 distinct pattern matches across 9 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 | Cargo.toml | 81 | futures = { workspace = true } | COMMENT |
| LOW | Cargo.toml | 141 | COMMENT | |
| LOW | Cargo.toml | 161 | gpui-kit = { workspace = true, features = ["tree-sitter"] } | COMMENT |
| LOW | Cargo.toml | 181 | # SOCKS proxy connector (socks4/4a/5/5h URIs). Without it Proxy::new | COMMENT |
| LOW | Cargo.toml | 201 | # inflater behind `compression` is the C zstd (`include-flate` → `zstd-sys`), | COMMENT |
| LOW | Cargo.toml | 281 | percent-encoding = "2.3.2" | COMMENT |
| LOW | Cargo.toml | 421 | # features but no EXR ever reaches Zedis), so `opt-level = "s"` shrinks .text | COMMENT |
| LOW | bacon.toml | 21 | [jobs.clippy] | COMMENT |
| LOW | bacon.toml | 81 | # to have the cargo run output immediately displayed instead of waiting for | COMMENT |
| LOW | deny.toml | 1 | # cargo-deny — the dependency gate that runs on every PR and push touching | COMMENT |
| LOW | rust-toolchain.toml | 1 | # Pins the toolchain for everyone entering this directory — rustup reads | COMMENT |
| LOW | crates/zedis-db/src/key_metadata_manager.rs | 1 | // Copyright 2026 Tree xie. | COMMENT |
| LOW | crates/zedis-db/src/key_metadata_manager.rs | 21 | //! ```json | COMMENT |
| LOW | crates/zedis-db/src/error.rs | 1 | // Copyright 2026 Tree xie. | COMMENT |
| LOW | crates/zedis-db/src/error.rs | 21 | use crate::mem_store as store; | COMMENT |
| LOW | crates/zedis-db/src/error.rs | 41 | RedbTransaction { source: store::TransactionError }, | COMMENT |
| LOW | crates/zedis-db/src/lib.rs | 1 | // Copyright 2026 Tree xie. | COMMENT |
| LOW | crates/zedis-db/src/lib.rs | 81 | /// Per-(server, db) MRU of recently opened keys (JSON array of key names). | COMMENT |
| LOW | crates/zedis-db/src/mem_store.rs | 1 | // Copyright 2026 Tree xie. | COMMENT |
| LOW | crates/zedis-db/src/mem_store.rs | 21 | //! code verbatim and only their storage import is switched (ADR 9), the same | COMMENT |
| LOW | crates/zedis-db/src/backup.rs | 1 | // Copyright 2026 Tree xie. | COMMENT |
| LOW | crates/zedis-db/src/metrics_history.rs | 1 | // Copyright 2026 Tree xie. | COMMENT |
| LOW | crates/zedis-db/src/protos.rs | 1 | // Copyright 2026 Tree xie. | COMMENT |
| LOW | crates/zedis-db/src/scripts.rs | 1 | // Copyright 2026 Tree xie. | COMMENT |
| LOW | crates/zedis-db/src/scripts.rs | 21 | //! | COMMENT |
| LOW | crates/zedis-db/src/scripts.rs | 41 | //! `"$ZEDIS_KEY"` under `sh`, `!ZEDIS_KEY!` under `cmd /v:on` — which the shell | COMMENT |
| LOW | crates/zedis-db/src/scripts.rs | 61 | //! ## Viewers only decode — no write-back (deliberate, TODO on demand) | COMMENT |
| LOW | crates/zedis-db/src/scripts.rs | 121 | /// to add noticeable latency to the common case (a script that finishes in | COMMENT |
| LOW | crates/zedis-db/src/scripts.rs | 421 | COMMENT | |
| LOW | crates/zedis-db/src/history_manager.rs | 1 | // Copyright 2026 Tree xie. | COMMENT |
| LOW | crates/zedis-db/src/lua_scripts.rs | 1 | // Copyright 2026 Tree xie. | COMMENT |
| LOW | crates/zedis-db/src/lua_scripts.rs | 41 | /// body so it doesn't get serialized twice. | COMMENT |
| LOW | crates/zedis-db/src/trash.rs | 1 | // Copyright 2026 Tree xie. | COMMENT |
| LOW | crates/zedis-db/src/trash.rs | 21 | //! `[u32 LE meta_len][meta_json][payload]` so listings can decode the | COMMENT |
| LOW | crates/zedis-db/src/trash.rs | 41 | /// Pre-DUMP gate: skip trashing entirely when `MEMORY USAGE` estimates the | COMMENT |
| LOW | crates/zedis-ui/src/text_table.rs | 1 | // Copyright 2026 Tree xie. | COMMENT |
| LOW | crates/zedis-ui/src/about.rs | 1 | // Copyright 2026 Tree xie. | COMMENT |
| LOW | crates/zedis-ui/src/divider.rs | 1 | // Copyright 2026 Tree xie. | COMMENT |
| LOW | crates/zedis-ui/src/lib.rs | 1 | // Copyright 2026 Tree xie. | COMMENT |
| LOW | crates/zedis-ui/src/dialog.rs | 1 | // Copyright 2026 Tree xie. | COMMENT |
| LOW | crates/zedis-ui/src/dialog.rs | 21 | type ZedisDialogOnOk = Rc<dyn Fn(&ClickEvent, &mut Window, &mut App) -> bool + 'static>; | COMMENT |
| LOW | crates/zedis-ui/src/dialog.rs | 181 | /// stray Return after "Delete key" deletes it. OK still answers a click, | COMMENT |
| LOW | crates/zedis-ui/src/loading.rs | 1 | // Copyright 2026 Tree xie. | COMMENT |
| LOW | crates/zedis-ui/src/select.rs | 1 | // Copyright 2026 Tree xie. | COMMENT |
| LOW | crates/zedis-ui/src/hint.rs | 1 | // Copyright 2026 Tree xie. | COMMENT |
| LOW | crates/zedis-ui/src/help.rs | 1 | // Copyright 2026 Tree xie. | COMMENT |
| LOW | crates/zedis-ui/src/card.rs | 1 | // Copyright 2026 Tree xie. | COMMENT |
| LOW | crates/zedis-ui/src/card.rs | 21 | /// Type alias for the click handler closure. | COMMENT |
| LOW | crates/zedis-ui/src/card.rs | 41 | } | COMMENT |
| LOW | crates/zedis-ui/src/card.rs | 61 | /// platform-correct family lives in the app crate, so the caller | COMMENT |
| LOW | crates/zedis-ui/src/card.rs | 261 | }), | COMMENT |
| LOW | crates/zedis-ui/src/form.rs | 1 | // Copyright 2026 Tree xie. | COMMENT |
| LOW | crates/zedis-ui/src/form.rs | 101 | options: Option<Vec<SharedString>>, | COMMENT |
| LOW | crates/zedis-ui/src/form.rs | 121 | verbatim: bool, | COMMENT |
| LOW | crates/zedis-ui/src/form.rs | 521 | /// | COMMENT |
| LOW | crates/zedis-core/benches/hot_paths.rs | 1 | // Copyright 2026 Tree xie. | COMMENT |
| LOW | crates/zedis-core/benches/hot_paths.rs | 21 | //! rebuild). Run with `make bench` and compare reports before/after | COMMENT |
| LOW | crates/zedis-core/src/features.rs | 1 | // Copyright 2026 Tree xie. | COMMENT |
| LOW | crates/zedis-core/src/features.rs | 21 | //! servers (Dragonfly / KeyDB / Kvrocks / Garnet) ship different subsets. | COMMENT |
| LOW | crates/zedis-core/src/features.rs | 81 | /// `FAILOVER` — the coordinated standalone primary switch (Redis 6.2). | COMMENT |
| 712 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | crates/zedis-db/src/history_manager.rs | 258 | // ── the four lists kept this way ─────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/zedis-core/src/capability.rs | 47 | // ── Allowed in read-only (reads / local / pure UI) ─────────────── | COMMENT |
| MEDIUM | crates/zedis-core/src/capability.rs | 82 | // ── Denied in read-only (mutate Redis / server state) ──────────── | COMMENT |
| MEDIUM | crates/zedis-core/src/capability.rs | 321 | // ── reads / local: true ────────────────────────────────────── | COMMENT |
| MEDIUM | crates/zedis-core/src/capability.rs | 338 | // ── writes: false ──────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/zedis-connection/tests/live.rs | 254 | // ── standalone ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/zedis-connection/tests/live.rs | 3157 | // ── list ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/zedis-connection/tests/live.rs | 3185 | // ── set ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/zedis-connection/tests/live.rs | 3215 | // ── hash ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/zedis-connection/tests/live.rs | 3255 | // ── sorted set ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/zedis-connection/tests/live.rs | 3312 | // ── string ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/zedis-connection/tests/live.rs | 4469 | // ── tls ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/zedis-connection/tests/live.rs | 4562 | // ── commandlog ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/zedis-connection/tests/live.rs | 4673 | // ── replication ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/zedis-connection/tests/live.rs | 5216 | // ── sentinel ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/zedis-connection/tests/live.rs | 5541 | // ── cluster ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/zedis-connection/tests/live.rs | 7066 | // ── redis-stack ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/zedis-connection/tests/live.rs | 7803 | // ── Dragonfly and Garnet ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/zedis-connection/src/import_clients.rs | 54 | // ─── Another Redis Desktop Manager ─────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/zedis-connection/src/import_clients.rs | 199 | // ─── Tiny RDM ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/zedis-connection/src/import_clients.rs | 313 | // ─── Minimal YAML reader ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/zedis-connection/src/reply_format.rs | 316 | assert_eq!(table, "# │ value\n──┼──────\n1 │ a\n2 │ bb"); | CODE |
| MEDIUM | crates/zedis-connection/src/reply_format.rs | 358 | "# │ command │ reply\n──┼─────────────┼───────────\n1 │ SET a 1 │ OK\n2 │ INCR a │ 2\n3 │ GET m | CODE |
| MEDIUM | crates/zedis-connection/src/module_ops.rs | 33 | // ── TimeSeries ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/zedis-connection/src/module_ops.rs | 437 | // ── Geo ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/zedis-connection/src/module_ops.rs | 439 | // ── HyperLogLog / Bitmap ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/app_store_build.sh | 26 | # ======================================= | COMMENT |
| MEDIUM | scripts/app_store_build.sh | 49 | # ======================================= | COMMENT |
| MEDIUM | scripts/app_store_build.sh | 51 | # ======================================= | COMMENT |
| MEDIUM | scripts/it/up.sh | 216 | # ── standalone ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/it/up.sh | 235 | # ── dragonfly, garnet ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/it/up.sh | 326 | # ── tls ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/it/up.sh | 337 | # ── mtls ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/it/up.sh | 355 | # ── sentinel ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/it/up.sh | 408 | # ── busy ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/it/up.sh | 417 | # ── replication ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/it/up.sh | 430 | # ── ssh ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/it/up.sh | 519 | # ── cluster ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/views/keyspace_notifications.rs | 766 | // ── Render helpers ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/views/stream_editor.rs | 324 | // ─── Simple flat-data table delegate ──────────────────────────────────────── | COMMENT |
| MEDIUM | src/views/stream_editor.rs | 398 | // ─── Stream editor ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/views/stream_editor.rs | 1183 | // ── Stream summary card ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/views/stream_editor.rs | 1249 | // ── Idempotent producer (IDMP, Redis 8.6+) ─────────────────────────── | COMMENT |
| MEDIUM | src/views/stream_editor.rs | 1294 | // ── Manage groups: header + create, then per-group actions ─────────── | COMMENT |
| MEDIUM | src/views/monitor.rs | 63 | // ── Parsed MONITOR line ────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/views/monitor.rs | 158 | // ── Table columns ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/views/monitor.rs | 250 | // ── Main view ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/views/persistence.rs | 274 | // ── Header ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/views/persistence.rs | 314 | // ── Banners ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/views/persistence.rs | 386 | // ── Status cards ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/views/persistence.rs | 540 | // ── Policy / path summary ────────────────────────────────────────── | COMMENT |
| MEDIUM | src/views/persistence.rs | 693 | // ── Cluster per-node table ───────────────────────────────────────── | COMMENT |
| MEDIUM | src/views/persistence.rs | 804 | // ── Action cards ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/views/terminal.rs | 1661 | "$ EXEC\n# │ command │ reply\n──┼─────────┼──────\n1 │ SET a 1 │ OK\n2 │ INCR a │ 2\n" | CODE |
| MEDIUM | src/views/memory_analysis.rs | 119 | // ─── Row types ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/views/memory_analysis.rs | 250 | // ─── Column constants ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/views/memory_analysis.rs | 263 | // ─── Helpers ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/views/memory_analysis.rs | 319 | // ─── Main component ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/views/key_tag_dialog.rs | 310 | // ─── Batch tag (multi-select) ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/views/memory_analysis/rules.rs | 144 | // ─── Recommendations (offline rule engine) ─────────────────────────────────── | COMMENT |
| 4 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | …ills/gpui-kit/references/gpui/entity-best-practices.md | 51 | // Step 1: call hooks directly through list_state (no entity lock) | COMMENT |
| LOW⚡ | …ills/gpui-kit/references/gpui/entity-best-practices.md | 54 | // Step 2: update the parent entity — different lock, safe | COMMENT |
| LOW⚡ | …ills/gpui-kit/references/gpui/entity-best-practices.md | 61 | // Step 3: sync list state directly — no entity lock | COMMENT |
| LOW⚡ | src/states/server/list.rs | 92 | // Step 1: Set status and perform optimistic UI update | COMMENT |
| LOW⚡ | src/states/server/list.rs | 102 | // Step 2: Spawn background task for Redis operation | COMMENT |
| LOW | src/states/server/list.rs | 118 | // Step 3: what the server holds, not what the optimistic | COMMENT |
| LOW⚡ | src/states/server/set.rs | 122 | // Step 1: Perform local optimistic update | COMMENT |
| LOW⚡ | src/states/server/set.rs | 131 | // Step 2: Spawn background task | COMMENT |
| LOW⚡ | src/states/server/hash.rs | 172 | // Step 1: Perform local optimistic update | COMMENT |
| LOW⚡ | src/states/server/hash.rs | 181 | // Step 2: Spawn background task | COMMENT |
| LOW⚡ | src/views/key_tree/actions.rs | 122 | // Step 1: Update server state with new query mode | COMMENT |
| LOW⚡ | src/views/key_tree/actions.rs | 127 | // Step 2: Update local UI state | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src/states/server/list.rs | 92 | // Step 1: Set status and perform optimistic UI update | COMMENT |
| LOW⚡ | src/states/server/list.rs | 102 | // Step 2: Spawn background task for Redis operation | COMMENT |
| LOW | src/states/server/list.rs | 118 | // Step 3: what the server holds, not what the optimistic | COMMENT |
| LOW⚡ | src/states/server/set.rs | 122 | // Step 1: Perform local optimistic update | COMMENT |
| LOW⚡ | src/states/server/set.rs | 131 | // Step 2: Spawn background task | COMMENT |
| LOW⚡ | src/states/server/hash.rs | 172 | // Step 1: Perform local optimistic update | COMMENT |
| LOW⚡ | src/states/server/hash.rs | 181 | // Step 2: Spawn background task | COMMENT |
| LOW⚡ | src/views/key_tree/actions.rs | 122 | // Step 1: Update server state with new query mode | COMMENT |
| LOW⚡ | src/views/key_tree/actions.rs | 127 | // Step 2: Update local UI state | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | crates/zedis-connection/src/search.rs | 491 | /// committing to a schema the raw tree is pretty-printed — robust the same | COMMENT |
| MEDIUM | src/views/servers.rs | 618 | /// can't be parsed. Date-only granularity (no time-of-day) keeps it robust to | COMMENT |
| MEDIUM | src/views/bytes_editor.rs | 819 | /// - No borders for seamless integration | COMMENT |
| MEDIUM | src/views/key_tree/delegate.rs | 688 | // slot above). Absolutely positioned (out of flow → no | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/states/app.rs | 395 | /// the 10k default). The panel's other guardrails (value-size and | COMMENT |
| MEDIUM | src/views/setting_editor.rs | 534 | // Value-search guardrails. Cleared input → 0 → the setter stores | COMMENT |
| MEDIUM | src/views/value_search.rs | 20 | //! That is `O(keyspace)` of reads, so it runs behind guardrails: | COMMENT |
| MEDIUM | src/views/value_search.rs | 272 | // Snapshot the tunable guardrails at search start — a mid-search | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …lls/gpui-kit-design-guides/references/design-guides.md | 894 | ## Guidance for AI-generated interfaces | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/gen-flatpak-sources.sh | 7 | # Usage: | COMMENT |
| LOW | scripts/screenshot.sh | 5 | # Usage: | COMMENT |
| LOW | scripts/submit-winget.sh | 7 | # Usage: | COMMENT |
| LOW | scripts/submit-flathub.sh | 6 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/views/multi_search.rs | 122 | let query = cx.new(|cx| InputState::new(window, cx).placeholder(i18n_multi_search(cx, "placeholder"))); | CODE |