A portfolio project combining Rust language mastery with Domain-Driven Design principles, simulating a real client engagement for a renewable energy monitoring platform. The project covers the full software development lifecycle: client discovery interviews, requirements engineering (Epics and User Stories with Given/When/Then acceptance criteria), strategic and tactical DDD, Event Sourcing + CQRS, and full-stack implementation.
Repository: (link to GitHub repo once created)
Documentation (this Notion): (share as public read-only page)
| Phase | Status | Notes |
|---|---|---|
| Discovery (client interviews) | ✅ Complete | 3 sessions + 1 refinement session with simulated client |
| Domain Modeling | ✅ Complete | Ubiquitous language, context map, aggregates, event streams, policies |
| Architecture | ✅ Complete | Rust workspace, CQRS, crate structure, domain model |
| Epic Writing | ✅ Complete | 5 Epics, 41 stories total |
| Implementation | 🟡 Starting | Auth → Data Ingestion → CS Onboarding → Monitoring → Customer Dashboard |
GreenGrid Solutions is a mid-sized renewable energy company helping prosumers (people who both produce and consume energy) monitor their solar installations. They serve ~200 active sites across 3 regions, struggling with manual processes, unreliable data pipelines, and a monitoring system that lives entirely in one operations manager's head and a Google Sheet.
GreenGrid's operations manager (Diana) manually scans 200 sites every morning in a spreadsheet to detect problems. Data comes from three different inverter brands through fragile Python scripts that break without notification. Customer onboarding takes 2 days to 2 weeks with a 40% first-connection failure rate. There is no automated alerting, no baseline tracking, and no system tracking where each customer is in the onboarding process.
A modular monolith built in Rust with clean DDD boundaries, replacing the manual workflow with automated monitoring, anomaly detection, and alerting.
| Layer | Technology | Purpose |
|---|---|---|
| Backend | Rust + Axum | API server, background data ingestion |
| Database | PostgreSQL (Neon) | Event store (append-only) + read models + traditional tables |
| Frontend | React + TypeScript + TanStack Query | Dashboard UI for Ops, CS, and Customers |
| Auth | JWT (argon2 hashing) | Role-based access (Ops, CS, Customer) |
| Deployment | Home Arch Linux server + Cloudflare Tunnel | Free, self-hosted, portfolio demo |
Pattern: Modular monolith with Rust workspace. Each bounded context is its own crate with internal Clean Architecture layers (domain → application → infrastructure). Contexts communicate through domain events and a small shared kernel.
CQRS + Event Sourcing: Meter readings are stored as immutable events in an append-only event store. Dashboard data is served from pre-computed read models (projections). Anomalies and site metadata use traditional entities.
greengrid/
├── crates/
│ ├── api/ → Axum binary, routes, wiring
│ ├── energy-monitoring/ → ES+CQRS, aggregates, policies
│ ├── auth/ → JWT, roles, middleware
│ └── shared-kernel/ → SiteId, UserId, shared types
├── frontend/ → React + TypeScript
└── docs/ → Architecture decisions, diagrams