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)


Project Status

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

The Client

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.

The Problem

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.

The Solution

A modular monolith built in Rust with clean DDD boundaries, replacing the manual workflow with automated monitoring, anomaly detection, and alerting.


Tech Stack

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

Architecture

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