All work

Partner product at Mobil80

MyPrezence

In May 2026 I took over MyPrezence, the app employees use to mark attendance by QR code, face or tap scan.

Role
Maintainer, member app (2026)
When
May 2026 – Sep 2026
Status
Live on iOS and Android
Platforms
Android, iOS
Built with
Flutter, GetX, AWS Amplify, AppSync, Cognito, Firebase

What it is

MyPrezence is the employee side of Prezence, an attendance system for organisations with staff spread across several sites or out in the field. Employees mark attendance on their own phones by scanning a QR code at a location, scanning their face, or doing a tap scan, and every scan carries GPS. Admins use a separate app, Prezence Admin, to set up locations, add members and approve leave. The member app also handles leave requests, a monthly attendance calendar, corrections for missed swipes, and forms an organisation can require after a scan.

The app has 5K+ downloads on Google Play and has been on the App Store since 2021. Most of its code was written before I took it over.

What I worked on

I took over the member app in May 2026 at version 4.1.0 and shipped 4.2.0 on both stores in September 2026.

Most of my work for 4.2.0 was on how the app asks for sensitive permissions. Google Play expects an app to explain, inside the app, why it needs data like background location before the system prompt appears. I added a disclosure dialog that shows before the prompts for foreground location, background location, camera, photos and notifications. Pressing back or tapping outside doesn’t count as consent, and a decline is recorded.

Around it I reworked the flows that depend on those permissions:

  • “Allow always” location now explains foreground use first, then background use.
  • The QR scanner starts the camera only after consent, and shows a “permission required” state otherwise.
  • On iOS, the notification prompt no longer fires at launch. It waits until after the first frame, behind its own disclosure.
  • When location is denied, the app no longer re-prompts in a loop.

I also set the Android plugin modules to compile against SDK 36, the same as the app, and changed the “present today” check to look at today’s scans instead of a server field.