Mobile App Development

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 logo

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

SemBeacon Android app listing detected beacons with their UUID, major and minor values and signal strength
Scanner — detected beacons with identifiers and live signal strength (Android).
SemBeacon Android app showing beacons plotted on an indoor floor plan with a detail popup
Indoor map drawn from the linked data the beacons advertise (Android).
SemBeacon app displaying the raw RDF Turtle description of a beacon and its environment
The underlying RDF — every beacon is inspectable as linked data.
SemBeacon iOS app showing the details of a single beacon including calibrated RSSI and namespace identifier
Beacon details with calibrated RSSI and resolved URIs (iOS).
SemBeacon iOS app showing detected beacons on a building map
The same map on iOS, from a shared codebase.

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:

Floor plan annotated with Wi-Fi fingerprinting coverage collected using a mobile app
Indoor positioning using the OpenHPS framework
Fingerprints collected with a React Native app — IPIN 2021
Mobile application showing position data read from a Solid pod
Decentralised interoperable location data
A phone reading and writing its own position to a Solid pod — IPIN 2022
SemBeacon prototype application showing beacons on an indoor map
SemBeacon
The prototype that became the published app — ACM IoT 2023
Augmented reality content anchored to printed fiducial markers
FidMark
Marker-based AR on mobile devices — ESWC 2024