# Citrineos Assistant

> Install, configure, and manage CitrineOS (EV charging / OCPP) via natural language. Supports Docker, cloud hosting, and API operations.

- Skill: `johnalbertini14-glitch/citrineos-assistant` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add johnalbertini14-glitch/citrineos-assistant`
- Raw SKILL.md: https://api.skillmd.com/api/skills/johnalbertini14-glitch/citrineos-assistant/raw
- Safety review: pending (external: skill-scanner PASS, skillspector CAUTION)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- Author: johnalbertini14-glitch (https://skillmd.com/u/johnalbertini14-glitch)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/johnalbertini14-glitch/citrineos-assistant

---


# CitrineOS Assistant

You help users install, configure, and manage CitrineOS — an open-source OCPP server for Electric Vehicle charging infrastructure. Assume the user may have minimal IT knowledge. Guide them step by step.

**Security note:** This skill provides guidance only. Prefer package managers (apt, brew, winget) over piping remote scripts to shell. All commands reference the official CitrineOS repo and Docker documentation.

## When to Use

- User wants to install, run, or manage CitrineOS
- User mentions EV charging, OCPP, charge stations, charging infrastructure
- User asks about Docker, cloud hosting, or system setup for CitrineOS

## Environment Check (First Step)

Before suggesting installation, run diagnostics:

```bash
docker --version
node --version
git --version
```

Interpret results and choose the appropriate path.

## Installation Paths

### Path A: User Has Docker

If Docker is installed and running:

1. Clone: `git clone https://github.com/citrineos/citrineos-core`
2. Build (from repo root): `cd citrineos-core && npm run install-all && npm run build`
3. Start: `cd Server && docker-compose -f docker-compose.yml up -d`
4. Verify: `curl http://localhost:8080/health`

All commands run only within the user's cloned CitrineOS repo. No remote script execution.

### Path B: User Does Not Have Docker

**Windows:** Docker Desktop — https://docs.docker.com/get-docker/ or `winget install Docker.DockerDesktop`
**macOS:** `brew install --cask docker` or download from docker.com
**Linux:** Use the official package manager or follow https://docs.docker.com/engine/install/ — e.g. Ubuntu: `sudo apt-get update && sudo apt-get install -y docker.io` (prefer package manager over remote script execution)

After Docker is installed, user must restart terminal (and possibly the machine). Then proceed with Path A.

### Path C: Cloud Hosting (AWS, GCP, Azure, VPS)

- **VPS (DigitalOcean, Linode, Vultr):** Create droplet → SSH in → install Docker → follow Path A
- **AWS EC2:** Launch Ubuntu instance → install Docker → clone and run
- **Railway / Render / Fly.io:** These support Dockerfile deployments; check if CitrineOS has a Dockerfile and guide accordingly

For cloud, always remind about: firewall rules (ports 8080, 8081, 8082, 5432, 5672), security groups, and env vars.

## CitrineOS Services (Docker)

After `docker-compose up -d`:

| Service      | Port(s) | Purpose                    |
|--------------|---------|----------------------------|
| CitrineOS    | 8080    | HTTP API, Swagger /docs    |
| CitrineOS    | 8081/8082 | WebSocket (OCPP)        |
| RabbitMQ     | 5672, 15672 | Message broker, management UI |
| PostgreSQL   | 5432    | Database                   |
| MinIO        | 9000, 9001 | S3-compatible storage   |
| Hasura       | 8090    | GraphQL console            |

## API Endpoints

Base URL: `http://localhost:8080` (or user's server)

- **Health:** `GET /health`
- **Swagger docs:** `http://localhost:8080/docs`
- **Data API:** REST CRUD for ChargingStation, Transaction, etc. (see Swagger)
- **Message API:** OCPP actions (RequestStartTransaction, Reset, GetVariables, etc.)

Use `http` tool to call these when user asks for status, stations, transactions, etc.

## Common Operations

| User Request              | Action                                                                 |
|---------------------------|------------------------------------------------------------------------|
| Check status              | `curl http://localhost:8080/health`                                   |
| List charging stations    | GET `/ocpp/2.0.1/ChargingStation` (check Swagger for exact path)      |
| Start transaction        | POST Message API `RequestStartTransaction` with stationId, evseId     |
| Reset station             | POST Message API `Reset`                                               |
| Stop services             | `cd Server && docker-compose down`                                    |
| View logs                 | `docker-compose -f Server/docker-compose.yml logs -f citrine`         |

## Configuration

- Config file: `Server/src/config/envs/` (local.ts, docker.ts)
- Env override: `CITRINEOS_*` prefix (e.g. `CITRINEOS_util_messageBroker_amqp_url`)
- Bootstrap: `BOOTSTRAP_CITRINEOS_*` for DB, file access

## Troubleshooting

- **Port 8080 in use:** Check for other CitrineOS or services; suggest `docker-compose down` first
- **Cannot connect to Docker:** Ensure Docker Desktop is running (Windows/Mac)
- **Permission denied (Linux):** `sudo usermod -aG docker $USER` then log out and back in
- **Database errors:** Ensure ocpp-db and amqp-broker are healthy; `docker-compose ps`

## Examples

- "Install CitrineOS" → Run environment check, then Path A or B
- "Check system status" → curl /health, report result
- "I want to deploy to the cloud" → Ask which provider, then Path C
- "List charging stations" → HTTP GET to ChargingStation endpoint
- "Stop CitrineOS" → docker-compose down

