Candidate Dossier is a React MVP for structured, evidence-backed recruitment profiles. It replaces free-form CV uploads with a dossier that captures chronological education and work data, supporting documents, reference details, and recruiter-friendly summaries.
- Candidates sign in to a guided dossier workspace.
- Candidates complete structured profile sections across a multi-step form.
- The validation engine checks chronology, missing evidence, and employment gaps.
- Recruiters search candidates, inspect structured summaries, and export a dossier PDF.
- React 18 loaded directly in the browser via ES modules
- Responsive single-page experience with candidate and recruiter workspaces
- Multi-step dossier editing, validation panels, recruiter filters, and printable/exportable summaries
src/app.jsmanages auth, routing between candidate/recruiter views, and shared statesrc/storage.jsprovides a local demo datastore that mirrors the Firebase document shapesrc/validation.jsenforces chronology checks, employment-gap detection, and completeness scoringsrc/pdf.jsconverts structured dossiers into a recruiter-friendly PDF
The MVP runs fully in localStorage, but the data model is intentionally shaped for Firebase Spark:
- Authentication: Firebase Auth email/password or Google sign-in
- Database: Firestore collections for
users,candidates, and recruiter metadata - Storage: Firebase Storage for evidence files and attachment URLs
Switching to Firebase means replacing the adapter functions in src/storage.js with Firestore/Auth/Storage calls while keeping the UI and validation logic intact.
/Users/user/Documents/Playground
index.html
styles.css
README.md
src/
main.js
app.js
components.js
lib/
react.js
pdf.js
sample-data.js
storage.js
validation.js
{
"role": "candidate",
"email": "candidate@example.com",
"displayName": "Ariana Shah",
"candidateId": "cand-001"
}{
"status": "ready",
"personal": {
"fullName": "Ariana Shah",
"headline": "Senior Operations Analyst",
"email": "ariana@example.com",
"phone": "+971-555-0101",
"location": "Dubai, UAE",
"birthDate": "1994-02-12",
"nationality": "Indian",
"familyBackground": "Optional narrative"
},
"education": [],
"work": [],
"certifications": [],
"achievements": [],
"training": [],
"references": [],
"attachments": [],
"updatedAt": "2026-03-10T00:00:00.000Z"
}{
"query": "operations",
"status": "ready",
"minCompleteness": 70
}Serve the directory with any static file server:
cd /Users/user/Documents/Playground
python3 -m http.server 8000Open http://localhost:8000.
- Candidate:
candidate@dossier.dev - Recruiter:
recruiter@dossier.dev - Any password is accepted in local demo mode
- Add a Firebase project and web config.
- Replace the local adapter in
src/storage.jswith Firebase Auth, Firestore, and Storage calls. - Persist uploaded files to Firebase Storage and store download URLs in
attachments. - Enforce recruiter authorization with Firestore security rules.