Open source · Auditable · Self-hosted

Recruitment orchestration,
fully on your own terms

Vekt is a recruitment orchestration engine for privacy-first hiring. It structures candidate evaluation, audit logs, and data retention around explicit workflows instead of treating hiring as a resume inbox.

View on GitHub Live demo
TypeScript Next.js 15 Docker-ready GDPR-compliant
Recruiter dashboard
Recruiter dashboard — candidates sorted by AI score
Public job listings
Public job listings
Applications view
Applications with AI reasoning
Capabilities

Everything you need to orchestrate candidate evaluation

Built for teams that need structured vetting, explainable automation, and privacy controls without handing candidate data to a third party.

🤖
AI resume scoring
Pluggable AI providers — mock (offline), OpenAI GPT-4o, or a local Ollama model. Switch with a single env variable.
Durable evaluation pipeline
Powered by Inngest — each evaluation step is durable, retryable, and observable. Falls back to in-process execution in dev.
📋
Per-job screening questions
Add single-choice or multi-select questions to any job. Answers appear alongside AI reasoning in the recruiter view.
✉️
Delayed, cancellable emails
Status emails are held for a configurable delay (default 48 h). If a recruiter changes the decision, the queued email is automatically cancelled.
🎨
Admin-editable email templates
All candidate emails are stored in the database and editable from the admin dashboard. Every sent email is logged with its delivery ID.
🗑️
Automated data purge
Inngest cron job automatically purges candidate records and resume files past the configurable retention window. GDPR-ready out of the box.
🔒
Secure file serving
Resume PDFs are stored outside the web root and served exclusively through an auth-gated API route. No accidental public exposure.
📚
Full Swagger API docs
Interactive OpenAPI 3.0 documentation at /api-docs — build integrations or automate job posting without digging into source code.
🐳
One-command Docker deploy
A single docker-compose up starts the Next.js app and a self-hosted Inngest server together. No external accounts required.

Pipeline

From submit to decision in minutes

Every application moves through a consistent, auditable pipeline with human override at every step.

1
Candidate submits application
Name, email, and PDF resume (max 5 MB). Optional per-job screening questions appear as a second step. All answers are IDOR-validated server-side.
POST /api/candidates
2
PDF text extracted & AI scoring runs
unpdf extracts CV text. The AI provider scores it against the job description using a weighted formula: relevance × 0.4 + experience × 0.6.
Inngest · analyze-candidate
3
Automatic status assignment
Score ≥ threshold (default 75) → SHORTLISTED. Below threshold → REJECTED. Recruiters can always override.
APPLIED → ANALYZING → SHORTLISTED / REJECTED
4
Delayed status email queued
A status-change email is scheduled after the configured delay (default 48 h). If the recruiter updates the decision before it sends, the email is cancelled and a new one is queued.
Inngest · send-delayed-status-email
5
Recruiter reviews & decides
The recruiter dashboard shows every applicant sorted by AI score with full reasoning and screening-question answers. Accept, reject, or shortlist with one click.
/recruiter/jobs/[jobId]
6
Automated data retention
A daily Inngest cron deletes candidate records and resume files older than the admin-configured retention window. Warning emails are sent 7 days in advance.
Inngest · purge-expired-candidates · daily 02:00 UTC

User roles

Three distinct surfaces

Each role has a dedicated, purpose-built UX — no cluttered all-in-one interface.

public
Candidate
Browses job listings and applies with a resumé. Tracks application status via a private link.
Job listings & search
Multi-step apply form
Screening questions
Status tracker page
Email notifications
recruiter
Recruiter
Manages job listings and reviews candidates sorted by AI score — no context-switching required.
Job listing management
Screening question builder
Applications sorted by score
AI reasoning & answers
Accept / reject / shortlist
admin
Admin
Controls the platform — accounts, email templates, retention settings, and system configuration.
Recruiter account management
Email template editor
Data retention settings
Email delay configuration
Sent email audit log

Tech stack

Built on proven open source primitives

No proprietary runtimes or vendor-specific infrastructure required.

FrameworkNext.js 15 App Router
DatabaseSQLite via Prisma 7 + better-sqlite3
AuthNextAuth v5 credentials
AI pipelineInngest durable functions cron
AI providersMock · OpenAI GPT-4o · Ollama (local)
PDF extractionunpdf
ValidationZod
LoggingPino structured JSON
UIshadcn/ui + Tailwind CSS v4 + Phosphor Icons
Rich textTiptap
EmailResend

Quick start

Up and running in one command

The setup script downloads all files, generates secrets, prompts for your admin credentials, and starts everything automatically.

terminal
curl -fsSL https://raw.githubusercontent.com/Behnoudmst/vekt/main/setup.sh | bash

# App →  http://localhost:3000
# Inngest → http://localhost:8288

Ready to take back control of your hiring?

Vekt is free, open source, and runs entirely on your own infrastructure.

Star on GitHub Try live demo →