Skip to content
Jay Arnon Sinahunon.
All work

Mobile · 2025 · Mobile & full-stack developer

JEG Employee & Kiosk Apps

Two React Native apps for JEG Ventures' payroll platform: an employee app that generates signed, 30-second attendance QR codes (even offline) and shows payslips and leave, and a branch kiosk app that scans those codes to record time in, breaks and time out.

Employee app: signed Time In QR code with its 30-second countdown (fictional demo data)

01

Context

Role
Mobile & full-stack developer
Year
2025
Category
Mobile

02

The problem

A multi-branch food-kiosk business needs reliable time records from crews at many small stalls, often with weak mobile data. Paper logs and shared PINs invite buddy punching, and a static QR code can simply be photographed and reused.

03

The approach

An employee app that turns the phone into a signed, short-lived badge: it syncs hourly keys while online, then signs each Time In, break or Time Out code locally, bound to the employee's registered device, with a nonce and a 30-second expiry, and blocks screenshots while it shows. A kiosk app at each branch, set up by a manager for that branch only, scans the codes, confirms instantly and queues scans offline. Both apps feed the JEG payroll platform, which also gives employees their payslips and leave on the same phone.

Architecture

  1. Employee appReact NativeExpoReact Navigationreact-native-qrcode-svg
  2. Kiosk appReact NativeExpoexpo-camera QR scanninghaptics
  3. SecuritySHA-256 signed QRdevice bindingexpo-secure-storescreen-capture block
  4. Offlinehourly key syncAsyncStorageoffline scan queue
  5. BackendJEG payroll platform API (Next.js)PostgreSQL
  6. DeliveryEAS Build (internal distribution)

Highlights

  • Offline attendance QR: the phone syncs hourly signing keys, then builds each code itself as a SHA-256 signature over the payload, so employees can clock in with no signal.
  • Each QR carries the employee, a device key, the action, a random nonce and a 30-second expiry, so a screenshot or a replayed code is useless.
  • Screenshots are blocked while a QR code is on screen (expo-screen-capture), and the session token and device key live in the OS keychain (expo-secure-store).
  • Device binding: an account signs in on one registered phone; a different device is refused until an admin resets the binding, and password reset verifies the bound device.
  • Branch kiosk: only a store manager, HR, CEO or admin can configure a kiosk device, a store manager only for their own branch, and the kiosk then runs on its own scoped token.
  • Scans give instant feedback with haptics and reset for the next person; if the network drops, scans are queued on the device and synced later.
  • Employee self-service: payslips with SSS, PhilHealth and Pag-IBIG breakdowns and a shareable PDF, leave balance, and leave requests with status.
  • Both apps share the JEG payroll platform API, so attendance flows straight into payroll.

04

Results

Apps (employee + branch kiosk)
2
QR code lifetime
30 s
Signing key rotation
Hourly
Attendance actions
4

05

Tech stack

06

Screenshots

  • Employee app: signed Time In QR code with its 30-second countdown (fictional demo data)
    Employee app: signed Time In QR code with its 30-second countdown (fictional demo data)
  • Kiosk app: scan recorded, with the employee and action confirmed (fictional demo data)
    Kiosk app: scan recorded, with the employee and action confirmed (fictional demo data)
  • Employee app: quick actions for time in, breaks and time out, offline-ready (fictional demo data)
    Employee app: quick actions for time in, breaks and time out, offline-ready (fictional demo data)
  • Kiosk app: branch scanner ready for the next employee
    Kiosk app: branch scanner ready for the next employee
  • Employee app: payslips with net, gross and deductions per cut-off (fictional demo data)
    Employee app: payslips with net, gross and deductions per cut-off (fictional demo data)
  • Employee app: leave balance and leave requests (fictional demo data)
    Employee app: leave balance and leave requests (fictional demo data)
  • Kiosk app: manager setup, limited to the manager's own branch (fictional demo data)
    Kiosk app: manager setup, limited to the manager's own branch (fictional demo data)
  • Employee app: sign-in with device binding
    Employee app: sign-in with device binding