EthioLance — a freelance marketplace for Ethiopian professionals (React + Node/Express + Prisma/PostgreSQL, Socket.io, Chapa escrow, Telegram job-alert bot)
# EthioLance — Freelance Marketplace for Ethiopian Professionals
A cross-platform freelance marketplace connecting Ethiopian freelancers with clients: role-based auth,
profiles & portfolios, job posting, proposals, milestone-based **escrow** contracts, real-time messaging,
ratings & reviews, dispute resolution, and an admin console. Built from the project SRS (`G 6.pdf`).
> This run targets the **web app + backend**. Mobile (React Native) is deferred. External services
> (Chapa payments, Cloudinary media) use **mock adapters** by default and become live by setting env vars.
## Stack
| Layer | Tech |
|---|---|
| Web | React 18, Vite, TypeScript, Tailwind CSS, TanStack Query, React Router |
| API | Node.js, Express, TypeScript, Prisma, Socket.io |
| DB | PostgreSQL (Docker) |
| Auth | Custom JWT (access + refresh), role-based (Freelancer / Client / Admin) |
| Payments / Media | Chapa / Cloudinary adapters (mock by default) |
Monorepo (pnpm workspaces): `apps/api`, `apps/web`, `packages/shared`.
## Quick start
```bash
# 1. Install
pnpm install
# 2. Start Postgres (Docker)
pnpm db:up
# 3. Configure env (defaults work out of the box)
cp .env.example .env
# 4. Create schema + seed demo data
pnpm db:migrate
pnpm db:seed
# 5. Run API (:4000) + Web (:5173) together
pnpm dev
```
Then open **
http://localhost:5173**.
One-shot setup: `pnpm setup` (install → db up → migrate → seed).
## Demo accounts — password `Password123`
| Role | Email |
|---|---|
| Admin | `admin@ethiolance.com` |
| Freelancer | `huda@ethiolance.com` (+ meba@, helina@, ruhama@, dawit@, selam@, yonas@, and 7 more) |
| Client | `biniyam@ethiolance.com` (+ sara@, michael@, rahel@, tewodros@, meron@, daniel@) |
The database seeds a full, realistic marketplace: **14 freelancers** with detailed profiles & portfolios,
**7 client companies**, **28 jobs**, **79 proposals**, **8 escrow contracts**, reviews, messages, and
notifications — so every screen looks populated out of the box.
## Channels
- **Web ap …