Ranges often have poor or no mobile signal. DeadCenter is built from the ground up to handle this — with a native Android app, a browser PWA, and a local hub/client mesh.
Before heading to the range, open the Android app or PWA and select your match. The full match data — target sets, squads, shooters, and existing scores — is downloaded. On the Android app, data is stored in Room DB. On the PWA, it uses IndexedDB. Alternatively, import the match directly from a hub on the local network without any internet.
Every tap of Hit, Miss, or Shot Not Taken is instantly saved to the device’s local database. Stage times are saved locally too. The app works exactly the same whether you’re online or offline — no loading spinners, no errors.
A background sync runs every 15 seconds. If connected to a hub on the LAN, scores push to the hub. If internet is available, they go directly to the cloud. The hub can also bridge scores from clients to the cloud. Duplicate submissions are harmless — the server uses upsert logic.
Once scores reach the cloud, the TV scoreboard and mobile live page pick them up on their next refresh cycle. Spectators see results appear in real-time as devices sync.
Android App — Room DB
The native Android app uses Room DB for local storage. Scores persist across app restarts. The app supports standalone, hub, client, and cloud modes.
PWA — IndexedDB
The progressive web app stores scores in IndexedDB via Dexie.js. Each score is keyed by (shooterId, targetId) so re-tapping the same target overwrites rather than duplicates.
Dual Sync Paths
Each device shows two sync indicators: hub connectivity (LAN) and cloud connectivity (internet). Scores can flow through either or both paths simultaneously.
Conflict Resolution
Last-write-wins. Each score carries a device_id and recorded_at timestamp. Multiple devices can score different stages simultaneously without conflict.
Set up a local scoring network at the range with zero internet. One tablet runs as the hub, the rest connect as clients.
One Android tablet starts a local server. It displays its IP address on screen. The hub collects scores from all connected clients and can also be used for scoring.
Other tablets enter the hub’s IP address and connect as clients. They import the match from the hub, score their assigned stage or squad, and sync scores back over WiFi.
When the hub has internet (mobile hotspot, venue WiFi), it bridges all collected scores to deadcenter.co.za. Client tablets never need internet directly — the hub handles it.
Client tablets don’t need internet to get the match data. When a client connects to the hub, it can import the full match — stages, targets, squads, shooters, and existing scores — directly from the hub over the local network. This is especially useful at remote ranges with no cell coverage.
A native Android app purpose-built for scoring on tablets in the field. Available on the Google Play Store.
All match data and scores are stored in Room DB on the device. Data persists across app restarts and survives loss of connectivity. No browser cache limitations.
The Android app can run as a hub (hosting a local server) or as a client (connecting to a hub). This enables a full local WiFi mesh for scoring at ranges with no internet.
Background sync runs every 15 seconds. When connectivity is detected — to the hub, to the cloud, or both — all unsynced scores are batched and sent. Dual status indicators show hub and cloud connectivity separately.
Lock the app to a specific stage or squad with a PIN. Prevents accidental navigation. If a Range Officer forgets their PIN, the Match Director can unlock with their credentials.
Don’t have an Android tablet? The progressive web app works on any device with a modern browser and offers the same offline scoring capabilities.
Each match on the scoring app’s match list has a Download button. Tap it while you have connectivity and the full match payload is saved to IndexedDB on your device.
Once downloaded, a green Offline Ready badge appears next to the match. You can see at a glance which matches are cached and ready to score without any network connection.
A background sync runs every 15 seconds. When connectivity is detected, all unsynced scores are batched and sent to the server. A pending counter in the header shows how many items are waiting to sync.
Done with a match? Tap Clear to free up device storage. The match data is removed from the local database but nothing on the server is affected.