Blog
Notes from the side projects: charts, chat assistants, and the lessons in between.
2026
Sep 063 min read
One cobalt line on the roof
A design brief in one photograph, applied to an admin as a system: the roofline, one black primary per view, and screenshots as the only verification that counts.
Sep 064 min read
Three small things that make a cafe bot feel finished
Tappable contact details, a glossary under the analytics bars, and staff logins that see only their own tenant.
Sep 063 min read
Ten minutes a week
The owner's loop: the Unanswered report, the answer-cache inspector, Slack pings and retention, as a habit rather than a feature list.
Sep 063 min read
A second kind of tenant
Why a chess coach could not run on a platform that refuses everything but the business, and the one-column change that was the right size.
Sep 064 min read
The baiting weekend
What strangers tried on a cafe bot, the two places it bent, and why the real fix was making refusals visible.
Sep 022 min read
Teach the bot from a PDF, without burning tokens
michi-chat can now turn a PDF into knowledge-base facts. The analysis is free, the mechanical junk is stripped deterministically, and you see what the AI clean-up would cost before a single token is spent.
Aug 315 min read
How michi-chat works
The journey of one question through michi-chat: guardrails, the semantic cache, the tool loop, and why a LiteLLM proxy makes the AI model a config edit instead of a rewrite.
Aug 304 min read
Introducing michi-chat
A small self-hostable chat assistant platform for small businesses: multi-tenant, grounded in tools and RAG, and built to never invent a fact. The first tenant is Mugshot Artisan Cafe of mugshotmnl.com.
Aug 263 min read
michi-vz chart by chart: sankey and the fountain
Part 9 of 9 in the chart-by-chart series. The finale: flows whose thickness is the accounting, and the Jet d'Eau signature chart. All 22 charts, toured.
Aug 264 min read
michi-vz chart by chart: the maps
Part 8 of 9 in the chart-by-chart series. Choropleth and symbol map: bring your own GeoJSON, shade by threshold scale or plot de-overlapped circles at real coordinates.
Aug 263 min read
michi-vz chart by chart: tornado and bar-bell
Part 7 of 9 in the chart-by-chart series. Two bar specialties: opposing values on a shared centre line, and cumulative segments with end-caps.
Aug 264 min read
michi-vz chart by chart: gap and comparable bars
Part 6 of 9 in the chart-by-chart series. Before-and-after three ways: endpoint gaps, overlaid horizontal bars, and diverging columns with change arrows.
Aug 264 min read
michi-vz chart by chart: gauge, radar and radial tree
Part 5 of 9 in the chart-by-chart series. The round ones: progress rings, criteria polygons, and a radial dendrogram with adaptive labels.
Aug 263 min read
michi-vz chart by chart: scatter and bubble
Part 4 of 9 in the chart-by-chart series. Correlation clouds with a third variable as size, and gravity-packed bubbles when size is the whole story.
Aug 263 min read
michi-vz chart by chart: pie, donut and treemap
Part 3 of 9 in the chart-by-chart series. Part-of-whole snapshots: wedges for a handful of categories, tiles for many, and a realized-vs-untapped split.
Aug 264 min read
michi-vz chart by chart: area, stack bar and ribbon
Part 2 of 9 in the chart-by-chart series. Composition over time three ways: smooth stacks, discrete bars, and ribbons that follow a category as it trades places.
Aug 265 min read
michi-vz chart by chart: line, range and fan
Part 1 of 9 in the chart-by-chart series. Time series with honest uncertainty: solid history, shaded spreads, and forecasts that admit they are forecasts. Live examples included.
Aug 263 min read
Introducing @michi-vz: charts that survive a stack change
One TypeScript engine, 22 chart types, and the same charts in React, Vue, Svelte, Angular or plain web components. Why I built michi-vz and how to get your first chart on screen.