Portfolio
Web applications, distributed systems, and developer tools I've built.
Products
Side projects that turned into real products.

AccessHawk
Web ApplicationCombined Playwright browser automation with AI integration through OpenRouter to build a full scanning pipeline. Designed the job queue architecture for scheduled scans, implemented tiered subscription billing with Polar.sh, and applied deep WCAG knowledge to make the output actually useful.
- Nuxt 4
- TypeScript
- MongoDB
- Redis
- BullMQ
- Playwright
- Polar.sh
- OpenRouter
- Doppler
- Railway

SereneReader
Web ApplicationBuilt a real-time RSS platform from scratch with background job processing via BullMQ, Server-Sent Events for live updates, and a custom theming engine. Recently launched native iOS, iPad, macOS, and Apple Watch apps that keep feeds, folders, read state, and Focus Mode in sync with the web app.
- Nuxt 4
- TypeScript
- Swift
- SwiftUI
- MongoDB
- Redis
- BullMQ
- Polar.sh
- Resend
- Doppler
- Railway

MyPetDay
Web ApplicationLed the full architecture as Solution Architect and Lead Developer. Set up the infrastructure on Railway, hardened the security layer, optimized MongoDB queries for performance, and integrated AWS S3 for media storage. Focused on building a clean, mobile-first experience.
- Nuxt 4
- TypeScript
- MongoDB
- Polar.sh
- AWS S3
- Tailwind CSS
- Doppler
- Railway

SPConnector
Web ApplicationEngineered a multi-tenant system with real-time WebSocket communication, intelligent print routing logic, and AES-256-GCM encryption for customer data. Integrated the Shippo and PrintNode APIs and built a load-balanced queue to handle thousands of daily orders reliably.
- Vue.js
- Express.js
- MongoDB
- Redis
- Polar.sh
- Resend
- Tailwind CSS
- Doppler
- Railway
Open Source
Tools I built for myself and decided to share.
Claude Code Plugins
Plugins I wrote for Claude Code. Security audits, performance checks, accessibility testing, ADO integration. I use these daily.
- Security audits: Hours of review in minutes
- Performance audits: Bottleneck and N+1 detection
- Accessibility audits: Catches issues tools miss
- Azure DevOps: Work items and time logging
- Git and phase planning automation
- TypeScript
- Node.js
- MCP
- Claude AI
- Azure DevOps API
- Git
- OWASP
UmamiDash
Real-time analytics dashboard for self-hosted Umami instances. Built it to monitor website traffic across multiple sites without switching between Umami tabs.
- Real-time visitor and pageview monitoring
- Multi-site dashboard in a single view
- Clean UI with shadcn-vue components
- Connects to any self-hosted Umami instance
- Vue 3
- shadcn-vue
- Express
- TypeScript
- Umami API
UmamiHA
Home Assistant integration for self-hosted Umami analytics. Built it to surface website traffic data directly in my HA dashboards without checking Umami separately.
- Real-time active visitors sensor
- Pageviews, visits, and bounce rate tracking
- Multi-site support with per-website sensors
- HACS compatible for easy installation
- Configurable update intervals
- Python
- Home Assistant
- HACS
- Umami API
PulseRT
macOS menu bar app that shows real-time GA4 visitor counts. I wanted to see traffic without opening a browser tab.
- Real-time visitor counts in menu bar
- Native Swift/SwiftUI, no Electron
- Configurable refresh: 5-60 second intervals
- Secure local credential storage
- Last updated timestamp visibility
- Swift
- SwiftUI
- macOS
- GA4 API
- Google Cloud
ReplyQueue
Chrome extension that finds social posts related to your content as you scroll, then suggests replies. Built it to make content promotion less tedious.
- Passive discovery: extracts posts as you scroll
- AI-powered contextual reply suggestions
- Keyword and semantic content matching
- Adjustable relevance thresholds (10-90%)
- Local-first: all data stays on device
- Vue 3
- TypeScript
- Tailwind CSS
- Chrome Manifest V3
- RSS
GA Mac Dashboard
Native macOS app for monitoring multiple Google Analytics real-time dashboards in a customizable grid. Built it to track all my sites at once without juggling browser tabs.
- Multiple GA4 dashboards in one window
- Customizable grid layout with configurable rows and columns
- Shared sessions across views, login once
- Fullscreen mode for distraction-free monitoring
- Persistent URLs between sessions
- Swift 6.0
- SwiftUI
- GA4
- WebKit
GA Win Dashboard
Windows port of GA Mac Dashboard for monitoring multiple Google Analytics dashboards in a customizable grid. Portable single-exe distribution, no install required.
- Multiple GA4 dashboards in one window
- Customizable grid layout with configurable rows and columns
- Shared sessions across views, login once
- Fullscreen mode for distraction-free monitoring
- Portable .exe, no install required
- Electron
- TypeScript
- electron-vite
- GA4
- CSS Grid
Technical Blog
What I'm working on and what I've figured out.
Opus Writes It. Codex Reviews It. They Loop Until It's Clean.
How I pair Claude Code with Codex Code Review for every pull request: Claude ships the feature and opens the PR, Codex reviews it on open, and Claude resolves every finding and re-requests review in a loop until it comes back clean. Includes the /git-pr-codex-loop skill, the setup, and the honest tradeoffs.
Your Claude Prompts Are an Audit Gap. LiteLLM Closes It.
A staff engineer's case for putting LiteLLM in front of Claude to close the audit gap: PII filtering, secret detection, virtual keys per user, and a real log of every prompt. Config examples and an honest take on the tradeoffs.
84 Malicious TanStack Versions Hit npm. My Portfolio Pulled Zero.
On May 11, 2026, the Mini Shai-Hulud worm published 84 malicious versions across 42 TanStack packages in a six-minute window. My portfolio runs on TanStack Start. None of the bad versions ever touched it. Here is why, and what every project running npm should be doing right now.
WordPress Was Already a Security Nightmare. AI Agents Are About to Make It Unlivable.
Someone spent six figures on 31 trusted WordPress plugins, planted a PHP deserialization backdoor, and sat on it for eight months before lighting it up in April 2026. That's not a WordPress bug. That's what WordPress is. Here is why the next wave of agentic AI turns every outdated install into a ticking clock, and what to move to instead.
GEO is the New SEO: Optimizing for AI Answer Engines in 2026
Generative Engine Optimization (GEO) is the discipline of getting cited by ChatGPT, Perplexity, Claude, and Gemini. It overlaps with SEO about 40%. The other 60% is new territory, and it's worth learning now.
Why I Rebuilt My Portfolio with TanStack Start
I previously wrote about choosing Nuxt over Next.js. Then I rewrote my entire portfolio in React. This isn't a framework war - it's about what TanStack Start gets right that Next.js doesn't, and why the rebuild was worth it.
