Android · iOS · Wear OS
I build small native apps, and ship them.
Seven apps across three platforms, written in Kotlin, Java and Swift. Two of them exist twice — Promises in Java on Android and SwiftUI on iOS, Unit Converter in Kotlin and SwiftUI — built natively for each rather than wrapped in a shared shell.
- Apps shipped
- 7
- Platforms
- 3
- Languages
- 3
Selected work
Select any app to read how it works and see its screens. Every repository is public, and the three that have shipped link straight to their store listing.
-
stop-scroll Android · Kotlin
Stop Scroll
Measures the time you actually spend scrolling a feed, rather than the time the app sits open in front of you.
- Separates active scrolling from idle time through an
AccessibilityService - Different idle rules for list feeds (Reddit, YouTube) and full-screen video (TikTok, Reels, Shorts)
- Week-over-week and month-over-month comparisons, with honest clipping of partial periods
- Charts drawn directly on
Canvas— no charting dependency
Kotlin · Jetpack Compose · Material 3 · Room
- Separates active scrolling from idle time through an
-
converter-app Android · Kotlin
Unit Converter
Twenty categories of everyday conversion. Currently at v1.2.0, with the store listing and release notes kept in the repository alongside the code.
- Length, mass, temperature, area, volume, speed, fuel economy, EV efficiency, pressure, power, pay, shoe and shirt sizing
- Search matches unit names and symbols —
psi,mpg,knot - Long-press a row to copy it; the last value in each category is remembered
- Conversion tables covered by unit tests
Kotlin · Material 3 · JUnit
Google Play -
converter-ios iOS · Swift
Unit Converter for iOS
Twenty-one categories on iPhone and iPad, rebuilt in SwiftUI — and taken further than the Android build in a few places.
- Pin a category, or a single conversion like
Foot → Centimeter, to the top - Value fields read arithmetic —
12*3,1½,5'11" - A Clock whose units are cities, converted on any date so daylight saving holds
- Nine Swift Testing suites over the calculator, clock, locale parsing and pins
Swift · SwiftUI · Observation · Swift Testing
- Pin a category, or a single conversion like
-
Bible_Promises_App Android · Java
Promises
A daily verse app carrying two public-domain translations, English and Malayalam.
- Promise of the Day, browsing by topic, favourites and sharing
- A daily notification at a time you pick, rescheduled across reboots
- World English Bible and Malayalam സത്യവേദപുസ്തകം, both public domain
- Light, dark and system themes, with a built-in feedback screen
Java · Android Views · AlarmManager
Google Play -
promises_ios iOS · Swift
Promises for iOS
The same app rebuilt natively in SwiftUI — a second implementation, not a port of the first.
- Today's verse set over photography; swiping moves through the collection and changes the image
- Serif, sans-serif or monospaced type at a size you set, with Dynamic Type honoured throughout
- Favourites and notification scheduling via
@AppStorageand observable stores - Shares its translation set with the Android build
Swift · SwiftUI · UserNotifications
App Store -
airport-terminal-app Android · Kotlin
Airport Terminal
Terminal and concourse layouts for 119 airports, from Atlanta's Plane Train concourses outward.
- 119 airports with terminals, concourses and gate ranges in bundled JSON
- An interactive terminal map drawn on a custom
View - Links out to each airport's official map for the detail it can't carry
Kotlin · Custom Canvas views · Local JSON
-
simple-data-face Wear OS
Simple Data Face
A Wear OS watch face built on the declarative Watch Face Format, so the system renders it and the battery barely notices.
- Seven complication slots, corner to corner
- Editor options for time colour, complication colour and ring colour
- An optional activity ring, and a toggle for complications in always-on
Watch Face Format · Wear OS
Nothing matches that filter. Choose another to see the rest.
Notes on the work
Three things the repositories show, if you'd rather not read them.
-
Two apps, each written twice
Promises runs on Android in Java and on iOS in SwiftUI; Unit Converter runs on Android in Kotlin and on iOS in SwiftUI. Four apps, two ideas — each pair sharing its content and its conversion tables, and nothing else. The iOS builds use
@AppStorage, observable stores and Dynamic Type rather than reproducing the Android structure in Swift. -
Drawing rather than depending
Stop Scroll's charts and Airport Terminal's maps are drawn on
Canvasin custom views. Both could have pulled in a library; drawing them directly kept the binaries small and left nothing to chase when the OS moves. -
Finished to the store, not the build
Unit Converter is at v1.2.0 with its Play Store listing and per-version release notes versioned next to the code, conversion tables under unit tests, and a feedback screen wired up in the app itself.
Tools in use
Drawn from what these projects actually import.
Android
- Kotlin
- Java
- Jetpack Compose
- Material 3
- Room
- AccessibilityService
- AlarmManager
- Canvas & custom views
- Gradle
Apple
- Swift
- SwiftUI
- UserNotifications
- AppStorage
- Observation
- Dynamic Type
- Xcode
Wear
- Wear OS
- Watch Face Format
- Complications API
Practice
- JUnit
- Swift Testing
- Instrumented tests
- Light & dark theming
- Play Store releases
- Git
Get in touch
Happy to talk about Android, iOS or Wear work — or about any of the apps above.