Job board and ATS of the Socium suite, with CV parsing and server-side rendering.
- Client
- Socium
- Live
- sociumjob.com ↗
Context
Job offers were poorly indexed by search engines, and production suffered from memory leaks and N+1 queries.
What I built
A rebuild on Nuxt 3 for server-side rendering and indexable job pages, connected to the suite's ATS: applications land in a hiring pipeline and uploaded CVs are parsed into structured candidate profiles. I also resolved critical production incidents (memory leaks, N+1 queries). Uploaded CVs go through the suite's secured file service: antimalware scan on S3 and short-lived signed links. Like the four other apps of the suite, the ATS runs on the shared security model I put in place: tenant isolation in a common data-access layer, fail-closed guards and per-app permissions on Keycloak.
Result
Indexable job pages, and production incidents fixed at their cause rather than worked around.
Architecture
Server-side rendering for the job board
Job pages are rendered by Nuxt on the server, so search engines index every offer and candidates see content immediately.
CVs handled by the secure file service
Uploaded CVs are scanned for malware on S3 and only served through short-lived signed links.
Applications in the shared data layer
Candidates and applications use the suite's shared models, so a recruitment request in Workflow and a hire in Job talk about the same data.
Permissions per app
Recruiters get Job permissions only, through the suite's per-app RBAC, with one permission per screen.
Stack
- Nuxt 3
- NestJS

