Releases: burakgon/roamcode
Releases · burakgon/roamcode
Release list
RoamCode v4.0.48
Fixed
- Keep terminal typing responsive during heavy agent output and keep the screen stable across desktop and mobile
viewport changes. Browser parsing now applies real backpressure, repeated PTY resizes are deduplicated, and a
reconnect redraw no longer changes the terminal height temporarily.
Full changelog: v4.0.47...v4.0.48
RoamCode v4.0.47
Fixed
- Keep a Codex session marked as working while another session is open. RoamCode now follows Codex's own
lifecycle events, so an off-screen pane's stale prompt cannot turn background work idle or resurrect a
completed turn as working. - Type Shift-modified characters exactly once in the terminal while preserving keydown-less mobile keyboard
input and IME composition commits.
Full changelog: v4.0.46...v4.0.47
RoamCode v4.0.46
Added
- Clear a notification everywhere once you have dealt with it. Opening the session on any device — or the
agent no longer waiting on you — now takes the matching notification off every other device's screen,
instead of leaving a question you already answered sitting on your phone. Nothing is sent unless a standing
signal was actually resolved, so ordinary session switching produces no traffic.
Full changelog: v4.0.45...v4.0.46
RoamCode v4.0.45
Fixed
- Allow Android and Chrome to register for notifications at all. The guard that keeps a push endpoint from
pointing at a private address tested the IPv6fc00::/7range against the endpoint's hostname, so every
host whose name merely begins with "fc" or "fd" was refused — includingfcm.googleapis.com, the push
service for Chrome and every Android browser. Subscribing reported "endpoint host is not allowed" and no
such device could ever receive a notification. The address checks now apply only to real IP literals;
loopback, link-local, unique-local and private ranges are still refused.
Full changelog: v4.0.44...v4.0.45
RoamCode v4.0.44
Fixed
- Say why turning notifications on failed. Every error from the opt-in was discarded and the switch simply
returned to "off", so a browser that refused to subscribe, or a Node that could not be reached, was
indistinguishable from a button that does nothing at all — with nothing recorded anywhere to explain it.
The browser's own message is now shown in Settings, and the same applies to turning them off.
Full changelog: v4.0.43...v4.0.44
RoamCode v4.0.43
Fixed
- Test notifications against this device, and say whether one was actually shown. The button used to send
to every stored subscription and report success when any push service accepted it, so a stale or
desktop registration could certify a phone that receives nothing. It now refreshes this browser's own
subscription, targets only that endpoint, and waits for the service worker to confirm the notification was
displayed — reporting acceptance-without-confirmation honestly rather than as success. - Recover a subscription the browser replaces on its own. The service worker holds no credential of its own,
so it now wakes an open app to run the authenticated repair, and the same repair runs on the next open when
nothing is running. - Honour an explicit "notifications off" absolutely. The repair checked that choice only after re-registering
an endpoint that still existed, so a device could be put back in the Node's push list after being switched
off — and a Node that could not be reached during the switch-off no longer prevents it locally. - Remove a subscription the Node can no longer sign for from both sides, instead of leaving a row that is
rejected on every send forever. - Report Web Push as unavailable in an iPhone or iPad browser tab. It is a Home Screen web-app feature there,
so the permission flow could previously be completed in a way that could never produce a working device. - Retry a failed repair instead of giving up silently until the app is next launched.
- Keep full push endpoints out of the server log; only the push service's hostname is recorded now.
Full changelog: v4.0.42...v4.0.43
RoamCode v4.0.42
Fixed
- Use a contactable VAPID subject by default. The
subclaim is the address a push service can reach, and
the services validate it — Apple answers403 BadJwtTokenfor one it will not accept, which reaches the
user only as "notifications never arrive". The previous default named a domain no one can deliver to, so
any Node without an explicitROAMCODE_VAPID_SUBJECTcould be refused outright. - Replace a push subscription the Node can no longer sign for. A subscription is bound for life to the VAPID
key it was created with, so once that key differs every push is rejected with 403 and re-registering the
same endpoint can never recover it. A device now notices the mismatch on start-up and subscribes afresh. - Report the push service's own explanation alongside the status, in the test-notification result and the
server log. A bare 403 cannot distinguish a rejected subject from a key mismatch, and those need opposite
fixes.
Full changelog: v4.0.41...v4.0.42
RoamCode v4.0.41
Fixed
- Say whether a test notification was actually delivered. The Node answers the same way whether a push
reached a device or nobody at all, and the app discarded that answer — so "Send test notification" reported
success even when the channel was completely dead, which is exactly the case someone is looking at when
they say notifications never arrive. It now reports how many devices received it, or why none did. - Stop discarding push-delivery rejections. Only "gone" (404/410) responses were ever examined; every other
rejection — a push service refusing the VAPID credentials with 403, a 400, a throttling 429 — was dropped
without a log line or a report, leaving no evidence anywhere on the Node. Rejections are now logged with
their status and surfaced to the caller, while a subscription that is merely rejected is still kept.
Full changelog: v4.0.40...v4.0.41
RoamCode v4.0.40
Fixed
- Restore notifications after an update. A Web Push subscription belongs to the service-worker registration,
and every stale-bundle recovery path unregisters that registration — the automatic self-heal after an OTA
update, the iOS "close and reopen" preparation, and the Reload/Refresh buttons. Each of those destroyed the
subscription, and start-up only ever re-registered a subscription that still existed, so notifications
stopped silently while the app kept looking healthy and Settings had to be used to turn them on again.
A device that already granted permission now re-subscribes itself on the next open, without prompting, and
a subscription the browser rotated on its own is recovered the same way. Turning notifications off in
Settings is remembered, so the repair never switches them back on against your wishes.
Full changelog: v4.0.39...v4.0.40
RoamCode v4.0.39
Added
- Show the Node's own health in Settings → Node health: session-storage durability, per-provider
availability, running version and Node.js version. A Node that fell back to the non-durable in-memory store
now says so — that state silently discards the session list on every restart and was previously visible only
by runningcurl /diag. - Reach the gestures & keys guide from inside a session, through the session title menu. It had only ever been
reachable from the sessions rail, which is off screen on mobile the moment a session is open — and the
first-run card told people to look for it in the session. - Link to the troubleshooting guide from the crash screen, the sign-in screen and a terminal that ended for a
named reason. Nothing in the app had ever linked to its own documentation. - Resize split panes from the keyboard: the divider is now a real tab stop with arrow, Home, End and Enter.
- Give the session header's menus their keyboard behaviour — focus moves in, arrow keys move between items,
Escape closes, and focus returns to the button that opened them.
Fixed
- Keep a typed prompt when the terminal is disconnected. Submitting while reconnecting cleared the composer
and its saved draft while xterm and the socket dropped the text — the message was lost with no error.
Sending is now refused with an explanation, and the text stays until the terminal is back. - Report why a terminal could not be attached. A missing working directory or an unavailable tmux was shown as
" exited" with a hint that the provider might be signed out, and both recovery buttons re-ran the
same failing spawn. - Stop reconnecting forever after a device's access is revoked, and say when the Node has stopped answering
instead of repeating "Reconnecting…" indefinitely. - Say that the session list could not be loaded, with a Retry, instead of showing the "No sessions yet" empty
state when the Node is unreachable. - Warn before an update restarts the server while an agent is mid-turn. The confirmation existed but was never
given the information it needed to appear. - Replace raw failure text with plain language:
request failed (503),EACCES: permission denied, scandir …
andInvalid token (401)no longer reach the screen, and the server's actionable hints (for example, to
install tmux) are now kept instead of discarded. - Report a rate limit as a rate limit rather than as a lost connection.
- Show a file produced by an agent as a confirmation instead of styling it as a warning, and say when a
selection reached neither clipboard rather than always reporting success. - Say when the terminal is still connecting, instead of showing an empty black pane.
- Show terminal keys as inert while the terminal cannot accept input, rather than letting them look live and
do nothing. - Explain that a Node cannot open terminals before asking for a directory, rather than after.
- Tell the user when a session rename never reached the Node, instead of only logging it to the console.
- Keep Help reachable when the desktop sessions rail is collapsed.
- Trap keyboard focus inside the file preview, which sat outside the files panel's focus trap.
- Announce toasts to screen readers through a live region that is always present, rather than one created at
the same moment as its message. - Offer a retry on provider-account and paired-device load failures.
Full changelog: v4.0.38...v4.0.39