Skip to content

Remote mobile: rewrite the feed rendering (mobile-native, and adopt the new ownership-ledger pipeline) #475

Closed

Description

@Juliusolsson05

Sub-issue of #420 (Remote Mobile Companion). The phone can pair, list sessions, submit prompts, and stream — but the feed rendering is far from done. This tracks a ground-up rework.

Where it stands today (the actual code)

Why "reuse the desktop Feed" is now the wrong foundation

It was a reasonable bootstrap (ship something fast), but it couples the phone to desktop-shaped rows and, critically, to the legacy renderer that the rewrite is deleting. The desktop feed's density, hover affordances, and fixed-width assumptions don't translate to touch. And the two will diverge hard at cutover.

What "properly done" looks like

  1. Adopt the new pipeline, don't fork it. The ownership-ledger pipeline (src/renderer/src/rendering/) is provider-neutral and produces a clean ordered row model (RenderLedger → view bridge). The phone should consume that decision core and render its OWN mobile row components from it — same ownership/ordering guarantees, different presentation. This is exactly the seam the rewrite created (decision core vs. dumb rows). The phone becomes a second "view" over the ledger, like the desktop view bridge.
  2. Mobile-native row components. Purpose-built for touch/narrow: readable prompt/assistant bubbles, tap-to-expand tool calls (reuse the plan's JSON/MCP tool-row concepts but sized for the phone), collapsed subagent/Task cards, code blocks with horizontal scroll containers, big tap targets. Not the desktop marker-gutter layout shrunk down.
  3. Reuse the session recorder for mobile fixtures. The Session Recording work (Session Recording: continuous debug-gated capture replayable as rendering fixtures #467) records the SessionFeed input stream — the exact stream the phone consumes. A recording replays through the ledger identically for desktop and phone, so the phone's rendering gets the same replay/invariant test net for free, and mobile-specific divergences become fixtures.
  4. Handle the mobile-only surfaces properly. Conditions/AskUserQuestion tap-bar (already partially in SessionView), the screen/terminal fallback, connection/restart states, scroll/stick-to-bottom on touch.

Scope / non-goals

Pointers

Activity

  1. Juliusolsson05 commented on Jul 9, 2026

    @Juliusolsson05
    OwnerAuthor

    Closing — shipped, with one deliberate direction change from this issue's sketch.

    What landed:

    The direction change: this issue prescribed purpose-built mobile-native row components. That was explicitly superseded — the decision (2026-07-08) was a 1:1 replica of the desktop feed reusing our components, precisely so phone and desktop can never diverge in rendering semantics. Same ownership/ordering guarantees, same rows, zero drift surface. The "second view over the ledger" idea survives in the architecture (the view bridge is feed-owned and injectable), so a mobile-native skin remains possible later without touching the decision core.

    Mobile fixtures via recordings came free with the shared pipeline: the corpus + replay net exercises the exact RuntimeRenderInput path the phone paints from.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions