我做本地优先的桌面工具:跨平台阅读器、系统集成组件,以及给 AI agent 与 ComfyUI 用的工作流工具。 I build local-first desktop tools — cross-platform readers, OS-integration components, and workflow tooling for AI agents and ComfyUI.
What keeps pulling me in is the layer underneath the UI: archive formats, text decoding, thumbnail pipelines, shell handlers, process supervision. The parts where a tool either works on your actual files or it doesn't.
grzeb — directory-wide plain-text search that returns a drill-downable result tree instead of a flat hit list, with decoded text cached in a local SQLDelight database so a second search over the same files never re-reads disk. One Compose Multiplatform codebase targeting desktop (JVM), Android (SAF), and wasm. Its README spells out what does not work yet — which is the fastest way to see how I approach a problem.
| Project | Stack | What it is |
|---|---|---|
| grzeb | Kotlin · Compose Multiplatform · SQLDelight | Tree-shaped full-text search over a whole directory, desktop + Android |
| Xiranite | React 19 · TypeScript · Wails v3 (Go) · Bun | Desktop workspace host: one capability "node" rendered across six layouts (dashboard, cards, dockview, flow canvas, lanes, bento grid) behind a single contract |
| neoview | Tauri 2 · Svelte 5 · Rust · PyO3 | Local image / manga viewer built around a Rust + SQLite thumbnail and directory cache; the target is NeeView's reading feel on a modern stack |
| rossi | Flutter · Rust · JS plugin ABI | Manga reader that ships no content: each source is one JS file declaring how to list, search, and resolve images |
| siyuan-damophus | TypeScript · Svelte | SiYuan (思源笔记) plugin: Markdown question banks through scan → index → practice → recover, plus a virtual relation bar between questions and knowledge points |
| ArcThumbX | Rust · Slint | CBZ / CBR / EPUB / FB2 / AZW3 cover thumbnails rendered inside Windows Explorer and macOS Finder |
Most of these are working forks: upstream license and authorship stay in each README, and each repo's description states what my side changed.
Readers, archives, and the formats under them exhentai-manga-manager (local tag management for downloaded ExHentai works) · rossi · JHenTai · quivi-t · neoxide · opencomic-ai-bin
Image and document pipelines Xlchemy (JPEG XL / AVIF / WebP batch conversion) · Trimg · czkawka-tauri (dedup) · FolioX (local batch OCR) · manga-translator-ui
PDF → Markdown, for study material
MineruCustom (MinerU post-processing: discarded_blocks recovery, footnotes, page marks) · MarkdownWrapper (marku: heading-structure repair and normalization)
Agent and ComfyUI workflow tooling ComfyUI-Workflow-Studio (workflow / asset management plus a generation tab) · ComfyUI-GlowLoader · skilloom (agent skills, plus the gate scripts that reject malformed skill output) · lazypi (extensions for the pi coding agent) · omp-decktop · auto-continue
OS integration
hibernal (on-demand deep hibernation via pmset, with a privileged helper) · ArcThumbX · AppuruPie (mouse-wheel gesture layer) · SmartZ
Distribution
homebrew-tap — 26 casks for niche macOS GUI apps that aren't in homebrew/cask:
brew tap hibernalglow/tapExtras-Glow is the same idea for Scoop on Windows.
- Fork and extend, don't rewrite. Much of my real output sits on forks, tracked against upstream rather than abandoned at a snapshot: siyuan-damophus, Extras-Glow, rossi, Xlchemy, ComfyUI-Workflow-Studio, ArcThumbX. When I port a fix I take the upstream's conditions, not only its code — a merge must not silently drop either side.
- CJK correctness is a requirement, not a nice-to-have. Chinese text is where most "it works" claims fall apart, so the detection order gets specified and argued: BOM → NUL probe → UTF-8 → GB18030 behind two guards → Latin-1 last. Whole-word matching deliberately does not apply to CJK, because
\bcan never form on either side of a Chinese word. - Documents state limits before features. The write-ups I'm happiest with say what is not implemented, why, and which behaviour exists in the core but still has no UI switch.
- Local-first by default. Files stay on disk, indexes stay in a local database, inference runs on the machine.
No contribution graphs or trophy cards here — stars mostly count zero and some projects are weeks old. That's a fact about reach, and the READMEs above are the honest substitute.


