Add apple-tv-remote extension - #28594
Conversation
- README: embed store screenshots - Replace store screenshots with improved captures - Add store screenshots (remote, command roster, menu bar) - Pre-ship Raptor pass: remove Spotify, dead code, and fix all docs - Fix skip-back (OPACK negative-int crash) + remove volume from visible surfaces - Menu bar: fire "skip forward" not "skip" (which maps to next track) - Fix menu bar clicks never reaching the TV - Remote view: compact 5-column cross layout - Menu bar: custom TV icon with light/dark variants - Menu bar: use emoji title — Icon.Tv rendered invisible in the status bar - Menu bar: remote functions as menu rows (the platform maximum) - Visual remote: grid laid out like the physical Apple TV remote - Full Siri Remote parity + instant-access architecture - Spotify Connect: verified agentic music playback on the Apple TV - Search automation ladder: stop on the title page by default - Fix region handling: auto-detect country from macOS locale; honor explicit provider - Deterministic content resolution: JustWatch deep links + tvOS universal search flow - Add Ask Apple TV one-shot command; improve AI tool routing; manual-port pairing - Initial release: Apple TV Remote extension for Raycast
|
Congratulations on your new Raycast extension! 🚀 We're currently experiencing a high volume of incoming requests. As a result, the initial review may take up to 15 business days. Once the PR is approved and merged, the extension will be available on our Store. |
Greptile SummaryThis PR adds a fully self-contained Apple TV remote extension — no Python or external helpers required — using
Confidence Score: 4/5The extension is well-constructed but has one lint-blocking duplicate import in ask.ts that must be fixed before the PR can merge cleanly. The duplicate @bharper/atv-js import in ask.ts (lines 2 and 15) is caught by ESLint's no-duplicate-imports rule, which @raycast/eslint-config enables — ray lint will reject it. Everything else in the core connection, companion-extras, play-flow, and UI paths looks correct. extensions/apple-tv-remote/src/ask.ts (duplicate import), extensions/apple-tv-remote/CHANGELOG.md (hardcoded date), extensions/apple-tv-remote/package.json (Volume up capitalisation) Important Files Changed
Reviews (7): Last reviewed commit: "Update CHANGELOG.md and optimise images" | Re-trigger Greptile |
- docs/style: rewrite README + description in plain voice, remove all em-dashes - revert: drop menu-bar Now Playing (requires a second pairing) - feat: live Now Playing in the menu bar (MRP-over-AirPlay, zero-install)
There was a problem hiding this comment.
issue: check the metadata screenshot size and padding
Can you make sure the metadata screenshot is the correct size and has the proper padding?
Right now it looks cropped and has a white border. Please use the capture window command in Raycast.
Reference:
There was a problem hiding this comment.
Recaptured with Window Capture at a clean 2000×1250 — no white border, nothing cropped. The original was a manual screenshot that got letterboxed.
There was a problem hiding this comment.
issue: check the metadata screenshot size and padding
Can you make sure the metadata screenshot is the correct size and has the proper padding?
Right now it looks cropped and has a white border. Please use the capture window command in Raycast.
Reference:
There was a problem hiding this comment.
Same fix — recaptured via Window Capture at 2000×1250.
There was a problem hiding this comment.
issue: not needed
You can move the menu bar command to the media folder instead of removing it entirely, as it may be useful in that specific location.
There was a problem hiding this comment.
Moved out of the store screenshots into media/ (referenced from the README there) and removed from metadata/, since you noted it wasn't needed.
0xdhrv
left a comment
There was a problem hiding this comment.
Hey @camschroedes 👋
I have added a few comments for you to address.
I'm looking forward to testing this extension again 🔥
Feel free to contact me here or at Slack if you have any questions.
I converted this PR into a draft until it's ready for the review, please press the button Ready for review when it's ready and we'll have a look 😊
Resolves the open comments on raycast#28594: - Fix concurrent establish() connection leak in remote.tsx: coalesce concurrent callers onto one in-flight attempt, identity-check the onConnectionLost callback, dispose a socket that resolves after unmount, and retire the previous connection on manual reconnect. - connection.ts: dispose a connect() that resolves after the timeout. - Recapture store screenshots at a clean 2000x1250 via Window Capture (no white border / cropping); drop the menu-bar store screenshot (kept in media/ for the README). Co-Authored-By: Cameron Schroeder <64573040+camschroedes@users.noreply.github.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Thanks for the review @0xdhrv! Addressed everything:
On the Greptile summary's Marking ready for review 🙏 |
Addresses the metadata-screenshot comments on raycast/extensions#28594: - Recapture remote (d-pad) + commands screenshots via Raycast Window Capture: clean 2000x1250, no white border, no cropping -> apple-tv-remote-1.png, apple-tv-remote-2.png - Drop the menu-bar store screenshot (apple-tv-remote-3.png); reviewer said it was not needed and it already lives in media/ for the README - Sync media/remote.png + media/commands.png to the new captures Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
T-Rex pricing update — T-Rex was free through June 2026. Effective July 1, 2026, T-Rex adds 2 credits on top of the standard 1-credit review (3 total). T-Rex settings |
- Add try-catch to openSetup for improved error feedback - Update .gitignore to include compiled_raycast_rust - Revise CHANGELOG for consistent version format - Adjust README and package.json for clarity and accuracy
|
Published to the Raycast Store: |
|
🎉 🎉 🎉 We've rewarded your Raycast account with some credits. You will soon be able to exchange them for some swag. |
* Add apple-tv-remote extension - README: embed store screenshots - Replace store screenshots with improved captures - Add store screenshots (remote, command roster, menu bar) - Pre-ship Raptor pass: remove Spotify, dead code, and fix all docs - Fix skip-back (OPACK negative-int crash) + remove volume from visible surfaces - Menu bar: fire "skip forward" not "skip" (which maps to next track) - Fix menu bar clicks never reaching the TV - Remote view: compact 5-column cross layout - Menu bar: custom TV icon with light/dark variants - Menu bar: use emoji title — Icon.Tv rendered invisible in the status bar - Menu bar: remote functions as menu rows (the platform maximum) - Visual remote: grid laid out like the physical Apple TV remote - Full Siri Remote parity + instant-access architecture - Spotify Connect: verified agentic music playback on the Apple TV - Search automation ladder: stop on the title page by default - Fix region handling: auto-detect country from macOS locale; honor explicit provider - Deterministic content resolution: JustWatch deep links + tvOS universal search flow - Add Ask Apple TV one-shot command; improve AI tool routing; manual-port pairing - Initial release: Apple TV Remote extension for Raycast * README images: move to media/ (metadata/ is store-screenshots-only) * Fix store CI: version-safe icons + metadata padding spec * Fix store CI (validated locally) + Greptile review feedback * Update apple-tv-remote extension - docs/style: rewrite README + description in plain voice, remove all em-dashes - revert: drop menu-bar Now Playing (requires a second pairing) - feat: live Now Playing in the menu bar (MRP-over-AirPlay, zero-install) * fix: Raycast store-guideline compliance pass * apple-tv-remote: address review (connection-leak fix + screenshots) Resolves the open comments on raycast#28594: - Fix concurrent establish() connection leak in remote.tsx: coalesce concurrent callers onto one in-flight attempt, identity-check the onConnectionLost callback, dispose a socket that resolves after unmount, and retire the previous connection on manual reconnect. - connection.ts: dispose a connect() that resolves after the timeout. - Recapture store screenshots at a clean 2000x1250 via Window Capture (no white border / cropping); drop the menu-bar store screenshot (kept in media/ for the README). Co-Authored-By: Cameron Schroeder <64573040+camschroedes@users.noreply.github.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * refactor(apple-tv-remote): enhance error handling and docs update - Add try-catch to openSetup for improved error feedback - Update .gitignore to include compiled_raycast_rust - Revise CHANGELOG for consistent version format - Adjust README and package.json for clarity and accuracy * Update CHANGELOG.md and optimise images --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Co-authored-by: Dhruv Suthar <git@dhrv.pw> Co-authored-by: raycastbot <bot@raycast.com>
Description
Apple TV Remote — control an Apple TV from Raycast with zero external installs (no Python/pyatv, no helper apps). Pure TypeScript over Apple's Companion protocol, via
@bharper/atv-js(a pyatv port — all pure-JS dependencies, no native addons).This is the first Apple TV remote in the store. What it does:
WASD/HJKLmove,Fselect,Spaceplay/pause…) plus ⌥-shortcuts. Includes context menu (hold-select), app switcher, Control Center, ±10s skip, and typing into TV search fields.Create Quicklinkfor global hotkeys.pause,open netflix,play severance,type stranger things,sleep.disabledByDefault, Spotify/Sonos pattern): every remote function individually hotkey-able.remote-key,launch-app,play-content,power) + evals.play-contentresolves titles to real deep links via JustWatch's public GraphQL (no LLM-guessed IDs); Netflix (whose tvOS deep links no longer work) and unresolved titles fall back to typing into tvOS universal Search, gated by aSearch Automationpreference.All device interactions were verified against a physical Apple TV 4K (tvOS 18). Known protocol caveats are documented in the README (volume requires HDMI-CEC; screensaver flaky upstream — pyatv #2139).
The protocol features missing from the underlying library (app launch/list, power, Control Center, skip) are implemented in
src/lib/companion-extras.ts, ported from pyatv's reference implementation — and contributed upstream in bsharper/atvjs#1 (incl. an OPACK negative-integer crash fix found during this work).Screencast
Screenshots in
metadata/(remote grid, command roster, menu bar). Happy to add a screencast if helpful — note the extension requires a physical Apple TV on the local network, so reviewer testing needs one; the README's setup section covers the 30-second pairing flow.Checklist
npm run buildand tested this distribution build in Raycastassetsfolder are used by the extension itselfREADMEare placed outside of themetadatafolder