Shipping update - 2026-01-18
Launched a composable AI elements library with 27 new components, added comprehensive keyboard shortcuts for logs, migrated to Bun for faster builds, and shipped a spring-physics theme toggle.
Highlights
- AI elements component library: built 27 composable components (prompt input, message renderer, context provider, open-in-chat widget, and more) as a reusable foundation for AI-powered interfaces across the product, with streaming support baked in.
- Full-stack AI streaming integration: wired the backend streaming API into the dashboard chat context with optimistic updates, incremental message rendering, cancellation support, and proper session management across 17 changed files.
- Comprehensive keyboard shortcuts for logs: added Cmd/Ctrl+click to open details, arrow keys and j/k vim-style row navigation, Enter/Space to expand,
/to focus search,wfor line wrap,[/]for tab switching, number keys for mode switching, and a shortcuts modal triggered by?. - Exception stack traces now include component stacks parsed from error args, giving developers the full React component hierarchy alongside the JavaScript call stack when debugging exceptions.
- Switched the dashboard build from yarn to Bun for roughly 10-25x faster package installation, with simplified caching and backward-compatible lockfile support.
- Personal site: replaced the button-based dark mode toggle with an interactive spring-physics pull cord using verlet integration for rope simulation, where dragging the ball past a threshold triggers the theme switch with natural spring animation.
User outcomes
- AI chat feels native and responsive with streaming messages, structured tool-result cards, character count limits, and improved loading/empty states.
- Log exploration is fully keyboard-navigable: power users can browse rows, open details, toggle views, refresh queries, and switch modes without touching the mouse.
- When debugging exceptions, the full component stack (React hierarchy) now appears in the trace view, making it faster to pinpoint which component tree path led to an error.
- Dashboard CI runs significantly faster thanks to the Bun migration, reducing feedback loops for engineers.
- The personal site theme toggle is now a playful, physics-based interaction instead of a static button.
Technical wins
- Built the AI elements library as composable primitives: a
PromptInputcomponent (1200+ lines) with attachment handling, character counting, and submit affordances; aMessagerenderer with structured parts and copy behavior; and aContextprovider for managing chat state across the component tree. - Integrated real-time streaming into the chat context with a helper to build stream URLs, an
updateMessagemethod for incremental token appending, and proper cleanup on unmount/cancellation — spanning backend Go handlers and frontend React state in a single coordinated change. - Implemented a keyboard shortcuts system with a
KeyboardShortcutsContextprovider, multi-key sequence support (e.g.,g h,g lvim-style), visual focus rings on rows, and a discoverable shortcuts modal — all without conflicting with existing input fields. - Centralized exception formatting with
getComponentStackFromArgsto parse args payloads, extract componentStack entries, and merge them with existing stacktrace frames, handling bothexception.stacktraceanderror.stacktracefallback paths. - Replaced yarn with Bun in CI workflows, removing 94 lines of configuration and adding Bun's global cache strategy for simpler, faster builds.
- Implemented rope physics using verlet integration with configurable segment count, gravity, and constraint iterations, attaching a draggable ball that triggers theme changes when pulled past a distance threshold.
Notes
- Sensitive/internal details have been redacted.
- Bundle analysis workflow was removed as part of build tooling cleanup.
- Linting auto-fixes were applied across 7 files for formatting consistency.