diff --git a/.claude/handoffs/2026-05-03-221356-toolbar-deploy-confirmed-mobile-only-visual.md b/.claude/handoffs/2026-05-03-221356-toolbar-deploy-confirmed-mobile-only-visual.md new file mode 100644 index 0000000..2935684 --- /dev/null +++ b/.claude/handoffs/2026-05-03-221356-toolbar-deploy-confirmed-mobile-only-visual.md @@ -0,0 +1,178 @@ +# Handoff: sethmux toolbar deploy confirmed live — visual gated to ≤900px viewport + +## Session Metadata +- Created: 2026-05-03 22:13:56 +- Project: /home/claude/bin/sethmux +- Branch: main +- Session duration: continuation of 2026-04-24 deploy session, ~30 min of follow-up debugging + +### Recent Commits (for context) + - 06c1ebb fix(docs): correct deploy topology — static assets live on caddy CT, not steel141 + - 8a9d89b docs: add session handoff for toolbar refresh deploy + - b8a7810 chore: archive design handoff bundle for toolbar refresh + - 2b375b0 chore: add detect-secrets baseline + - 3b06ce7 fix: keep tmux selection alive after mouse-drag in copy mode + - 8e70875 feat: Workspace dark refresh + mobile compose bar + +## Handoff Chain + +- **Continues from**: [2026-04-24-195210-toolbar-workspace-dark-refresh-deploy.md](2026-04-24-195210-toolbar-workspace-dark-refresh-deploy.md) +- **Supersedes**: None (prior handoff is still accurate; this one closes its open gates) + +## Current State Summary + +The 2026-04-24 toolbar refresh + compose bar work is **fully shipped and verified live** on `mux.sethpc.xyz`. The previous handoff left one open gate: "mobile-browser acceptance test." That gate is partially closed — the deployed file matches the design hash, the file is reachable through Caddy, and direct fetch of `https://mux.sethpc.xyz/toolbar.js` returns the new content. What's *not* yet confirmed is the actual mobile-device feel of the compose bar interacting with Gboard/iOS autocorrect; that requires a real phone session by Seth and is the only remaining work. + +A long detour mid-session uncovered two real gotchas that are now committed to docs: (1) the deploy is **two-host split** (Caddy CT serves static assets from its own filesystem; steel141 serves the index page and runs ttyd) — initial deploy went only to steel141, leaving the live site unchanged for ~30 minutes. (2) The toolbar is **gated behind `@media (max-width:900px)`**, so on a desktop viewport the page is byte-for-byte identical regardless of toolbar.js version. This is what caused the "looks the same after clearing cookies and site data" symptom: Seth was reloading on a Linux desktop browser ≥ 900px wide where the toolbar is `display:none` either way. + +## Codebase Understanding + +## Architecture Overview + +Two-host serving topology, both happen to use the path `/opt/sethmux/`: + +``` +Browser + ↓ +Caddy on caddy CT (192.168.0.185) + ├── /toolbar.js, /manifest.json, /icon-*.png → file_server from /opt/sethmux/ on caddy CT + ├── /api/* → reverse_proxy 192.168.0.141:7684 (notify-server.py on steel141) + └── / → reverse_proxy 192.168.0.141:7683 (ttyd on steel141) + └── ttyd serves --index /opt/sethmux/index.html (steel141 disk) +``` + +Auth (`import google_auth` in the Caddyfile vhost) wraps everything including `/toolbar.js`, but content is served directly off Caddy's disk — not proxied to an upstream. This is critical: the same path `/opt/sethmux/` exists on both hosts; only the caddy-CT copy of `toolbar.js` is what users actually see. + +DNS: `mux.sethpc.xyz` is a CNAME to `sethpc.xyz`, which is an A record to `71.178.159.217` (Seth's home WAN). Traffic flows directly to the caddy CT's exposed port. **No CDN, no Cloudflare** — header `server: Caddy` confirms. + +## Critical Files + +| File | Purpose | Relevance | +|------|---------|-----------| +| `static/toolbar.js` | Source of truth for the mobile toolbar — Workspace dark + compose bar | Hash `6aee4388...`. Must `scp` to caddy CT to ship. | +| `caddy:/opt/sethmux/toolbar.js` | What Caddy actually serves | Must match the source hash above. As of 2026-04-25 00:16 UTC, it does. | +| `/opt/sethmux/toolbar.js` (steel141) | Unused — but kept in sync for parity | Updating this alone does **nothing** to live. Easy trap. | +| `/opt/sethmux/index.html` (steel141) | ttyd's `--index` — the page shell that loads `/toolbar.js` via `