OCPP Proxy / Splitter
Route your charger's OCPP traffic to multiple backends simultaneously. Keep your original CSMS and connect to Joulo — or any other platform.
// Architecture
One proxy, multiple backends
The proxy sits between your charger and the backend(s). Your primary CSMS retains full control — including sending commands back. Secondary backends receive a read-only copy of all messages.
Charger → CSMS
Messages are forwarded to the primary CSMS and mirrored to all secondary backends.
CSMS → Charger
Only the primary CSMS can send commands back to the charger. Responses from secondary backends are ignored.
// Features
Everything you need
Split & Mirror
One incoming connection, multiple backends. Primary CSMS has full control, secondaries receive read-only copies.
Auth forwarding
HTTP Basic Auth credentials are automatically forwarded to all upstream backends.
Sub-protocol negotiation
Automatic negotiation of OCPP 1.6, 2.0 and 2.0.1 sub-protocols.
Docker-ready
Pre-built images on GitHub Container Registry. One command to start.
Lightweight
TypeScript/Node.js, minimal footprint. Runs as non-root user in Docker.
Structured logging
JSON logs to stdout/stderr. Set LOG_LEVEL=debug to see individual OCPP messages.
// Quick Start
Up and running in 3 steps
Docker (recommended)
docker run -d \ -p 9000:9000 \ -e PRIMARY_CSMS_URL=wss://your-primary-csms.example.com/ocpp \ -e SECONDARY_CSMS_URLS=wss://analytics.example.com/ocpp \ ghcr.io/joulo-nl/joulo-ocpp-proxy:main
Docker Compose
git clone https://github.com/joulo-nl/joulo-ocpp-proxy.git cd joulo-ocpp-proxy cp .env.example .env # Edit .env with your CSMS URLs docker compose up -d
From source
git clone https://github.com/joulo-nl/joulo-ocpp-proxy.git cd joulo-ocpp-proxy npm install npm run build PRIMARY_CSMS_URL=wss://your-csms.example.com/ocpp npm start
// Configuration
Environment variables
| Variable | Required | Default | Description |
|---|---|---|---|
| PORT | No | 9000 | Port the proxy listens on |
| PRIMARY_CSMS_URL | Yes | — | WebSocket URL of your primary CSMS |
| SECONDARY_CSMS_URLS | No | — | Comma-separated list of secondary CSMS URLs |
| LOG_LEVEL | No | info | debug, info, warn, or error |
// Charger setup
Point your charger to the proxy
Change the OCPP backend URL in your charger's settings:
wss://your-csms.example.com/ocpp/CHARGER-001ws://proxy-host:9000/CHARGER-001The proxy appends the charge point ID from the incoming URL to each upstream CSMS URL automatically.
// Use cases
When would you use this?
Multi-backend monitoring
Run your chargers against your primary platform while mirroring data to your own analytics or energy management system.
Platform migration
Mirror traffic to the new platform and verify it processes messages correctly before switching over.
Development & debugging
Mirror production charger traffic to a local development CSMS for testing without affecting the live system.
Compliance & auditing
Send a copy of all OCPP messages to an audit system for regulatory compliance.
Related pages
Joulo for developers
Overview of all tools, APIs and integrations.
OCPP connection
Connect any OCPP 1.6J charger to Joulo.
REST API
API documentation, endpoints and Home Assistant.
Platform status
Realtime status of all Joulo services.
developer.joulo.nl
Developer portal with extended documentation.
status.joulo.nl
Realtime status of all Joulo services.
Ready to get started?
Create a free account and connect your charger. Find your API token directly in the dashboard.

