Skip to content

Update kaset-control extension - #32562

Open
danieltsam wants to merge 5 commits into
raycast:mainfrom
danieltsam:ext/kaset-control
Open

danieltsam wants to merge 5 commits into
raycast:mainfrom
danieltsam:ext/kaset-control

Conversation

@danieltsam

@danieltsam danieltsam commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Description

Reworks the extension around Kaset's queue AppleScript, and adds YouTube search plus a played history that does not depend on the menu bar.

Now Playing (rebuilt)

  • Queue, Recently Played and Up Next in one list. The current track is selected when the window opens, and Recently Played sits above it, oldest first, so the newest track lands directly above what is playing.
  • The detail pane is sized to fit without scrolling: fixed 200px artwork, then Track / Artist / Album, and a progress row that also carries the playing state.
  • Live progress, play/pause, skip, shuffle, repeat, mute, volume, like/dislike, and queue actions (play now, remove from queue).
  • ⌘I opens a full-screen Track Info view.
  • Album names are resolved by searching YouTube Music, because Kaset's player payload never carries them.

Play Song

  • Searches YouTube Music and YouTube together by default; a preference and an in-search filter narrow it to one source.
  • Play, play next, or add to queue.

History

  • Recorded by a headless Record Player State command, so no menu bar item is required.
  • A track is only recorded once it has stopped playing, so the current track never appears in both Now Playing and Recently Played. Kaset's "Loading..." placeholder track is filtered out.

Menu bar

  • Album artwork or progress-ring icon, marquee title, and hide-when-idle.

Also

  • Upgraded to @raycast/api 2.8.2.
  • Queue commands require Kaset 0.14.2 or newer. The README covers the setup, including enabling the background recorder.

Screenshots

image image

Checklist

- chore: exclude repository docs from the store publish
- tune(player): settle artwork at 200px
- tune(player): artwork 180px with headroom on the v2 renderer
- chore: upgrade to @raycast/api 2.8.2
- refactor(player): labelled metadata rows, playing state in the progress row, art 240
- experiment(player): empty metadata labels to widen title/artist; backlog album search
- refactor(player): artwork only in markdown, title/artist as metadata rows
- fix(history): never log Kaset\'s Loading... placeholder track
- fix(player): title/artist back in markdown (metadata truncates), recent limited to 5
- tune(player): settle artwork at 200px
- tune(player): artwork 220px
- tune(player): artwork 240px
- tune(player): artwork 200px
- tune(player): artwork 160px
- tune(player): artwork 80px to clear the five metadata rows
- docs: correct store framing (existing extension, contributor update)
- refactor(player): artwork only in markdown, title/artist as metadata rows, fixed 120px art
- feat(album): resolve album from YouTube Music search; store listing docs
- docs(upstream): proposed Kaset album-byline patch and its limits
- feat(player): recent list oldest-first so newest sits above now playing
- feat(player): pushed Track Info view with spotify-style right-hand metadata
- feat(player): spotify-style order - title, by artist, then artwork
- fix(player): read artwork size per render so preference changes apply
- feat(player): artwork size preference; record List.Item.Detail layout rule
- fix(player): metadata sits below markdown in List.Item.Detail, shrink artwork to fit
- feat(player): title as heading, artist as plain text below it
- feat(player): drop rating row, status as tag, instant paint from cache snapshot
- feat(player): compact detail pane, rating row; track Kaset source for album work
- feat(player): recently played above now playing, selection pinned to the current track
- fix(player): large title/artist text and record history only after a track ends
- fix(player): live progress, title/artist/album pane, history from search, song durations
- docs: update test plan for the detail-pane fix, merged search and background recorder
- feat(search): merged source by default, background history recorder, revert name
- fix(player): set isShowingDetail so the detail pane (art, progress) renders
- docs: add manual test plan
- fix: address review findings (YouTube URL, tsc errors, queue re-fetch, history recording)
- docs: document the Player, queue, YouTube search and menu-bar options
- feat(menu-bar): album-art icon, marquee title, idle hide and progress ring
- feat(player): rebuild the Player screen with the queue and recent history
- feat(search): source selector and queue actions in Play Song
- feat(history): add recent-played log with LocalStorage backing
- feat(search): add YouTube search module alongside YouTube Music
- refactor: strip emoji from UI copy and add an emoji-free guard test
- feat(queue): add queue command helpers with vitest harness
- docs: add Player/queue/history design spec and implementation plan
@raycastbot raycastbot added extension fix / improvement Label for PRs with extension's fix improvements extension: kaset-control Issues related to the kaset-control extension platform: macOS labels Oct 20, 2026
@raycastbot

Copy link
Copy Markdown
Collaborator

Thank you for your contribution! 🎉

🔔 @Endiruslan you might want to have a look.

You can use this guide to learn how to check out the Pull Request locally in order to test it.

📋 Quick checkout commands
BRANCH="ext/kaset-control"
FORK_URL="https://github.com/danieltsam/extensions.git"
EXTENSION_NAME="kaset-control"
REPO_NAME="extensions"

git clone -n --depth=1 --filter=tree:0 -b $BRANCH $FORK_URL
cd $REPO_NAME
git sparse-checkout set --no-cone "extensions/$EXTENSION_NAME"
git checkout
cd "extensions/$EXTENSION_NAME"
npm install && npm run dev

We're currently experiencing a high volume of incoming requests. As a result, the initial review may take up to 15 business days.

@greptile-apps

greptile-apps Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerView in GreptileConfidence Score: 5/5

[Medium impact] The PR appears safe to merge, with no new actionable issues found.

Summary

Rebuilds Now Playing around Kaset’s queue, adds combined YouTube search and background history, and updates menu bar controls.

  • Now Playing puts the queue, recent tracks, and playback controls in one view.
  • Play Song searches YouTube Music and YouTube together by default.
  • The menu bar can show artwork or progress and scroll long track names.
  • The extension uses Raycast API 2.8.2 and plainer playback notices.

Reviews (4) · Last reviewed commit: "chore: remove tests from the extension a..." · Reviewed by Greptile

Comment thread extensions/kaset-control/CHANGELOG.md Resolved
@socket-security

socket-security Bot commented Oct 20, 2026 •

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Addednpm/​vitest@​5.0.5981007999100

View full report

- Only fall back to the cached player state while the live value is undefined
- Menu bar records finished tracks instead of the playing one
- History and album lookup retry once Kaset's placeholder resolves
- Play Now stops when the row has left the queue instead of playing its slot
- Qualify search row keys by source
- Keep the published changelog entries
Replaying a song that is already in the history put it in both Now Playing and
Recently Played. History is now filtered by the current track id, with tests.
@danieltsam
danieltsam marked this pull request as ready for review October 24, 2026 01:46

@0xdhrv 0xdhrv left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @danieltsam 👋

Thanks for your contribution 🔥 Rebuilding Now Playing around Kaset's queue and recording history headlessly, so it no longer needs the menu bar, are both great additions. The isKasetRunning() guard means the background recorder never launches Kaset by itself.

@Endiruslan do you want to check this and approve if it looks good to you?

Here's everything I found in this pass:

Blocking

  • Please remove the test files from the extension. Keep them in your own repo: src/no-emoji.test.ts, src/utils/history.test.ts, src/utils/kaset.test.ts, src/utils/search.test.ts
  • Please remove the test tooling from package.json, which is the "test": "vitest run" script (package.json:195) and the vitest devDependency (package.json:188). Then regenerate package-lock.json.

Optional

  • The Store screenshots still show the old Now Playing, so they no longer match what this PR ships. Retaking them with Window Capture would also fix two existing problems: screenshot-01.png has the development glyph and a "Development" section, and screenshot-03.png is a menu bar crop rather than a Store screenshot.

    As mentioned in our docs here ↗

Feel free to reach me here or on Slack if anything is unclear.

@0xdhrv
0xdhrv marked this pull request as draft October 29, 2026 06:53
@0xdhrv 0xdhrv self-assigned this Oct 29, 2026
Raycast does not allow test files or test tooling inside the extension, so the four test files, the vitest script and the vitest devDependency are gone and package-lock.json is regenerated. The Store screenshots are retaken with Capture Window to match the new Now Playing and Play Song.
@danieltsam
danieltsam marked this pull request as ready for review October 31, 2026 05:40
@danieltsam

Copy link
Copy Markdown
Contributor Author

all blocking fixes implemented :)

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

extension fix / improvement Label for PRs with extension's fix improvements extension: kaset-control Issues related to the kaset-control extension platform: macOS

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants