paiseh apps.paiseh.sg
← All apps

ACDC SG

Live EV charger availability

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)
What it does
Live availability Charger status from LTA DataMall, cached for five minutes to match the upstream refresh cadence — there is no point asking faster.
Search the local way Name match first, then OneMap geocoding, then nearest. Typing “Tampines” filters what's on screen before it touches the network.
Fails honestly A missing Maps key renders blank tiles; a missing DataMall key says so plainly. Neither degrades into a silently empty screen.

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.