SYSTEMS NOMINAL

EngineeringPragmatic Systems

Technical deep dives into micro-SaaS architecture and open-source tooling. Exploring Bun, Elysia.js, zero-dependency libraries, and the reality of shipping production systems.

Runtime

Program Status, Colour Profiles and Snapshots That Don't Stop the Program: What Today's Charm Port Releases Add

Eleven TypeScript ports shipped new versions on November 2: Bubble Tea 1.4 reports what a program is doing to the terminal (OSC 7501) and writes frames in the terminal's colour profile, freeze 1.1 rasterizes off the event loop, ntcharts 1.1 gives charts fixed zone IDs, huh 1.1.3 fills bound fields at once, teatest 1.1 waits for the frame. One runnable example, a canary deploy you approve, uses all of them.

November 2, 2026 23 min read
Read Story →
Engineering

Porting Go's Bubblezone to TypeScript: Mouse Hit-Testing for Bubble Tea

lrstanley/bubblezone — clickable regions for Bubble Tea, found by hiding zero-width markers in the view — is now a TypeScript package. 549 lines of source, 122 tests, no runtime dependencies. What changed when the Go goroutine went away, what the original gets wrong about hyperlinks, and what still doesn't work.

November 1, 2026 13 min read
Read Story →
Runtime

Getting Started with Freeze in TypeScript: Code and Terminal Screenshots as SVG, PNG and WebP

@oakoliver/freeze is a Node and Bun port of Charm's freeze: it turns a code file or a command's coloured output into an image with window controls, a shadow and syntax highlighting, as SVG, PNG or WebP. This guide goes from one command to a script that renders a set of images, with the real output of every step.

November 1, 2026 8 min read
Read Story →
Runtime

Getting Started with teatest in TypeScript: Test Your Terminal Apps, Keys, Waits and Golden Files

A from-zero guide to @oakoliver/teatest, the TypeScript port of Charm's testing library for Bubble Tea. Run a program headless, press keys, wait for output, check the final model, compare the whole output with a golden file, take the clock out of a test, and use it from bun test, node:test or Vitest. Every program runs.

November 1, 2026 13 min read
Read Story →
Runtime

Getting Started with the Charm Ports Together: A Multi-User Terminal Dashboard over SSH in TypeScript

Build one program with five TypeScript ports of Charm's Go libraries: ntcharts draws the charts, bubblezone makes them clickable, wish serves the dashboard to everyone who connects over SSH, freeze turns a screen into an SVG, and teatest tests it all with golden files and real mouse input. Step by step, on Bun and Node.

November 1, 2026 24 min read
Read Story →
Runtime

Getting Started with Bubblezone in TypeScript: Clickable Buttons, Tabs and Sliders for Terminal Apps

A from-zero guide to @oakoliver/bubblezone, the TypeScript port of lrstanley/bubblezone for Bubble Tea. Make a button, a tab bar, a slider and a pair of nested counters respond to the mouse without computing a single screen coordinate, and see exactly what breaks a zone. Every program runs on Bun, Node and Deno.

November 1, 2026 13 min read
Read Story →
Runtime

Porting Go's teatest to TypeScript: Golden-File Tests for Bubble Tea Programs

Charm's teatest runs a Bubble Tea program headless, sends it keys, waits for its output and compares everything it wrote with a golden file. It is now a TypeScript package that works with bun test, node:test and Vitest. 137 tests, escaping and diffs checked against real Go, and a failure message made to be read.

November 1, 2026 13 min read
Read Story →
Runtime

Getting Started with Wish in TypeScript: SSH Apps in Six Small Programs

A from-zero guide to @oakoliver/wish, the TypeScript port of Charm's wish. Build an SSH server that greets people, recognises them by key, runs commands and serves a Bubble Tea app to every session, then share state between sessions and make it safe to expose. Every program runs on Node and Bun.

November 1, 2026 12 min read
Read Story →
Engineering

Porting Go's Freeze to TypeScript: Code and Terminal Screenshots, Byte for Byte

Charm's freeze turns code and terminal output into SVG, PNG and WebP images. The TypeScript port reproduces upstream's SVG byte for byte for terminal output and in everything but token colours for code, renders PNGs about 20 times faster than freeze's own WebAssembly fallback, and writes real WebP with a 455-line encoder. 100 tests, 37 golden SVGs.

November 1, 2026 12 min read
Read Story →
Runtime

Getting Started with ntcharts in TypeScript: Terminal Charts for Bubble Tea and Plain CLIs

A from-zero guide to @oakoliver/ntcharts, the TypeScript port of NimbleMarkets' terminal charting library. Print a sparkline, a bar chart, a time series and candlesticks as plain strings, then stream live CPU data into a Bubble Tea program, zoom with the keyboard and the mouse, and put three charts on one screen. Every program runs on Bun, Node and Deno.

November 1, 2026 13 min read
Read Story →
Testing

Porting Go's ntcharts to TypeScript: Terminal Charts That Match Go to the Last Bit

NimbleMarkets' ntcharts, the charting library for Bubble Tea, is now a TypeScript package: canvas, bar, line, streaming, time series, wave, sparkline and heatmap charts, candlesticks and JSON chart specs. Its output is compared byte for byte with the Go library on 342 scenarios, which meant reproducing Go's fused multiply-add and its own math functions.

November 1, 2026 12 min read
Read Story →
Runtime

Porting Go's Wish to TypeScript: SSH Apps and Bubble Tea over SSH

Charm's wish, the Go library for building SSH apps, is now a TypeScript package on top of ssh2: an SSH server with middleware, one Bubble Tea program per session, Git and SCP. 154 tests on Node and Bun, and the key-generation bug that hid behind a flaky test.

November 1, 2026 12 min read
Read Story →
Engineering

A Neuron Atlas for a Speech Model: What a Local 4B Can Label, What Replays Bit for Bit, and the Voice Levers We Had to Re-check

A one-day feasibility probe on LFM3-Audio-2B, a 2B speech-to-speech model: a local 4B model wrote labels for 300 of its 184,320 MLP neurons, a simulator scored them against a shuffled baseline, steering checked whether they are causal, and every test replayed bit for bit in new processes and across Metal and CUDA. Labels work for selective neurons only, families built from descriptions do not, labels transfer to a text model with another tokenizer, and of the voice neurons we first reported, three survived a 16-seed rerun against random neurons.

October 30, 2026 16 min read
Read Story →
Runtime

OG Images with Satori and resvg-js in Bun: Server and CLI

Satori turns a JSX or object tree into SVG, resvg-js turns it into PNG. A standalone CLI, a cached Bun route, fonts, timings and pitfalls from production.

October 28, 2026 16 min read
Read Story →
Runtime

How OpenCode Renders Messages in Bubble Tea: A Source Tour

How OpenCode's Go TUI renders chat: Bubble Tea's update loop, Glamour markdown, Lip Gloss, a render cache and a viewport, then the same in TypeScript.

October 28, 2026 15 min read
Read Story →
Runtime

Zero JavaScript on Load Cost Us 400 Milliseconds on the First Click. The Page Already Knew How to Get Them Back.

We moved 16 production sites from React to Qwik 2: 1-2 scripts on load instead of 22, first paint twice as fast. Then the first click took 400 ms to 1.6 s. A 1 KB idle warm-up that reads the chunk names the page already carries brought it to 56-90 ms, plus two deploy traps and one benchmark that lied.

October 27, 2026 11 min read
Read Story →
Engineering

Memory in the Weights: Teaching a 4B Model New Facts While It Sleeps, Without Teaching It to Lie

A lab note on a wake–sleep memory for a small language model: a teacher distils the day's messages at night and the facts are trained into per-person experts behind a learned router that can stay shut. Dense memory hallucinated; routed memory kept the model's own abstention. With Qwen3-VL-4B the memory held 100 episodes at best; the first Spark-X2.6-4B seed still passes at 250, and the three-seed answer is not in yet. All of it runs on our Rust engine, on Metal and CUDA.

October 23, 2026 15 min read
Read Story →
Engineering

Sounds and Videos as Prompts: A 107M Adapter That Lets EmbeddingGemma 2 Drive Qwen-Image and Iris, Retrained on Permissive Data

We replaced the 8B text encoder of Qwen-Image 2.1 with the 0.74B EmbeddingGemma 2 plus a small adapter, so a sound or a short video can be referenced in a prompt like an image. Then we threw away every non-commercial training item and retrained on CC0 / CC BY data only. The permissive adapter is better on text, the best we have on video, and the licensing surprise was not in the data.

October 21, 2026 11 min read
Read Story →
Engineering

Oak Oil: Cargo Plans, We Execute — Lean, Fast Rust Builds That Stay Byte-Identical to Stock Cargo

One Mac held 469 GiB of Cargo target directories, 177 GiB of them byte-identical copies. Oak Oil borrows Bun's build architecture: Cargo plans, our executor runs the plan against a content-addressed store. Output is byte-identical to stock Cargo, a wiped target comes back in 1.7 s instead of 11 s, and cleanup is verified by Cargo itself. Open source, built and published in public.

October 6, 2026 10 min read
Read Story →
Engineering

Porting TRELLIS.2 From Python to Rust and Metal: 2D Sprites to 3D Models in One Command

I moved Microsoft's 4-billion-parameter image-to-3D pipeline off PyTorch and onto our Rust and Metal runtime. One command now turns a 2D sprite into a textured GLB in one to three minutes with about 6 GB of memory instead of 33. This is how the port was organised, the three bugs worth retelling, the sparse-convolution kernel that decided it, and what parity means when the sampler is chaotic.

October 5, 2026 12 min read
Read Story →
Runtime

Getting Started with Bubbles in TypeScript: Spinners, Inputs, Lists and Tables for Terminal Apps

A from-zero guide to @oakoliver/bubbles, the TypeScript port of Charm's component library for Bubble Tea. Add a spinner, a text input, a filterable list and a table to a terminal app, then combine two components with focus switching. Every program runs on Node, Bun and Deno.

October 3, 2026 10 min read
Read Story →
Runtime

Getting Started with Bubble Tea in TypeScript: Interactive Terminal Apps in Six Small Programs

A from-zero guide to @oakoliver/bubbletea, the TypeScript port of Charm's Bubble Tea. Learn the Elm Architecture with a counter, then add key handling, timers, full-screen mode and printed output, and finish with a styled todo app. Every program runs on Node, Bun and Deno.

October 3, 2026 11 min read
Read Story →
Runtime

Getting Started with pageindex: Tree Indexes for Reasoning-Based RAG

A hands-on introduction to pageindex, the TypeScript port of PageIndex: turn a Markdown document into a tree of sections from the CLI and from code, thin the tree, add summaries through any OpenAI-compatible endpoint, and write the tree-search loop that answers questions from the right section. Offline first, with clear notes on which steps need an LLM.

October 3, 2026 10 min read
Read Story →
Runtime

Getting Started with specify-cli: Spec-Driven Development in Ten Minutes

@oakoliver/specify-cli is GitHub Spec Kit's `specify` command for Node and Bun. This guide sets up a project for an AI coding agent, walks through every file it generates, checks the setup with status and doctor, and explains the specify → plan → tasks → implement loop the generated skills give your agent.

October 3, 2026 7 min read
Read Story →
Runtime

Getting Started with Glow: Read Markdown in Your Terminal

Install one npm package and your terminal renders Markdown: files, stdin, URLs, a browsable TUI for a whole docs folder, styles, a git hook that shows the changelog after every pull, and an npm script for your project's docs. Every command here was run as written.

October 3, 2026 6 min read
Read Story →
Runtime

Getting Started with gum: Interactive Shell Scripts Without Writing a TUI

@oakoliver/gum gives bash scripts menus, prompts, confirmations, spinners, styled boxes, Markdown and tables, one command at a time. This guide builds up to a conventional-commit helper in seven steps, and every picture is the real output of the script beside it.

October 3, 2026 8 min read
Read Story →
Runtime

Getting Started with kb: A Knowledge Base an LLM Writes for You

@oakoliver/kb turns notes, papers and web pages into a linked, Obsidian-compatible wiki: you ingest sources, an LLM compiles them into articles, and you search, lint and browse the result from the terminal. This guide goes from an empty folder to KB Studio, and shows which steps need an API key.

October 3, 2026 7 min read
Read Story →
Runtime

Getting Started with bm25s: Full-Text Search in TypeScript Without a Search Server

A hands-on introduction to bm25s, the TypeScript port of Python's BM25 library: index a corpus, rank results with scores, pick a BM25 variant, tune k1 and b, add stopwords and stemming, save and load an index, and finish with a small CLI that searches your Markdown notes. Every example runs on Node, Bun and Deno.

October 3, 2026 10 min read
Read Story →
Runtime

Getting Started with Lip Gloss in TypeScript: Terminal Styling in Ten Minutes

@oakoliver/lipgloss brings Charm's Lip Gloss to Node, Bun and Deno: CSS-like styles for the terminal, with borders, padding, colors and layout. This guide goes from an empty folder to a small status dashboard in five runnable steps, each with its real output.

October 3, 2026 6 min read
Read Story →
Runtime

Getting Started with Huh in TypeScript: Terminal Forms in Ten Minutes

From npm install to a working project scaffolder: one question, a multi-field form, validation, themes, and a script that writes real files. Every snippet in this guide was run as written, on Node and Bun, and every animation is a recording of that run.

October 3, 2026 8 min read
Read Story →
Runtime

Getting Started with Glamour in TypeScript: Render Markdown in the Terminal

@oakoliver/glamour renders Markdown as styled terminal output on Node, Bun and Deno: headings, tables, task lists, syntax-highlighted code and seven built-in themes. This guide goes from one function call to a small script that renders any README in your terminal, with the real output of every step.

October 3, 2026 6 min read
Read Story →
Runtime

Getting Started with Rod in TypeScript: Drive Chrome Over the DevTools Protocol

Three small zero-dependency packages, @oakoliver/browser-launcher, @oakoliver/cdp and @oakoliver/cdp-input, let you start Chrome, send it DevTools Protocol commands and type and click like a user, from Node 22+ or Bun. This guide goes from an empty folder to a script that fills in a form, waits for the result and saves a screenshot.

October 3, 2026 9 min read
Read Story →
Runtime

Getting Started with VHS in TypeScript: Terminal GIFs Written as Code

@oakoliver/vhs is a Node and Bun port of Charm's VHS: you write a .tape file of keystrokes and pauses, and it renders a GIF, MP4 or PNG of a real terminal running them. This guide covers the prerequisites, a first tape, waiting on output, styling, rendering from TypeScript, keeping README GIFs fresh, and the tape-language gotchas we hit along the way.

October 3, 2026 8 min read
Read Story →
Architecture

Who May a 24/7 AI Agent Team Contact? Outreach Channels in Portugal, and the Gate in Front of Every Send

We are building an agent team that finds small businesses with failing websites and offers them a better one, around the clock. Before letting it send a single message, we mapped Portuguese and EU law, provider policies and deliverability rules. The answer reshaped the product: most small restaurants and salons are sole traders, and for them a letter with a QR code is the only channel an agent may use on its own.

September 28, 2026 10 min read
Read Story →
Runtime

One JSON Document, Live Data: Adding Data Bindings to oak-ui and Running It as a Vibe

oak-ui describes a whole app as one JSON document, but the document could only show data it already contained. Version 1.1 adds sources, bindings and commands against the app's own API: each distinct request fetched once per resolution pass, dependencies resolved in waves, paths that can't leave /api/, and API data that is never evaluated as code. Then we taught the vibe platform to serve app.oak.json as a page, fought a CSP over fonts, and shipped the first real oak-ui vibe to production.

September 28, 2026 12 min read
Read Story →
Runtime

Agent Teams That Never Talk to Each Other: Running a 24/7 Lead Pipeline on pi

Oak Prospector runs teams of pi coding agents around the clock, finding local businesses, assessing their websites, building previews and handling replies. The agents never message each other. They claim work with leases, hand it off through state changes, read directives at claim time and escalate upward, all through one API. This is the design, why we stayed on pi instead of adopting an orchestrator, and an honest line between what exists and what doesn't yet.

September 28, 2026 12 min read
Read Story →
Runtime

Syncing Ten Ports With Upstream: Glow v3, spec-kit 1.0, and Everything In Between

This year we ported ten Go and Python libraries to TypeScript. By September every upstream had moved: Glow shipped v3, spec-kit hit 1.0, Bubbles gained a tree component, PageIndex released nineteen times. We brought all ten back to parity in one pass: 1,795 tests became 5,730, with zero new runtime dependencies.

September 27, 2026 14 min read
Read Story →
Runtime

Finishing Rise: The TUI Framework That Said It Was Done, and the App That Proved It Wasn't

Rise is our Bun-native terminal UI framework: typed-array screen buffer, zero dependencies. Its reports said complete. The type checker had 71 errors, four widgets drew garbage behind tests that asserted true === true, and the App class gave every widget the same hard-coded 10×3 layout constraints. This is how we finished it, and Rise Studio, the six-screen app we built on it to prove it.

September 25, 2026 10 min read
Read Story →
Engineering

Porting ERNIE-Image-Turbo to Zig and Metal: An 8B Diffusion Transformer From Scratch on Apple Silicon

I rewrote the hot path of Baidu's 8B-parameter ERNIE-Image-Turbo (DiT + scheduler) from scratch in Zig with hand-written Metal kernels. 13.06s/step at 1024×1024 on M2 Max. The bug archaeology behind getting 36 layers numerically correct, plus the honest accounting of what still has Python in it.

April 23, 2026 18 min read
Read Story →
Runtime

Specify-CLI v1.1.0: Syncing 28 Agents, a Catalog System, and Doctor/Status Commands

We synced @oakoliver/specify-cli with upstream spec-kit v0.7.0. 5 new agents, YAML recipe generation, catalog search, doctor diagnostics. 324 tests, zero dependencies.

April 15, 2026 7 min read
Read Story →
Runtime

Stop Pasting Into ChatGPT. Build a Knowledge Base Your AI Can Actually Search.

I built a CLI tool that turns URLs, PDFs, and markdown into a searchable knowledge base with AI-powered Q&A. No vector database. No embedding service. Just files, BM25 search, and LLM synthesis — all from your terminal.

April 3, 2026 7 min read
Read Story →
Runtime

How kb Works: 27 Modules, One External Dependency, and a Compiler That Turns Raw Sources Into a Wiki

A deep dive into the architecture of kb — the CLI knowledge base tool. Hash-based incremental compilation, BM25 search, TTY-aware dual output, Zod-validated frontmatter, and a dependency graph that recompiles only what changed. 154 tests, 27 TypeScript modules, the full @oakoliver stack.

April 3, 2026 8 min read
Read Story →
Runtime

Porting Python's Spec-Kit to TypeScript: Using SDD to Build SDD

We ported GitHub's spec-kit — the Spec-Driven Development CLI — from Python to TypeScript with zero dependencies. This is the complete journey.

March 26, 2026 16 min read
Read Story →
Real-time

Porting Go-Rod to TypeScript: Browser Automation from Scratch

Go-rod — the DevTools Protocol automation library used by Charmbracelet for VHS — is being ported to TypeScript as a multi-package monorepo. Three packages complete: cdp-input (keyboard/mouse encoding), cdp (WebSocket client), and browser-launcher (process management). 107 tests, 179 expects. Zero dependencies.

March 21, 2026 7 min read
Read Story →
Engineering

Porting Go's Huh? to TypeScript: Interactive Terminal Forms, Zero Dependencies

Charmbracelet's Huh? — interactive terminal forms with 7 field types, 5 themes, dynamic evaluation, and validation — is now a TypeScript package. 4,944 lines of source, 28 tests, 126 expects. The sixth Charm ecosystem port.

March 20, 2026 6 min read
Read Story →
Engineering

Porting Go's Glow to TypeScript: A Terminal Markdown Reader, Zero Dependencies

Charmbracelet's Glow — the terminal markdown reader with CLI and interactive TUI modes — is now a TypeScript package. 4,254 lines of source, 10 Go dependencies replaced, 60 tests. The fifth and final Charm port.

March 19, 2026 9 min read
Read Story →
Engineering

Porting Go's Terminal UI Ecosystem to TypeScript: Glamour and Lipgloss Are Now on npm

charmbracelet/glamour and charmbracelet/lipgloss are now available as TypeScript packages. Custom GFM parser, 7 built-in themes, 645+ tests. The first two of five Charm ports.

March 16, 2026 7 min read
Read Story →
Engineering

Porting Go's Bubble Tea to TypeScript: An Elm Architecture TUI Framework for Node.js

Charmbracelet's Bubble Tea — the Elm Architecture TUI framework — is now available as a zero-dependency TypeScript package. Event loop, input parser, renderer, 46 tests. The third of five Charm ports.

March 16, 2026 7 min read
Read Story →
Runtime

Full-Text Search Without Elasticsearch: BM25 in Pure TypeScript

How we replaced Elasticsearch with a small TypeScript port of Python's bm25s for mentor and session search in Mentoring. 4.6 million tokens per second indexing, zero infrastructure dependencies.

March 16, 2026 6 min read
Read Story →
Engineering

Porting Go's Bubbles to TypeScript: 15 TUI Components, Zero Dependencies

Charmbracelet's Bubbles — 15 pre-built TUI components including text inputs, viewports, tables, lists, and spinners — is now available as a zero-dependency TypeScript package. 256 tests, 11,738 lines. The fourth of five Charm ports.

March 16, 2026 7 min read
Read Story →
Runtime

I Rewrote Python's Fastest BM25 Library in TypeScript: 2x Faster Indexing, Zero Dependencies

How bm25s (formerly bun-bm25s) indexes about 2x faster than Python's bm25s library using nothing but TypeScript and typed arrays. Retrieval beats bm25s's numpy backend but not its numba backend, as the October 2026 re-measurement shows.

March 15, 2026 9 min read
Read Story →
Data

I Mined 47,000 Businesses from OpenStreetMap and Scored the Ones That Need a Website: Building an Automated Lead Gen Pipeline

How the osm-vibe-all pipeline parses 13GB of PBF data from four European countries, crawls websites with Puppeteer, scores web presence quality, and identifies businesses ripe for outreach — all from open-source geographic data.

February 15, 2026 13 min read
Read Story →
Security

Server-Side API Key Injection: An LLM Proxy That Hides Your Keys and Meters Cost Per Request

How Vibe's AI proxy injects its Gemini key on the server so browser code never sees them, and why it meters each request's cost at the proxy, before and after the call, instead of working it out from logs later.

February 14, 2026 16 min read
Read Story →
Testing

BDD Is Not Dead: How Gherkin Scenarios Turned My Micro-SaaS Test Suite Into a Living Contract

How Vibe uses Cucumber.js with Gherkin scenarios and Playwright to describe and execute full user journeys — create a vibe, purchase credits, approve payments — with tests that non-developers can read.

February 13, 2026 14 min read
Read Story →
Runtime

14 Test Files, Zero Flaky Tests: How I Test Every API Domain in Elysia.js Without Jest or Vitest

Why Bun's native test runner replaced my entire testing stack — and how 14 integration test files with real databases, mock modules, and Faker-powered factories give me the confidence to deploy solo.

February 12, 2026 10 min read
Read Story →
Runtime

From 1.2GB to 89MB: The Docker Multi-Stage Build That Changed How I Ship Bun Applications

How I reduced production Docker images by 93% using multi-stage builds, Alpine base images, non-root users, entrypoint migrations, and every optimization pattern I've developed running six services on one VPS.

February 11, 2026 9 min read
Read Story →
DevOps

I Run 6 Production Services on a Single €30/Month Server. Here's Why I Don't Need Kubernetes.

How one Hetzner VPS with Coolify and Traefik runs two SaaS platforms, an automation engine, analytics with ClickHouse, image processing, and a dev environment — at 10% of the cloud cost.

February 10, 2026 9 min read
Read Story →
Architecture

I Built Two Stripe Integrations in the Same Codebase. They Share Almost Zero Billing Code.

Why per-session payments and prepaid credit systems demand completely different architectures — even when they use the same Stripe account, the same API keys, and the same developer.

February 9, 2026 9 min read
Read Story →
Billing

85/15 Almost Killed My Marketplace — The Hidden Economics of Two-Tier Billing

How Vibe implements an 85/15 revenue split with Stripe Connect, referral bonuses, minimum payout thresholds, and why getting marketplace economics wrong kills platforms faster than bad code.

February 8, 2026 11 min read
Read Story →
Runtime

We Run Cron Jobs Inside the Bun Server Process (And You Should Too)

How we replaced system cron and external job runners with an in-process scheduler in Bun — featuring drift correction, job deduplication, error isolation, and why fewer moving parts means fewer 3 AM pages.

February 7, 2026 18 min read
Read Story →
Architecture

Stop Deducting Credits Immediately — Your Billing System Is a Ticking Time Bomb

Why naive credit deduction causes race conditions, phantom charges, and support nightmares — and how the hold-confirm-release pattern with automatic TTL expiration eliminates an entire category of billing bugs.

February 6, 2026 10 min read
Read Story →
Frontend

480 Unique OG Images at Build Time: How We Made Every Page Shareable with Satori and resvg

How we generate dynamic Open Graph images for 40 locales and 12 routes at SSG build time using Satori and resvg-js — creating unique, branded social cards without a single runtime render.

February 5, 2026 19 min read
Read Story →
Architecture

40 Languages, 400KB Bundle — Why I Refuse to Ship Translations in JavaScript

How dynamic translation loading with client-side caching serves 40 locales without bloating the SPA bundle, keeping the React app under 400KB while supporting instant language switching.

February 4, 2026 10 min read
Read Story →
Runtime

We Built Our Own Hot Reload Because Bun Doesn't Have One (And It's Better)

How we built a custom file watcher for development hot-rebuild in Bun — with debouncing, selective bundle rebuilds, cache invalidation, and why rolling your own DX tooling is sometimes the right call.

February 3, 2026 18 min read
Read Story →
Frontend

480 Pages, 40 Locales, Zero Frameworks — How I Beat Next.js at International SEO

How we bake hreflang tags, Schema.org structured data, and locale-specific Open Graph metadata into 480 static HTML pages at build time — without any client-side i18n framework or SSR.

February 2, 2026 9 min read
Read Story →
Frontend

I Killed the Loading Spinner — Without Next.js, Without SSR, Without Any Framework

How a 6-line data injection pattern eliminates the loading spinner from React SPAs by injecting server data into HTML and pre-populating React Query's cache before the first render.

February 1, 2026 10 min read
Read Story →
Architecture

Your SSE Connections Are Lying to You — Here's What Happens When Users Reconnect

Most Server-Sent Events implementations have a silent reliability hole. The event replay pattern guarantees reconnecting clients never miss a billing update, payment approval, or session state change.

January 31, 2026 11 min read
Read Story →
Architecture

I Made Billing Invisible. Now My Developers Ship Paid Features Without Writing a Single Line of Payment Code.

How Vibe's billingGuard middleware intercepts paid API calls, pushes approval requests via SSE, auto-renders payment modals, and settles transactions — without feature developers touching payment logic.

January 30, 2026 9 min read
Read Story →
Architecture

Our Mentoring Platform Was Bleeding $17 Per Overrun Session. Then I Built a Timer That Kills Zoom Calls.

How I built an in-memory billing engine that broadcasts millisecond-accurate charges via Server-Sent Events, escalates balance warnings, and automatically terminates Zoom meetings when credits run out.

January 29, 2026 9 min read
Read Story →
Framework

I Deleted Every Password From My Database. Here's Why My Users Are Safer Than Yours.

How I built passwordless authentication with magic link tokens, GitHub/Google/LinkedIn OAuth via Arctic with PKCE, JWT httpOnly cookies, and Elysia.js middleware — and why the password era needs to end.

January 28, 2026 10 min read
Read Story →
Architecture

HMAC-Signed Vibe-to-Vibe Calls: How We Stopped Micro-Apps from Impersonating Each Other

Inside the HMAC-signed request protocol that secures inter-app communication on the Vibe platform — where every micro-app runs in its own Cloudflare Worker sandbox and no one trusts anyone.

January 27, 2026 20 min read
Read Story →
Runtime

I Processed 1.2 Billion Map Records on a $7/Month Server. The Lead Database Industry Doesn't Want You to Know This.

How I built a Bun-powered pipeline that downloads 13GB of OpenStreetMap data, extracts 7.4 million businesses, crawls their websites, and produces over one million qualified leads — all on a single Hetzner VPS.

January 26, 2026 9 min read
Read Story →
Architecture

Layered Authorization in Elysia.js: Why Your Middleware Is Doing Too Much

How we built composable authorization layers using Elysia's derive() and scoped middleware — replacing a monolithic auth check with elegant derive chains that narrow permissions at every step.

January 25, 2026 18 min read
Read Story →
Architecture

Your SaaS Handles Money With a Balance Column. That's Why Your Numbers Don't Add Up at 2 AM.

How I built NostroLedger — a double-entry accounting system inside PostgreSQL that tracks every cent flowing through a real-time mentoring platform, and why 700-year-old bookkeeping principles will save your startup.

January 24, 2026 9 min read
Read Story →
Runtime

I Deleted a 200MB Rust Binary From My Docker Image. My Deploys Have Never Been the Same.

How migrating from Prisma 5's Rust query engine to Prisma 7's pure-JavaScript driver adapter cut our Docker image by 42%, slashed cold starts by 68%, and gave us back control of our connection pool.

January 23, 2026 8 min read
Read Story →
Architecture

Every User Gets Their Own Database. The Billing Architecture That Shouldn't Work — But Outperforms Everything.

How Vibe gives every user their own bank.sqlite for credits, holds, and transactions — the hold/confirm/release pattern, 5-minute TTL self-healing, and why database-per-user scales better than you think.

January 22, 2026 11 min read
Read Story →
Runtime

Your Users Download 1.5MB of JavaScript to See a Landing Page. We Fixed It With an If Statement.

How we split a React SPA into public (400KB), auth (150KB), and private (1.5MB) bundles — selected server-side by URL path, built with Bun, zero framework required.

January 21, 2026 9 min read
Read Story →
Architecture

Our Entire SaaS Is One 13,870-Line File. We Tried Splitting It. We Put It Back.

The case for keeping a micro-SaaS as a single Elysia.js monolith — where the seams are, why we reverted the extraction, and why premature decomposition is the root of all evil.

January 20, 2026 9 min read
Read Story →
Architecture

We Use Subdomains as Security Boundaries. No Kubernetes. No Containers. Just Directories.

Inside Vibe's multi-tenancy architecture where every user's micro-app gets its own subdomain, filesystem, derived secret key, and SQLite database — all on a single server process.

January 19, 2026 8 min read
Read Story →
Runtime

We Built a 340-Line Static Site Generator That Made Next.js Irrelevant. It Renders 480 Pages in 650ms.

How mentoring.oakoliver.com generates 40 locales × 12 routes at server startup using React 19, hydrates with React Query, and why we'll never go back to a framework for this.

January 17, 2026 9 min read
Read Story →
Runtime

We Replaced Node.js With Bun Across Every Production Service. Here's What Nobody Tells You.

The real story of migrating three production services from Node.js to Bun on a single VPS — cold starts, memory savings, deleted dependencies, and every gotcha that bit us.

January 15, 2026 9 min read
Read Story →