Work · Elocity Technologies · since Sep 2024

Charging, payments and the plumbing between.

Elocity builds the platform charge point operators use to run chargers, tariffs, customers, payments and roaming. Drivers use white-label apps; operators use a web portal. I own features end to end: design, API and data model, migrations, tests, release, and the client call when something breaks.

The hardest one

Card payments at the charger.

Money moves through a card terminal and a third-party cloud, triggered by charger events, so every step can fail halfway. I'm the single point of contact for it. Try both paths.

POS terminal flow · simulationStatus
Charger reports “Preparing”·
Look up the cached terminal for this connector·
Queue a pre-authorization on the terminal·
Poll every 3 s, for up to 48 s·
Approved: one-time RFID, remote start·
Session runs, stops as cost nears the hold·
Queue the capture, poll until settled·
Leader-pod recovery job checks the terminal·
Poll clock (simulated seconds)
T+00s
Session cost against the hold
Idle. Tap a card to start a simulated session.

Simulation of the real design. The 3 s poll interval, 48 s limit and 15-minute leader-only recovery job are real; time is compressed.

Features I own

Nine features, owned end to end.

V2 Mobile Location API

Distance search in SQL, our own and roaming locations merged, rich filters, live connector status.

FOR → MOBILE APPS

Location autocomplete

LocationIQ, Google or HERE behind one API, reference data cached in Redis for 3 months.

FOR → MOBILE APPS

OCPI 2.2.1 roaming

CPO and eMSP roles over the Open Charge Network, so drivers can charge at partner stations.

FOR → ROAMING PARTNERS

Maya payments

Tokenisation, card holds, capture and over-capture, voids, refunds, webhooks, reconciliation jobs.

FOR → PHILIPPINES, SINGLE POINT OF CONTACT

POS terminal payments

Pre-auth, capture and void through AMP 360 with automated recovery.

FOR → CARD TERMINALS AT CHARGERS, SINGLE POINT OF CONTACT

Guest charging

Stripe backend plus the Next.js 16 frontend: per-connector routes, live session status, invoices.

FOR → DRIVERS WITHOUT THE APP

Activity log framework

Audit events through Kafka and Kafka Connect into OpenSearch.

FOR → ADMINS AND AUDITORS

ElevenLabs voice agent

APIs that explain charging failures to callers, plus the support page UI.

FOR → CUSTOMERS WHO CALL SUPPORT

OTP v6

Five OTP generations folded into one, with Firebase App Check and rate limiting. Every older version retired.

FOR → MOBILE APPS
Migrations I drove

Changing trains while moving.

Most started with a production problem: timeouts, crashes on large tenants, or OTP abuse.

FromTo · why
Direct Postgres→PgBouncer8 services, after timeouts as per-tenant connections grew
Sync push fan-out→Bull queuememory now bounded by a 1,000 batch, not tenant size
OTP v1 to v5→OTP v6one hardened API, older ones retired
ABA PayWay v1→PayWay v3payment API upgrade
cls-rtracer→nestjs-clsrequest context, ahead of OpenTelemetry tracing
Raw OpenSearch→Ports and adaptersdata abstraction layer across 5 services, rolling out
How the services talk

Pick the wire for the job.

NestJS microservices on Oracle Kubernetes across three fault domains, Kafka on AWS MSK over a site-to-site VPN, PostgreSQL behind PgBouncer with row-level security, and OpenSearch.

REST + service JWTswhen the caller needs an answer first, like validating an RFID
Kafka + Avrocharger and session events that several services consume
Kafka Connectsinks into OpenSearch for logs, sessions and audit
WebSocketsOCPP to every charger, one stateful pod per environment
Webhooksfrom payment providers, handled even when they arrive out of order
Bull queuespush delivery with retries instead of lost sends
Leader-elected jobsreconciliation and recovery that never run twice
Istio gatewayJWT request auth and Envoy external authorization
Before Elocity

Earlier stops.

JUN 2022 to MAY 2023 · REMOTE, NETHERLANDS

Full stack blockchain developer, D Frame Foundation

  • Wrote the DFT ERC20 contract and minted 100 million tokens on Polygon mainnet
  • React, Express and MongoDB dashboard with Magic Link sign-in, cutting sign-in time by 50%
  • Built the reward engine and shipped the browser extension to the Chrome Web Store
FEB to MAR 2022

Security research intern, SISTMR Australia

  • Security testing of web apps: vulnerability exploitation and malware analysis
  • Penetration testing and persistence techniques for web applications