Repository navigation
Epic: Mobile and responsive shell #128
Description
Supersedes the exploratory stack #111–#127 and the integration preview #116.
TL;DR - 🚀 just play it.
Reviewing on desktop? 🕹️ ?mode=dev forces the touch shell (D-pad + action UI) without a phone · ?mode=debug adds turn/perf diagnostics.
What this tracks
The mobile and responsive-shell work is going up as 11 focused PRs, each scoped to a single concern and stacked linearly. The assembled set reproduces the tree already on #116: the re-slicing changes the commit shape, not the code, so each concern reviews and merges on its own.
Slices
All 11 carry the browser-mobile label — open the filtered PR list to review them together.
Shared-render (off main):
- build-info (build-info: build-info.json generator shared by make and CI #129):
build-info.jsongenerator shared bymake wasmand CI · basemain - bench (bench: native engine benchmark + shared xsofy.perf core #130): native engine benchmark + shared
xsofy.perfcore - render (render: responsive camera + narrow-terminal rendering #131): dead-zone camera + viewport follow + narrow-terminal layout collapse
- topbar (topbar: narrow-width in-grid HP/status bar #132): narrow-width in-grid HP/status bar when the sidebar folds
- screens/reflow (screens/reflow: reflow title and death screens on resize #133): reflow title and death screens on resize / font-change
Mobile shell (stacks on topbar):
let-go dependency (shell lane only). The client shell binds let-go's host-frame mount, which let-go #378 renames
#terminal→#app(and ships visible). So #135 bumps.let-go-versionfromv1.11.1tocf195a6(the #377 + #378 squash) and binds#app; #136–139 inherit the pin. #134 and the shared-render lane stay onv1.11.1and are unaffected. The pin is a commit ahead of the next release, not a tag — a tagged release carrying #377+#378 can replace it once one is cut.
- bridge (bridge: ui-bridge HUD channels + startup/stats wiring #134): ui-bridge HUD channels + startup/stats wiring
- shell (feat(mobile): blank client-shell scaffold (structure + hooks) #135): touch shell (client-owned host, D-pad/action UI, dark mode) + dev-gating (
?mode=) + OPTIONS panel - fit (fit: debounced re-fit + letterbox the grid #136): debounced resize / orientation re-fit + letterbox the grid
- landscape (feat(mobile): touch shell redesign — portrait + landscape #137): horizontal split layout for phone landscape
- screens/nudge-guard (screens/nudge-guard: ignore the shell's resize nudge on modal reads #138): ignore the shell's resize nudge on modal and prompt reads
Tail:
- title-moat (title-moat: keep decorative runes off the title text #139): keep decorative runes off the title, prompt, and seed text
Integration reference
integ/mobile-stack is a single squashed commit of the whole set: the diff to review the change as a whole without merging. Its tree matches #116's tip, except it drops #116's preview-only review doc.
Design reference
A visual walkthrough of the design — camera, layout collapse, touch shell, phone landscape, resize handling — with trigger conditions and the layout shape at each size: rendered HTML.
Landing order and independence
Linear by default, but the graph has slack:
- Shared-render: build-info, bench, render, topbar, and screens/reflow are all off
main. They don't depend on the mobile shell and can go in independently. - Mobile shell: bridge, shell, fit, landscape, and screens/nudge-guard form one dependent chain on top of topbar, in that order.
- title-moat is order-free, disjoint from everything else.
- build-info must precede shell: the shell fetches
build-info.json, and without the generator the browser-smoke gate fails on the missing file.
So the shared-render slices and title-moat can merge whenever; the mobile lane goes in order.
Why re-slice
The previous stack grew by exploration: churn that was added and later removed, one concern spread across several PRs, and two unrelated concerns sharing a commit. This set regroups the same final tree into one PR per concern: a touch shell that arrives in one piece, a screens fix separated into its shared-render half and its shell-specific half, and build-info pulled out so its ordering constraint is explicit. Same code, reviewable in coherent pieces.
Activity
[-]Mobile and responsive shell: focused slice set (umbrella)[/-][+]Epic: Mobile and responsive shell: focused slice set (umbrella)[/+][-]Epic: Mobile and responsive shell: focused slice set (umbrella)[/-][+]Epic: Mobile and responsive shell[/+]mparrett commentedon Jul 8, 2026
Pardon the dust on the shell lane (#135–139) — about to split it along the shell/non-shell seam.
Most of what makes portrait genuinely good (the resize-nudge guard in #138, the letterbox/refit, and a ~3-line portrait aspect cap) turns out to be independent of the opinionated touch shell. So those parts will land on
maindirectly, on v1.11.1 with no pin move, and the touch shell stays an optional layer to adopt (or not) later.Near term: #138 merges early on its own since it's pure game-side, then a small minimal-portrait-shell PR follows. #135/#136/#137 stay as published for now and rebase on top if/when we take the heavy shell. Expect some base reshuffling; nothing destructive to the reviewed diffs.
mparrett commentedon Jul 13, 2026
Status update, 2026-07-13: the slice checklist below consolidated.
Remaining to land: review #137, then two squashes (#137 → shell/app-mount, #154 → main).
mparrett commentedon Sep 2, 2026
All shared-render (#129-133), bridge (#134), and consolidated touch-shell (#135, #137, #154) PRs are merged; #138/#139 landed too. Nothing open still depends on this epic — closing.