← Back to all work

Self-initiated concept · 2025

Real-Time EV Charging for Medellín

A cross-platform app I designed and built to solve a problem I hit every week as an EV owner, then pitched to the utility that runs the chargers.

RoleProduct Designer & Developer (solo)
TypeSelf-initiated · 2025
ScopeDesign + front-end, end to end
StackNext.js, React Native, Turborepo, TypeScript, Leaflet
EPM Carga Verde EV charger app, shown floating in a spatial energy-grid scene
Problem

As an EV owner in Medellín, I'd reach EPM chargers only to find them busy or out of service, with no way to check first. Their own app barely shows status.

What I did

Designed and built a cross-platform app (web + native) with availability per connector, type and power filters, a status map, and a damage-report flow.

Outcome

Pitched it to EPM for free. They loved the design but couldn't adopt external code, so it lives as a working concept, built end to end, solo.

EPM Carga Verde map view: a sidebar list of charging stations with live availability and an interactive status map of the Medellin metro area
  • Availability is the headline: connectors free right now, not the station name
  • Type 2 · 22 kW · wait ETA: the three facts that decide a trip
  • Map mirrors the list state. One color system, never out of sync
  • Filters speak driver: rápida / normal / solo disponibles

Availability first: every station shows how many connectors are free, their type and power, and a live, color-coded status map.

Try the Design / Spec toggle

The chargers exist. Knowing if they work is the hard part.

EPM runs the public EV charging network across the Medellín metro area. As a driver, the recurring problem was never finding a charger on a map; it was arriving to find it occupied, in maintenance, or simply broken, with no way to know in advance.

Their existing app lists stations, but not the thing that actually decides your trip: is a connector free right now, what type and power is it, and is it even working? So I designed the tool I wanted to use.

EPM Carga Verde damage-report flow: a guided form with station selector, seven damage-type categories, a description field with photo upload, and contact details

A guided damage-report flow, the feedback loop EPM's app is missing, so the network's status stays honest.

Designed around the decision, not the database.

Availability-first. Each station leads with how many connectors are free (3/4), the connector type and power (Type 2, 22 kW), and a live status (available, in use with an ETA, in maintenance, or out of service), mirrored on a color-coded map.

Filters that match intent. Filter by city, by charge speed (rápida or normal), and "only available," so the list answers the real question: where can I actually charge right now?

Closing the loop. A structured, seven-category damage-report flow lets drivers flag broken connectors, screens, or payment issues: the missing mechanism that keeps a status map trustworthy.

EPM Carga Verde mobile view: a full-screen status map of charging stations, built mobile-first for drivers on the go

Mobile-first, because you check this from the driver's seat. Same product as a native app and responsive web, from one Turborepo.

Designed it, built it, pitched it.

I built the whole thing end to end: a Turborepo monorepo sharing logic between a Next.js web app and a React Native mobile app, in TypeScript, with the map on Leaflet.

Then I took it to EPM and proposed it for free. The design landed: the brand fit, the handling, the features their app lacked. But as a matter of policy they couldn't adopt code from an external developer, so they didn't open their data or infrastructure to take it further.

Note: EPM doesn't expose a public availability feed, so the live status in the demo is simulated. The product, the UX, and the cross-platform build are real.

2
Platforms from one codebase: native app + responsive web (Turborepo)
7
Damage-report categories, with photo upload and guided steps
0→1
Designed, built, and pitched to the utility, solo

Next case study

Nvidia Supply Chain Intelligence →