Skip to content

Releases: burakgon/roamcode

RoamCode v4.0.48

Choose a tag to compare

@github-actions github-actions released this 16 Aug 06:26

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

Choose a tag to compare

@github-actions github-actions released this 15 Aug 21: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

Choose a tag to compare

@github-actions github-actions released this 15 Aug 20:21

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

Choose a tag to compare

@github-actions github-actions released this 15 Aug 19:43

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 IPv6 fc00::/7 range against the endpoint's hostname, so every
    host whose name merely begins with "fc" or "fd" was refused — including fcm.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

Choose a tag to compare

@github-actions github-actions released this 15 Aug 19:29

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

Choose a tag to compare

@github-actions github-actions released this 15 Aug 19:05

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

Choose a tag to compare

@github-actions github-actions released this 15 Aug 17:29

Fixed

  • Use a contactable VAPID subject by default. The sub claim is the address a push service can reach, and
    the services validate it — Apple answers 403 BadJwtToken for 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 explicit ROAMCODE_VAPID_SUBJECT could 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

Choose a tag to compare

@github-actions github-actions released this 15 Aug 17:16

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

Choose a tag to compare

@github-actions github-actions released this 15 Aug 16:58

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

Choose a tag to compare

@github-actions github-actions released this 15 Aug 16:38

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 running curl /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 …
    and Invalid 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