Aleksander Stojanowski

Aleksander Stojanowski

@stojanowski.dev

#IndieHacker working on @letspark.it

167 followers370 following1.1K posts

Much later than I wanted to, but a new version of Spark is available to download! 🥳 It’s also a much smaller update than I thought it’d be, but at least now Spark has a new #LiquidGlass icon. 🤩 #BuildInPublic #iOSDev #IndieDev #IndieHacker

Spark just got even better ✨ This update brings a refreshed Calendar view for easier streak tracking, a new iOS 26 Liquid Glass icon, and smoother overall performance. Stay consistent. Stay focused. Stay sparkling. 💎 #iOS26 #HabitTracker #SparkApp #LiquidGlassDesign

View full thread

I even set a deadline for myself, but I’m not ready to share it with you yet. 😅 Either way, the long weekend in Poland we start today might give me a bit of a head start, or at least I hope so. 🤞

Much later than I wanted to, but a new version of Spark is available to download! 🥳 It’s also a much smaller update than I thought it’d be, but at least now Spark has a new #LiquidGlass icon. 🤩 #BuildInPublic #iOSDev #IndieDev #IndieHacker

Spark just got even better ✨ This update brings a refreshed Calendar view for easier streak tracking, a new iOS 26 Liquid Glass icon, and smoother overall performance. Stay consistent. Stay focused. Stay sparkling. 💎 #iOS26 #HabitTracker #SparkApp #LiquidGlassDesign

However… Struggling with App Intents, I made a tough decision regarding Spark’s future. Instead of slowly progressing as I did over the last half a year or so, I’ll make a hard cutoff and start developing version 2.0. 😳

I’ve learned so much during all this time, and the more I want to change, the more I see I have issues in the foundation of the app, so either way I need to change a lot even for some basic functionality. 🫤

So… I’ve just learned that most of my adoration for #AppIntents was premature. 😆 I discovered why they didn’t work from actionable notifications, by having the same issue when I tried to use them in .onMove. 😬 #BuildInPublic #IndieHacker #iOSDev #IndieDev

View full thread

As for the progress in general, I had yet another exhausting week and I haven’t made much progress. I even took a 2-day break from working on Spark completely! 😱 However, I managed to create intents to work with habit groups and extended entities, so I can use them with my view.

So… I’ve just learned that most of my adoration for #AppIntents was premature. 😆 I discovered why they didn’t work from actionable notifications, by having the same issue when I tried to use them in .onMove. 😬 #BuildInPublic #IndieHacker #iOSDev #IndieDev

View full thread

Running them directly from code by instantiating them and calling perform makes them run in an environment where all their dependencies aren’t initialized. At least that’s what I understand from chatting with AI. However, I admit I haven’t double-checked yet. 😅

So… I’ve just learned that most of my adoration for #AppIntents was premature. 😆 I discovered why they didn’t work from actionable notifications, by having the same issue when I tried to use them in .onMove. 😬 #BuildInPublic #IndieHacker #iOSDev #IndieDev

This time I asked AI what’s going on, and its explanation seems reasonable. In a nutshell, intents for their dependency injection to work properly need to be run in a proper environment. Be it via Button with intent as a param, or from the Shortcuts app.

It looks like two weeks in a row I’m coming back to you with an update. 😅 Again, #TestFlight one, but I’m now much closer to a full update! Today I finished introducing #AppIntents to @letspark.it They aren’t available from Shortcuts or Siri, but they helped me clean up code.

View full thread

During the week, I also attempted to change a bit some animations in the app, but I failed, so for now there is nothing new the user can actually see by using the app. At least I hope so, there won’t be a bunch of crashes from running intents. 😆

It looks like two weeks in a row I’m coming back to you with an update. 😅 Again, #TestFlight one, but I’m now much closer to a full update! Today I finished introducing #AppIntents to @letspark.it They aren’t available from Shortcuts or Siri, but they helped me clean up code.

The only problem I have is using App Intent from an actionable notification. For some reason, dependency injection doesn’t work when the intent is performing in a delegate handler. I work around it for now, by passing them manually to the intent instance, but it feels wrong. 😑

Aleksander Stojanowski reposted

As usual, if you‘d like to help make @letspark.it better, or just use the best #HabitTracker there is (😝) for free, just send me a DM and I’ll send you an #TestFlight invite. 😉

Aleksander Stojanowski@stojanowski.dev

I’m back! 🥳 I had some tough times, caught a cold… Generally not the best period. 😅 I’m still not 100% healthy and strong, but back nonetheless. I even brought the Spark update with me! 😱 New #TestFlight version, but the update is an update, it still counts! 😜 #BuildInPublic #iOSDev #IndieDev

As usual, if you‘d like to help make @letspark.it better, or just use the best #HabitTracker there is (😝) for free, just send me a DM and I’ll send you an #TestFlight invite. 😉

Aleksander Stojanowski@stojanowski.dev

I’m back! 🥳 I had some tough times, caught a cold… Generally not the best period. 😅 I’m still not 100% healthy and strong, but back nonetheless. I even brought the Spark update with me! 😱 New #TestFlight version, but the update is an update, it still counts! 😜 #BuildInPublic #iOSDev #IndieDev

I’m back! 🥳 I had some tough times, caught a cold… Generally not the best period. 😅 I’m still not 100% healthy and strong, but back nonetheless. I even brought the Spark update with me! 😱 New #TestFlight version, but the update is an update, it still counts! 😜 #BuildInPublic #iOSDev #IndieDev

View full thread

Frankly, the next few weeks are going to be even tougher for me, and I think most of that will need to wait until sometime in November. 😩 I’m just happy I found time and strength to work for just a bit today. 😊

I’m back! 🥳 I had some tough times, caught a cold… Generally not the best period. 😅 I’m still not 100% healthy and strong, but back nonetheless. I even brought the Spark update with me! 😱 New #TestFlight version, but the update is an update, it still counts! 😜 #BuildInPublic #iOSDev #IndieDev

View full thread

It’s strongly coupled with my data model, and it makes the changes in the data schema so hard for me. Luckily, I have an idea of how to separate these two matters, and it should remove the main blocker of migrating to a new schema! Hopefully. 🤞

I’m back! 🥳 I had some tough times, caught a cold… Generally not the best period. 😅 I’m still not 100% healthy and strong, but back nonetheless. I even brought the Spark update with me! 😱 New #TestFlight version, but the update is an update, it still counts! 😜 #BuildInPublic #iOSDev #IndieDev

Frankly, it’s quite a small update. I streamlined background tasks at last and created a simple solution for synchronous scheduling of background work, without strange workarounds as before. The next task I want to tackle is… Notification scheduler. 😫

Working on a new schema (at last 😆), I decided I need to move my data interaction to app intents (yet another excuse 😅), as then I'll have one point to change my logic after schema migration. However, that means I need to extract my logic first, and it made me realize one thing…

View full thread

Even the description sounds horrible. 😬 Moreover, I believe there are cases when something might go wrong, but I just haven’t encountered them yet. I thought the actors could save me here, but reentrancy means every await call makes my actor method calls interleave. 😩

Working on a new schema (at last 😆), I decided I need to move my data interaction to app intents (yet another excuse 😅), as then I'll have one point to change my logic after schema migration. However, that means I need to extract my logic first, and it made me realize one thing…

View full thread

I created my handler in a way that enqueues the operations to an async stream and executes them on a background thread in the proper order, but it looks and feels like a very dirty workaround. Especially since I need to be sure that it finishes in a few places.

That forced me to create yet another horrible solution when waiting for execution to finish means I close the async stream, wait for the background task to end, and recreate the stream with its background handler.

Working on a new schema (at last 😆), I decided I need to move my data interaction to app intents (yet another excuse 😅), as then I'll have one point to change my logic after schema migration. However, that means I need to extract my logic first, and it made me realize one thing…

I hate notification scheduling on iOS. 😩 The main problem I have right now with moving my code to intents is that I need to handle notifications scheduling correctly, and today I realized why I hate that API so much. It’s asynchronous!

Don’t get me wrong, most of the APIs that are asynchronous are fine. The problem in my case is that I need to be able to call methods from different places and for them to be executed synchronously.

I have to more often say publicly that I don’t have much time to do something, I guess… I’ve sat for a moment to optimize the calendar view before migrating to a new schema, and it happened that I had a lot of opportunities to do so. 😅 #BuildInPublic #iOSDev #IndieDev

Aleksander Stojanowski@stojanowski.dev

It requires some optimizations. However, in the playground project, it worked smoothly, so I suppose the new data schema used there might help. Yet another reason I have to migrate at last… 😬 #IndieHacker

I spent more time working on that than I initially anticipated today, but as a result, there is a new #TestFlight build waiting to be released for testers. 😆 As if the optimization was too little, I upgraded the app icon to a #LiquidGlass design as well. 😁

It took me much longer than I wanted, but I started at last moving the new calendar view out of the playground project into Spark, and I must admit the results are great. 😊 Not only can you now easily go through history, but the calendar now scrolls naturally. 😁 #BuildInPublic #iOSDev #IndieDev

View full thread

There is also a problem with sheets animating together with button presses. I don’t understand what’s going on there, especially when that behavior is gone if the sheet has full height. 🫤 I’m quite sure it has something to do with #LiquidGlass, but I don’t know what yet. 😔

I wish I could say that the next update is near, but I believe the new schema might be really necessary to optimize everything without some strange hacks, and frankly, life happens, and I won’t have much time to work on Spark in the near future. 😩

It took me much longer than I wanted, but I started at last moving the new calendar view out of the playground project into Spark, and I must admit the results are great. 😊 Not only can you now easily go through history, but the calendar now scrolls naturally. 😁 #BuildInPublic #iOSDev #IndieDev

It requires some optimizations. However, in the playground project, it worked smoothly, so I suppose the new data schema used there might help. Yet another reason I have to migrate at last… 😬 #IndieHacker

Aleksander Stojanowski reposted

Replying to @letspark.it

Ready to build better habits with the new & improved Spark? ⬇️ Download now and take control of your daily routines ✨📈 #SelfImprovement #DailyHabits #ProductivityApps

apple.co‎Habit Progress Tracker - Spark‎What if your habits grew stronger each day instead of crumbling? Spark turns shaky intentions into unstoppable momentum through atomic tracking and guilt-free reminders. No complex systems – just a f...

I just got the moment of peak engineering! I struggled with an infinitely scrolling calendar timeline. I tried a few approaches, but none of them worked as intended (to say the least 😆). Then it struck me! #BuildInPublic #IndieHacker #iOSDev #IndieDev

View full thread

I almost gave up for the day, but then I got one more idea… Let’s flip the view horizontally! That’s it! Now calendars scroll in natural order, and everything works smoothly! 🥳 Of course, I needed to flip both, the parent scroll view as well as the calendars themselves. 😅

I just got the moment of peak engineering! I struggled with an infinitely scrolling calendar timeline. I tried a few approaches, but none of them worked as intended (to say the least 😆). Then it struck me! #BuildInPublic #IndieHacker #iOSDev #IndieDev

View full thread

That in itself caused the app to lag, a big amount. Mostly because a lot of computation was required to create a single month calendar. I need to optimize the view, but it will help only a bit in case of dozens of views being created at once. 😕

Then I got a quick fix. Instead of moving the view to the end, let’s reverse the array. Brilliant! Now swiping between months is also reversed… 😩 I asked an AI for help, but it couldn’t propose anything performant as well. 😬

I just got the moment of peak engineering! I struggled with an infinitely scrolling calendar timeline. I tried a few approaches, but none of them worked as intended (to say the least 😆). Then it struck me! #BuildInPublic #IndieHacker #iOSDev #IndieDev

It went viral that time wheel in iOS picker isn’t infinite. I did the same. Instead of fighting with adding new months when needed, I generated a list of dates, put them into a lazy stack, and… I got the problem. 🥲

The dates in the array were from the oldest one to the present, which caused that first month the user saw after opening was an ancient history. Using scroll position for some reason caused that for every month in the array, the calendar view was created when moved to the end. 😔

Am I 2 days late? Perhaps, but better late than never, am I right? 😅 I must admit I planned to prepare Spark for iOS 26 release date, but I got distracted, dove into new calendar view, and you know how it sometimes can be.

✨ Consistency > rushing. Spark now supports iOS 26’s Liquid Glass design - arriving polished, not pressured. #iOS26 #HabitTracker #LiquidGlass

I hadn’t planned to work on this update until the weekend, but a friend showed me a bug that I needed to fix right away, so I sat yesterday evening and prepared everything. I thought I’d be waiting much longer for a review.