I ship things people press buttons on: WordPress plugins used on live sites, Chrome extensions that fight real player DOMs, and dashboards that make sense of messy data.
|
StatWP Plugin stats dashboard for WordPress.org data. Next.js and Recharts, live from the .org APIs. |
Captiv Pulls subtitles out of any player, canvas-rendered, shadow DOM or cross-frame, and floats them in a picture-in-picture window. |
Captiv Musica Mini player for YouTube Music and Spotify that stays on top of every window. Seek, queue, volume, five themes, |
By day: User Registration, a WordPress plugin doing forms, memberships and payments.
How I work
- Root cause, not symptom. One guard in the shared function beats a guard in every caller.
- Escaping and sanitization are not optional. Parameterized queries, escaped output, validated identifiers, every time.
- Boring code wins. Clever is what someone decodes at 3am.
- Delete before you add. The best code is the code never written.
- Currently poking at MV3 service workers, Document picture-in-picture, and Next.js internals.
Ask me about WordPress plugin architecture, PHP, or Chrome extension APIs.


