Senior Full-Stack Engineer

.NET, Node.js, Swift, React, Vue

Twenty years, startups to Fortune 500s.

What I've Built

Products I designed, shipped, and still run in production.

AccessHawk website screenshot

AccessHawk

  • Web Application

Automated WCAG scanning. Real browser capture, Lighthouse audits, and AI analysis in one pipeline, with scheduled scans and a CI API.

  • Nuxt 4
  • TypeScript
  • MongoDB
  • Redis
  • BullMQ
SereneReader website screenshot

SereneReader

  • Web Application

A real-time reading platform with live updates over SSE, native clients on four Apple platforms, and complete localization into 13 languages.

  • Nuxt 4
  • TypeScript
  • i18n (13 locales)
  • Swift
  • SwiftUI
SPConnector website screenshot

SPConnector

  • Web Application

Multi-tenant print routing for e-commerce fulfillment. Real-time WebSocket delivery, AES-256-GCM encryption, thousands of orders a day.

  • Vue.js
  • Express.js
  • MongoDB
  • Redis
  • Polar.sh

About Me

Full-stack: React, Vue, and TypeScript on the front end, Node.js and C#/.NET on the back, SQL Server, Postgres, and MongoDB underneath. Production workloads on Azure and AWS.

A large part of my work is architectural: service boundaries, multi-tenant data modeling, background processing, real-time updates, authentication and access control, and query performance as data grows.

Also native iOS, iPadOS, macOS, and watchOS apps in Swift 6 and SwiftUI, accessibility to WCAG 2.2 backed by a W3C certification, and enterprise CMS work on Sitecore and Umbraco, certified on both.

Technical Blog

What I'm working on and what I've figured out.

Thumbnail for I Open-Sourced the Engine Behind AccessHawk. Meet A11yHawk.
A11yHawkAccessHawkAccessibility+6 more

I Open-Sourced the Engine Behind AccessHawk. Meet A11yHawk.

A11yHawk is the open-source, self-hostable accessibility scan engine that powers AccessHawk. Real browser capture, Lighthouse audits, and bring-your-own-key AI analysis against every WCAG criterion. Build your own accessibility tooling without the per-scan SaaS bill.

8 min read
Thumbnail for Your Claude Prompts Are an Audit Gap. LiteLLM Closes It.
LiteLLMClaudeAI+6 more

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.

10 min read
Thumbnail for 84 Malicious TanStack Versions Hit npm. My Portfolio Pulled Zero.
npmpnpmTanStack Start+4 more

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.

11 min read
Thumbnail for That Accessibility Widget Isn't Protecting You. It's a Lawsuit Waiting to Happen.
AccessibilityWCAGADA+4 more

That Accessibility Widget Isn't Protecting You. It's a Lawsuit Waiting to Happen.

Accessibility overlays like AudioEye and accessiBe promise WCAG compliance with a single line of JavaScript. The FTC, the courts, and the disability community all disagree. I dig into why overlays fail, what legal exposure they actually create, and what it takes to build accessibility into your source code.

13 min read
Thumbnail for Railway Is My Go-To Infrastructure. Here's Why I Recommend It to Enterprise Clients
RailwayInfrastructureDevOps+5 more

Railway Is My Go-To Infrastructure. Here's Why I Recommend It to Enterprise Clients

I run several production projects on Railway, from SaaS platforms with background workers to simple marketing sites. After years on AWS and Azure, Railway cut my go-to-live time from days to minutes. Config-as-code, built-in databases, non-serverless deployments by default, and a platform that ships meaningful features weekly.

14 min read
Thumbnail for Why I Chose Nuxt Over Next.js for AccessHawk
NuxtNext.jsVue+5 more

Why I Chose Nuxt Over Next.js for AccessHawk

I built AccessHawk with Nuxt instead of Next.js. Vue's reactivity model and auto-imports made me faster, and I didn't have to give up TypeScript or testing to get there.

12 min read

Contact

Drop me a line. I read everything and reply within a day.

Required fields are marked “(required)”.