English · Deutsch · Español · 한국어 · 简体中文 · 繁體中文
EVtivity is an AI-powered EV charging platform. At its core is an OCPP 1.6 and 2.1 compliant Charging Station Management System (CSMS) for EV charging infrastructure. It 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.
AI is built into the operator dashboard. The AI assistant answers questions about stations, sessions, revenue, and operations, reads attachments such as a photo of a charger screen, a PDF, or a log, and proposes changes that run only after the operator confirms. The support assist drafts replies to support cases in the driver's language. Both work with Anthropic, OpenAI, Gemini, or DeepSeek, and secrets and personal data are masked before they reach the model.
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 |
|---|---|
| AI Assistant | Ask about stations, sessions, revenue, and operations in plain language. Answers stream, and conversations are kept with search, rename, and delete |
| Image and File Analysis | Attach images (such as a photo of a charger screen), PDF, CSV, text, log, and JSON files |
| Confirmed Changes | The assistant reads data through API tools. A change it proposes shows a confirmation card and runs only after the operator confirms |
| Support Assist | Drafts support case replies in the driver's language and internal notes in the operator's, with the sources it read |
| Provider Choice | Anthropic, OpenAI, Google Gemini, or DeepSeek, set per surface or per user, with an effort level |
| Redaction and Guardrails | Secrets and personal data are masked in tool results before they reach the model. Settings, secrets, users, payments, and station security stay out of reach |
| Six Languages | Answers in the operator's language: English, German, Spanish, Korean, Simplified Chinese, and Traditional Chinese |
| Limits and Audit | Rate limits per user and per site, a daily token budget per user, and audit entries for changes made through the assistant |
| 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 |
|---|---|
| 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.