KaruniaAndrianSaputra
All projects

Mobile · 2026

Tracking App v2

A role-based operations app for a military battalion — real-time GPS tracking of personnel on a live map, a panic-button emergency alert system, route-based patrol check-ins, and modules for attendance, letter disposition, training, and health records.

Gallery

A closer look

Login

Member home

Commander home & quick actions

Live personnel map

Panic button

Active patrol session

Patrol progress notification

Personnel detail & location

Smart Academy

Overview

What it is, and why it exists

Tracking App v2 is a React Native app I'm building for a battalion's day-to-day operations, going well beyond the original single-purpose location tracker into a full role-based platform for members, commanders, instructors, and medical officers. It covers live personnel tracking on a map, a panic button that broadcasts push alerts through Firebase, GPS + QR + selfie patrol check-ins, roll-call attendance, an incoming-letter disposition workflow, a training/assessment academy, and a health-records module — all against one role-scoped REST API.

My Role

Mobile developer — React Native app covering live GPS tracking, emergency alerting, patrol check-ins, and role-based operational modules, integrated with a REST API and Firebase push notifications.

Problem

The problem

A battalion's day-to-day operations — where personnel are, who's on patrol, letter dispositions, roll-call attendance, training progress, and health records — ran across paper logs and manual check-ins, with no live visibility for commanders and no automated way to raise or broadcast an emergency.

Solution

The solution

I'm building this as one role-scoped React Native app instead of separate tools per function: members get a panic button, live-tracked patrols, roll-call check-in, and a learning academy; commanders get a real-time personnel map, patrol monitoring, and unit-wide reporting; instructors and medical officers get their own scoped views for verification and health records — all backed by a single REST API with Firebase push notifications for anything time-sensitive (emergencies, dispositions, patrol progress).

Key Features

What it does

  • Real-time personnel tracking on a live map, with nearby markers grouped into photo grids that split apart on zoom
  • Panic button with background location tracking and push-notified emergency broadcasts (custom siren channel, deduped per device)
  • Patrol module — route selection, QR + selfie + GPS check-in per checkpoint, with live commander monitoring
  • Roll-call (apel) attendance via manual entry or QR scan, with full recap and search
  • Letter disposition workflow — log incoming letters, route with priority/deadline, follow-ups, and read tracking
  • Smart Academy — role-based learning: timed assessments for members, verification for instructors, unit-wide progress for commanders
  • Personnel, family, vehicle, and equipment catalog with QR member cards and history tabs
  • BMKG weather and earthquake widgets, OTP login, and forced/soft app-update gating

Tech Stack

Built with

Technology choices made to fit the product's real constraints, not novelty.

React NativeGoogle Maps SDKReact Native GeolocationAndroid Foreground ServiceFirebase Cloud MessagingNotifeeTypeScriptRedux ToolkitReact NavigationReact Native Reanimated
Architecture

System architecture

React Native (Android/iOS)
REST API backend
Redux Toolkit + redux-persist
React Navigation (native-stack + bottom-tabs)
Firebase Cloud Messaging + Notifee
Google Maps SDK + Geolocation

Challenges

Challenges & solutions

Keeping live map markers in sync with async photo loads

Personnel markers on the live map occasionally rendered blank even though the photo had loaded, because Android's map-snapshot capture could race a photo finishing its async load, and a bitmap cached wrong on the first attempt was never re-requested afterward. I made the marker bitmap cache re-render on every relevant state change instead of caching on first attempt, so markers stay correct however the photo and the snapshot happen to interleave.

Preventing two members from patrolling the same route at once

The route list needed to show, live, whether a route was already being patrolled by someone else — locked and unclickable — while still letting the officer who owns that session jump straight back into it. Each route from the API carries an is-selectable flag and the id of any session already running on it, so the client locks a route only when it belongs to someone else, and starting a route the caller is already running returns a conflict response the app turns into a 'resume patrol' prompt instead of a silent failure.

Result

Outcome

  • Actively developed over 3.5 weeks (Aug–Sep 2026) across 8 tracked releases (v0.1 → v0.8), each shipped as a versioned release build
  • Ships with four scoped roles — member, commander, instructor, health officer — instead of one-size-fits-all screens
  • Emergency alerts and patrol progress reach the right people over push notification (Firebase + Notifee) instead of radio or phone calls