Projects

Everything I've built and shipped

Side projects, tools, and experiments. Each one has a write-up covering why I built it, how it works, and where it honestly stands.

Melofy

Melofy syncs translated lyrics to whatever's playing on Spotify, YouTube Music, or Apple Music. Line by line, against the playhead, in your language. Translation runs through Gemini in two passes for accuracy. Ten free translations to start, then bring your own API key.

Next.js TypeScript Gemini MongoDB

Kutlass

Install it from npm and mount one component to get a full video editor in a React app: trim, crop, filter, annotate and export, none of it touching a server. WebCodecs handles decode/encode wherever the browser supports it, FFmpeg compiled to WASM picks up the rest. The source file never leaves the user's machine.

React WebCodecs FFmpeg WASM Web Workers

A11y Auditor

A11y Auditor renders pages in real Chromium, then runs them through axe-core to surface accessibility violations, each one tagged with its WCAG rule and conformance level, filterable by severity and category, with the exact contrast ratio measured against the threshold it missed.

Next.js TypeScript axe-core Playwright

Auto Slug

Auto Slug is a Strapi plugin that generates slugs automatically from any source field you pick in the Content-Type Builder. Duplicates get a numeric suffix, accents normalize, regeneration rules are configurable per field and the same logic runs server-side for entries created through the API, not just the admin panel.

Strapi v5 React Node.js Strapi Design System

Gallery

Search Unsplash, scroll for more, open a photo full size. Skeleton placeholders occupy the grid slots their images will take, so the layout stays still while pages load.

Vue 3 TypeScript Vite VueUse

MCP Server

Expose a Strapi v5 instance as a Model Context Protocol (MCP) server. AI clients (Claude Code, Claude web, Cursor, Codex, opencode, Continue, etc.) authenticate via OAuth 2.1 + PKCE and then call tools to browse content-types, read entries, create/update drafts, list media, and upload files, all governed by Strapi's existing role-based permissions.

TypeScript MCP SDK Strapi v5 OAuth 2.1 + PKCE

06 projects / 5 still maintained