Side projects and open-source work. Most of what I build falls into two categories: tools that fix something annoying I ran into, and experiments that let me go deeper on something I am curious about.
Projects
GitHub activity
GitHub profile ↗-
mcp-remote (contribution)
activeFixed a startup crash in mcp-remote, the proxy that lets stdio-only MCP clients reach remote servers. When the OAuth callback port is already taken, it now binds another port and re-registers the client, or fails with a clear message when the port has been pinned. Merged in PR 262 and shipped in 0.1.39.
TypeScript Node.js OAuth 2.0 MCP -
m2m-app-creator
activeCLI that automates machine-to-machine (M2M) application setup in WSO2 Identity Server. Reads app definitions from config, resolves API resources, creates client credentials apps, and authorizes each one with the required scopes - validating everything before the first API call.
Java WSO2 Identity Server OAuth 2.0 Maven -
Asgardeo Samples (Remix and Express)
referenceTwo sample apps that add Asgardeo login, one to a Remix app and one to an Express app with Passport.js. Both now in the official asgardeo-samples repository.
TypeScript JavaScript Remix Express Passport.js Asgardeo OIDC -
Azure Membership Scheme
archivedHazelcast membership scheme for automatically discovering WSO2 product cluster nodes on Azure virtual machines. Supports both the Azure REST API and Azure Java SDK for IP discovery.
Java Azure Hazelcast WSO2 -
skills
activeThe AI agent skills I use day to day, written as SKILL.md files and kept in sync between agents with a script.
AI Agents Claude Code GitHub Copilot Shell Python -
zero-shot-image-classifier
activeClassifies large photo archives into categories using OpenAI's CLIP model. No labelled data, no fine-tuning, no cloud uploads. Entirely private. Sorts images with prompt ensembling across different categories, routes low-confidence results to a review folder, and runs entirely locally.
Python CLIP PyTorch Machine Learning MPS -
ContactBook
referenceReference implementation of the CQRS pattern in ASP.NET Core Web API. Separates read and write models so each can scale and evolve independently - Commands mutate state, Queries retrieve it, with no crossover. The companion code for the blog post on CQRS in ASP.NET Core.
C# ASP.NET Core CQRS .NET -
clipboard-history
activeA super lightweight clipboard history manager for macOS built with only built-in dependencies - two scripts running locally. Browse and paste anything you've copied recently, triggered from any app via an Automator Quick Action. No third-party apps, no cloud sync, no need to trust anyone with sensitive data.
Python Shell macOS Automator -
vscode-mario
activeA fully playable Mario-style game running inside VS Code's sidebar. Every sprite and sound effect is generated procedurally - no image or audio files. Covers Canvas 2D physics, AABB collision detection, fixed-timestep game loops, and enemy AI.
TypeScript HTML5 Canvas Web Audio API VS Code Extension API -
Angular Search Bar with RxJS Debounce
referenceA production-ready search bar component in Angular using RxJS debounceTime, distinctUntilChanged, and switchMap - avoiding unnecessary API calls as the user types.
Angular TypeScript RxJS -
babylon.js-shape-extrusion
referenceAn experiment in interactive 3D in the browser - draw a 2D polygon and extrude it into a 3D solid using Babylon.js. Covers the mesh generation and manipulation APIs that sit beneath most Babylon.js 3D scenes.
TypeScript Babylon.js WebGL 3D -
This website. A Jekyll blog redesigned from Lanyon into a custom theme - Ink & Signal palette, Inter + Serif typography, dark mode, and structured content via Jekyll data files.
Jekyll Liquid CSS Ruby GitHub Pages