Releases: Osasuwu/like-current-song
Release list
v1.3.0
The desktop half as one Windows exe
The desktop half no longer needs Python: this release carries a standalone LikeCurrentSong.exe for Windows, without credentials, that you set up from its Settings window. Pasting into that window works on any keyboard layout now. The Android app is unchanged apart from its version number.
Install it
Windows: download LikeCurrentSong.exe below and double-click it. No Python, no terminal. The first launch opens the Settings window: pick the music service, sign in with your own Spotify or Google app, and save. The tray icon and hotkey start right after. Keep the exe wherever you like; if you move it, relaunch it once and autostart follows.
The exe isn't code-signed, so SmartScreen warns about an unrecognized app once: More info → Run anyway. To check the download first:
Get-FileHash .\LikeCurrentSong.exe -Algorithm SHA256It should print 1c8cb9070756fd54b857df54dffcfeaadca7e78016f203804a39d8420fe5cbea.
The exe ships with no credentials of its own. The build fails if a token, keystore, .env or filled-in client secret ever ends up inside it. Every extension and YouTube Music support are included.
Android: download app-release.apk below and install it. It installs over v1.2.0 in place: same signing key, same settings. There are no changes you'd notice; this build only carries the new version number.
macOS / Linux, or the pipx install on Windows: unchanged. Clone the repo and run ./install.sh (.\install.ps1 on Windows); to upgrade, pull and re-run it.
Changed
- A fresh desktop install opens Settings straight away instead of asking whether to. A configured install whose sign-in has lapsed still asks first. In the exe,
--setupopens the Settings window, since there is no console to run the wizard in. - Moving the exe keeps autostart working. If the autostart entry points at an exe that is no longer there, the next launch points it at the running one.
Fixed
- Copy and paste work in the Settings window on any keyboard layout. With a Russian (or any non-Latin) layout active, Ctrl+V/C/X/A used to do nothing, so a client ID or secret couldn't be pasted in. The shortcuts now go by the physical key, and there is a right-click menu (Cut, Copy, Paste, Select all) as well.
The full list is in CHANGELOG.md.
v1.2.0
Choose where a like goes, one counter in a Google Sheet, and a logo
Where a like goes is now your choice — the service's own likes, a playlist of yours, or both — on Android and on the desktop. The shared like counter moved from Supabase to a Google Sheet you own, and can create that sheet for you. Most of the rest is the app telling you what actually went wrong instead of failing quietly, and a run of fixes for likes made with the app closed.
Development slows down after this release: the project does what it set out to do. Bugs and requests filed as issues are still read and answered.
Install it
Download app-release.apk below and install it. Android will warn you about an app from outside the Play Store; that is expected for a sideloaded APK.
Upgrading from v1.1.0 installs over it in place — same signing key, same settings. A fresh install asks for your own Spotify Client ID under Connected services → Spotify credentials; the redirect URI to register on your dashboard app is shown there with a copy button.
If you used the Supabase counter, read Removed below before upgrading: counts do not carry over.
Where a like goes
Trigger configuration on Android and Where a like goes on the desktop (or step 2 of like-current-song --setup) now offer Liked songs (the default, unchanged), a playlist of your own, or both. It matters most on YouTube Music, where a thumbs-up drops a song into the same bucket as every video you ever liked. The playlist is matched by name on whichever service is playing and created on first use. With Both, a like that lands in only one place still counts, and the log names the half that failed.
On the desktop, the discard hotkey (Ctrl+Shift+Alt+Q) now also sends the strongest "not this one" the service supports — a real thumbs-down on YouTube Music, removal from Liked Songs on Spotify, whose API has no dislike — and takes the track back out of your like playlist too.
The shared counter is a Google Sheet
Both halves now count in the same sheet, so a phone and a PC add up to one number. Create a sheet for me (Android, Connected services → Shared like counter) and create in the desktop setup build it with the right tabs and headers; pasting an existing id is how a second device joins. The counter signs in to Google with the spreadsheets scope only, and cannot see anything else in your Drive.
Follow-artist now counts through the sheet on Android too (#209): it follows on distinct tracks by the artist liked on any device, as the desktop does. A sheet built by hand needs an ArtistTracks tab — see the README.
Knowing what went wrong
- The Logs screen shows what happened while the app was closed — background likes and every failure behind them used to be thrown away unseen — and every entry now has a timestamp.
- A failed like says which step failed — refreshing the token, reading the current track — and a failure in the extra actions after the like says the track was liked.
- The counter says why it could not count instead of passing a local count off as a shared one, on both halves — including a Google project with the Sheets API switched off, with a link to switch it on.
Fixed
- The media-button pattern works again after swiping the app out of recents, and the listener survives a reboot again on Android 15+.
- A like made with the app closed no longer fails in silence, and likes made in the app and with the media button now count towards the same total — which also lets follow-artist reach its threshold.
- The shared sheet no longer grows a second row for the same track, on either half, and no longer writes some counts as text.
- A like stopped reaching a playlist you had deleted and recreated.
- "Sign in to YouTube Music again" no longer appears when the real problem is the OAuth client ID or secret, which a new sign-in cannot fix.
- Liking works again for newly registered Spotify Client IDs.
Changed
- The app has a logo — a white heart with the pause-play gesture inside it, on a violet tile. It replaces Flutter's stock launcher icon (adaptive, with a themed-icon layer), the play symbol in the status bar, and the green heart in the Windows tray.
- The "best-of" rule is now just "best" everywhere. Existing settings migrate themselves; nothing needs re-entering.
--dart-define-from-file=.envseeds every service's credentials again, for your own builds.
Removed
- The Supabase counter backend, on both halves. Counts stored on the phone are untouched and keep counting; numbers that lived in Supabase are not migrated, so a new sheet starts from what the phone knows. On the desktop, a
config.jsonstill namingsupabasekeeps liking but counts nowhere, and says so once on startup — runlike-current-song --setupor open Settings… and pick Sheets. Promote-to-best and follow-artist stay off until a counter is configured. Your Supabase project itself is untouched.
The full list, with the reasoning behind each change, is in CHANGELOG.md.
Desktop
There is no prebuilt desktop build — that half is still install-from-source:
git clone https://github.com/Osasuwu/like-current-song.git
cd like-current-song
./install.sh # .\install.ps1 on Windows
To upgrade an existing install, pull and re-run the same script.
v1.1.0
YouTube Music on both halves, a prebuilt APK, and a like that follows what's actually playing
The release that stops the project being Spotify-only — and the first one you can install without building it.
Install it
Download app-release.apk below and install it. Android will warn you about an app from outside the Play Store; that is expected for a sideloaded APK.
The APK carries no credentials of anyone else's. After installing, open Connected services → Spotify credentials, paste the Client ID from your own Spotify dashboard app, and save. The redirect URI to register there is shown on that screen with a copy button. Connect Spotify turns on once the ID is saved.
You type the ID once, not once per build: it lives in the app's encrypted storage and survives updates and a disconnect.
- Credentials are typed into the app, not baked into the build (#131). The optional shared like counter works the same way — a Supabase project URL and anon key in a second section; leave them blank to keep counts on the device.
--dart-definestill works for your own builds: those values seed a store that has never been written, so an existing build stays configured across the upgrade, and from then on whatever you saved in the app wins. - Releases are signed with a real key (#132), so this APK can be upgraded in place by the next one. An APK you build yourself without a keystore is signed with your machine's debug key and cannot be — you would have to uninstall first.
YouTube Music
- Android. Connected services now takes your own Google "TVs and Limited Input devices" OAuth client and signs you in with a code at
google.com/device. The thumbs-up itself goes through the YT Music app's media session, so it works with the screen off and needs no sign-in at all; signing in adds a YouTube Data API fallback for when the session rating doesn't take. Tokens are kept apart from Spotify's, so both stay signed in. - Desktop (Windows, beta). Pick
ytmusicinlike-current-song --setup. Now-playing comes from the Windows media session, the song is matched through the YouTube Data API, and the like lands in Liked music. - The extras came too — archive clean-up, best-of promotion and follow-artist run under YouTube Music on both halves, using your ordinary YouTube playlists. Follow-artist only subscribes when the match came from the artist's own "Topic" channel or a channel named after them.
- Likes count in the shared counter (#96) — keyed by your YouTube account, never mixed with the Spotify one.
Automatic service routing (#125)
Connected services has a new Automatic option: the like goes to whichever connected service is actually playing rather than to one you picked up front. It resolves to the one connected service with a playing media session, else the last service that was playing, else the picker. The same rule runs in the background listener, so it holds with the screen off and the app closed.
Opt-in — upgrading leaves your current pick alone — and only offered while notification access is granted and at least two services are connected. Every automatic like logs where it went and why.
Desktop settings window (#100)
like-current-song --settings, or Settings… in the tray menu, covers everything --setup does. Saves apply live, with no restart. Built on stdlib tkinter — no new dependency.
Fixed
- Likes and follows keep working on newly registered Spotify apps (#121). Spotify's February 2026 migration replaced the per-type library endpoints with one generic
/me/library, and client IDs created since then only get the new form. Both halves now call the generic endpoint and fall back to the old one only when Spotify says this client ID doesn't have it, so grandfathered client IDs keep working too. - The bottom of a screen no longer hides under the navigation bar (#139). Flutter draws edge-to-edge on Android 15+, so the last row of a screen — most visibly the shared like counter — sat half covered by the gesture bar with no way to scroll it clear. Every screen keeps out of the way of it now. The MIUI battery instructions also dropped their "lock the app in Recent apps" step, which the fix below made unnecessary some time ago.
- The Android listener survives swiping the app out of recents on MIUI / HyperOS shells that tear the foreground service down with the task.
- Like feedback tone and vibration are back on HyperOS 3 / Android 16.
- Two Android screens stopped assuming Spotify was the only service (#113), and the YouTube Music sign-in can now be set up from the phone alone (#118).
Also worth knowing
- The app is called Like Current Song now (#137) — on the launcher, in the notification, in the Windows tray and everywhere else it shows. It had still been saying Like Spotify, which stopped being true once it started liking on YouTube Music. Nothing a machine reads changed, so this costs you nothing: same app, same redirect URI, same upgrade path.
- The desktop package and commands are now
like-current-song(#101).like-spotifyandlike-spotify-guistill work for at least one more release. To upgrade, re-runinstall.ps1/install.sh; by hand,pipx uninstall like-spotifythen install the repo again. - The repository was renamed from
like_spotify_mobile_apptolike-current-song. Old URLs redirect. - The
SPOTIFY_REDIRECT_URIbuild variable is gone. It was never really configurable — it has to match thelikespotify://auth-callbackintent filter — so it is a constant the credentials screen shows you. Drop it from your.env; it is ignored. - Android extra actions are now opt-in and live in a collapsed "Extra actions" section; on a fresh install all three are off with empty playlist names. Existing installs keep what they had.
- Feedback sound defaults to 100% (was 25%, inaudible over music). Existing installs keep their saved value.
- A home page, privacy policy and terms are published at https://osasuwu.github.io/like-current-song/ (#126).
pubspec.yamlhad been stuck at1.0.2since that tag, so Android reported the wrong version through v1.0.3. It is corrected here rather than bumped by one.
Desktop
There is no prebuilt desktop build — that half is still install-from-source:
git clone https://github.com/Osasuwu/like-current-song.git
cd like-current-song
./install.sh # .\install.ps1 on Windows
Full changelog: CHANGELOG.md · v1.0.3...v1.1.0
v1.0.3
Desktop console-flash fix + OSS launch prep
- Fix: no more console flashes. The packaged entry point is now a windowed
gui-scriptsentry, so the tray host no longer spawns a visible console window on launch or on each hotkey press (#68). - Repo baseline synced — CI workflows, PR body check, and owner-queue guard brought in line with the shared template (#65).
- OSS polish (#70) —
CODE_OF_CONDUCT.md,SECURITY.md,CHANGELOG.md, a feature-request issue template,good first issue/help wantedlabels, README badges, and a correctedCONTRIBUTING.md. The Python package version also caught up with the repo (0.1.0→1.0.3).
Full changelog: CHANGELOG.md · v1.0.2...v1.0.3
No prebuilt APK is attached — build your own with your own Spotify/Supabase credentials:
flutter pub get
flutter build apk --release --dart-define-from-file=.env
See README.md for .env setup.
v1.0.2
Desktop crash fix + architecture cleanup
Fixes a crash in the desktop tray feedback beep, and closes out all 5 findings from an architecture review pass — no user-facing behavior changes beyond the crash fix.
- Fix: tray beep crash.
winsoundrejectsSND_MEMORY | SND_ASYNCoutright, so every like/error beep on desktop crashed withRuntimeError: Cannot play asynchronously from memory. Dropped the redundantSND_ASYNCflag (_beepalready runs on its own daemon thread). hosts/windows.pysplit into a package — tray feedback, tone synthesis, autostart, and resident wiring separated into their own modules instead of one 687-line grab-bag (#55).- Regression tests for
TrayFeedback._beep/_synth_tone— the beep path (including the crash above) now has test coverage (#56). - Like-cooldown gate and recorder now share one store — removed a fragile pre/post-action coupling that risked silent desync between the dedup check and the record write (#57).
hosts/_common.pydecomposed into a builder registry — storage/action-extension construction moved off an if/elif chain, interactive--setupwizard extracted to its own module (#58).PlaylistCapableProviderprotocol — replaced three independent duck-typing checks (getattrprobe + twoisinstance(..., SpotifyMusicProvider)checks) with one structural-typingProtocol, checked consistently across the remove-from-playlist pipeline, archive-remove action, and follow-artist action (#59).
No prebuilt APK is attached — build your own with your own Spotify/Supabase credentials:
flutter pub get
flutter build apk --release --dart-define-from-file=.env
See README.md for .env setup.
v1.0.1
Like Cooldown / Dedup
Adds a 10-minute (configurable) cooldown against accidental repeat-likes on the same track — two hotkey/media-button presses seconds apart for one listen now count as one like instead of two.
- Mobile (Android):
RuleConfig.likeCooldownEnabled/likeCooldownMinutes(default 10). Checked before liking, recorded only after the real Spotify like call succeeds — mirrored in the native Kotlin WorkManager background path. - Desktop: new
like_spotify/extensions/like_cooldownpre/post action pair, backed by a local JSON store under~/.like_spotify/. No Storage/network round-trip, same 10-minute default.
No prebuilt APK is attached — build your own with your own Spotify/Supabase credentials:
```
flutter pub get
flutter build apk --release --dart-define-from-file=.env
```
See README.md for `.env` setup.
v1.0.0
First tagged release.
- Android + Windows media-button trigger for Spotify like/unlike, playlist archiving, best-of promotion, artist auto-follow.
- Desktop tray feedback tone (synthesized, distinctive, volume-configurable via
trigger.feedback_volumein~/.like_spotify/config.json). - Matching Android feedback-volume setting in Trigger configuration.
No prebuilt APK is attached — build your own with your own Spotify/Supabase credentials:
flutter pub get
flutter build apk --release --dart-define-from-file=.env
See README.md for .env setup.