English · Deutsch · Español · 한국어 · 简体中文 · 繁體中文
An OCPP 1.6 and 2.1 compliant Charging Station Management System for managing EV charging infrastructure. Handles real-time WebSocket communication with charging stations, OCPI 2.2.1/2.3.0 roaming, ISO 15118 Plug and Charge, a REST API for operators, and two React frontends for operators and drivers.
EVtivity integrates AI across the operator experience. A chatbot assistant answers natural-language questions about stations, sessions, revenue, and operations by calling API endpoints as tools. A support AI assistant drafts replies for customer support cases by gathering full case context. Both support multiple LLM providers (Anthropic, OpenAI, Gemini) with configurable parameters at system and per-user levels, respond in the operator's preferred language, and enforce security guardrails that prevent leaking sensitive data.
graph TB
subgraph Frontends
CSMS[CSMS]
Portal[Driver and Guest Charging Portal]
end
subgraph Backend Services
API[REST API]
OCPP[OCPP Server]
OCPI[OCPI Server]
Worker[Worker]
end
subgraph Data
DB[(PostgreSQL)]
Redis[(Redis)]
end
subgraph External
Stations[Charging Stations]
Partners[OCPI Partners]
end
CSMS -->|REST| API
Portal -->|REST| API
API <-->|pub/sub| Redis
OCPP <-->|pub/sub| Redis
OCPI <-->|pub/sub| Redis
Worker --> DB
Worker --> Redis
API --> DB
OCPP --> DB
OCPI --> DB
Stations -->|OCPP 1.6/2.1| OCPP
Partners <-->|OCPI 2.2.1/2.3.0| OCPI
| Feature | Description |
|---|---|
| Protocol Support | OCPP 1.6 and 2.1 with simultaneous multi-version operation |
| Security Profiles | SP0 through SP3, including mTLS client certificate authentication |
| Remote Control | Start/stop sessions, reset, unlock connector, set charging profile |
| Local Authorization | Per-station authorization lists with operator-managed push sync |
| Reservations | EVSE-level reservation with expiry monitoring and driver notification |
| Station Messages | Eight state-specific templates (available, occupied, reserved, charging, suspended, discharging, faulted, unavailable) rendered to station displays via SetDisplayMessage |
| Plug and Charge | ISO 15118 PKI with Hubject OPCP and manual certificate provider support |
| Feature | Description |
|---|---|
| Multi-site Hierarchy | Sites, stations, EVSEs, and connectors with per-operator site access control |
| Real-time Monitoring | Live connector status, session activity, and meter values via server-sent events |
| Station Images | Upload, tag, and publish images per station with driver-visible flag |
| Firmware Management | Network-wide firmware campaigns with per-station scheduling and status tracking |
| Configuration | Configuration templates with station drift detection and bulk apply |
| Station Metrics | NEVI uptime compliance, ChargeX KPIs, utilization rate, and fault rate reporting |
| Popular Times | Session frequency heatmap by day and hour per station |
| Remote Diagnostics | Trigger status notifications, retrieve diagnostics, clear fault states |
| Per-site Maintenance | Schedule one-off or immediate maintenance windows that take stations offline, cancel overlapping reservations, optionally stop active sessions with driver notification, and surface a Maintenance badge on the sites list |
| Feature | Description |
|---|---|
| Load Management | Site-level power budget with equal-share and priority-based allocation |
| Charging Profiles | OCPP charging profile delivery with composite schedule support |
| Idle Detection | Multi-signal idle detection (chargingState, power meter, status) with grace period |
| V2G | Vehicle-to-grid discharging state tracking via OCPP 2.1 chargingState |
| Feature | Description |
|---|---|
| Tariff Engine | Flat, time-of-day, day-of-week, seasonal, holiday, and energy-threshold tariffs |
| Pricing Assignment | Tariff group assignment at driver, fleet, station, and site levels with priority resolution |
| Split Billing | Per-segment cost tracking when tariff changes mid-session |
| Idle and Reservation Fees | Per-minute idle fee with grace period and per-minute reservation fee |
| Multi-currency | 10 currencies with Intl.NumberFormat formatting |
| Payment Processing | Stripe pre-authorization, capture, partial and full refunds |
| Guest Charging | Card-on-file payment for unauthenticated drivers via QR code |
| Invoicing | Session receipts, monthly statements, and revenue reconciliation |
| Feature | Description |
|---|---|
| OCPI 2.2.1 / 2.3.0 | CPO and eMSP roles with dual-version support |
| Partner Management | Credential exchange, endpoint registration, and connection status monitoring |
| Location Publishing | Per-site publish control with partner-level visibility settings |
| CDR Generation | Automatic charge detail record creation and push to eMSP partners |
| Token Authorization | Real-time and offline authorization of external driver tokens |
| Remote Commands | CPO commands receiver (START_SESSION, STOP_SESSION, RESERVE_NOW, UNLOCK_CONNECTOR) |
| Roaming Station Search | Driver portal browse and search of partner network stations |
| Feature | Description |
|---|---|
| Driver Portal | Mobile-first web portal with QR code scanning, session management, and history |
| Nearby Station Search | Location-aware station search with map view and real-time availability |
| Guest Charging | No-account charging flow with Stripe payment at the station |
| Activity Dashboard | Monthly charging summary with energy, cost, and estimated miles by vehicle |
| Monthly Statements | Itemized session statements available per calendar month |
| Favorites | Save and quick-access frequently used stations |
| Fleet Management | Fleet grouping with fleet-specific pricing and driver token assignment |
| Vehicle Management | Vehicle profiles for energy-to-miles estimation based on real-world efficiency |
| RFID Self-service | Drivers add and manage their own RFID cards from the portal |
| In-app Notifications | Real-time notification bell with history drawer and per-channel preferences |
| Support Cases | Support tickets with session linking, refund actions, and S3 file attachments |
| Notifications | Email and SMS for session events, payment status, reservations, and support cases |
| Feature | Description |
|---|---|
| Chatbot Assistant | Natural-language operator assistant with access to all API endpoints via auto-generated tool catalog |
| Two-tier Tool Selection | Category-based tool routing keeps per-request tool count under provider limits (128) |
| Support Case AI | Draft customer replies and internal notes from full case context (messages, sessions, station, driver) |
| Multi-provider Support | Anthropic Claude, OpenAI GPT, and Google Gemini with per-user and system-level configuration |
| LLM Parameters | Configurable temperature, top-p, top-k, system prompt, and tone at system and per-user levels |
| Language-aware Responses | AI responds in the operator's preferred language across all 6 supported locales |
| Security Guardrails | Blocks password and API key leaking, requires confirmation before data modifications |
| Auto-generated Tools | OpenAPI spec codegen produces typed tool definitions for all 500+ operator endpoints |
| Editable Chat | Edit and resend user messages, copy assistant responses, markdown rendering with scrollable tables |
| Feature | Description |
|---|---|
| Carbon Tracking | CO2 avoided per session computed from EPA eGRID and Ember regional grid intensity |
| Site Carbon Regions | Assign a carbon intensity region to each site from 60 pre-loaded regional factors |
| Dashboard Integration | CO2 avoided stat card on the operator dashboard with day-over-day trend |
| Session Display | CO2 column in sessions table and detail pages for both operator and driver views |
| Sustainability Report | Monthly trend chart, site breakdown table, trees equivalent, and CSV export |
| Portal Integration | Carbon impact on session receipts, monthly statements, and activity page |
| Feature | Description |
|---|---|
| Authentication | JWT-based auth with role-based access control for operators and drivers |
| SAML SSO | SAML 2.0 single sign-on with configurable IdP, auto-provisioning, attribute mapping |
| API Keys | Long-lived API keys for programmatic access, inheriting the creator's site access |
| Multi-factor Auth | TOTP authenticator app, email code, and SMS code options |
| Site Access Control | Per-operator site assignment with default-deny enforcement |
| Email Verification | Account verification on driver self-registration before portal access is granted |
| Bot Protection | Google reCAPTCHA v3 on operator and driver login |
| Audit Logs | Access log of operator actions for compliance and security review |
| Feature | Description |
|---|---|
| Dashboards | Real-time revenue, energy, session count, and connector status charts |
| Reports | 9 report types including energy consumption, revenue, utilization, and faults |
| NEVI Compliance | Station uptime tracking and excluded downtime management per NEVI requirements |
| Scheduled Delivery | Automated report delivery by email or FTP on configurable schedules |
| Feature | Description |
|---|---|
| Event-driven Alerts | 41 configurable OCPP event types with per-event recipient, channel, and template |
| Driver Notifications | Session, payment, reservation, and support case notifications per driver |
| Channels | Email (SMTP), SMS (Twilio), webhook, and in-app delivery |
| Template Editor | WYSIWYG email editor with drag-and-drop variable insertion and live preview |
| Email Layout | Configurable HTML wrapper template applied to all outgoing emails |
| Notification History | Delivery log with email preview and SMS/push inline expand |
| Feature | Description |
|---|---|
| Deployment Options | Docker Compose, Kubernetes Helm chart (Istio/Envoy Gateway), and AWS CDK (ECS) |
| Horizontal Scaling | Stateless services with Redis-backed OCPP connection registry across pods |
| Auto-scaling | Kubernetes HPA for API and OCPP with WebSocket-aware scale-down stabilization |
| Rate Limiting | Configurable global and per-endpoint rate limiting with separate auth rate limits |
| Observability | Prometheus metrics, Grafana dashboards, Loki log aggregation |
| Conformance Testing | Built-in OCTT 1.6 and 2.1 conformance test runner for CSMS and Charging Station SUT with dashboard reporting and per-module results |
| Multi-language UI | 6 languages: English, German, Spanish, Korean, Simplified and Traditional Chinese |
| Responsive Filters | Filter controls collapse into dropdown on tablet and mobile for all list pages |
| Server-down Page | Friendly error page with retry when API is unreachable, on both CSMS and Portal |
| Release Management | Stable, alpha and beta channels. Each stable release bumps the Helm chart and AWS CDK app to its version |
| Option | Use it for | Source | Guide |
|---|---|---|---|
| Docker Compose | Local development and single-host installs | docker-compose.yml in this repository |
Docker Compose |
| Kubernetes Helm chart | Production on Kubernetes (Istio or Envoy Gateway) | EVtivity/evtivity-csms-helm | Helm chart |
| AWS CDK | Production on AWS (ECS Fargate, Aurora, ElastiCache) | EVtivity/evtivity-csms-cdk | AWS |
The Helm chart and the AWS CDK app track stable releases only. See Helm chart and AWS CDK versions.
With the Helm chart, each service is exposed on its own subdomain via Gateway API:
| Service | URL | Public Port | Internal Port |
|---|---|---|---|
| CSMS dashboard | https://csms.your-domain.com | 443 | 80 |
| Driver portal | https://portal.your-domain.com | 443 | 80 |
| REST API | https://api.your-domain.com | 443 | 3001 |
| OCPP WebSocket | wss://ocpp.your-domain.com | 443 | 8080 |
| OCPP WebSocket TLS | wss://<load-balancer-ip> | 8443 | 8443 |
| OCPI server | https://ocpi.your-domain.com | 443 | 3002 |
| Grafana | https://grafana.your-domain.com | 443 | 3000 |
| Prometheus | https://prometheus.your-domain.com | 443 | 9090 |
| API Docs | https://api.your-domain.com/docs | 443 | 3001 |
All hostnames share a single load balancer IP. DNS records for each hostname must point to that IP. OCPP TLS (port 8443) is provisioned as a separate LoadBalancer service for direct station connections using Security Profile 3 (mTLS).
EVtivity Agent Skills teach your AI coding agent to work with EVtivity. They follow the open Agent Skills standard, so the same skills work in Claude Code, Codex, GitHub Copilot, Gemini CLI, Cursor and other agents.
| Skill | Helps you |
|---|---|
evtivity-getting-started |
Install and run EVtivity locally with Docker and sign in |
evtivity-deployment |
Deploy and upgrade with Docker Compose, Helm or AWS CDK |
evtivity-configuration |
Set environment variables, secrets, auth, database and station security |
evtivity-csms |
Operate the dashboard: sites, stations, sessions, drivers, pricing, reports |
evtivity-portal |
Use the driver portal: find a station, charge, pay, manage cards |
evtivity-mobile-app |
Build, brand and release the driver mobile app |
evtivity-guides |
Follow step-by-step guides such as station onboarding and stuck sessions |
evtivity-integrations |
Set up Stripe, Adyen, the test payment provider and payouts |
evtivity-api |
Call the REST API: API keys, error codes, OCPP command routes |
evtivity-simulator |
Run simulated OCPP 1.6 and 2.1 stations and charging sessions |
evtivity-conformance |
Send OCPP commands, read message logs and run OCTT conformance tests |
evtivity-troubleshoot |
Find and fix a failing service, station connection or sign-in |
evtivity-report-issue |
Collect the version and redacted logs and draft a GitHub issue |
Install them for any agent:
npx skills add EVtivity/evtivity-skillsSkill releases use the same tags as EVtivity. Install the tag that matches your deployment. Pull requests and discussions for new skills are welcome.
Versions follow Semantic Versioning: vMAJOR.MINOR.PATCH. Every release is a git tag and a GitHub release with notes.
| Channel | Tag example | Purpose | GitHub release |
|---|---|---|---|
| Stable | v0.1.38 |
Production release | Latest |
| Beta | v0.1.38-beta.2 |
Feature-complete preview of the next stable release | Pre-release |
| Alpha | v0.1.39-alpha.1 |
Early preview while the version's features are still in work | Pre-release |
Prereleases rank below the stable version they lead to (v0.1.38-beta.2 comes before v0.1.38). Run only stable releases in production.
Once a version's betas start, it is feature-frozen: later betas carry only fixes, and new features go to the next version. The stable release is cut from the same code as the last beta.
Images are published to ghcr.io/evtivity/evtivity-csms/<service> for linux/amd64 and linux/arm64.
- Every release has an exact, immutable tag:
0.1.38,0.1.38-beta.2. - Stable releases also move
0.1,0,latestandstable. - Prereleases move the alias of their channel only:
betaoralpha.
Aliases always point to the newest image of their channel, and a deployment picks up a new one only when it pulls the image again. Pin an exact tag in production.
The Helm chart and the AWS CDK app follow stable releases only. Each stable release bumps them to its version. To try a prerelease, set the image tag yourself, for example image.tag=0.1.38-beta.2.
- Every release note starts with a Breaking changes section: what changed, who is affected, and the action to take. It says "None." when there are none.
- Upgrade notes give the steps for the upgrade, such as webhook moves, renamed settings, or chart values that changed.
- Database changes that old and new versions must share during a rolling upgrade ship in two steps: one release adds the new structure while keeping the old one, and a later release removes the old one. When a release note says so, upgrade through each stable version in order instead of skipping one.
- The dashboard shows an update notice when a newer stable release is available. Prereleases never trigger it.
Copyright (c) 2025-2026 EVtivity. All rights reserved.
You may download and run the software for your own operations. You may not copy, redistribute, reverse engineer, or offer the software as a hosted or SaaS product. You may not sell or charge others for access to the software.
See LICENSE.md for full terms. For licensing inquiries, contact evtivity@gmail.com.