
Web Dev · 1200+ CVs · 98% satisfaction
DigiMyTech Talent Hub
PFE capstone: an AI-powered talent hub for CV prep, skill matching, and application tracking.
At a glance
97
Days
PFE capstone
5
Sprints
Scrum delivery
109
Tests
All passing
11
AI features
Embedded in UX
10
DB tables
PostgreSQL
<50ms
Matching
Deterministic score
Platform modules
Five modules, one candidate journey

AI-assisted writing, PDF/Word/OCR import, high-fidelity PDF export.

0–100 compatibility score with skills gap analysis and AI explanation.

Formations ranked by detected skill gaps from your profile.

Four-column tracker with timestamped status history.

8 AI-generated questions, voice or text mode, personalized debrief.
Delivery
Scrum: 5 sprints in 97 days
Initiation
Feb 15–28
Backlog & architecture
Auth & profile
Mar 2–13
Magic link + RLS dashboard
CV editor
Mar 16–27
Editor, PDF export, AI quality score
AI & matching
Mar 30 – Apr 10
Matching engine + formations
Kanban
Apr 13–24
Application tracking + admin
Interview AI
Apr 27 – May 8
Voice simulator + final QA
Market positioning
Built for Tunisia — not a US import
| Feature | DigiMyTech | Jobscan | Rezi.ai |
|---|---|---|---|
| French interface | — | ||
| 0–100 matching score | — | ||
| Training recommendations | — | — | |
| Application Kanban | — | Partial | |
| Tunisia market fit | — | — | |
| AI interview simulator | — | — | |
| Explainable matching algo | — | — | |
| Free for candidates | Partial |
Architecture
Presentation
Next.js 15 · React 19 · Tailwind
SSR/SSG hybrid UI
Business logic
Server Actions · Zod DTOs
Repository pattern
Data & AI
Supabase · OpenRouter · Vercel AI SDK
RLS + streaming LLM
DigiMyTech Talent Hub is my PFE capstone (Licence MDW, ISET Sousse): a full-stack, AI-powered talent platform built solo in 97 days at Digimytch SUARL, Ariana. It accompanies Tunisian job seekers from CV creation through interview simulation — with AI embedded at every step, not bolted on as a chat widget. Graduated with highest honors (Mention Très Bien).
Context & problem
At Q1 2026, graduate unemployment in Tunisia reached 24.2% (INS). Candidates often have strong skills but weak presentation: generic CVs, no objective way to gauge fit before applying, Excel-based tracking, and zero French-language interview prep tools adapted to the local market. International tools like Jobscan and Rezi.ai cover only fragments of this journey.
I conducted field analysis at Digimytch with the CTO, CEO (Product Owner), and mapped four broken steps: CV writing without feedback, subjective job browsing, unstructured application tracking, and no guided interview practice.
Five integrated modules
- Smart CV editor — Structured editor with streaming AI assistant, PDF/Word/OCR import, high-fidelity PDF export via @react-pdf/renderer, and AI quality scoring by category.
- Job matching engine — Deterministic 0–100 compatibility score (not LLM-generated) with NFD tokenization for accent-insensitive skill matching, plus AI-generated explanation in 3–5 sentences.
- Training catalog — 21 formations ranked by detected skill gaps from matching results — "Recommended for you" instead of a generic list.
- Application Kanban — Four columns (To do, Applied, Interview, Offer) with timestamped status history and soft-delete archiving.
- Interview simulator — 8 dynamically generated questions, voice mode (Web Speech API on Chrome/Edge) or full text fallback, personalized debrief per answer.






Architecture & stack
Three-tier architecture: Next.js 15 + React 19 + Tailwind (presentation), Server Actions + Zod DTOs (business logic with Repository pattern), Supabase PostgreSQL + Storage + JWT Auth (data with Row Level Security on every user table).
AI layer: Vercel AI SDK v4 streaming to OpenRouter Free models — Kimi K2.6 for CV, Gemma 4 26B for cover letters, Llama 3.3 70B for interviews. Each Server Action validates JWT before calling OpenRouter; responses stream directly to React without a REST middle layer.
Scrum delivery (5 sprints)
| Sprint | Focus | Key deliverable |
|---|---|---|
| Initiation | Backlog, UML, architecture | Product backlog + tech stack locked |
| Sprint 1 | Auth & profile | Magic link auth, RLS profiles, dashboard KPIs |
| Sprint 2 | CV editor | Auto-save editor, PDF export, AI quality score |
| Sprint 3 | AI & matching | Deterministic matching engine, formations catalog |
| Sprint 4 | Kanban & admin | Application tracker, formation import via AI |
| Sprint 5 | Interview AI | Voice simulator, debrief, 109 tests green |
21 user stories delivered out of 21 planned. Solo developer on every sprint — conception, code, tests, documentation.
The interesting technical challenge
The most significant design decision was building the matching score as a deterministic algorithm (src/lib/matching.ts) rather than an LLM call. Same profile + same offer = same score every time — tested explicitly in the test suite. Users can trust and audit the number; the AI only generates the natural-language explanation on top.
Other hard problems: token budget management on free OpenRouter models, Supabase SSR session sync (syncProfileToAuthSession), and a React state bug causing duplicate formation recommendations (fixed by resetting state between matching calls).
Quality & security
- 109 automated tests across 24 files (Node.js native test runner) — all passing at defense
- Rate limiting (60s / 10 requests), CSP, HSTS, prompt injection sanitization via Zod
- RLS on all 10 PostgreSQL tables; admin access via JWT
app_metadata.is_admin
Measured performance
- Matching score calculation: < 50 ms for a 10-skill CV
- AI assistant first token: < 800 ms
- CV quality score (generateObject + Zod): 2–4 s
- Vercel deploy from GitHub push: < 90 s
What I'd do next
Vector search via pgvector to match "JavaScript engineer" with "React/Node developer" beyond lexical matching. Playwright E2E for critical flows. Auto-fill profile on signup from CV parser. Arabic-language models with RTL support.
Stack: Next.js 15 · React 19 · TypeScript · Supabase · OpenRouter · Vercel AI SDK · Tailwind · Framer Motion · Vercel
Live: digimytch-talent-hub.vercel.app · Code: GitHub