Skip to content

Roku Control 2.1.0: fix "doesn't work" reviews, keyboard control, power-on, in-app feedback - #2

Merged
BlizzHacker merged 7 commits into
masterfrom
claude/vibrant-albattani-aj7h6q
Sep 26, 2026
Merged

BlizzHacker merged 7 commits into
masterfrom
claude/vibrant-albattani-aj7h6q

Conversation

@BlizzHacker

@BlizzHacker BlizzHacker commented Sep 26, 2026 •

Copy link
Copy Markdown
Owner

Try it

Preview builds of this branch are published automatically while the PR has the build-installers label: preview-pr2.

Why

Recent Microsoft Store reviews are all 1★ with the same story: "didn't work at all, I only got as far as connecting it", "still doesn't work on the living room TV", "doesn't work except volume controls — error anywhere else". I traced each one to a cause in the code.

What reviewers saw Cause Fix
Nothing works after connecting The app opened pointed at two hard-coded home TVs (192.168.0.126 / .124), and refreshing never changed the selection, so every button went to an address that doesn't exist on the user's network Removed. Discovery runs on launch and the app selects what it finds
Only volume works Roku OS 14.1+ ships "Control by mobile apps" in Limited mode, which answers HTTP 403 to everything except volume. Status codes were never checked Errors are typed (unreachable / limited / unsupported); the app shows the exact setting to change, before you press anything if device-info reports it
Refresh spins forever The fallback scan probed 762 fixed IPs one at a time with a 3 s timeout (~38 min) Parallel probe of the machine's own private subnets (~2 s); SSDP now goes out every adapter (VPN / Hyper-V / WSL no longer swallow it)
"Connected" but not working The green dot was sel ? 'on' : 'off', i.e. always green A real device-info check every 8 s: connected / screen off / not responding / Limited mode
Worked yesterday, not today Saved IPs went stale when DHCP moved the TV Devices are matched by serial and re-found automatically
✕ and window dragging process:allow-exit and core:window:allow-start-dragging were never granted Added to capabilities

Also fixed: a system proxy could intercept LAN requests (the HTTP client is now direct-only); rapid presses could arrive out of order (commands are serialized); typed text didn't encode spaces/symbols/accents properly; & showed in channel names.

What's new

  • Turn on from standby: PowerOn first; if the TV is off the network, Wake-on-LAN to every known MAC (from device-info, falling back to the OS ARP cache), with retries for about 25 s. If it still can't wake the TV, the app explains Fast TV start.
  • Keyboard as a remote: arrows, Enter = OK, Backspace/Esc = Back, Space = Play, +/−/M volume, and more (? shows them all). Hold to repeat, the matching on-screen button lights up, and clicking a button never steals Enter.
  • Live typing: letters appear in the TV's search box as you type. Paste, IME, mid-word edits and emoji all map to Backspaces plus new characters.
  • Real channel icons, filter, "On now"; TV inputs by the names set on the TV.
  • Add by IP (accepts pasted URLs), deep network scan, forget devices.
  • Mini remote (📌), always on top.
  • Help: troubleshooting for Limited mode, discovery, power-on and IP changes, plus a shortcut list and "copy diagnostics".
  • Feedback straight to GitHub: Report a problem / Suggest an idea open new issue forms (added here), pre-filled with app version and Roku model/software. IPs are redacted; names, serials and MACs are never included.
  • Footer: MoveWeight.com, Source code, Report a problem, Suggest an idea, Rate.
  • One-time rating prompt after 10 minutes of active use: "no ads, no tracking… your input is what helps this grow." It only appears once the app has actually worked (≥ 5 successful commands), so people it failed for aren't asked. Windows opens the Store review dialog; other OSes open GitHub.
  • CI: clippy + tests on Linux and Windows.
  • Build installers workflow: Windows (setup .exe, .msi, Store .msix), macOS and Linux. It runs on demand, on v* tags (publishing a release: draft for plain versions, pre-release for suffixed ones), or on PRs labelled build-installers (publishing a preview-pr<N> pre-release).

Removed: the volume slider. Rokus can't report their volume, so it was always a guess. Press-and-hold −/+ is accurate.

Testing

  • cargo test: 21 tests, including a fake Roku over loopback (403 → Limited, 404 → unsupported, Lit_ encoding and ordering, PowerOn → Home fallback on players, parallel subnet scan) plus parsers for device-info/apps/SSDP/ARP (Windows, macOS and Linux formats), MAC/magic-packet, and link allowlist.
  • cargo clippy --all-targets -- -D warnings is clean on Linux and cross-checked for x86_64-pc-windows-msvc. CI runs it natively on Windows too.
  • 12 Playwright scenarios against the built UI with a mocked backend: discovery and status, shortcut ordering, hold-to-repeat, live typing diffs, Limited mode, offline + Turn on, no-device onboarding + add by IP, footer/GitHub links (asserting no IP/serial/MAC/name in reports), rating prompt timing and one-time behaviour, help, and mini mode.
  • Launched the real Tauri binary under Xvfb: real IPC and discovery run, and the no-Roku onboarding renders.
  • Installers built successfully on all three OSes, and makeappx accepted the MSIX manifest.
  • Not tested on a real Roku or on Windows hardware. Please sanity-check the preview on a TV before submitting to the Store.

Before publishing

  • The Store listing's privacy URL points to a gist. Update it with the new privacy.txt, or point it at docs/privacy.html.
  • MSIX version is bumped to 2.1.0.0. Upload the .msix above in Partner Center → Roku Control → Start update → Packages, paste "What's new" from STORE-LISTING.txt, then submit for certification.

🤖 Generated with Claude Code

https://claude.ai/code/session_01T1KVxxyYNj32N3J63JDkSK

Store reviews said the app didn't work at all, or only volume worked.
Causes found and fixed:

- The app opened pointed at two hard-coded home TVs, so every other
  user's buttons went to an address that didn't exist. Removed; the app
  now discovers on launch and selects what it finds.
- Roku OS 14.1+ ships "Control by mobile apps" in Limited mode, which
  answers 403 to everything but volume. HTTP status was never checked,
  so failures were silent. Errors are now typed (unreachable, limited,
  unsupported) and the UI shows the exact setting to change.
- The fallback scan probed 762 fixed addresses one at a time with a 3s
  timeout (~38 min). It now probes the machine's own private subnets in
  parallel, and SSDP is sent from every adapter so VPN/Hyper-V adapters
  can't swallow it.
- System proxies could intercept LAN requests; the client is now direct.
- The "connected" dot was always green. Status is now a real
  device-info check every 8s, and devices are matched by serial so a new
  DHCP address is re-resolved automatically.
- The close button and window drag were denied by missing capabilities.

New: Turn on (PowerOn, then Wake-on-LAN with retries, MAC from
device-info or the ARP cache); keyboard shortcuts for every key with
hold-to-repeat; live typing into the TV with correct UTF-8 Lit_
encoding; real channel icons, TV inputs by name, now playing; add by
IP; mini always-on-top remote; help and troubleshooting; report a
problem / suggest an idea as pre-filled GitHub issues (no IPs, names or
serials); MoveWeight.com and source links; a one-time rating prompt
after ten minutes of use once the app has worked.

Commands to a device are serialized so presses arrive in order. Rust
tests cover parsing, validation, and a fake Roku over loopback.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T1KVxxyYNj32N3J63JDkSK
The in-app "Report a problem" and "Suggest an idea" links open these
forms with the version and a non-personal device summary pre-filled.
CI runs clippy and the Rust tests on Linux and Windows; the build
workflow produces installers for Windows, macOS and Linux on demand or
on a version tag.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T1KVxxyYNj32N3J63JDkSK
The privacy policy now covers what the new features store locally
(device MACs for Wake-on-LAN, usage counters for the one-time rating
prompt) and the opt-in links. The Store listing drops the widget-mode
claim and describes the mini remote, keyboard control and power-on.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T1KVxxyYNj32N3J63JDkSK
@coderabbitai

coderabbitai Bot commented Sep 26, 2026 •

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: fdf12c4c-6a41-4093-b981-a2cac6fed4c0


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Artifacts from a workflow run are zipped and need a GitHub login. A
version tag now also attaches every installer to a release: suffixed
tags (v2.1.0-beta.1) publish a pre-release for testers, plain version
tags create a draft to review before publishing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T1KVxxyYNj32N3J63JDkSK
Labelling a pull request "build-installers" builds the Windows, macOS
and Linux installers from its branch and publishes them as a
"preview-pr<N>" pre-release, replaced on each push, so testers get a
direct download link before anything is merged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T1KVxxyYNj32N3J63JDkSK
The Store listing is an MSIX product, so each Windows build now packs
roku-control.exe with msix/AppxManifest.xml and its assets using the
Windows SDK's makeappx, and attaches the .msix to the release. Partner
Center signs it on upload.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T1KVxxyYNj32N3J63JDkSK
Running "Build installers" by hand can now publish a GitHub release
with a given tag and, when the Partner Center secrets are set, submit
the MSIX to the Microsoft Store with Microsoft's msstore CLI.

Also fixes loose ends for going live: the Store listing's privacy
policy URL pointed at an old gist and now points at privacy.txt in
this repo; docs/index.html was plain text rather than HTML; STORE.md
described converting an MSI by hand and a widget mode that no longer
exists; the README sent people to workflow artifacts instead of
releases.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T1KVxxyYNj32N3J63JDkSK
@BlizzHacker
BlizzHacker marked this pull request as ready for review September 26, 2026 17:36
@BlizzHacker
BlizzHacker merged commit 6e47365 into master Sep 26, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants