Powerkick — An Installable QR-Code Web App for 800+ EV Stations
Migrated a React Native codebase to the Web, shipped OAuth2, and built a Node.js/GraphQL backend with Redis caching to power an installable QR-code app used across 800+ EV charging stations in South Korea.
Context
Powerkick operates a network of EV charging stations across South Korea. Drivers needed a frictionless way to authenticate, start a charge, and see session state — ideally without having to install a native app. The team had an existing React Native codebase and wanted to extend reach to the web as an installable PWA.
Problem
- Mobile-first, web-second — the original app was React Native and did not deliver a first-class web experience.
- Auth friction — each station interaction needed a secure, low-latency login.
- Query hot paths were slow — repeat GraphQL queries hit the DB every time.
- Deployments were manual — new builds required hands-on work.
Approach
1. React Native → React Web
I migrated the React Native screens to the web, keeping the shared domain logic where feasible and rewriting platform-specific layers. The web app was built as an installable PWA so drivers could add it to the home screen and launch it like a native app.
2. OAuth2 authentication
Shipped OAuth2 with secure token handling and refresh flows. Integrated it into the charging-session initiation path so users could tap-to-scan, authenticate, and start charging in a few seconds.
3. Node.js GraphQL backend + Redis cache
Built a Node.js GraphQL layer in front of the core services. Cached hot GraphQL queries in Redis — station lookups, pricing, and station availability — which dropped p95 latency and took load off downstream systems.
4. MongoDB + AWS + CI/CD
Integrated MongoDB for scalable document storage, deployed static assets behind AWS CloudFront, and wired up GitLab CI/CD for automated builds, test runs, and deployments. Also shipped the build to the Google Play Store for devices that preferred a packaged install.
Impact
- 800+ charging stations served by a single responsive web app.
- Sub-second UX on hot paths thanks to aggressive Redis caching.
- Tap-to-charge in a few seconds via OAuth2 + QR initiation.
- Shipped to the Play Store and the public web from one pipeline.
Takeaways
- A well-scoped PWA removes the app-store tax without sacrificing UX for most mobile flows.
- Caching is the cheapest performance improvement you can buy — pick the right keys and the rest falls into place.
- Owning the whole pipeline (frontend + backend + cache + CI) made each optimization visible end-to-end.