I have a whole year of sales data for @broadcastsapp on visionOS now!

In total, six full copies of the app were purchased on the platform in the past 12 months, and it has about 400 users total there.

This is my best-performing app on Apple Vision Pro, and it took about seven months of work to create 🤡

Apple offered a pat on the head in lieu of a devkit

Verifying that my older @broadcastsapp alternate UI feature flags still work before the WWDC keynote — always good to build yourself some options before you need them. Next time we see this, I expect it will be with an unhealthy amount of frosted glass

Complete double-take while browsing Apple's Developer site.

"…hey, wait a second, I know that app…"

Yeaaaaahhh now I remember what UI overhaul season feels like…

Threading the needle on targeted if statements that won’t also break the app across older OS designs on Mac, iOS, and visionOS 😂

This may not be the UI layout I ship, but I’m opting in all my custom views into the new stuff to see where that gets me before I start worrying about making decisions

Getting closer to a reasonable starting point for @broadcastsapp in iPadOS 26 using my existing feature flags, before I start actually writing any new code or doing new layout. Progressive blurs and new glass effects all present and accounted for
I have toned down the glass effect from the default by setting its background color to be 80% white. I expect that somewhere over the beta period Apple is going to do something similar (maybe meet somewhere in the middle). Or maybe the user base will get used to it, and decide they want something more like the glassier version. It will be an easy thing to tweak, if so
I will try to maintain dual-compatibility with iPadOS 26 and earlier versions of the OS as we move through the summer. Maintaining two different design languages, *per platform*, is going to be a struggle, but we'll see how it turns out. I built Broadcasts to be flexible, and it has paid off so far
The new layout does work on the old design language too, so that's something I could consider down the road as features coalesce into a Broadcasts 4

If I were making my living on designing app icons, I would be pretty upset with Icon Composer. Apple has gradually defined whole classes of designers out of existence throughout this era, but this is a K.O.

As a developer, though, this stuff is great!

Had a couple of tiny tweaks to make, but my starting point for Broadcasts on macOS 26 is looking OK. If I manage to build and ship no other features this summer, this is at least how it will look like on the new OS

Alternate Broadcasts layout, should all the bottom toolbar stuff stick on macOS.

When you see it all laid out like this, I'm almost surprised Apple didn't make macOS more like visionOS, and move the sidebar and the bottom bars out of the window chrome like visionOS' ornaments

Adding icons to all my menu items, as per the new HIG. UIKit has made the Liquid Glass transition surprisingly easy — benefit of such a flexible framework that runs on everything from watch to headset — and it still looks and runs like it used to on older OSes at the same time
Side by side, the old and new. I'm not afraid to lean into it, if this is really the way the wind is blowing. The more time you spend on this OS, the more you get used to the new way of doing stuff. It does seem pretty stark, looking in from the outside, but when /all/ your apps look like this, it does feel better to lean in and try more ambitious things
I'm at the 'ripping up all my layouts' stage of transitioning to the modern-tab-bar-with-alt-compact-view-controller stuff and hoping I'll be able to put the pieces back together again before I give up 😅

I have reduced Broadcasts to its platonic ideal on iOS 26 😜

Trying to shoehorn all the new stuff into my existing view controller hierarchy was just overcomplicating things; I'm going to start over from first principles, and I think that means using the modern iPad (/mighty morphin') tab bar structure that I so hated upon its introduction last year. But I think it makes a lot more sense now, now that there's a spectrum across device sizes

I'd be lying if I said I knew what I was doing with these APIs, chat, but we'll get there
Getting somewhere, at least. I am always so glad that I built all my new apps in a composable form, as it has made all these new layouts and platforms over the past years so much easier
If iPadOS only respected the window scene size restrictions maximum size, as well as minimum (which it now does), I could enable more of my expanded featureset on iPad — like my Mini Player window. I think it would be worth doing 🤷‍♂️
I'm kinda tempted to spawn windows now on iPadOS instead of presenting view controllers like I used to. I feel like now the OS has enough flexibility for me to enable all the workflows that I've kept locked to macOS and visionOS previously, which is fun
Took the morning to add Spotlight action support to Broadcasts, and it's pretty cool. It's like having a command bar, available systemwide, for your favorite apps. If this comes to iPadOS in the coming years it will be incredible
Shifting my list view code path from the macOS-specific one to the iOS version, as I think it fits the new design language better (don't worry, Regular and Large modes still exist)

If you've never really considered the complexity in updating an app for a new iOS release over the summer, welcome to my hell:

I'm currently working on two completely different versions of the UI in Broadcasts. One, using the old layout, which needs a reasonable amount of fixup. And another, using a new layout using all the newer APIs, currently very broken and is going to need a mountain of work to finish, and from my initial experimentation looks like it's unable to do all the things I want

Will I ship the ambitious rewrite that won't be as pretty but will be way more flexible for folding phones? Or will I ship the battle-tested existing UI that doesn't handle transitioning from small to large mode very well, and won't have a good solution for the 'middle' posture the platform now demands? I really don't know right now. Many of the APIs are unfinished and/or broken, so it's really up in the air. I will have to progress *both* far enough to make a decision

https://mastodon.social/@stroughtonsmith/114726300637233438

Speaking of rewrites, this redesign is finally going to push me to finish rebuilding my playback bar in UIKit. It now has to scale down a size class further to handle the new iPhone tab accessory mode, so it makes sense I do this here rather than in the doomed SwiftUI version.

My codebase basically has at least two versions for every view controller you see onscreen, either as new un-shipped versions, or versions I replaced a while back but never fully ripped out. I can sense a clean-out coming

Here's a side by side just to show my two codepaths. I'll be happy to finally get rid of the SwiftUI one (which, of course, has bizarre new interaction bugs on iOS 26, continuing its flaky history). Pay no heed to the layout or level of blurriness; neither are fully ready for the new design language
Bit by bit, the Broadcasts design is coming together. There's still a long way to go before September, and this is but one of my many apps to get through. With each passing day, the old visual style is looking more and more ancient to my eyes

So what if I sacrifice the morphing tab bar, but hide/show a tab bar when the sidebar is opened/closed instead? That way I can keep my custom sidebar logic and ornamentation, but also have a unique middle posture layout 🤔

It's an option — probably the most sensible one — but I'm undecided

Broadcasts progress journal: I am starting to wonder if maybe I should just put all my energy into the redesign instead of continuing to support iOS 18. Whatever way I cut it, this is going to be Broadcasts 4, and I feel like it won't have the same impact when it doesn't look or feel very different (on the legacy OSes). I still have a lot to think about, and I'm at the stage where everything looks ok but is completely broken and probably will stay that way for a while 😂
I have been making slow progress at building out the new Broadcasts UI, but I'm not at all sold on the level of glass in the bottom bar that Podcasts and Music use. I'm not tearing it out and building something custom, in the hope that Apple makes some decisions to fix that in its own apps first (that I can follow). In the meantime I've been building things that aren't immediately visible, like multi-select
I am, of course, keeping my new UI working in UIDesignRequiresCompatibility mode, in case of emergency, even though I don't think I'll be supporting older versions of the OS with this release. And maintaining the legacy UI too 🥲
Broadcasts is already a very different app on iOS 26 compared to what it was on iOS 18, especially on iPad, and I'm not even a significant fraction through my redesign. Designing for iPad now very much feels like building a desktop app, and it just makes me want to expand on all my features in ways I wouldn't have thought of doing before
I'm not wholly convinced yet, but I'm experimenting with making the toolbar area in Broadcasts customizable. Empty by default, but you can put extra buttons in there if you want them. Feels like something I should start doing in my apps, but maybe not /this/ particular app
Another aspect floating around my head is the inspector panel, a new option in UIKit. I haven't figured out if it's something I want in the app, or if it is what would I put there. History is an interesting option, however…
UINavigationController's alternate titlebar modes are kinda pretty. It's making me want to actually try this inspector panel thing. Bigger, better apps, for a bigger, better iPad
With this, Broadcasts now persists track history to disk, something I've been meaning to add for months
Broadcasts' three-column layout is quickly becoming canon in my head, and nobody has tried to talk me out of it yet 👀

There comes a moment in every major update you build where your app really starts to fork from the previous version and it becomes hard to imagine going back. I'm starting to feel that way about Broadcasts 4 now. At the time everything I did felt like tiny changes, but looking back now I'm like "wait, I did all of that since June?"

The question remains, will anybody actually like what I've done, or was I on the wrong path from the start 😅

The intent is for Broadcasts on iPad to be closer to the Mac version than ever before. Some of this is predicated on Apple getting iPadOS 26 into a reliable state, which is a little up in the air right now, but I'm continuing to build under the assumption that they'll get there

The most important thing I need to do for Broadcasts 4 is move the monetization to a subscription model (for new users only), something I've been talking about for way too long at this point and just been too afraid to pull the trigger on.

And I think part of that is going to involve making the app iOS 26-only — if I'm going to offer subscriptions, I don't want that to tie me down to supporting older versions of the OS indefinitely, when this is very clearly a line-in-the-sand update year

I figured I should take another pass at my 'iTunes Visualizer' idea, now that I'm armed with ChatGPT in Xcode. It took a lot of convincing to have it write a Metal shader for me, but I kinda like the results? Metal shaders are very much a case where I haven't got a clue what I'm doing. Sadly I can't get actual audio buffers from streaming audio using system APIs, so I can't actually wire it up to anything. It's basically just a screensaver
Broadcasts' visualizer mode is just one of those things that I teed up forever ago and didn't know how to execute. A lot of things coming home to roost now with iPadOS 26 that I have better ways to integrate them
I think people have been asking for this.
I am slowly forming a better picture of what a 'Broadcasts 4' is. I'm not even close to finished, and there are large parts I haven't started on still, but it's starting to feel meaningful as I slot things together. Compatibility mode is rapidly succumbing to bitrot as I approach the point of no return

There is an alternate timeline where this is what became Broadcasts 4. A timeline without crunching for six months to port to visionOS, without despair at an iPad platform vision with seemingly no future, without disgust at Apple's handling of antitrust issues, all of which combined I lost a good 18 months to

https://mastodon.social/@stroughtonsmith/110899816310922687

"Broadcasts 4" vs Broadcasts 4
Today I finally pulled the trigger and started work on gutting Broadcasts old core root layout code and replacing it with something modern. In short, everything is broken, and there's no going back — the app won't function again until I rewrite it all, piece by piece 🥲
It may look similar to before, but this really is a significant restructuring of the UI around UITabBarController, unifying the layout with the iPhone version of the app. Trying to see if this is viable, and, if it's not, I can revert today's work and pretend it never happened
I think the tradeoffs of using UITabBarController are piling up to the point where I will have to revert my Broadcasts rework from a couple days ago. It can't really support my UI in this seed, and I doubt updates will make it viable by September — and if I do wait for it, it'll halt all my forward progress on the update in the meantime. It was definitely worth attempting, but I can see it's not giving me what I want
Spent the day rewriting my playback toolbars in Broadcasts, and ripping out a whole lot of overengineered generalized code and replacing it with much more simple specialized code. This is the first time the iPhone build has been functional since WWDC. Not super hot on the iPhone version so far, even if it's just what Liquid Glass looks like

I made two tiny changes and it transformed how I feel about the Liquid Glass in my iPhone design

1) I use 0.99 white/black instead of systemBackgroundColor
2) I added a stronger fade underneath my tab bar

Both of these changes could trivially be implemented by Apple

The difference in legibility seems dramatic
Here's a before and after, just with the fade layer added. The earliest betas of iOS 26 were more like this by default, with the strong progressive blur effect at the bottom, but they disabled it all in beta 3 to try to hit performance targets. I have a feeling we're going to see a lot of developers pull last-minute tricks to try to 'fix' their Liquid Glass
After thinking about @marcoarment's comments, I've been debating dramatically scaling back my plans for iOS 26 to 'just' a visual update. Even still, I'm not confident updating the app with the new design language is going to leave users with a better experience than not-updating it. I feel like I need space between what I'm working on and the launch of Liquid Glass to see where everybody else lands, first. I very much want to see how Apple tries to salvage things in 26.1 and beyond

There is a ton left to do in Broadcasts before I can even start pushing it to TestFlight — it is the most changed of any of my apps, touching a lot of the parts of the system that look or behave badly even at this late stage.

Plus, it adopts the new Music/Podcasts design, and I want to see how people react to Apple's, first 😅

At the moment I'm not targeting 26.0 or September, as I want to get everything else out the door before I turn my attention back to it. It will be done when it's done

Finally fixed a layout blocker in Broadcasts that has been plaguing me since WWDC and sapping me of energy 🫠
On the topic of progress, today I've been mapping out the refreshed Search UI in Broadcasts on macOS, which follows the Podcasts app in form and function. I think the Mac version of Broadcasts is the nearest to a TestFlight-ready state, though there's still a bunch to clean up

"Why doesn't the last-played station automatically pre-load at launch?"

Good question. So now it does. Same amount of clicks, but no need to scroll

You ever come across a one-line-of-code change and wonder 'how the heck did I not know this?'

Today's example: setting .accessibilityTraits = .header on your collection view section headers.

Now you can navigate blisteringly fast between them with VoiceOver, like I've enabled in Broadcasts

StoreKit 2 actually seems legit; am in the process of migrating Broadcasts over to it, and it makes everything about licensing so much easier. I was spurred on by how easy and straightforward Coppice's subscription code was, so I can finally do the work I've been dreading (for two whole years) in Broadcasts
Shook the cobwebs out of the ongoing Broadcasts 4 project today, and pushed past a roadblock. Back to giving it my full attention now the juices are flowing again. Too many metaphors? Perhaps…
@stroughtonsmith I’m not a developer, so does “subscription code” mean that Broadcom’s 4 will introduce subscriptions?
@stroughtonsmith You should consider few scenarios where StoreKit2 will fail you & validating local receipt (for enabling features or offering free-upgrade purchase) can help:
- user uses multiple AppleID accounts (sometimes in different countries) and have downloaded app with another account (signed with different AppStore account)
- user is logged out from AppStore account
I use local receipt validation (or send receipt to AppStore validation endpoint to get json back) as a failover.
@stroughtonsmith Great to see, that you're continue developing your great app! I use Broadcasts every day in my car. Is it somehow possible to test the new version in Testflight? Is there a link?
@wladisge no news at the moment, but I'll be posting about it here when TestFlight begins
@stroughtonsmith to me this design strikes a good balance.
@stroughtonsmith For sure version with floating player felt way better. Why did you scaled back this one? 🤔 It seemed pretty finished...
@kkolakowski yeah but iOS isn't. The more UI surface area I touch, the more problems arise, and I don't think any of it is going to be fixed in 26.0. I've wasted weeks of my dev time just trying to make things work
@stroughtonsmith I'm not sure that was about performance targets. The top still has the progressive blur and *sometimes* the bottom bar also gets it in my testing, but it's very rare.
@stroughtonsmith Last-minute tricks, until Apple changes the whole thing again in the 26.1 beta just a few weeks later 😅

@stroughtonsmith The fade version is so more more parseable and readable and less cluttered and distracting.

TBH I think liquid glass is a pure regression, Apple’s own-goal of shiny form-way-too-far-over-function in pursuit of ill conceived, retconned goals (“focus on content”, lol). Gotta spend every last extra transistor in that Apple Silicon! But this is the least bad version of it I’ve seen that still basically honors it. Mostly because it reduces it.

@stroughtonsmith is there a TestFlight available of the redesigned Broadcasts?
@stroughtonsmith the "native" look is horrible. Your fixes actually being well thought out show how much better it should be
@stroughtonsmith Holy shit, this thread goes back 2 years!
@stroughtonsmith with the fade layer it’s more readable, but less “magic”. You lose most of the appeal of the new glassy buttons

@stroughtonsmith I really don't like it to be honest...

I mean - the tricks. Having to "fix" system components and standard behaviors seems like some total failure from the Apple design team 🙄 - but indeed your version seems to be more legible (I’m not sure if I like it much though, except the more blur underneath)

Personally - I wouldn't bother, we're still in beta, They can also modify and fix it anytime, or in early updates after the release.

@stroughtonsmith That’s a night and day difference!
@stroughtonsmith is it really Liquid Glass if the text stays readable?
@stroughtonsmith Not sure about the stronger fade, but I do agree with the color change 👍
@stroughtonsmith I swear the bottom would get progressive blur in earlier builds
@stroughtonsmith smushing the tab bar and now playing controls together still seems to be kind of pointless and worse UI. I know it’s the new default but it feels like it’s just there because they want to show off their fancy animations, not because it was necessary to give back space to the user.

@stroughtonsmith Not to barge in here at the list minute asking for features a month before the OS launch...but... Any plans to increase Shortcuts or osascript support? I'd love to be able to control via a script (triggered by an external keypad). Play URL, pause, resume, select audio destination...

I currently use Music.app for this, but for some reason as soon as I connect it to Homepods, the current track/artist info is lost.

@darthnull most of that should work with the existing Shortcuts and AppleScript support?

@stroughtonsmith I played with that a few months back and I'm not sure I could... Though maybe I could pick a favorited stream by index? Might've been the audio output switching that blocked me going forward.

I'll give it another look. :) Thanks for the response!

@stroughtonsmith seeing the AIB app was not expected! I didnt realise you were based in Ireland!
@kennethfallon that's like, my whole thing
@stroughtonsmith i guess ive not paid enough attention
@stroughtonsmith I think it would look a little more iOS 26-y if you separated the Search button from the navigation, kind of like Phone, Music and Podcasts. And maybe if you found a different spot for Settings, too?
@stroughtonsmith what was the layout code like before and want do you consider modern?
@rwitherspoon everything was custom, because that's what I used to need to support a bunch of different platforms. Now I want to move it all to the new tab controller layout, which means pushing some root functionality down a level to where it belongs

@stroughtonsmith by old layout do you mean frame-based?

In the AI age, I find myself reaching more and more for frame-based UIKit layouts; AI is really good at writing it. I find that it is much better at that than it is at Auto Layout, and certainly much better at that than it is at SwiftUI.

I think it’s because there’s so little implicit in frame-based layouts—it can kinda see everything.

@stroughtonsmith Comparing the two "Search" seems to have gone?
@eerko it's going to be in a different place