Real-time road safety incident reporting & dispatch platform (Ghana Highway Authority), serverless AWS (Lambda, DynamoDB, API Gateway, Step Functions, Location Service) with a Next.js operator dashboard, Terraform IaC, and OIDC-based GitHub Actions CI/CD.
# SafeRoute
Real-time road safety incident reporting and emergency dispatch platform for the Ghana Highway Authority (simulated government client).
Citizens report incidents (accidents, breakdowns, road hazards, flooding, protests) from a mobile-first web app with photo upload. Operators see all active incidents on a live map dashboard, assign response units, and track them through to resolution. Incidents unacknowledged after 10 minutes automatically escalate to a supervisor via SMS. A monthly analytics report (PDF) is generated and emailed to authority leadership.
All four phases are built and have been deployed end-to-end on AWS. See **WALKTHROUGH.md** for the full architecture, data model, API reference, and a guided tour of every part of the system.
## Deployment
Deployed to a single AWS account, region `us-east-1`. Dashboard URL, API base URL, and Cognito IDs are all `terraform output` values (see WALKTHROUGH.md) — nothing account-specific is hardcoded anywhere in this repo.
Sign in to the dashboard with a Cognito operator account (create one via `aws cognito-idp admin-create-user`, see WALKTHROUGH.md).
## Cloud architecture
Source: docs/architecture.drawio — open it in diagrams.net (or the draw.io desktop app / VS Code extension) to edit.
Text-only fallback (Mermaid, no AWS icons, renders inline on GitHub)
```mermaid
flowchart TB
subgraph internet["Internet"]
citizen["Citizen browser"]
operator["Operator browser"]
end
subgraph aws["AWS Account -- us-east-1"]
subgraph edge["Edge"]
cf["CloudFront\n(dashboard CDN)"]
end
subgraph frontend["Static hosting"]
s3dash["S3\nsaferoute-dashboard-dev"]
end
subgraph api_layer["API layer"]
apigw["API Gateway\n(REST + Cognito authorizer)"]
end
subgraph compute["Compute"]
lambdas["Lambda (10 functions)\ncontainer images via ECR"]
end
subgraph data["Data"]
ddb["DynamoDB\nincidents / responders"]
s3photos["S3\nincident photos"]
end
subgraph identity["Identity"]
cognitoup["Cognito User Pool"]
cognitoip["Cognit …