π African logistics platform connecting shippers and carriers across SADC
# AfriHaul
A logistics platform tackling freight fragmentation across South Africa and the SADC region. Built with landmark-based addressing in mind (for areas without formal street addresses), shipment creation, and carrier matching β designed for the African logistics context from the ground up. Currently in beta.
---
## Features
- **Shipment management** β create shipments, list pending shipments
- **Carrier matching** β find available carriers by country, register new carriers
- **Clean Architecture** β strict separation between Domain, Application, Infrastructure, and API layers
- **CQRS with MediatR** β commands and queries are isolated per feature (`Features/Shipments/Commands`, `Features/Shipments/Queries`)
- **Validation pipeline** β FluentValidation wired into the Application layer
- **Swagger/OpenAPI** β auto-generated interactive API docs via Swashbuckle
- **Angular frontend** β server-side rendered (SSR) Angular 21 app styled with Tailwind CSS
## Tech Stack
### Backend (`AfriHaul.API`, `.Application`, `.Domain`, `.Infrastructure`)
| Layer | Technology |
|---|---|
| Runtime | .NET 10 |
| API | ASP.NET Core Web API |
| Architecture | Clean Architecture (Domain / Application / Infrastructure / API) |
| CQRS | MediatR |
| Validation | FluentValidation |
| ORM | Entity Framework Core 9 |
| Database (current) | SQLite (`afrihaul.db`, local file) |
| API Docs | Swashbuckle (Swagger UI) |
### Frontend (`afrihaul-frontend`)
| Layer | Technology |
|---|---|
| Framework | Angular 21 (standalone, with SSR via `@angular/ssr`) |
| Styling | Tailwind CSS 3 |
| Language | TypeScript |
| Server | Express (for SSR) |
> **Note on the database:** `appsettings.json` currently lists a PostgreSQL connection string, but the actual wiring in `AfriHaul.Infrastructure/DependencyInjection.cs` uses **SQLite** (`Data Source=afrihaul.db`) β the Postgres string is unused leftover config. The plan (per the frontend's own project description) is **SQLite β PostgreSQL** as th β¦