February 14, 2024
How I'm optimising development across my apps

As an app developer actively working on multiple projects, I’ve found that it’s necessary to identify areas to improve my efficiency. I’ve spent the first weeks of the year focusing on streamlining my processes and reducing repetitive tasks to better focus my time. One of the outcomes of this effort is AppDecoKit, an internal Swift Package created to optimise development across my suite of apps.


Repetition has consistently hindered me over the past couple of years. A lot of this has come down to duplicating code across projects and then subsequently needing to update that same code multiple times, and it’s impeded me from doing more exciting things such as feature work. With the inevitable growth of my apps and the potential for more projects in the pipeline, addressing these challenges promptly has become imperative.

What is AppDecoKit?

To tackle this inefficiency head-on I created AppDecoKit, a centralised repository housing shared code and new implementations intended for use across all of my projects. This strategic consolidation not only reduces redundancy but also makes boilerplate code that I reuse often available in all of existing and new projects. Moreover, this has enabled me to start sharing larger components, such as monetisation logic and paywall views, with a view to doing the same for other common app components such as the “New Features” screen.

Today, AppDecoKit encompasses three distinct targets, each serving a specific purpose:


This foundational package encompasses a diverse array of utilities, including useful extensions, common SwiftUI views, formatters, and more. While it currently incorporates UI components, I intend to migrate these to a dedicated AppDecoUI target, enhancing code organization and modularity.


Dedicated to all aspects of paywall implementation and monetisation logic, excluding UI elements. This segment houses proprietary models and functionalities, including a bespoke @Environment property facilitating real-time subscription status validation. Notably, AppDecoPaywall operates independently of third-party dependencies, with in-house models driving paywall dynamics - a key part of my aim to ensure that my packages can operate independently of any third party libraries.


Literally what it says on the tin! This target interfaces seamlessly with AppDecoPaywall, leveraging a PaywallMetadata model to dynamically populate information within the paywall interface. I’m considering writing more about my shared paywall approach in a future post, so let me know if that piques your interest!

Streamlining processes

Beyond the code itself, AppDecoKit has its own dedicated Xcode Cloud workflow and strict pull request merge requirements, ensuring every line of code is ready to be used by my apps. On top of running the package’s suite of unit tests, the CI process includes steps to ensure the package can build against every Apple platform I support - iOS, macOS, watchOS, and visionOS - as well as making use of SwiftFormat to standardise coding styles.

Early days

This marks only the initial phase of what I envision as a multifaceted approach to optimising my workflow. By consolidating shared functionalities and streamlining development workflows, AppDecoKit empowers me to focus on what truly matters - creating exceptional apps with distinctive features that resonate with users. This package will continue to expand, and I’m sure it will evolve as I continue my indie app development journey.

Have you already embarked on a similar path, or are you contemplating a similar strategy? Reach out to me over on Mastodon!

Brought to you by PupperPost