A modern recruitment platform for Uganda, enabling job discovery, applications, employer hiring, and streamlined recruitment management.
# Job Centre Uganda
Full-stack implementation of the platform described in the Blueprint (§1–§12)
and mockups. **Phase 1** covered design system, auth/RBAC, public pages, job
posting → moderation → publish, apply, basic Seeker/Company portals, and
admin moderation. **Phase 2** (this update) adds real-time chat, resume/logo
file uploads, drag-and-drop candidate pipeline, and pgvector-based semantic
matching.
## Stack
- **API** — NestJS (TypeScript), PostgreSQL via Prisma, JWT (short-lived
access token in memory + httpOnly refresh cookie), argon2 password hashing.
- **Web** — Next.js 14 App Router, TypeScript, Tailwind CSS using the exact
tokens from Blueprint §5 (`apps/web/tailwind.config.ts`). Public pages are
server components (SSR); the three portals are client-rendered behind auth.
- **Matching** — deterministic rules (`matching.service.ts`: skills overlap /
location / salary fit / experience) blended 50/50 with real pgvector
cosine-similarity (`embeddings.service.ts`, OpenAI `text-embedding-3-small`)
whenever both sides have an embedding. Falls back to rules-only if
`OPENAI_API_KEY` isn't set — the app works either way.
- **Chat** — Socket.IO gateway (`chat.gateway.ts`, namespace `/chat`, JWT
handshake auth) for live delivery, backed by REST endpoints
(`chat.controller.ts`) for history/listing so a client works even before
the socket connects.
- **File uploads** — resume (PDF/Word, 5MB) and company logo (PNG/JPEG/WebP,
2MB) via `multer` disk storage under `LOCAL_STORAGE_DIR`, served back at
`/uploads/...` (outside the `/api/v1` prefix — see `main.ts`).
- **Local infra** — Postgres, now on the `pgvector/pgvector:pg16` image
(adds the `vector` extension; same PG16 data format as plain
`postgres:16`), also standing in for OpenSearch via `ILIKE` search — Phase
1 substitute, see `jobs.service.ts`), Redis, both via `docker-compose.yml`.
No cloud accounts needed beyond an optional OpenAI key.
## Run it
```bash
cp .env.example apps/api/.env # then trim to th …