Mobile App Development
I build Android and iOS applications — with a particular focus on the awkward ones: apps that talk to Bluetooth hardware, read sensors in the background, run positioning maths on-device, and keep working when the network does not. A single cross-platform codebase where that makes sense, native modules where it does not.
The SemBeacon app below is the reference: a published Play Store application that scans BLE beacons, resolves linked data over the network, renders indoor maps, and signs users in to their own Solid pod.
What I do
Cross-platform apps
One TypeScript codebase targeting Android and iOS, with native plugins written only where the platform genuinely differs.
- Capacitor and Cordova, with Ionic and Vue for the UI
- Custom native plugins when no suitable one exists
- Progressive web apps where an install is not warranted
- Play Store and App Store release pipelines and signing
Bluetooth & hardware
The part that usually goes wrong. Background scanning, permission flows and battery behaviour differ sharply between the two platforms.
- BLE scanning, advertising and GATT connections
- iBeacon, Eddystone, AltBeacon and SemBeacon
- Foreground services and background execution limits
- Integration with ESP32 and other embedded devices
Sensors & positioning
Turning raw device sensors into something useful, on-device, without shipping a trace of the user's movement to a server.
- Accelerometer, gyroscope, magnetometer and step detection
- On-device indoor positioning with OpenHPS
- Indoor and outdoor map rendering with OpenLayers
- Offline-first data handling and sync
Privacy-respecting design
Apps that ask for the permissions they need and no more — increasingly a store requirement as much as an ethical one.
- On-device processing instead of server round-trips
- Solid pod login, so the user keeps their own data
- Clear permission rationales and store privacy declarations
- GDPR-aligned data flows documented up front
Case study: the SemBeacon app

SemBeacon is a semantic BLE beacon specification I designed in 2023. The companion app is its reference implementation, and a fair demonstration of what this kind of application involves in practice. It scans for iBeacon, AltBeacon, Eddystone and SemBeacon advertisements, fetches the linked data each SemBeacon points at, and uses that to draw the building the user is standing in — without any beacon database of its own.
On Android it can also simulate every supported beacon type, which turns a phone into a portable test rig for designing a deployment. It is built with Capacitor, Ionic and Vue 3, with OpenHPS modules handling the RF processing, RDF serialisation and Solid storage.
Google Play Documentation Source





OpenHPS on mobile
Positioning logic does not have to live on a server. Because OpenHPS ships as ESM, CJS and UMD, the same processing graph runs inside the app — so sensor data can be fused into a position on the device and never leave it. These are the mobile bindings:

Fingerprints collected with a React Native app — IPIN 2021

A phone reading and writing its own position to a Solid pod — IPIN 2022

The prototype that became the published app — ACM IoT 2023

Marker-based AR on mobile devices — ESWC 2024