ACDC SG
Live EV-charger availability across Singapore on a map, with search, a detail sheet, and hand-off to your maps app for navigation. Native on both platforms.
- Status
- Both platforms implemented
- Platforms
- iOS · Android
- Role
- Design and build
- Source
- PaisehSG/ACDC-sg (private)
Finding a working EV charger in Singapore means knowing which points are actually free right now, not which ones exist. ACDC SG pulls live availability from LTA DataMall and puts it on a map.
Tap a pin for a compact card, pull up the detail sheet for the full picture, search by name or by place, and hand off to whichever maps app you prefer for the actual navigation.
How it’s built
Two native apps sharing a deliberate file-for-file layout — a SwiftUI iOS app, and a Kotlin and Jetpack Compose Android port that mirrors it module for module. Keeping the structures parallel means a fix in one has an obvious home in the other.
The data path is the interesting part:
- A tolerant parser for LTA DataMall’s EVCBatch file, written to survive the format’s inconsistencies rather than assume them away.
- A station mapper that aggregates individual charger points into stations and picks the nearest slice around a point.
- A 5-minute batch cache, matched to DataMall’s own refresh cadence — there is no value in asking more often than the upstream data changes.
- OneMap for geocoding, so Singapore place names resolve the way locals actually type them.
- Favourites and recents in local preferences.
The search pipeline runs name match first, then geocode, then nearest — so typing “Tampines” filters what’s on screen before it ever hits the network.
On Android the app targets SDK 36 with a minimum of Android 8, with API keys kept out of the repository through the secrets Gradle plugin. Missing keys degrade honestly: without a Maps key the map renders blank tiles, and without a DataMall key the app surfaces a clear “key is missing” error rather than an empty screen.
Plain-JVM unit tests cover the parser, models, mapper and view model — the parts that break silently when an upstream file changes shape.