Skip to main content

Projects

Shipped artifacts. Not experiments.

Screenshot of Rune

Rune

A private notes app that keeps everything encrypted on the device: Argon2id and XChaCha20-Poly1305 envelope encryption, on-device voice transcription through whisper.cpp, and one Flutter codebase shipped to the App Store, Google Play and the Mac App Store.

FlutterDartArgon2idXChaCha20-Poly1305whisper.cppDart FFIGitHub Actions
Screenshot of Goose

Goose

A rapidly evolving local-first autonomous agent platform built around Ollama: an AI wingman with approval-gated tools, persistent memory, multiple interfaces, scheduled automation, and a growing plugin ecosystem.

Node.jsOllamaSlack BoltServer-Sent Eventswhisper.cppVitestPlugin Architecture
Screenshot of MLX TTS Studio

MLX TTS Studio

A local Apple Silicon text-to-speech studio that runs open Hugging Face models through MLX, with a Gradio UI, FastAPI endpoints, model-cache controls, and performance-aware preset guidance.

PythonMLXMLX AudioHugging FaceGradioFastAPIApple Siliconuv
Screenshot of Energy Duel

Energy Duel

A neon, simultaneous turn-based strategy game built for Gamedev.js Jam 2026. Two robots. One grid. Queue your moves, then watch them execute at the same time.

Phaser 4TypeScriptViteWeb Audio APIWavedash
Screenshot of The Wee Table

The Wee Table

A production-style mobile app for SPFL standings, including an iOS WidgetKit experience and a new Android release, backed by a resilient Cloudflare Worker with multi-source ingestion and layered caching.

SwiftSwiftUIWidgetKitAppIntentsTypeScriptCloudflare WorkersCloudflare KVSwift Package Manager
Screenshot of Asteroid Blaster

Asteroid Blaster

A full modernization of my 2012 PhoneGap game into a maintainable Godot 4.6 mobile release with state-driven gameplay, resilient input handling, and repeatable iOS/Android shipping workflows.

Godot 4.6GDScriptiOSAndroidXcodeProcedural RenderingData-Driven BalancingMobile QA