Sheet 02 — Detail drawings

Selected work

Personal builds, open where I can open them. My employer work is described on the résumé sheet; this is the code you can actually read.

DWG 001 — Sheet 01 of 04 Open source

Earshot

On-device speech-to-text SDK

One Kotlin core drives speech recognition on both iOS and Android. Whisper through WhisperKit on iOS, ONNX Runtime on Android. No audio leaves the phone.

Built to answer a question I kept hitting at work: can you get real transcription quality without shipping a user’s voice to somebody’s cloud. You can.

The hard part was memory. Whisper models plus an audio ring buffer plus the app itself will get you killed by the Android low-memory killer on mid-tier hardware. Rework of the buffering and model loading path took peak memory from 367MB to 230MB.

Accuracy is measured, not claimed: 8.38% word error rate against 14.97% for the platform recognizer on the same device and the same audio.

peak memory cut
37% peak memory cut
WER vs 14.97% platform
8.38% WER vs 14.97% platform
platforms, one core
2 platforms, one core
  • Kotlin
  • Swift
  • WhisperKit
  • ONNX Runtime
  • KMP
Source on GitHub →
DWG 002 — Sheet 02 of 04 Open source

Pencil Count

Local vision pipeline over 406,769 ballots

A six-stage funnel that reads handwritten write-in votes off scanned ballot images using a 12B vision model running locally, and reconciles the tally against the official count.

Public ballot scans, a local model, and no third party in the loop. Every stage of the funnel is inspectable, which is the whole point when the output is an election number.

The result landed within 1.4% of the official county totals. The gap is the interesting part, and the pipeline reports where it came from rather than hiding it in an aggregate.

Cheap enough to run on one workstation. Slow enough to be honest about it.

ballots processed
406,769 ballots processed
variance vs official
1.4% variance vs official
pipeline stages
6 pipeline stages
  • Python
  • Local 12B VLM
  • OCR
  • Batch pipeline
Source on GitHub →
DWG 003 — Sheet 03 of 04 Personal build

Sitewinder

Retrieval chat over your own video, offline

An Android app that composes Whisper ASR, MiniLM embeddings, and Gemma 3 1B entirely on device, so you can ask questions about your own video library with the radio off.

Three models in one process on a phone. Transcribe, embed, retrieve, answer. The orchestration budget is the design constraint: what can be resident, what has to be paged, what can be precomputed while charging.

This is the small-model orchestration problem that on-device assistants actually run into, at a size where you can feel every decision.

models, one device
3 models, one device
network calls
0 network calls
  • Kotlin
  • Whisper
  • MiniLM
  • Gemma 3 1B
  • Vector search
DWG 004 — Sheet 04 of 04 Open source

SigPocket

Mobile observability client for SigNoz

Ten years of observability work compressed into the screen you actually have on you when something pages. A mobile client for SigNoz, built because I wanted it.

Traces, metrics, and logs shaped for a phone rather than a dashboard shrunk to fit one. Different information hierarchy, different defaults, same data.

  • TypeScript
  • React Native
  • OpenTelemetry
  • SigNoz
Source on GitHub →

Appendix A — Also on the bench

Smaller sheets

  • A01

    Notch

    Greasing-the-groove watch apps, shipped to the App Store and Google Play.

  • A02

    potato-mesh

    Federated Meshtastic and Meshcore node dashboard for a local community. No MQTT clutter.

    View →
  • A03

    RF Observatory

    Software-defined radio on a Raspberry Pi 5. ADS-B aircraft, AIS vessels, spectrum anomaly baselining.

  • A04

    redux-devtools-bubbles-monitor

    An unobtrusive monitor for Redux DevTools. Still in use years later.

    View →
  • A05

    Code to Muscle LLC

    The entity behind the watch apps, registered for federal SBIR/STTR work.

    View →
github.com/eknuth