🦀 I'm Scotty. A Rust engineer in Washington state.
⚙️ I build systems from the bottom up: chickadee, an LSM-tree storage engine, and steller, a Redis-compatible server that talks to real redis-cli. Both hand-written, no protocol crates. steller is in production behind heron, my own server, which serves every number on scottyfermo.com: commits and a year of contributions from GitHub, lines and tests it counts itself from each repo after a push.
📱 I also built Zwipe (source), a swipe-first MTG deck builder, live on the iOS and Android app stores with ~1,000 users. Over 143,000 lines of Rust across 6 workspace crates, 770+ tests, self-hosted, built and operated by me.
🔨 I build things from scratch to understand how they actually work.
I joined GitHub 2 years ago and have since pushed 5,945 commits across 54 personal projects, 34 of them public.
Counted from the GitHub API on 2 Oct 2026. Forks excluded.
| Databases & Systems | Apps & Tools |
|---|---|
| • chickadee - A key-value storage engine, evolved from Bitcask to an LSM-tree: WAL, memtables, SSTable compaction, bloom filters, CRC32 corruption recovery • steller - A Redis-compatible server in Rust: hand-written RESP parser, snapshot + append-only durability, works with real redis-cli. In production since Sep 2026, where its first real workload found a framing bug its 240 tests had not• heron - My personal server. Reads GitHub for scottyfermo.com, and for the numbers GitHub does not have it downloads a tarball of each repo after a push, counts lines, tests and lints, and throws it away. Layered cache, steller first and memory behind it. Hexagonal, on its own box behind a Cloudflare Tunnel • gotcha - Cross-platform security camera: raw evdev with nix::poll on Linux, Accessibility API callbacks on macOS, unlocks on a secret key sequence. The decisions are a tested domain module; the platforms only own the devices |
• Zwipe - Full-stack MTG deck builder (Axum + Dioxus + PostgreSQL), live on both app stores (source) • halo_action_importer - Production CLI that bulk-imports actions into Halo from CSV/Excel: runs unattended for hours against unreliable APIs, per-failure retry logic. Weeks of manual work, automated • halo_custom_field_builder - Production CLI that bulk-creates custom fields across Halo products: OAuth2 with cached tokens, type-safe domain modeling. Hours to minutes, used across Fortune 500 client implementations • marvin - Interactive CLI chatbot built on Rig with Claude: streaming responses, web + math tools, chat persistence, dynamic model discovery. Found deprecated model constants in Rig, filed the issue and a 17-file fix • upsee - Real-time pullup counter: webcam frames through MoveNet on tract, on-device, with a hysteresis rep counter that is a pure function with tests • cairn - Lifetime rep counter for iOS in Rust and Dioxus: local SQLite, no server, no account. On my phone daily with 98,300 reps across 225 days • rustmas - Advent of Code client: input fetcher and solutions • sharpmas - rustmas ported to C#, same tooling rebuilt on .NET • portfolio - scottyfermo.com, written in Rust. Every number on it is heron's, fetched while you read with the build's copy as the fallback, drawn as charts the site renders itself, the year of contributions on the front page; a test fails if a number is typed by hand • rusty-aoc - Archived Advent of Code solutions in Rust |
| Category | Description |
|---|---|
| Building | Zwipe (source), under daily development and shipping weekly releases. |
| Shipping | cairn, a lifetime counter I use every day. On my own phone now, App Store review next. |
| Iterating | rustmas and sharpmas in lockstep: the same Advent of Code tooling maintained in Rust and C#, every refactor ported both ways. |
| Extending | steller: pub/sub and SET options landed, now serving heron in production; MULTI/EXEC transactions next on the roadmap. |
| Learning | C#, by writing all sorts of projects in it and comparing notes on Rust vs C# in online forums. |
| Operating | Two Hetzner boxes: the one Zwipe runs on (CI/CD, structured tracing, nightly backups, production metrics) and the one heron and steller share, deployed by a self-hosted runner on every push, where heron sweeps thirteen repos for a fresh count whenever one is pushed to. |

