Skip to content
narrowstacks

Projects

Stenobar macOS menu-bar app interface

Stenobar (opens in new tab)

macOS app, iOS coming soon

A Mac menu-bar recorder for meetings, calls, lectures, and stray ideas.

Stenobar records system audio and your microphone as separate tracks, then turns each take into transcripts, summaries, tags, and searchable notes. It also adds hold-to-dictate and a quick 'Thoughts' capture path for spoken fragments you would otherwise lose.

  • -System audio and mic captured as separate tracks
  • -Per-app capture for Zoom, Safari, or the whole system
  • -Hold-to-dictate and a local 'Thoughts' capture path
  • -Searchable library with transcripts, tags, and summaries

Hold a hotkey, talk, and let go: a live preview tracks what you say, then the cleaned-up text lands wherever you were typing.

Swift · SwiftUI · macOS · WhisperKit · On-device LLM

screenshots

Dorkroom web app homepage

Dorkroom (opens in new tab)

Web app, iOS coming soon · Open Source

Darkroom & photography calculators to speed up photographic work.

Dorkroom collects the little tools I kept rebuilding around darkroom work: border and resize calculators, reciprocity and exposure helpers, film notes, and development recipes. Answer the measurement question, get back to the enlarger.

  • -Border, resize, mat-cut, and stops calculators for printing
  • -Reciprocity, exposure, and lens-equivalency tools for shooting
  • -Film database and manufacturer development recipes with a volume mixer
  • -Fast web app tuned for phone use in a working darkroom

React 19 · TypeScript · Tailwind CSS · TanStack Query

screenshots

DarkroomSCAD web customizer showing a 35mm negative carrier in the 2D preview

DarkroomSCAD (opens in new tab)

Web app · Open Source

A browser customizer for parametric, printable darkroom negative carriers.

Negative carriers hold film flat in an enlarger, and every enlarger and film format needs a slightly different one. DarkroomSCAD generates the right carrier from parameters; the web customizer puts that behind a UI, so you pick your enlarger and film format, watch the part update instantly, and download a print-ready STL — no OpenSCAD install required.

  • -Nine film formats from 35mm to 4×5, plus fully custom openings
  • -Presets for Omega D, LPL/Saunders, and Beseler enlargers, with matching alignment boards
  • -Instant 2D preview (TypeScript geometry) alongside a lazy-loaded 3D STL view
  • -Exports the carrier and boards as print-ready STLs in a single zip

Next.js · React 19 · TypeScript · three.js · OpenSCAD WASM

screenshots

The dithrrd editor showing a Bayer-dithered photograph, with the effect stack on the left and Grade controls on the right

dithrrd (opens in new tab)

Web app · Open Source

A browser-based photo dithering and halftone customizer.

I wanted repeatable control over a dithered look, down to the screen angle and the matrix. dithrrd is a stack: open a photo, add dithering, halftone, and color passes in any order, and tune every parameter while the preview redraws. Nothing gets uploaded. Decoding, rendering, and PNG export all happen on your machine, on the GPU through WebGL2. The error-diffusion algorithms run in a Web Worker instead, since those go one pixel at a time.

  • -A drag-to-reorder effect stack, where each pass feeds the next
  • -16 effects across color, pixelate, ordered dither, halftone, and error diffusion
  • -Built-in and custom palettes, with an eyedropper for pulling a swatch off the image
  • -Presets and share links, undo/redo, pan/zoom, and full-resolution PNG export

React 19 · TypeScript · WebGL2 · regl · Web Workers

Smaller things, also on GitHub.