# Ethiopia Job Portal
Production-oriented monorepo for a **job marketplace tailored to Ethiopia**: ETB salaries, **English + Amharic** UI, **Africa/Addis_Ababa (UTC+3)** semantics, mobile-first frontend, JWT auth with refresh tokens, PostgreSQL, Redis caching, CV parsing (PDF/DOCX) with TF–IDF matching, job alerts (email/SMS hooks), and payment stubs for **Chapa / Telebirr**.
## Architecture
| Layer | Stack |
|--------|--------|
| Frontend | Next.js 14 (App Router), TypeScript, Tailwind CSS, **next-intl** (`en`, `am`) |
| Backend | FastAPI, SQLAlchemy 2, Pydantic v2, **scikit-learn** TF–IDF cosine similarity |
| Data | PostgreSQL, Redis (job list cache + rate limiting support) |
| Files | Local disk (dev) or S3 (env-driven) |
| Containers | Docker Compose: Postgres, Redis, API, Web |
```
├── backend/ # FastAPI app (`app/`), tests, Dockerfile
├── frontend/ # Next.js app, Dockerfile
├── packages/
│ └── shared-types/ # Optional shared TypeScript types (`JobOut`, etc.)
├── docker-compose.yml
├── .env.example
└── .github/workflows/ci.yml
```
## Quick start (Docker)
1. Copy environment file:
```bash
cp .env.example .env
```
2. Adjust secrets in `.env` (JWT secrets, DB password, optional Google/SendGrid/SMS keys).
3. Start stack:
```bash
docker compose up --build
```
4. **Seed** sample data (Ethiopian cities list, categories, employer + jobs, demo users):
```bash
docker compose exec api python -m app.seed
```
5. Open **
localhost (Next.js) and **
localhost (OpenAPI).
### Demo accounts (after seed)
| Role | Email | Password |
|------|--------|----------|
| **Featured seeker** | `amanuelabrha02@gmail.com` | `12345678` |
| Employer | `employer@ethiojobs.et` | `Employer123!` |
| Admin | `admin@ethiojobs.et` | `Admin12345!` |
Re-load demo data anytime: `python -m app.seed --force`
## Local development (without Docker)
**Backend** (Windows: use `py` if `python` is not found; **3.12–3.14** supported)
```bash …