Open Source
    MIT License
    TypeScript

    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 (OCPP)
    🔀 Joulo OCPP Proxy
    Primary CSMS
    full control
    Secondary CSMS
    read-only mirror
    CSMS N…
    read-only mirror

    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

    VariableRequiredDefaultDescription
    PORTNo9000Port the proxy listens on
    PRIMARY_CSMS_URL
    Yes
    WebSocket URL of your primary CSMS
    SECONDARY_CSMS_URLSNoComma-separated list of secondary CSMS URLs
    LOG_LEVELNoinfodebug, info, warn, or error

    // Charger setup

    Point your charger to the proxy

    Change the OCPP backend URL in your charger's settings:

    Before:wss://your-csms.example.com/ocpp/CHARGER-001
    After:ws://proxy-host:9000/CHARGER-001

    The 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.

    Ready to get started?

    Create a free account and connect your charger. Find your API token directly in the dashboard.