Was presented with some neat generated palettes while testing this UI. I think I'm going to keep building a UI around it in case the API situation changes in the future. It's just such a cool side feature to have
If you're curious about what's happening behind the scenes, this is the setup prompt I'm passing to #GPT. I’m defining a JSON data structure, and redefining what a palette is in the process (as GPT sees the word 'palette' and tries to output 5 colors every time if I don’t). I tell it to be fun and creative in its palette generation and naming, and to follow related topics for keywords. The results speak for themselves, though it does still have a habit of duplicating palettes under diff names
Prompts are taken as-is, so "a gallery of sample palettes to include in an art app” turns into all of these with no other code. Names provided by the generator
While I don’t intend to ship GPT-3 as a user-facing feature in Pastel, I can certainly use it on the development side to build collections of palettes to populate a gallery feature I was toying with. It will make it very easy to pre-fill with content based on themes
Today's task in @pastelapp is to rewrite the color wheel to move it off third-party ObjC code and bring it in-house in Swift. Almost done — it’s so much smoother to interact with now, even if there are still a couple bugs to work out. Pastel is still a ways off being Swift-only, about 6,000 lines to go, but it’s nice to be able to get major improvements as I do-over each class
Next up for visionOS: @pastelapp. A few dozen build errors to start with…
…well that's certainly a look 😂 Time to dive in
Better, but I can see I'm going to have plenty of elements to rewrite ahead of me
Some of this UI does look fun, but it's gonna be one hell of an OS to window-manage
I think the color picker makes sense as an ornament, but it is pretty hard to gauge some of this stuff from a simulator
Going in another direction for @pastelapp. I will have to rewrite the sidebar as a collection view (it’s still UITableView, of all things), and I'm glad I spent time this week working on a new color picker tab bar because I'm gonna need it. Overall I think it's going to require a lot more effort than Broadcasts, but it's mostly stuff I needed/wanted to do anyway
Starting to make preparations to branch @pastelapp to v3.0, so I can work on some larger changes coming down the pipe. I think that will include bumping the minimum OS version, which is currently macOS 11 & iOS 15. I will be dropping support for macOS 11 in this release, for certain, and maybe push even higher depending on timing and how development plays out. This is probably a 2024 update rather than for the iPhone launch this year

This is the time post-WWDC where I try to get all my projects building to a shippable state again with the new Xcode after working on experimental tangents and rabbit holes for months 😅 I think everything in my dev version of @pastelapp works again now, but I can't remember what I broke.

I'm doing a pass at a bunch of little things, shuffling some bits around, updating iconography etc

There is no ‘iOS 17 update' for Pastel, as the new system features don't really touch upon anything in the app. Kinda gives me some space to think up new features to build as I work towards v3.0. The app is in a great place, I think, so I don't feel like there's any pressing need to dig in right now. Some of my other projects need the attention a lot more
Making progress on @pastelapp today. I've walked back some of the more-complex changes I was making for visionOS, and taken a pass at rounding out all the sharp edges. There is still a lot to do, but I think it's turned a corner now

An awful lot of bringup for an existing iOS view controller on visionOS involves three things:

• Change your background color
• Round out your shapes/set your button configurations to the system rounded style
• Add roundrect hover styles

Here's a before/after on my wallpaper generator; just a handful of one-line changes

TL;DR much of this stuff looks incredibly daunting when you first run your iOS app on visionOS, where everything has the wrong color and style, and feels like a mountain of work ahead of you. But actually, it's not as bad as it seems
Here’s @pastelapp with a few more passes around the app. Honestly? I could probably publish this build without changing a whole lot else

I built this palette-generation feature two years ago for @pastelapp, hoping that Apple would ship LLM APIs I could use instead of GPT-3. Womp womp.

Here's hoping tomorrow brings some change here…

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

Finally trying Apple's Foundation Models for palette generation, side by side with what I generated with ChatGPT.

The first image is the prompt "Planets of the Solar System" with Apple's on-device LLM, the second image is the same prompt using GPT-3.5 as of 2 years ago.

It can certainly do what I need it to do; whether the results are any good is an open question. I think it's inoffensive, and harmless, at the very least, so maybe I can move forward with it

As a proof of concept, it confirms that the Foundation Models can indeed be applied to any kind of silly little task, and it’s so easy to get structured, deterministic output from it using the new @-Generable macro. No JSON, no parsing, just perfectly formed structs as output
Even though the concept works, the performance is a little worrying. It takes an M1 iPad Air about 30 seconds to generate a handful of color palettes — which are just some hex codes with a name, nothing complex. Streaming the results in one by one becomes a necessity with those kinds of processing times

Enabling streaming, you can see that the Foundation Models API is slow — I would say alarmingly slow — on M1 hardware. I'm not even sure what kind of optimization I might be able to do to speed this up, as it's seemingly purely on the token generation side 🤔

It's going to take more than a little care and attention before you start sprinkling this all over your apps, that's for sure. Good to know

#wwdc25

Initial bringup on macOS 26 for Pastel. There are some significant system-level performance regressions that I'm going to have to debug my way through — I've lost my 60fps window resizing, that's for sure 😐 Other than that, it was a modern app with a forward-thinking design language, and it fits Liquid Glass on iOS and macOS without much trouble
Slowly iterating on the design language for Pastel and fixing all the weird little bugs the new SDK introduced. Only now is it functional again
Not making a whole lot of forward progress with my apps right now, so I'm gonna get some lateral progress done. Pastel still has about 5,500 lines of Objective-C code remaining that is all ripe for translating to Swift via Xcode's new ChatGPT feature. It'll give me a chance to sanity-check some of my legacy code in the process
Slightly reorganizing my copy menu while I'm at it, and scratching my chin at the menu glass effect 🤔

Still a long way to go, but here's a before/after on Pastel on macOS 26 as of the current build.

During development, you spend so much time looking at the new design that you kinda forget how it used to look

Pastel on iPad is going to look effectively indistinguishable from the Mac version by the time I'm finished updating it for Liquid Glass

With today's work out of the way, I think Pastel's iOS 26 update is done for Mac and for iPhone. The iPad build is blocked by my earlier radar, and I haven't figured out a mitigation strategy yet, but we're nearly there

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

I've started the TestFlight process for Pastel for iOS and macOS 26. There are some known issues on iOS, including a severe hang, but most things are in place now, and there are still slots available 😄

https://testflight.apple.com/join/xkUYBZPb

Today's build of @pastelapp fixes the last of my major issues, and achieves all the goals I set out for this iOS 26 update 😄 All in all, the update touched about 6000 lines of code, with zero new features, just to adopt the new UI
I think @pastelapp for iOS and macOS 26 is now 'visually complete' ahead of the September event, which means I have to start thinking about marketing screenshots. I'm very happy with how this turned out, even if it took a while to get there
I don’t think I’ll ever get used to how good iPadOS 26 looks on an external display. If you have an M1 iPad or higher, I implore you to give it a try
Giving Pastel a v2.4.1 today on macOS to update everything that looked blurry on a non-Retina display, as it's been a long time since I've given it a pass and some system metrics have changed lately that need round()ing. It's real hard to tell the difference from a JPEG, but here's a before/after

The next minor version of @pastelapp will support exporting color palettes to Pixelmator Pro (on the Mac, at least, as they don't support that on iOS)

Update: now available!

https://apps.apple.com/us/app/id413897608

(Did I just spend the day reverse-engineering their proprietary color palette format? Yes.)
The next version of Pastel tackles a bunch of things, including revamped undo/redo support. I recently added pinch-zoom to the image importer, too. Paying attention to lots of little corners of the app that haven't seen love in a while — time for a polish pass now that Liquid Glass is no longer taking up all of my development time

Venturing out into the Great Unknown, I have finally made the switch from single-purchase to subscriptions in @pastelapp, for new customers, after talking about it for years.

I should have done it years ago, but the risk of the floor falling out from under me scared me off. Better late than never!

I'm much better prepared to handle the initial financial shock today, and as I've migrated everything to StoreKit 2 I've been really impressed by how easy Apple has made it to implement subscriptions

Why subscriptions? A one-time purchase revenue graph, even for a moderately successful app, looks like this. Yet work required only increases in complexity — Pastel has had 40 multiplatform updates since it launched in 2020, including two system UI redesigns, and a whole new OS (visionOS).

One-time purchases just aren't sustainable, unless the product itself is also one-and-done — and that's just not possible on a moving target like Apple's OSes. Revenue can't be inversely proportional to time

I've tried to make Pastel's subscription pricing as unobtrusive as possible. As it stands:

• Existing paid users are grandfathered in and don't have to subscribe
• New users can subscribe for $2/mo or $10/year, with two-week free trials
• If you are on an OS version that I know won't be supported going forward (though I haven't decided to drop support yet), you won't see subscription options at all, only the legacy one-time purchase (now $20)

TL;DR, if you already own the app, you won't notice

All of this is subject to change in the future, but I have no plans to do so. And this model, by and large, is what I will be doing with @broadcastsapp with Broadcasts 4.

There is so much I'd like to be able to do in both apps that requires investment, and the only way I can justify it is if the revenue line is going in the right direction, otherwise that time needs to go into new products. I would like to do both things! So Pastel gets to be my test case, and we'll see how it goes

Taking another crack at the 'Gallery' tab in Pastel, while I have the codebase open. The idea is to provide a vehicle to offer new/refreshed curated collections of palettes without stomping on the built-in presets. Also a way to recover deleted presets. I'm reasonably happy with the idea so far (though content and UI is still temporary). Ideally they would have illustrated key art of some kind, but in lieu of that I'll have to find some other way to visualize collections
53,000 devices have updated to the latest version of Pastel over the past day, and it has done 350K (unique) units over its lifetime (which is several multiples of Broadcasts). I've always been generous with the free tiers in my apps, but I think I might have massively overdone it with Pastel. If even 1% of Pastel's users paid for a subscription, that would be a salary unto itself and allow me do so much more with the app. Hard not to feel sheepish about how much I've left on the table
(Broadcasts, in fact, is my third most-popular app by unit count. Fourth, if I include an app I sunset long ago. But it does make the most money, by far)
@stroughtonsmith I used it free for years but did buy it! It slowly seeped into my (casual) design workflow until it felt essential. That's a good free tier IMO.
@stroughtonsmith App subscriptions are one of the things which everybody hates, but also understands as the only sustainable model for continuous maintenance and improvement. Go for it.
@stroughtonsmith I use it often enough that I’d be willing to “tip” through the app since I paid for it years ago.
@DanMorgan the subscription options are open to previous purchasers if they go looking, but I don't have anything like a tip jar. Thanks though!
@stroughtonsmith I did that with Overcast. I think I’ve tried to give Marco money in several ways.
@stroughtonsmith a pretty reasonable change tbh! Are you implementing a hard paywall then? I've been preparing to launch my own app and have been going back and forth on whether to do a hard paywall or a freemium model
@chechoribero not at this time, I wouldn't want to run into one myself. Tire-kicking allowed

@stroughtonsmith

True.

That said, I surely would like more software to be “done”. Like, you’d pay for that year’s version, expect only updates for that calendar year.

Want another year of support or new features? Pay for the upgrade, at a discount or not.

I remember some iOS apps with that business model: “buy” and get a year of updates. Want another year? That’s an IAP.

I’m not totally averse to subscriptions, I subscribe to a few. But some apps don’t present a clear case for this model to its customers.

@klangoso @stroughtonsmith that sounds like a subscription, but one with only option being yearly subscription.

@Janne_O @stroughtonsmith

In this I can not subscribe after the first year and keep the app as it is at the end of the timeframe I’ve paid for.

If, say, 3 years down the road the app ain’t working or gets a feature I want, I’ll pay for that year only, not the previous two in which I didn’t want/needed it changed.

@klangoso @stroughtonsmith I’d say that would be way more confusing for everybody involved. There would be people complaining that the app does not work properly.
@klangoso @stroughtonsmith That’s not possible in the app store, nor the google play store.

@2happy1sad @stroughtonsmith

Weird. I clearly remember Agenda (https://apps.apple.com/br/app/agenda-notas-mais-calend%C3%A1rio/id1370289240) advertising this.

That said, 1) it should be possible; 2) I’m not limiting my argument to App Store apps only, but all apps.

I’m basically asking for more apps being “bought”, like the norm before app stores. E.G. Adobe’s apps before the subscription model, like CS6. This is still possible.

App Agenda: Notas mais calendário – App Store

Baixe o app Agenda: Notas mais calendário de Momenta B.V. a partir da App Store. Veja capturas de tela, classificações e avaliações, dicas de usuários e mais…

App Store
@klangoso @stroughtonsmith I can’t see how, given that it has never been possible. It’s an app store feature developers have been screaming about for years.

@2happy1sad @stroughtonsmith

Just checked: it’s still like that:

“Agenda does offer extra premium features that require an In App Purchase, and that make the app even more powerful. If you decide to purchase the upgrade, you permanently unlock all *current* premium features across all of your devices. Each of them is described in detail below.

Additionally, *any new premium features we add while you are subscribed is also permanently unlocked, even if you decided to cancel your subscription*. What is yours stays yours!”

Emphasis are mine.

https://agenda.community/t/get-all-features/21

Get All Features

Going Premium Agenda comes out of the box with a great set of features, completely free. There are no time or trial limits. You can use it forever, at no cost. Agenda does offer extra premium features that require an In App Purchase, and that make the app even more powerful. If you decide to purchase the upgrade, you permanently unlock all current premium features across all of your devices. Each of them is described in detail below. Additionally, any new premium features we add while you are ...

Agenda Community
@klangoso @2happy1sad there are certainly hoops you can jump through to do all these weird edge cases, like locking groups of features to different in-app purchases, or including multiple versions of your app logic in one codebase and picking one at launch (which is madness, but some of the bigger companies do that). It's a whole lot of time and effort spent putting together a system like that instead of just improving the app for everybody, that's why almost nobody does it

@stroughtonsmith @2happy1sad that “everyone” includes those that stopped their subscriptions? Because that’s what I was getting at: subscriptions are the worst for a lot of apps that don’t present clear benefits to its users.

Many users just want to go back to the pre-App Store ways: you “buy” an app, it just stays as when you bought it, saving for critical bugs for a reasonable (1 year minimum, 3 at best for most apps) time.

Barring some *really* cheap or critical apps, the only benefit I see for users with subscriptions is when one’s use is sporadic, when the total spending with monthly/weekly subs is less than the yearly or lifetime pricing, and if (**big “if”**) one can know this would be the case beforehand.

@stroughtonsmith @2happy1sad examples, *in my usage patterns*

* Streaming video apps. I’ll subscribe to some for just one month when a desired show season ends.
* Adobe’s: When I get a freelancing gig (about one each year), I’ll subscribe for one month.
* Iconfactory’s *Tapestry*: its monthly subscription is cheap and I’m still deciding if it’s for me. Seems like it is. Now I need to decide if I’ll spring for an yearly subscription, as the “forever” is expensive for me.

I’m in Brazil; every app/sub costs 5-10x here, because of our low purchasing power comparing with the USA or the EU. I’m a senior professional in the top 10% earnings bracket in Brazil and I make about 20k USD per year; my take home pay is about 7 USD/hour, minimum wage in the USA.

@stroughtonsmith @klangoso Yes, but neither Apple nor Google provide a way to charge for specific version upgrades through the app stores.

@2happy1sad @stroughtonsmith That’s not what I’m asking for either.

The way the Agenda team does it is close enough for me, and, IMO, for the vast majority of people wanting something that isn’t a subscription.

@stroughtonsmith do you think Apple would ever do something similar to Setapp/Apple Arcade/Game Pass for apps?
@stroughtonsmith This is why I've stopped using apps entirely and use only web apps.

@stroughtonsmith @gereon I hear^Wread you.

Nevertheless, OTOH, if I would need to subscribe for every utility I paid for in the past, I would need another tool to keep track of my subscriptions.

And as all subscriptions are different, I would need to manage these cases, at least:

- subscription expired? no new updates/features, but security/bugfixes, otherwise have fun with the software
- subscription expired? no security/bugfixes, but software keeps running. YOLO
- subscription expired? its license is checked against a license server, you lose access to your software (and maybe data created with it)
- subscription expired? the backend services somewhere else stop working, rendering the software useless
- what is this $2.95 cost a month on my credit card/Google Pay/whatever from CoolCompanyNameThatsImpossibleToGoogle Inc. ???

And now guess how well my dad or my aunt could distinguish this and decide.

That’s why I avoid subscriptions whereever I can. I tend to lose track of ’em. Either I pay too much, not using it. Or I lose the stuff bound to it. Either way, I’m unhappy.

YMMV, my arguments are not bound/related to _your_ software, just generic ramblings.

@stroughtonsmith @gereon I prefer a model like Barebones’s BBEdit scheme (for example): I paid once, I upgrade whenever I want, software keeps running, I get a discount as a loyal customer.
@goetz @stroughtonsmith @gereon I have similar thoughts. Far too many subscriptions to track. So I pay for less software overall as I cut back when it got out of hand.
@stroughtonsmith and yet Apple has no way to volume purchase subscriptions and in App purchases (as Organisation paid for in AxM for managed distribution)

@stroughtonsmith

You could keep the one-time purchase active for security updates, but offer newer features for purchase.

@stroughtonsmith Users generally don’t like subscription. Why not, make an app, sell it,and then give users compelling reasons to buy the upgraded version when it’s a meaningful change.
@warrick_w I mean, that model doesn't exist on the App Store, so it's not an option. Also, to be fair, why would one optimize for the users who don't like subscriptions over the ones who are OK with them? Wouldn't anybody prefer customers who are happy to keep paying for the product? Do you want fast growth and inevitable decline, or do you want stability?
@stroughtonsmith @warrick_w I’ll just not buy the software. I need to own something. If it stops working when I no longer subscribe I’m not that interested.
@stroughtonsmith Interesting. I do get the draw. But even as a developer, I think one time purchase with upgrades is still a better customer experience. But you still supplement with subscription for cloud things.

@stroughtonsmith What about paying for updates. Like a base model that you can buy, then if you want continued updates you can either subscribe to that or pay to get updated to the last major release?

-Edit: it seems like I am not the only one thinking of this

@stroughtonsmith One time purchase is never a good idea, it gives the developer no reason to make the product better for existing customers, and generally leads to the product being dumbed down to expand to a wider market over time. Subscriptions are never a good idea, it gives the developer no reason to make the product better full stop. Purchases with Paid Upgrades Is The Way. It gives the developer an incentive to make the program better and better for existing customers (easier sales).
@peternlewis which is nonviable on the App Store, and would mean you have to spend a lot of effort to re-convince people to buy every time anyway instead of making the app steadily better. Subscriptions are always a good idea; every app shouldn’t have to be in a fight for its life year in year out
@stroughtonsmith I agree its non-viable in the App Store, which is something that makes me very happy my app is excluded from the App Store. I still think that subscriptions remote virtually all incentive for the developer to continue to develop their app, leaving only personal pride and potential competition as motivations, only one of which is financial.
@peternlewis what subscription apps are you aware of that don’t get updates? I can’t think of any
@stroughtonsmith Dropbox? Office 365 (other than AI crap)? My contention remains that there is much less financial motivation to improve an application that has a subscription system. That it benefits developers over customers can be easily divined by the fact that the vast majority of developers have moved to subscription models.
@peternlewis I think that's more you don't like the updates, rather than them not getting updated; I don't think the payment model is responsible for their product choices. There is good reason for developers having switched over: most of the ones that didn't didn't survive, and now work for the companies that did 😅
@stroughtonsmith “I think that's more you don't like the updates, rather than them not getting updated” - yes, that was pretty much exactly the point I made at the start. Paid upgrades ensures the developer is working in the best interests of the existing customers as much or more than to generate new customers. Anyway, I respect that paid upgrades are not a path that developers can take within the App Store, and that leaves on subscription or failure in most cases.
@peternlewis you do also tend to need to start taking in user data to make the paid upgrade model viable: you need mailing lists, which means some kind of server infrastructure, you're now liable for GDPR or you're handing that data off to third parties to manage it for you, etc etc. That's just something I don't want to do in my apps, even if I were to release the Mac versions outside of the App Store
@stroughtonsmith that's fair. I have that, since there were no other options when I started. If I was doing it from scratch now, I would have my communication done via my app, so no mailing list. The app itself would inform the user of updates.
@peternlewis @stroughtonsmith It seems obvious to me that, with a subscription, the incentive to provide updates that users actually want disappears. Users cannot express their approval by buying an upgrade. They are forced to pay a subscription, and get the upgrades that the developer decides to give them. There are no sales numbers showing whether people actually want the new features. AI features are the obvious example. It’s even worse in the case of a de facto market monopoly (Office).

@stroughtonsmith I could not agree more.

I switched Parcel to subscription back in 2013 while grandfathering exiting premium users as a lifetime purchase. Subscription is the only reason why the app is still up and running.

Also makes sense to have an affordable price, way too often I see $50/year as a default subscription price.

@stroughtonsmith You appear to suggest that any pay-once app will cause a degrading revenue over time, yes? Well, that's sad to see but not universal. My FAF started small and kept increasing revenue over the past 15 years. Slowly but fairly steadily. And that at a price of just $6-$8. Not making me rich but still a valid counterpoint to what you suggest.
@tempelorg you can always grow your market share to new users, but to a point. And mostly that will require either viral success or a lot of marketing. I think most developers experience a launch spike and then a long tail. Sometimes you have a lot of runway
@stroughtonsmith Right. To be fair, mine is a mostly one-time use app. But I do practically zero marketing. It's just that people keep recommending it to others if they need the unique features my app offers, I guess. I'm lucky this way, and it took a long time to get there. And it wasn't designed to be successful like this. It started as a free app, in fact, until people kept asking to pay me for it :)
And honestly, I'm also looking into adding Pro features to give me a revenue boost.
@stroughtonsmith Still uncomfortable using a subscription model for a tool like this, though. Part of the success, I believe, is that it's a cheap program where people don't run much of a risk trying it out. OTOH, a Pro version would be suitable to those who use it regularly, and they might be more open to a subscription. Sigh, it's a difficult decision.