Skip to main content

Most recent roam work

Upcoming Roam Updates

  • Added control widgets: Play, Mute, Change Volume and Select from Control center!
  • Added better text field handling for many roku apps
    • Auto-open text field when text edit is available
    • Copy, Cut, Paste from macOS
    • Copy, Cut, Paste + Generalized edit on iOS
  • Better reporting around local network permissions and connectivity
  • Connection stability improvements

Roadmap

  • Current Ongoing

    • Can we get rays to spin when connecting (rays.spin?)
      • Can I have a transparent rays within the text + overlay spinning rays underneath it?
      • Can I do it with popup instead of menu?
    • Fix macOS widgets
  • Add +30 second mute timer with countdown

    • Hold mute to mute for +30 seconds
    • Click again to unmute and cancel it
    • Show an indicator below mute button line
      • Progress bar has a linear progress indicator
      • Progress bar has two buttons: +30 seconds, cancel
      • Show underneath the main button panel so it's close to mute
    • Make the +30 configurable to 30, 15, 60 second mute options
  • Provide an optional Minimalist view on iOS that replicates siri remote's view closely

General Future Ideas

Bug Fixes

  • Figure out if the loop of calls to nextPacket make sense.
    • Instead of looping every 10ms and hoping the timing is correct, should I instead be looping over received packets and trying to schedule them at host time 10ms * globalSequenceNumber + startHostTime and sampleTime to sequenceNumber * Int64(lastSampleTime.sampleRate) / packetsPerSec + startSampleTime
    • Then I can switch from a for await loop over the clock to a while !Task.isCancelled loop with a Task.sleep in it.
    • Okay so we need to loop every 10 ms and try to pull the last packet off and then schedule it at that time
    • Whenever we do an audio sync
      • We have lastRenderTime + a sync packet
      • Estimate the packet number we should be sending out at + the sync time
        • Render Time + additional

Improve Testing

  • UI Tests
    • Test when device is added that it shows up in device picker and is selected by roam
    • Test that user can navigate to settings -> devices
    • Test that user can navigate to settings -> messages
    • Test that user can navigate to settings -> about
    • Test that user can edit/delete devices
    • Test that user can click buttons once devices are added
    • Test that user sees banner for no devices when it shows up
    • Test that the user sees applinks
    • Refer to swiftdat testingmodelcontainer for modelcontainers
    • Refer to here https://medium.com/appledeveloperacademy-ufpe/how-to-implement-ui-tests-with-swiftui-a-few-examples-636708ee26ad for how to setup tests

App Clip

  • AppClip
    • Add a "getAShareableLinkToThisDevice" button on settings -> device
      • Pre-generate all 1.1M app clip codes and encode ring locations (0.5GB)
      • Make a button to "Get a shareable link to the device!" with an image preview to the app clip code (roam color)
      • Download the code + link and convert to PNG on device when a device location is changed
      • Have the code open up the device as a shared link to an image (with preview!)
    • Also make the actual device link sharable

Improve user messaging around info/status management

  • Update Info/status management to better handle volatile state
    • On disconnect, select, button click, move to foreground, app opened -> Restart reconnect loop if disconnected
    • Reconnect loop is to exponentially backoff retrying failing connections (0.5s, double, 10s backoff)
    • When connected to the device, always disable the network warnings
    • When trying to connect to the device, or trying to power on the device, show spinning information icon instead of gray dot
    • When powering on the device and succeeding, show an animation on transition from gray -> spinning -> green
    • When powering on the device with WOL and not connecting after 5 seconds, or when powering on the device and immediately failing, show a warning message underneath the wifi one
      • “We weren’t able to wake your Roku” (Find out more) (Don’t show again for this device), (X)
      • Find out more shows some reasons why
        • You aren’t connected to the same network (Show last device network name. Ask if the user is connected to this network)
        • Your device is in deep sleep (wasn’t powered down recently) and can’t be woken up
          • Your device doesn’t support WWOL and is connected to wifi
          • Your device doesn’t support WWOL or WOL
        • Your network isn’t setup in a way to allow us to send wakeup commands to the device
    • Reconnect loop = Backing off Exponentially attempt to reconnect to reconnect ECP
      • Reconnect ECP first
      • Listen to notify second
        • Handle +power-mode-changed,+textedit-opened,+textedit-changed,+textedit-closed,+device-name-changed
        • Make sure we can handle each of these requests and their format…
      • Refresh device state third
      • Refresh query-textedit-state fourth
        • Update textedit state
      • Refresh device icons fifth
    • On all changes after reconnecting (through notify or anything)
      • Update Device (stored) and DeviceState (voilatile)
    • After reconnecting/disconnecting, update online status in remote view

Improve user messaging around device capabilities

  • Update user messaging when errors may occur
    • When clicking on a disabled button, open popover to show why it’s disabled
      • Show a info indicator on the button to indicate that information can be received when it’s clicked?
      • Headphones mode disabled -> because device doesn’t support headphones mode to this app
      • Volume control disabled -> because the audio is outputting over HDMI which does not support volume controls?
    • When actively scanning for devices and no new ones are found show a warning message underneath the device list
  • Add badge for supportsWakeOnWLAN and supportsMute

To update when dropping support for iOS 17/macOS 14 (Feb 2026)