Full-stack engineer specializing in Laravel and Vue.js. Five years shipping production systems on AWS, from architecture and database design through deployment. Available for full-time remote roles and select contracts.
5+ years shipping // 3,000+ users served // 9 live products // 100% on-device AI
Designed and built a complete case management system on AWS — case tracking, document automation, and a secure client portal used in active legal practice.
Civil servant records platform and tourism analytics dashboard for the Province of Surigao del Sur. Digitized 500+ employee 201 files and modernized the team's workflow onto Git and code review.
Local-first speech-to-text with real-time waveform feedback. Runs entirely on-device — no audio ever leaves the machine. Built for sensitive legal/medical contexts.
Google Drive-style platform unifying every NEMSU campus. Resumable uploads via a Go tus service, ClamAV scanning, Go-signed PDF documents, S3 + local hybrid storage, and in-place editing of Google Sheets and Docs.
Joined a Dragonica private server as a player. Stayed on as the engineer hardening web auth, the cash shop, and the perimeter against the common attacks script kiddies actually run.
"Chris took our entire firm off spreadsheets and onto a real platform. Case tracking, document automation, and the client portal have been running daily for over a year without drama. He handled the full build, AWS setup, and rollout to our team."
"Christopher modernized our internal systems and brought the team onto Git and proper deployment workflow. The E-PDS records platform and tourism dashboard he built are still in production use across the province."
I take on full-stack projects end-to-end — from spec to deployment — and I'm especially useful when there's a legacy system to modernize or AI to integrate without leaking data to the cloud.
Laravel + Vue, end-to-end. From spec to deployment.
Records management, case tracking, internal tools.
Offline / on-prem speech, NLP, and inference pipelines.
Rescuing slow PHP systems. Profiling, refactoring, scaling.
AWS setup, CI/CD pipelines, server hardening.
Team upskilling, workflow standardization, technical docs.
A desktop version of ClawdMeter 🦀. I only saw the ESP32 hardware version going around, and thought of making a desktop variant for everyone who doesn't have the board sitting on their desk.
It lives in the system tray and lets you check your Claude Code usage at a glance, with an animated pixel Clawd that reacts based on how much of your limit you've burned through.
Built it with Claude in about 10–15 minutes, end to end. Open-sourced on GitHub for anyone who lives in their terminal and forgets to check.
ClawdMeter — original ESP32 desk dashboard by Hermann Bjorgvin ↗
claudepix — pixel-art Clawd sprites by amaanbuilds
We’ve all been there — scrolling through GitHub and cringing at a pile of abandoned projects and forgotten forks.
I had over 150 repos and wanted to clean them up, but GitHub’s UI makes bulk deletion tedious. So I built a TUI app in Go to make it fast and simple.
It lets you search, multi-select, and delete repositories in bulk, with quick access to repo details and browser links.
In about 10 minutes, I cleared out dozens of unused repos and kept only what matters. If your GitHub needs a cleanup, give it a try.
Back at the Province of Surigao del Sur, the team kept reaching for setInterval polling whenever they needed “live” data — refreshing a dashboard every few seconds, hitting the same endpoint over and over.
The polling itself was fine on paper. The execution was not. No one was clearing intervals on unmount, no one was tearing down listeners between page changes, and a few screens were stacking intervals on top of each other until the browser tab quietly hogged memory.
I wanted a concrete way to show the team that WebSockets are a cleaner answer for this kind of live state — one persistent connection, push from the server, no timers leaking in the background. So I built the simplest demo I could think of: multiplayer rock-paper-scissors over Socket.io. Two players, a room, instant move sync, instant winner.
The point was never the game. The point was the pattern: open a socket, listen for events, close the socket on teardown. Easier to reason about than a tangle of intervals.
A normal day at the park with my wife and daughter. I rented a bike for my daughter, and while paying I noticed the rental operator was still tracking everything in a paper notebook — bike number, start time, end time, price, scribbled across columns and corrected with arrows.
The work was mostly mental: glance at the wall clock, do the subtraction, multiply by the rate, look back at the page to find which bike came back. Slow when it was busy, error-prone when it was quiet.
So I built a small Android app to do the boring part. Tap to start a bike, tap to stop, the timer and price compute themselves. A second screen tallies daily sales so the operator can close out the day without a calculator.
Shipped it to Google Play so any rental stand with a phone can use the same tool. Built in Java back when that was still the default for Android.
The main reason I built this is for my friend's team that I work with sometimes to get rid of manual server checks and give them a live view of their server's current situation.
Private repo for now since it has my own auth + alert channels wired in.