projects
Things I have built, and the decisions behind them.
Fofito A personal finance app that pulls your real bank data into one place.
Fofito connects to bank accounts and brings transactions, budgets, loans, receipts and net worth together in one view. It categorises spending, tracks recurring payments, and includes a loan simulator and a crypto and investment tracker. The back-end is a Spring Boot API on PostgreSQL, with a React front-end, deployed self-hosted on Coolify. It is built for my own finances first, with the design of a product in mind.
- Java
- Spring Boot
- PostgreSQL
- ReactJS
- Docker
- Coolify
ESP32 Product Starter Reusable ESP32-S3 firmware and web UI base for building local connected products.
A starter template that gives ESP32-S3 devices Wi-Fi setup, a responsive React web interface, login, and over-the-air updates, so each new product does not rebuild this shared groundwork. Firmware and web UI ship as one signed package written to inactive A/B flash slots, with rollback if the new version fails to start. Product-specific logic runs in a separate higher-priority task, so network and UI work cannot delay it.
- C++
- PlatformIO
- ESP32-S3
- LittleFS
- MQTT
- TypeScript
- React 19
- Vite
- Vitest
- Python
Kids Ride Controller ESP32-S3 firmware and web UI for a safe, configurable kids ride-on car controller.
Firmware for an ESP32-S3 that reads a Hall-effect pedal and drives BTS7960 motor drivers with PWM. It also serves a React configuration UI over WiFi, so parents can set speed limits, ramps and 2x4/4x4 modes without reflashing. A key decision was to treat the physical switches as the source of truth for direction and driven wheels, with a direction-change interlock and an Emergency Stop latch, so web requests can never command direction.
- C++
- PlatformIO
- ESP32-S3
- LittleFS
- WiFiManager
- React 19
- Vite
- Tailwind CSS
- OpenAPI
- Python
WAGateway Self-hosted multi-tenant WhatsApp gateway with REST API and webhooks for developers.
WAGateway lets each user link one or more WhatsApp numbers as isolated instances, then send and receive messages and media through a REST API and outbound webhooks. It solves the need to automate WhatsApp without relying on a hosted third-party service, with per-instance API secrets stored hashed and an OpenAPI spec generated from the actual route schemas. A key technical decision was keeping the Baileys auth state in the database instead of on disk, which allows automatic recovery from invalid sessions, and queuing outbound messages while WhatsApp is disconnected.
- TypeScript
- Next.js
- React 19
- Prisma
- SQLite
- Baileys
- Tailwind CSS
- Zod
- OpenAPI
- Docker
- GitHub Actions
Structured Logging Spring Boot Starter Structured JSON logging, correlation IDs and business events for Spring Boot microservices.
A Spring Boot starter that adds structured JSON logging, per-request correlation IDs, authenticated-user context, and a simple API for logging business events. It solves the problem of inconsistent, hard-to-grep logs across services by giving every log line a shared JSON shape plus automatic correlation and user tagging. It is split into three Maven modules: a Spring Boot agnostic core, a Spring Boot autoconfiguration module, and a thin starter that aggregates both, so the core logging and encoding logic has no dependency on Spring Boot itself.
- Java
- Maven
- Spring Boot
- Logback
- Jackson
- Spring Security
- JUnit 5
- Mockito
- JaCoCo
OpenGate Local ESP32 access controller for gates and doors, with PIN and Wiegand readers.
OpenGate is a controller that decides who can open a gate or door and sends a momentary dry-contact command to the existing gate controller, so access works over the local network without any cloud service. It supports PIN and card credentials, validity windows, schedules, automation rules, webhooks and a Home Assistant integration. A key technical decision is that the firmware is the only authority for authorization, while a separate web UI is released with it as a signed, paired package with A/B update slots and a factory recovery image.
- C++
- ESP32-S3
- PlatformIO
- TypeScript
- React 19
- Vite
- Tailwind CSS
- Vitest
- Python
- Unity
- PowerShell