<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Passive-Aggressive Development]]></title>
		<description><![CDATA[Follow the life of an independent developer. Not only about coding/designing, but also how to make ends meet when running a small business.

Articles can be read here: <u><a href='https://aggressive.se/blog'>All Articles</a></u>]]></description>
		<link>https://aggressive.se/blog/</link>
		<lastBuildDate>Tue, 13 Oct 2026 00:44:22 +0200</lastBuildDate>
		<pubDate>Wed, 09 Sep 2015 00:00:00 +0200</pubDate>
		<generator>Aggressive Feed Generator https://feeds-app.com</generator>
		<item>
			<title><![CDATA[Dynamic JS feeds]]></title>
			<description><![CDATA[<p><img src="/blog/images/u/small.jpeg" /></p>
<p>The web keeps getting more dynamic, and feed readers have to keep up.</p>
<p>Feeds 3.3.3 is now available! This release makes Feeds much better at handling websites that require JavaScript, so you can now turn those dynamic sites into a feed. It also improves feed icons, code blocks, and fixes several web view bugs.</p>
<p>Why does that matter? Feeds is built to turn almost any news-like website into a clean, calm reading experience, then use private, on-device AI to bring the most interesting stories to the top. Version 3.3.3 opens up another slice of the web and makes everyday reading smoother.</p>
<p>More of the web. Less time hunting for updates. All in one feed.</p>
<p>Download Feeds: https://apps.apple.com/app/id1265608707</p>
]]></description>
			<link>https://aggressive.se/blog/#post_url=dynamic-js-feeds</link>
			<guid isPermaLink="true">https://aggressive.se/blog/#post_url=dynamic-js-feeds</guid>
			<pubDate>Tue, 06 Oct 2026 19:07:01 +0200</pubDate>
		</item>
		<item>
			<title><![CDATA[Feeds is alive]]></title>
			<description><![CDATA[<p><a href="https://itunes.apple.com/app/id1265608707">New version out now!</a></p>
<p>Times are changing but I’m not, and neither is Feeds, the greatest newsreader on the planet. AI has taken over the world and having your own personal AI in your pocket does not seem like such a fancy thing anymore. Its usefulness has however never changed, even if competitors can now build something like it. This AI however has never been trained by millions of old books in huge datacenters. In fact, it has never been trained at all (and the server runs on 100% wind power). It still also has the main features:</p>
<ul>
<li><p>Fast download and parsing of feeds you select - no infinite scrolling of random garbage</p>
</li>
<li><p>Turning any website into a feed</p>
</li>
<li><p>Sort by most likely to read first</p>
</li>
</ul>
<p><strong>In this new version</strong> there is a new tab for all feeds, grouped by feed. This is how regular feed readers work, a system users understand and are familiar with. I don’t really know why I refused to build this. Perhaps I thought that people would never use it once they understood how great the Feeds way is, but that won’t happen if you never get into the app in the first place.</p>
<p>Feeds has been a hobby project for me for a long time and every year I contemplate abandoning it. Still I use it every day and there are no alternatives, so I scratch that itch and add some minor feature and then fix some other detail. Suddenly a new version is ready. It’s a lovely hobby to have and now it is greater than ever.</p>
]]></description>
			<link>https://aggressive.se/blog/#post_url=feeds-is-alive</link>
			<guid isPermaLink="true">https://aggressive.se/blog/#post_url=feeds-is-alive</guid>
			<pubDate>Tue, 15 Sep 2026 03:28:37 +0200</pubDate>
		</item>
		<item>
			<title><![CDATA[Angel of light]]></title>
			<description><![CDATA[<p>I must confess, I had given up. Not only my work but life in general. I had quit all my clients and abandoned all my apps. Cut out from the world, I barely spoke to the few friends I had left. I was in a very dark place, from where I thought there was no way out. It was only suffering in store for me, until I would eventually die. I had been ground down to gravel and dust. There was no dreams left, no hope only darkness. </p>
<p>For how long could I hold on?</p>
<p>But life is wonderful, and it had a surprise for me. That no matter how long it’s gone, how wrong you’ve been, how many mistakes you’ve made - it is never too late to turn around. To start fighting for yourself, and for your life. I feel almost religious when I think about the enormous difference it is now from then. She came to me like an angel lighting up the world and showing me home. She made me see I have a worth. Reminding me of what is meaningful in life. She taught me what true love is. It is nothing like they tell you. It is worth all the struggles.</p>
<p>Now there are possibilities instead of obstacles. Life truly is wonderful when you find it. It took 43 years for me to realise what life could be, and since I never gave up I was rewarded with more I could imagine even in my wildest dreams. Perhaps that was the reason I didn’t fight hard enough, since I didn’t think this was possible. If my younger self could read this, or if you are struggling in a similar way: Don’t accept a bad situation, life can turn around in a second. Only surround yourself with people who care about you, find new ones or focus on the good ones. Just leave the others behind, don’t spend time thinking about them or try to get them to ask for forgiveness or do whatever it is that you want them to do. Focus on yourself instead and walk your own path. But most of all, never give up. It will all be worth it, in the end. True love will find you in the end and you will know just who’s your friend. Everything else will sort itself out.</p>
<p>Now we have been married for 2 years, it has been a dream come true. Whatever happens now, I will die a happy man.</p>
]]></description>
			<link>https://aggressive.se/blog/#post_url=angel-of-light</link>
			<guid isPermaLink="true">https://aggressive.se/blog/#post_url=angel-of-light</guid>
			<pubDate>Tue, 24 Feb 2026 03:02:24 +0100</pubDate>
		</item>
		<item>
			<title><![CDATA[[Feeds 3.2.1](https://feeds-app.com/)]]></title>
			<description><![CDATA[<p>A lot have happened to the greatest Feed reader of all time, but I have been a bit shy about it. I have basically not told anyone, and that is not great marketing.</p>
<p>This latest release is just a patch-version fixing a bug where your Settings could not be saved. A tremendous blunder on mu part, but to my defence it only happens in certain conditions, which avoided my testing. Thankfully a dedicated power user alerted me of the error and I could fix the bug the same evening.</p>
<p>Before this update Feeds has gotten plenty of new shining features:</p>
<ol>
<li><p>iPad support is back! And now with windows in iPadOS 26, things are really great.</p>
</li>
<li><p>Smarter, faster and more efficient download manager, that keeps all your feeds streaming into the app at lightning speeds. Did you ever wonder how Feeds can download so many articles from all your sources so fast? And not do any of them twice? It is not a miracle but a sweet and lock-free coding comfort called structural concurrency. I will not bore you with any more details!</p>
</li>
<li><p>A completely new parser, that is more capable and stable, allowing for brand new ideas of development in the future, and since it is much easier to work with (simpler algorithms), errors and bugs are easier and faster to squash.</p>
</li>
<li><p>Improvements how SwiftUI is used, eliminating unnecessary redraws making scrolling smoother and everything overall faster and more delightful. There are still more optimisations coming in the future, all is not done yet!</p>
</li>
<li><p>A whole new database engine which is a delight to work with. I will post endlessly about this one.</p>
</li>
<li><p>Tons of minor fixes and improvements that is too much to talk about.</p>
</li>
</ol>
<p>The app is over 10 years old so it had a lot of legacy that needed taking care of, and now that is done. It took me a while, but the new foundation will stand for another 10 years. The mission now is to spread the word to get users up to a decent level. Would you like to see more new features? Tell your friends about <a href="https://feeds-app.com">Feeds</a>!</p>
<p>Are you still not blessed with the wonders of having an app that turns the web into feeds? Take a look at <a href="https://feeds-app.com/s/b4999aa01f8a46018c984242a58a52c1">this article from Nature about how neurons form in the brain</a>. If you are reading this on an iOS device, Feeds can download automatically for you. No need to go to the appstore, just start reading! If you like it, you can just keep it and let Feeds fetch new articles as they come off the prints!</p>
]]></description>
			<link>https://aggressive.se/blog/#post_url=-feedshttpsfeeds-appcom-321</link>
			<guid isPermaLink="true">https://aggressive.se/blog/#post_url=-feedshttpsfeeds-appcom-321</guid>
			<pubDate>Fri, 07 Nov 2025 12:16:45 +0100</pubDate>
		</item>
		<item>
			<title><![CDATA[Death by appstore review]]></title>
			<description><![CDATA[<p>I made the grave mistake of building a new app. It is a simple, laser focused, reminder-app called “Gentle Reminders”. Purpose-built for people with <a href="https://en.wikipedia.org/wiki/Pathological_demand_avoidance">Pathological demand avoidance</a>, or that just don’t like alarms going off all the time. Apple disagrees, there are too many reminder-apps already and they won’t allow another one exist. I guess I just have to publish in a competing appstore?</p>
<p>You can try a beta version here: <a href="https://testflight.apple.com/join/VJVXg8Xt">Testflight link is here</a></p>
<p>But they are in a way correct. Here is the full story:</p>
<p>The app has a growing time line of due-dates, putting the widget on your home screen allows you to avoid the need for alarm/notifications. When switching apps it will be clearly visible what you have coming up or if you have forgotten something.</p>
<p>While waiting many years for someone to build it, I finally gave in and just build it myself. It is such a simple idea, with one clear and obvious goal that I really thought someone else should have built this already. But I found nothing, and since I needed it - I had to build it.</p>
<p>Now there are two questions we need to consider at the same time:</p>
<ol>
<li><p>Is <strong>Gentle Reminders</strong> a duplicate or too similar to other reminder-apps? Then is it really wrong to reject it?</p>
</li>
<li><p>Even if <strong>Gentle Reminders</strong> is too similar to other apps, should appstore review-team decide if it is allowed to exist, or should the market decide?</p>
</li>
</ol>
<p>They are not entirely wrong, there are hundreds of reminder and todo apps out there, and if I was reviewing all of them I would also be hard pressed to see the difference. Especially when you don’t care about this specific issue you don’t have yourself. That’s why appstore review is such a terrible idea. By the very nature of being humans, they can never make the right choice. Apps that spam the store or hide their true functionality will get pass a human reviewer, but when rejecting based on opinion you just won’t have the full picture and will not be able to know if that opinion is valid. Only automatic detection should be present, and those have at least a chance to detect nefarious behavior.</p>
<p>The bottom line is that if I want to publish something that Apple see no value in, no matter how pointless or meaningless it might seem to them - I should be able to do it. If they don’t want it in their store, allow direct downloads from the web then, problem solved!</p>
<p>Let me hammer in the message for those of you uncertain: Building an app, running a business and doing all the other things needed for this to be possible is a mere side-quest. Fighting the app-store is the big challenge, and that fight never ends. Every update is a risk of capsizing your entire business. This particular app will of course not matter to me personally, it didn’t take many hours to make and I can still use it for myself (I’ve spent more time writing this and fighting app-review than coding). But what about my next idea? Or your idea?</p>
<p>They call the app “spam”, claiming that I somehow have downloaded the code from GitHub and just re-uploaded it with a new icon. 🤦🏻‍♂️ Offensive of course, they try to provoke me into leaving the App Store and go over to Android instead. Similar to many other developers just getting too tired of Apple’s attitude, we just want to create great things and see them try their wings, while Apple try to prevent us. Will they succeed?</p>
<p>Anyway you can see for yourself, try out the beta**:** <a href="https://testflight.apple.com/join/VJVXg8Xt"><strong>Testflight link is here</strong></a></p>
]]></description>
			<link>https://aggressive.se/blog/#post_url=death-by-appstore-review</link>
			<guid isPermaLink="true">https://aggressive.se/blog/#post_url=death-by-appstore-review</guid>
			<pubDate>Sun, 25 May 2025 05:12:19 +0200</pubDate>
		</item>
		<item>
			<title><![CDATA[A voice to the voiceless]]></title>
			<description><![CDATA[<p>There was a time when new todo-apps was launched on a regular basis. And there are many, countless, apps and websites that give you a todo-list of varying fashion. Perhaps the most popular is <em><strong>Jira,</strong></em> a collaborative list with tickets that can be assigned to GitHub pull-requests and grouped by sprints (among many other things).</p>
<p>Horribly slow and bad UI per big-corporate-standards, of course. We use it in my daylight-job, and I brought up the idea of switching - and everyone seemed to hate the idea. ”This is the best there is”, ”There is nothing like it” was a two of the comments I got.</p>
<p>Should I build a collaborative todo-app for companies that don’t suck? No, but someone should, and it seems easy since the bar is so low. But how should anyone convince the world of their product, trusting it enough to switch from something known?</p>
<p>This is the main pain-point for me at the moment, and sadly it affects all my apps and creative endeavours. I am suffocated and cannot be heard. It feels pointless to try anything since I’m voiceless. It does not matter how great anything is, since it will never be seen by anyone and never heard by anyone. I can scream into the void like this but it will never amount to anything.</p>
<p>I want to have a voice, and I want even the maker of todo-apps to have a voice. I want great ideas to be heard and shared.</p>
]]></description>
			<link>https://aggressive.se/blog/#post_url=a-voice-to-the-voiceless</link>
			<guid isPermaLink="true">https://aggressive.se/blog/#post_url=a-voice-to-the-voiceless</guid>
			<pubDate>Thu, 20 Feb 2025 21:24:15 +0100</pubDate>
		</item>
		<item>
			<title><![CDATA[Conditionally compile code for extensions in Swift]]></title>
			<description><![CDATA[<p>I have googled this so many times, now I just have to write it down!</p>
<p>When building a framework with functions you can’t use in an App Extension, like a ShareExtension or WidgetExtension. Wrap that function or class in an <strong>@available</strong> like this:</p>
<pre class="ql-syntax" spellcheck="false"><code>
@available(iOSApplicationExtension, unavailable)
func notInExtensions() 
{
    if UIApplication.shared.delegate == nil 
    {
        print("No delegate")
    }
}
</code></pre>
<p>Then create a custom Swift compiler flag “APP_EXTENSION” for each extension, and use it like so:</p>
<pre class="ql-syntax" spellcheck="false"><code>
if APP_EXTENSION
    // do whatever else the extension should
else
    notInExtensions()
endif
</code></pre>
<p>Nothing more to it!</p>
]]></description>
			<link>https://aggressive.se/blog/#post_url=conditionally-compile-code-for-extensions-in-swift</link>
			<guid isPermaLink="true">https://aggressive.se/blog/#post_url=conditionally-compile-code-for-extensions-in-swift</guid>
			<pubDate>Thu, 06 Jun 2024 00:42:25 +0200</pubDate>
		</item>
		<item>
			<title><![CDATA[Programming with babies]]></title>
			<description><![CDATA[<p>This is an old post I wrote many years ago, when my second child was still a baby. I don’t know why I never posted it, but probably due to the stress-levels were through the roof. Having babies and running your own business is hard. Having babies and a regular stable conflict-free job is hard enough. Make sure to take the time to saviour those precious moments, this is what life is about. Anyway, here is the original post:</p>
<p>Programming takes a lot of your brain-activity. You build up these virtual worlds and let them run inside your mind. This is quite natural to all humans, think of a story - <a href="https://en.wikipedia.org/wiki/Hansel_and_Gretel">Hansel and Gretel</a>, now you have just done that.</p>
<p>The tricky part is to read that story out load while at the same time doing other tasks. E.g. reading this post while telling that story. Seemingly easy at first glance, but actually almost impossible. None of those tasks are particularly hard - they are just hard to do at the same time. You will end up pausing one task to do the other, and then switching back and forth as quickly as you can - stuttering and humming as if you have a difficult time remembering the story.</p>
<p>This is the best I can explain it, trying to debug code while putting a child to sleep. None of the tasks will be enjoyable nor done properly and the stress levels just rises. So do one thing first, then the other. Don’t fret about work, even if those children depend upon it. Being healthy and alive is worth more to them.</p>
]]></description>
			<link>https://aggressive.se/blog/#post_url=programming-with-babies</link>
			<guid isPermaLink="true">https://aggressive.se/blog/#post_url=programming-with-babies</guid>
			<pubDate>Wed, 01 May 2024 15:25:12 +0200</pubDate>
		</item>
		<item>
			<title><![CDATA[Xcode and frameworks, getting started and mixing Swift with Obj-C!]]></title>
			<description><![CDATA[<p>Frameworks is a must these days when developing iOS apps. Compile speeds are usually several times faster depending on code structure. The pitfalls are many, so where do you start? This is what I did to cut build times in half for my app <a href="https://feeds-app.com">Feeds</a>:</p>
<ol>
<li><p>Start by creating <strong>two</strong> frameworks, one as a separate project for code you share with other apps (which code can be compiled independently), the second as an additional target for files you won’t share. The Swift checkbox should be checked if you will ever use Swift, now or in the future.</p>
</li>
<li><p>Make sure the checkbox for <strong>App Extension</strong> is checked.</p>
</li>
<li><p>Note that Objective-C can/should only use Swift in their .m files. If you try to import Swift classes from frameworks into a .h file you will spend several hours regretting that decision. Import an intermediate protocol or similar instead.</p>
</li>
<li><p>To use Obj-C files <strong>FROM</strong> Swift, you need to make their .h files public (in the file info sidebar), then expose them in the frameworks <strong>umbrella header.</strong></p>
</li>
<li><p>Now starts the <em>fun task</em> (sarcasm) of splitting your app into these three sections, stuff that is imported by the appDelegate or uses UIApplication remains in the app, everything else goes into these two frameworks depending on usage.</p>
</li>
</ol>
<p>Now you are done with stage one. Not much “architecturing” at this point. But you have already gained two great things:</p>
<ol>
<li><p><strong>Speed when having App Extensions</strong> is multiplied. Just having extensions causes everything to recompile once for every extension - in addition to the slow compile times of Swift!</p>
</li>
<li><p><strong>Testing is now instant!</strong> Frameworks can be tested without launching the app, so tests you have moved or will write are going to be lightning fast! If you need the bundle or the app, you will need to rewrite some, but it’s still doable (more on that in a future post).</p>
</li>
</ol>
<p><strong>Stage two</strong>, splitting what’s left of the app. Since backgroundTasks make use of the UIApplication, all long running tasks are probably left in the app. Separating these tasks can be tedious but there is a shortcut! NSProcessInfo can also disable termination, but it has no callback. So you better make sure you only need those few seconds you get. Otherwise you will simply need to leave the classes in the app, splitting them into two classes is quite pointless. If you are using Objc, you can trick the compiler into importing UIApplication only when it exists. Like so:</p>
<pre class="ql-syntax" spellcheck="false">
static Class uiApplication = NSClassFromString(@"UIApplication");
[[uiApplication sharedApplication] anyFunction];
</pre>
<p><strong>Stage three,</strong> splitting the frameworks into smaller frameworks. Having lots of Swift really takes a toll out of your patience when compiling, especially with SwiftUI and switching between testing/running - three tasks that keeps rebuilding your code. Here you can go many routes, but what I’ve done in <a href="https://feeds-app.com">Feeds</a> is to layer everything, larger UI-classes and Controllers on top, data-objects/models below, and on the bottom there are standalone UI components, utilities and frameworks shared with other projects. The important take-away is that the framework above can use those below but never the other way around (since we don’t want circular dependencies). In addition it forces a strict separation of UI from data, which should not affect anything as it should always be separated. With this setup it is also easy to split up UI-frameworks when compile times for those grow too large.</p>
<p>In my experience it seems that SwiftUI and Combine benefits heavily from small structs, compile times <em>seems</em> to improve massively when split into smaller pieces even inside the same framework. So if Swift compile times is your main problem that should be the first order of business. I have not measured it but I will eat all my hats if I’m wrong.</p>
<h3>Side notes</h3>
<p>Swift in frameworks tend to become public all over, if you have a tight relationship between two classes/structs in separate frameworks at least one will need to become public. This degrades compile times since Xcode now needs to make sure the code is sharable (probably due to ABI-stability). This makes it important that classes that uses each other stays in the same framework. Also it makes it clear that frameworks is not a silver-bullet that solves all your problems, it can even make things worse. Secondly dynamic frameworks slows down your app’s startup, so you should be sure that it is necessary when creating new ones. You could use static frameworks instead, but these take longer to compile. One could imagine a situation where you switch between static and dynamic before building for the App Store, but since this is not done automatically and since Apple recommends dynamic frameworks I assume there are more to the picture than just compile and startup times.</p>
<p>If you know the answer to that riddle, or have a hunch - you are more than welcome to send me a suggestion: <a href="https://twitter.com/olof_t">@olof_t</a></p>
]]></description>
			<link>https://aggressive.se/blog/#post_url=xcode-and-frameworks-getting-started-and-mixing-swift-and-obj-c</link>
			<guid isPermaLink="true">https://aggressive.se/blog/#post_url=xcode-and-frameworks-getting-started-and-mixing-swift-and-obj-c</guid>
			<pubDate>Wed, 13 Jan 2021 15:19:00 +0100</pubDate>
		</item>
		<item>
			<title><![CDATA[The best RSS/news reader 2021]]></title>
			<description><![CDATA[<p>I’ve built the best RSS reader, <a href="https://feeds-app.com">Feeds</a>, and here is why!</p>
<ol>
<li><p>First of all it can <strong>create a feed from any feed-like webpage</strong>, it doesn’t matter if RSS is supported or not. This is more useful than you think since some sources strip their articles, sometimes only the header remains, and sometimes only certain articles are part of the rss-feed.</p>
</li>
<li><p><strong>AI-sorting:</strong> Information overload strikes you quite soon after adding ten (or so) feeds. Other apps try to solve this by forcing users to categorize every feed to make users sort items manually. Quickly your leisure time becomes filled with needless chores. Instead Feeds sorts articles by your preference, things you really like first, and then things you usually read. Last comes what you probably don’t like (according to the AI). It is automatically trained, all you have to do is read normally and it will learn by itself!</p>
</li>
<li><p><strong>No chores to perform!</strong> Everything in the Feeds-app is built around leveraging computer power to automate tasks. Humans should never have to do work unless strictly necessary. That’s why Feeds has no folders to manage, no categories to juggle and no read/unread markers. Everything is laid out in an overview, one tap to read and the rest follows below naturally. If you want to read an old article it stays in the “old” section for a few days (or just search for it) - but if you don’t care for the article it will automatically disappear. Nothing needs to be done!</p>
</li>
<li><p><strong>Full RSS article downloads</strong>, when you prefer the curated RSS-feed, but want the full content and not just the excerpt. Feeds got you covered!</p>
</li>
<li><p><strong>Everything inline and new content below.</strong> Articles expand inline to eliminate the need for side-scrolling/swiping, and new articles always follow below! One can just continue reading!</p>
</li>
<li><p><strong>Super fast full text search.</strong> It has happened to me a million times, a discussion comes up and you know you read about it but don’t remember when or where - just type a few words that you do remember and violá - there it is!</p>
</li>
<li><p><strong>Mute topics</strong> you don’t like. Phrases that comes up on a regular basis that you don’t ever want to see, not even last - <strong>mute it</strong>. It will still exist in the feed if you change your mind, just one extra tap away. <strong>Regex phrases</strong> are also supported!</p>
</li>
</ol>
<p>If you haven’t yet tried it, now is a good time to <a href="https://feeds-app.com">download Feeds</a> and take it for a spin!</p>
]]></description>
			<link>https://aggressive.se/blog/#post_url=the-best-RSS-news-reader-2021</link>
			<guid isPermaLink="true">https://aggressive.se/blog/#post_url=the-best-RSS-news-reader-2021</guid>
			<pubDate>Sun, 20 Dec 2020 21:06:47 +0100</pubDate>
		</item>
	</channel>
</rss>
