Recent updates
[Changelog] May 29, 2026
First up, we went to The Great Escape in Brighton. That was dope!
We work remotely 99% of the time, so it's good to hang out together - especially when there's food and music involved!
Of course, I didn't stop grinding out code. Best believe there's been a lot updated in the last month!
Playlists
First up, a growing problem: we're seeing more artists "boycott" Spotify. They're still a small minority, but it's caused a few headaches this year. Most of our playlisters are syncing across multiple DSPs, so it begs the question: if there's no Spotify link, can't the playlister just share on their other platforms? Up until now, the answer was "no," because my sync code treats Spotify as the "holy grail." That's all fixed!
- New "Custom Sync" system holds your track in YouTube, SoundCloud, Apple Music and Deezer mirror playlists that the normal Spotify sync would otherwise wipe out
- Artists can also opt-out of Spotify, and when their songs are ready to be shared, curators don't have to think about it: my code takes care of all the exceptions and uses the "Custom Sync" feature to keep it on their other playlisters
- Curators add any song to their other playlists, with an optional position and removal date (click the 3 dots to the right of your playlist)
Other playlist updates:
- Soundiiz support: SubmitHub's built-in sync functionality only covers 4 DSPs, while Soundiiz covers a bunch more. I know a few of our curators are paying for membership over there, and the Soundiiz team has been nice enough to set up an endpoint for us. Curators can connect from the settings section of their Spotify playlist tab
- I did a bunch of upgrades to sync song matching, leaning heavily on ISRC codes so that songs stop falling through the cracks. I think we picked up +30% coverage doing this, mostly on SoundCloud, Deezer, and Apple
- Spotify playlist view got a big cleanup, and now has stats consolidated into collapsible tables + sortable tracks table
Links
The Links feature got a proper visual refresh.
- New modern template. New Links default to it; older Links stay on the classic look until you opt in via the preview page. I'm gonna keep an eye on CTR rates between the two
- Option to hide the title - this is useful when your artwork contains the title already
- New Summary tab that surfaces some basics
- Added deep links for YouTube, plus Spotify podcast and episode links
- Duplicating a link can now optionally clone its ad too
Packages
Packages keep getting refined based on how people are actually using them.
- You can now toggle auto-renew on your ad directly from the package page
- One package per track now: if you try to start a second one on the same song, it funnels you back to the existing package instead of creating a duplicate
- Package descriptions now break the credits out into per-category lines so it's clearer where everything is going
- A "Keep my ad running" checkbox replaces the old inline note (now available on custom packages and Meta Ads too)
- Trashing a track now properly cancels its package and auto-cancels the associated Meta ad
- All the user-facing package text is now translated
Ads & Visuals
- The Visuals tab got a big revamp: a proper ads table (grounded in live Meta data) with per-creative thumbnails, click-to-play previews, a status toggle, and a clicks / conversions / impressions breakdown
- Custom video uploads now publish in the background, with clear Retry / Cancel states if something gets stuck or fails (and an email if a publish fails)
- Added a video download link next to "View on Meta"
Hot or Not
- Onboarding and genre editing now use a parent-category picker instead of a giant flat checklist (tick a category, get all its sub-genres; an Advanced toggle still lets you pick individual ones)
- Reworked the feedback credit counter and fixed the premium bonus payout
- Listen time now shows on all Hot or Not ratings, even skipped
Gifts
- Gifts is now a proper hub: claim a gift, send one, and see both your claimed and sent history in one place
- Anyone can now gift premium credits to anyone by email. The recipient gets a claim link (and an in-app banner if they're already on SubmitHub), and you can revoke an unclaimed gift
AI tools
- The AI checker no longer requires a login: you get 2 free analyses per hour
- The "AI Detected" badge on Spotify track rows now opens the detector with a source-aware verdict and a link to the full analysis
- Slightly controversial because it's not always 100%, so curators (and any logged-in user) can now report an incorrect AI tag directly from the detector modal
- [Internal] Support overhaul: AI-suggested draft replies for our support team (~80% accurate, which is great), an outbound/inbound email reply classifier, email-to-ticket threading hardening, ticket translation via the Qwen (running my own local model!), tighter auto-close thresholds, multi-file attachments + gallery, and AI summaries as ticket labels
- Prompt compression: AI prompts now compressed via LLMLingua to cut tokens and latency, with hardened fallbacks - saved about 50% of our ChatGPT bill there!
Submissions & dashboard
- Reframed the track dashboard summary as Recipients / Responses / Approved (clearer than the old wording)
- Fixed genre prefill leaking across songs when submitting multiple tracks
Miscellaneous
- Unified the desktop nav sidebar and the mobile slideout menu so they don't drift apart - for a while there I had two separate components doing the same thing
- Added a support icon for quicker access to help
- New post-release email that surfaces Spotify popularity score wins ~1 week after your song releases
- Mobile: per-curator descriptions in the main curators feed now show beneath their social icons
- Favorites tab shows proper empty-state copy when you don't have any yet
- A nice new gallery format for Stories (see above)
What's next
- Early next week I'm going to roll out a simplified song upload process, as well as a cleanup of song metadata in general
- I'm also very close to launching a more accurate version of the genre detector - have spent 4 weeks on this one trying different approaches and sourcing data. Really hoping it works 🙃