Projects

The things I have built, and how they actually work. Longer than the summaries on the home page.

NanoDraw screenshot

NanoDraw

Developer & Product Engineer

A collaborative drawing application that runs in the browser and on the desktop.

GolangTauriNext.jsTypeScriptViteHTML5 Canvas

The problem

Most drawing tools make you choose: a web app you cannot use offline, or a desktop app you cannot share a link to. NanoDraw is the same application in both places.

How it works

The canvas is drawn directly with the HTML5 Canvas API rather than a heavy scene-graph library, which keeps input latency low. A Go backend handles the collaborative side. The desktop build is the same frontend wrapped in Tauri, so it ships as a small native binary instead of bundling a whole browser.

TODO: Add what you would do differently, and what was harder than expected.

KittenTTS Android Engine screenshot

KittenTTS Android Engine

Creator & Lead Developer

An on-device text-to-speech engine for Android, built in Kotlin around ONNX models.

KotlinC++CMakeAndroid SDKONNX

The problem

Android speech synthesis normally means sending text to a server. That costs latency, needs a network, and hands your text to someone else. This runs entirely on the phone.

How it works

The model runs through ONNX Runtime, with the inference path written in C++ and built via CMake so it can be called across the JNI boundary without copying audio buffers around. The Kotlin layer registers it as a system TTS engine, so any app that speaks text can use it.

TODO: Add the model size, and what the latency actually is on a real device — those are the numbers people want.

Social screenshot

Social

Full-Stack Developer

A real-time chat and calling application, built solo.

React.jsNode.jsSocket.IOWebRTCPostgreSQL

How it works

Socket.IO carries messages and presence, and also acts as the signalling channel that lets two browsers find each other. Once they have, audio and video go peer-to-peer over WebRTC rather than through the server. Messages persist in Postgres.

TODO: Add what you learned about WebRTC — NAT traversal and TURN are the parts worth writing about.

Pixel screenshot

Pixel

Full-Stack, backend focused

A role-based image gallery built as a microservice architecture. Team of four.

Nest.jsReact.jsPostgreSQLDocker

How it works

Split into services behind Nest.js, with Docker keeping the pieces reproducible across four developers' machines. Access is role-based, so what you can see and upload depends on who you are.

TODO: Add what you owned specifically, and whether the microservice split was worth it at this size.