Job Posting Platform
End-to-end recruitment platform with public job discovery, candidate self-service, and protected backoffice hiring workflows.
Overview
Built a hiring workflow system that combines a React/Vite frontend, candidate-facing application flows, recruiter backoffice tools, and a TypeScript Express.js backend.
Role
Full-Stack Engineer
Timeline
2020
Tech Stack
ReactViteTypeScriptAnt DesignReact RouterTanStack React QueryReact Hook FormZodNode.jsExpressPostgreSQLOpenAPIPM2GitHub Actions
Focus
WebRecruitmentFull-StackRBAC
Scope & Constraints
Project boundaries
Scope
- Public job board
- Candidate account and application tracking
- Backoffice hiring operations
- Job posting and application review workflow
- Role, permission, user, candidate, report, and audit management
- Backend API, file handling, notification foundation, and deployment workflow
Constraints
- Multiple user surfaces with different authentication flows
- Complex authorization rules across candidate and backoffice users
- Contract consistency between frontend and backend
- Production-style deployment and rollback requirements
Gallery
Key screens

Public job discovery
Demo
Available app and product links
Contribution
What I handled directly
- Designed and implemented feature-first frontend modules for public, candidate, and backoffice surfaces.
- Built backend modules for job postings, applications, candidates, auth, RBAC, files, notifications, inbox, reports, and audit logs.
- Integrated OpenAPI-generated types and typed API clients between frontend and backend.
- Implemented protected routes, permission gates, form validation, loading, empty, and error states.
- Structured CI/CD workflows, release artifacts, health checks, and PM2 deployment behavior.
- Documented product scope, architecture, API contract, and deployment standards.
Impact
Results and outcomes
Centralized hiring flow
Workflow
RBAC + ownership rules
Access
OpenAPI typed integration
Contract
info
Full case study available
Read the complete breakdown with architecture, flow, and impact. Read Full Case Study →