← ALL TAGS

Tag: bun

44 articles tagged “bun” on Oak Oliver Engineering, newest first. The latest is “Program Status, Colour Profiles and Snapshots That Don't Stop the Program: What Today's Charm Port Releases Add”.

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 →
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 →
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 →
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 →
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 →
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 →
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 →
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 →
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 →
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 →
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 →
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 →
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 →
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 →
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 →
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 →
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 →