Take a look below at my portfolio of apps. Give them a try to see what they're like, and feel free to get in touch with any questions!

Physics Simulations

This app is designed to teach students physics, using interactive and customisable simulations. It was written in SwiftUI, for iPhone and iPad.

The app features several objects the user interacts with, creating unique simulations to learn about the equations of motion. For example, the user may explore the motion of a brick resting on an inclined conveyor belt, which is itself attached to a moving scissor lift. In addition, there are examples of projectile motion, where the user can throw the brick.

The user can scrub through the simulations by dragging on the chart, which is a powerful technique to better understand the equations and graphs.

The brick features a facial expression, which animates using a combination of SpriteKit and SwiftUI.

The app strikes a balance between guiding the user through the simulations and equations, while also providing an area where they can freely explore different motions, and configure their own simulation.

The architecture of the app allows for easily adding and customising different types of simulation objects, and maximises code reuse to simplify adding future units.

Thorough unit tests ensure the app works great, and comprehensive support for VoiceOver enables more users to enjoy it. This includes usage of new APIs in iOS 15 to provide an enhanced user experience for users using VoiceOver.

A framework was created to share common code between this app and the AP Chemistry Simulations app below.

Designs for the app were provided by the client. I was the sole developer and contributed to the physics content. Development work is complete for the app, and it will be released to the App Store once the quiz questions are finalised.

AP Chemistry Reactions

This app is designed to vastly improve how students learn chemistry, and help them prepare for their exams. It features beautiful, interactive simulations, with a thorough quiz after each section.

The app was written almost entirely in SwiftUI, with some usage of UIKIt and SpriteKit.

There are many interesting visualisations, all focused around a common beaker. These include a grid of molecules, a macroscopic view with dynamic colours, bouncing molecules, dissolving solute particles, a growing precipitate, and more. The more advanced molecule simulations make use of SpriteKit.

Outside of the beaker, there are several interactive tools, such as sliders, burners, liquid droppers, and scales. There are also containers which move and drop molecules into the beaker in response to motion.

The app features seamless animations and user interaction, with detailed graphs. These are interactive, and let the user scrub through many of the reactions. One of the many strengths of SwiftUI is how it automatically keeps the UI in sync while the user changes the time of the reaction, enabling a wonderful user experience.

The app is split into different units, which correspond to the AP Chemistry syllabus. The app is architected using a different module for each unit, which helps keep them well encapsulated and easier to work on.

The app uses a tipping model, implemented using both consumable and non-consumable in-app purchases. Support for VoiceOver has been meticulously added throughout the app, including all equations and graphs.

Comprehensive unit tests have been added, ensuring the app always works great.

The client provided the app designs, and I was the sole developer. It is available for both iOS and iPad.


AnyLog is a flexible logging application made using the Flutter UI toolkit. Users can create custom spreadsheets to keep track of whatever they want.

One of the challenges of designing this kind of app is keeping the UI simple, while still exposing many configuration choices. AnyLog manages to strike this balance with an intuitive interface, which keeps configuration out of the way until a user needs it.

Storing such flexible data also requires robust and careful design of both the underlying database and the codebase itself.

AnyLog has excellent support for screen readers, including the charts tab, where the user can select a data point to hear its value read out with a screen reader.

The data in the screenshots is generated with code that lives alongside the automated tests. All screenshots in the App Store are generated with code to ensure they are consistent between devices, while also making it much faster to make changes than if the data was added manually each time!

AnyLog is currently being rewritten using SwiftUI and CoreData.

Wave Writer

The idea behind Wave Writer was to create a high quality, immersive writing experience. Inspired by voice recording apps that show how sound waves respond to the user’s voice, WaveWriter brings this idea to typing.

A wave at the top of the screen responds as the user types. The animation properties even change as the user types faster or slower, and the wave slowly comes back to the starting position when the user is finished typing.

The underlying code behind the animations is complex, while still performing very well and remaining totally responsive as the user types.

Complimenting the animation, there are several well-designed themes the user can choose from, for both light mode and dark mode.

WaveWriter was made using Swift and SwiftUI.

Zero Below Zero

This puzzle game was made natively for iOS, using Swift and SwiftUI. So even though it’s a game, it uses the same technology as other iOS apps.

The game features playful animations and a carefully designed colour scheme. The graphics use a mix of 3rd party images as well as my own designs.

While the game is simple to play, there is a complex algorithm behind the scenes to figure out the minimum number of moves each level can be completed in.

A simple approach to just try every combination of moves is far too inefficient to be practical. For example, a simple level with just 4 circles has over 1 billion ways to perform 15 moves!

Only after designing a well optimised and efficient algorithm was it possible to create complex and interesting levels.

Ready to get started?

Get in touch today to start making your app a reality.