RAMEN

Selected Work

A curated index of the architecture, agent, streaming, browser, and chat UI work behind RAMEN.

Sort by
  1. Chat UI Frontend · Apr 2026
    Atomic @-mention pills with tab metadata

    Contenteditable tokens with favicon, title, and URL. Caret-aware deletion, drag-select, and keyboard support. Feels like a real tag input, not a regex on a textarea.

  2. Browser automation Backend · Apr 2026
    Eval suite for the browser subagent

    Roughly two dozen browser tasks scored on five axes: correctness, recovery, hallucination, latency, and tool-use shape. Turns vague "it broke" reports into a specific failing case and gates every patch before it ships.

  3. Browser automation Backend · Apr 2026
    Snapshot-first browser subagent prompt with raised step budget

    Subagent now requires a fresh page snapshot before any interaction, addresses elements by visible text rather than row position, and verifies the post-navigation URL before claiming success. Per-spec step budget raised from 25 to 50 so multi-step form flows finish without hitting the cap.

  4. Browser automation Frontend · Apr 2026
    CDP fill and type split into separate verbs with a direct focus path

    Replace versus append used to be a flag on a single verb, leaving the agent cycling through fallbacks. Splitting them deleted the ambiguity. Swapped the field-focus path from three simulated mouse events to a direct focus call: fill operations went from about 5,000ms to 40ms.

  5. Browser automation Frontend · Apr 2026
    CDP session manager with target resolution and idle release

    Single CDP session per browser, resolves target tab (current vs. new), runs tool calls, and releases on 60s idle. Show/hide overlay and screenshot/snapshot caches hang off the session lifecycle.

  6. Browser automation Frontend · Apr 2026
    Selected-tab ephemeral context attached to messages

    Current tabs feed into a per-message context field and clear after send. Stops yesterday's selection from quietly riding along on tomorrow's question.

  7. Streaming Frontend · Apr 2026
    Stream processor with partial-JSON tool input

    Extracted from the conversation store. Accumulates partial JSON for tool inputs, embeds tool results into the right block, and tracks subagent state alongside the parent turn.

  8. Browser automation Frontend · Apr 2026
    WebGL pulsing-border shader for the controlled-tab overlay

    Replaced a CSS glowing frame that felt too quiet next to the rest of the UI. Custom vertex and fragment shaders, 60fps RAF loop, debounced fade-out after the last tool call.

  9. Browser automation Backend · Mar 2026
    Browser proxy tool with dynamic schema-to-LangChain conversion

    Converts JSON schemas from the extension into StructuredTools at session start. Depth, property-count, and enum-cardinality guards keep a hostile schema from blowing up the agent.

  10. Browser automation Frontend · Mar 2026
    CDP tool suite with narrowed schemas

    Click, type, navigate, wait_for_selector, snapshot, and ~25 more, all schema-validated client-side before dispatch. Actionability checks live next to tool execution.

  11. Streaming Backend · Mar 2026
    Pulled the SSE serializer out of the stream service

    ChatEventSerializer owns block-index correlation, orphan event filtering, and text coalescing. Stream service is now a thin transport that doesn't know about content blocks.

  12. Chat UI Frontend · Mar 2026
    Composer with mention pills, slash menu, and attachment chips

    Multi-line input with Cmd+Enter to send, Shift+Enter for newline, queued sends while a turn is in flight, and a stop control wired to the abort protocol. The composer is where most of the chat polish lives.

  13. Browser automation Backend · Mar 2026
    Live tool updates over the open WebSocket

    An `update_tools` message rebinds the agent's available tools mid-session when the controlled tab changes. Avoided tearing down and reissuing tickets on every navigation.

  14. Architecture Backend · Mar 2026
    Typed LLMProfile DTO replacing untyped profile dicts

    Pydantic model for external GraphQL profile data with camelCase aliasing, provider extraction, and reasoning-effort validation. Removed `dict[str, Any]` from the agent boundary.

  15. Browser automation Backend · Mar 2026
    WebSocket relay with one-time Redis ticket handshake

    Origin-bound, hashed-key tickets with 60s TTL and atomic consume. Replaced JWT-in-query-param auth, which would have leaked tokens through extension logs.

  16. Architecture Frontend · Mar 2026
    Pluggable WebSocket client tool registry

    Modules register and unregister tools at runtime through a `(name, definition, implementation)` signature. CDP tools, tab access, and content capture all live behind the same interface.

  17. Streaming Backend · Feb 2026
    Resume-from-partial after abort with a LangGraph checkpointer

    Mongo-backed checkpoint saver scoped by `conversation_id`. After an abort, the next turn starts from the last persisted message, not from a fresh transcript.

  18. Chat UI Frontend · Feb 2026
    Command palette with conversation search

    Cmd+K (and Cmd+Shift+O) opens three modes: new chat, settings, and search. Relative date labels, request deduplication so stale results don't overwrite fresh ones.

  19. Architecture Frontend · Feb 2026
    Interactive create-feature scaffolder script

    Bun script generates a new feature module's directory shape, adds it to the toggle registry, and validates kebab-case naming. Stops new features from drifting in shape.

  20. Architecture Frontend · Feb 2026
    Environment-aware feature toggle system

    Local-only flags (tool debug, SSE inspector) and always-on flags (suggestions, agent config) in one registry. Persists to localStorage; a settings tab exposes them with friendly names.

  21. Architecture Backend · Feb 2026
    Conversation search via Mongo $text indexes

    Search by title and message content with cursor pagination. Orchestration lives in a use case, not the repository, so the query path stays under domain control.

  22. Chat UI Frontend · Feb 2026
    Sidebar with infinite-scroll cursor pagination

    Date-grouped conversation list, rename and delete inline, optimistic updates, loading skeletons. Built on shadcn primitives so it matches the rest of the chrome.

  23. Streaming Frontend · Feb 2026
    Stream coalescer with requestAnimationFrame batching

    Buffers keystroke-rate text deltas and flushes them once per frame. Keeps the chat smooth under streaming load and stabilises the order of multi-tool turns.

  24. Performance Frontend · Feb 2026
    Streamdown isAnimating prop for mid-stream memoisation

    Tells Streamdown to short-circuit re-renders mid-token-stream and only do a final pass when the turn finishes. Removed the worst of the message-list jank.

  25. Agent loop Backend · Feb 2026
    Subagent event isolation in the parent stream

    Distinct `SubagentStart`, `SubagentTextDelta`, and `SubagentToolCallStart` events let the frontend show delegated work without conflating it with the parent turn's tokens.

  26. Chat UI Frontend · Feb 2026
    Tool indicator with running shimmer and parallel-tool view

    Collapsible per-tool panel with a shimmer running state, a special web-search affordance, and a consolidated row when several tools fire in parallel. Replaced an early one-line spinner.

  27. Architecture Backend · Jan 2026
    Centralised dependency-injection container

    AppContainer manages tool registry, LLM factory, agent service, and session services with lazy initialization. Replaced module-level singletons so tests no longer have to monkey-patch globals.

  28. Architecture Backend · Jan 2026
    Atomic conversation ownership across every read and write

    Ownership filter pushed into the query, not layered on after, so a missing scope can't leak data. Safe-delete ordering and request-scoped checks fell out of the same pass.

  29. Performance Frontend · Jan 2026
    Background stream persistence with local cache

    Streams keep going when the tab loses focus, and results re-attach when the user comes back. Closes the loop where a long browser-tool turn used to look stuck.

  30. Architecture Backend · Jan 2026
    DDD-layered backend with five clean boundaries

    Domain entities, use cases, protocols, repositories, and presentation schemas wired through a single DI module. The split paid off when middleware, subagents, and providers slotted into existing seams without rewriting the API.

  31. Agent loop Backend · Jan 2026
    DynamicToolChoiceMiddleware mutating state at bind time

    Forces a specific tool when the product needs it, by mutating LangGraph's `tool_choice` between turns. LangChain's built-in selector solves a different problem (filtering visible tools), so I wrote this layer.

  32. Architecture Frontend · Jan 2026
    Feature-folder SPA layout with module runtime facades

    Each feature owns its module/, components/, hooks/, lib/, and __tests__/. A small create-feature script enforces the shape so new features always look the same.

  33. Streaming Backend · Jan 2026
    Framework-agnostic SSE event shape

    Text deltas, tool calls, tool results, token usage, finish reason, and disconnect signals. Designed against the contract, not the LangChain emitter, so the frontend code is portable across providers.

  34. Streaming Frontend · Jan 2026
    Three-layer abort wired through the conversation store

    abortKey-keyed registry with AbortError handled gracefully. The stop button, route changes, and reload all converge on the same path so partial responses don't get orphaned.

  35. Agent loop Backend · Jan 2026
    LangGraph middleware stack on top of LangChain

    Composable layers (DynamicToolChoice, ToolMonitor, SubAgent, prompt context) instead of subclassing the agent. Each middleware is independently testable and addable.

  36. Agent loop Backend · Jan 2026
    Per-(provider, model) LLM instance cache with TTL

    Avoids reconnecting to the upstream provider on every turn, which was the dominant tail-latency source under streaming load.

  37. Architecture Backend · Jan 2026
    Per-user, multi-provider API keys

    Request-scoped resolution of OpenAI, Anthropic, and Google credentials, with a model allowlist per provider. Each agent run uses the right user's keys without any global config.

  38. Performance Frontend · Jan 2026
    React Compiler with vendor chunk splitting

    Auto-memoisation in production builds and a Vite chunking pass that keeps the streaming hot path off the cold path. Smaller, cache-friendlier bundles.

  39. Agent loop Backend · Jan 2026
    Typed reasoning-effort and tool-choice across the codebase

    Literal unions enforce OpenAI and LangChain spec compliance at the type level. Removed a class of `KeyError`s that only surfaced at LLM call time.

  40. Performance Backend · Jan 2026
    Singleton middleware instances and lazy subagent init

    Reused middleware across requests instead of reconstructing them per turn. Combined with lazy SubAgentMiddleware init, this cut the streaming hot path significantly.

  41. Chat UI Frontend · Jan 2026
    Streamdown render with syntax-highlighted code

    Replaced vanilla markdown with Streamdown plus the code plugin. Streaming-aware, doesn't reflow on every token, and code blocks finally look right under heavy delta load.

  42. Agent loop Backend · Jan 2026
    SubAgentMiddleware for delegated execution

    Ephemeral subagents share the parent's tool registry and streaming protocol, so the frontend only needs to know about one event shape. Lazy init keeps the cold path quiet.

  43. Architecture Frontend · Jan 2026
    Tenant- and user-aware API client

    Axios instance with `X-Tenant-ID`/`X-User-ID` headers, EAB-extension token fetch, and 401 retry. The rest of the app talks to one client, not five.

  44. Streaming Backend · Jan 2026
    Three-layer abort: stop button, server, provider

    User cancellation, request scope, and upstream provider abort wired together. OpenAI streaming cancellation isn't actually feasible through LangChain's adapter, so I documented that and made sure partial responses still persist.

  45. No entries in this category.