Side Projects

Everything on this page is a side project, built on evenings and weekends because something itched. The day job side of the story lives on LinkedIn.

@michi-vz

Framework-agnostic D3 chart library with 22 chart types

A real line chart, fed data until it turned into Michi. Hover to redraw the cat.

One plain TypeScript chart engine, wrapped for React, Vue, Svelte, Angular, web components and vanilla JS, so the same charts survive a stack change. Renders to SVG, Canvas or WebGPU behind one API.

Some parts I'm proud of: every chart ships a hidden screen reader table by default, emits an LLM-ready context object (structured data, stats and a plain language summary), and there's an in-page devtools panel to inspect and profile any chart without a browser extension. Published as 8 packages under the @michi-vz npm scope from the michi-vz-mono monorepo, docs in four languages. Not to be confused with the original michi-vz package, which is the legacy v1 this project replaced. Named after Michi, my cat here in Geneva, who supervises every release.

  • TypeScript
  • D3.js
  • WebGPU
  • Canvas
  • Lit
  • Turborepo
  • Storybook
  • Playwright

LiveCodenpm

michi-chat

Self-hostable AI chat assistant for small businesses that never invents a fact

A multi-tenant platform where each tenant is one business with its own persona, tools, branding, knowledge base and embed key. Answers are grounded in the tenant's own data through a hand-rolled tool loop and RAG over pgvector, and the bot is built, prompted and eval-tested to never invent facts, prices or availability.

The model layer is a LiteLLM proxy, so the app only knows two aliases and swapping local Ollama for a cloud provider is a config edit. Ships with two eval golden sets (retrieval recall and judge-graded answer faithfulness), a semantic answer cache, per-tenant daily caps and a privacy mode. The first tenant is Mugshot Artisan Cafe in Pasig; the story is in Introducing michi-chat.

  • Next.js
  • TypeScript
  • OpenAI SDK
  • LiteLLM
  • PostgreSQL
  • pgvector
  • Drizzle
  • Docker

LiveCodeGHCR

e-Saxophone Learning

Browser practice tool for electronic saxophone

Listens to every note you play, over USB MIDI or plain microphone with pitch detection, and scores your accuracy against warm-ups, scales and songs. Live fingering chart, staff notation, a dated 20-week course and a progress heatmap showing the notes you avoid.

Built and tested against the Yamaha YDS-120. Next.js front end, Go backend with PostgreSQL, no web framework, deployed with Docker behind a Cloudflare Tunnel. Available in five languages.

  • Next.js
  • React
  • TypeScript
  • Go
  • PostgreSQL
  • Web MIDI
  • Web Audio
  • Docker

LiveCode

JB Tabuzo

Portfolio and catalog site for a ceramic sculptor

Full portfolio site for a visual artist: artwork collections, individual pieces with availability, exhibitions and a contact flow, all editable through a headless CMS. Next.js front end, .NET API, Squidex CMS, deployed with Docker and Cloudflare Tunnel.

  • Next.js
  • React
  • TypeScript
  • .NET
  • Squidex
  • Docker

Live

Mugshot

Not only a coffee shop website: a platform helping local artists promote their products and organize events

The web home of Mugshot Artisan Coffee in Pasig, and quietly a bit more. Behind the menu sits a platform for local artists, giving them a place to promote their work and organize events at the shop, with the venue and the Mugshot crew behind them.

The shop is also the first tenant of michi-chat, my chat assistant platform, so visitors can ask about hours, beans and events and get answers grounded in the shop's own data.

If Manila is ever on your route, drop by for a slow coffee and the artisan pieces on the shelves. Greenwoods Executive Village, Greenwoods Ave, Pasig, 1900 Metro Manila, Philippines.

  • React
  • TypeScript
  • PostgreSQL
  • MinIO
  • Docker

Live