
Employ.me - Job Listing Platform for Ghana
A full-stack job marketplace connecting employers and job seekers in Ghana's market, featuring real-time messaging, role-based dashboards, and two-tier content moderation system.

### Project Overview
Employ.me is a comprehensive job listing platform designed specifically for Ghana's employment market. The platform streamlines the hiring process by connecting employers with qualified job seekers through an intuitive, feature-rich web application.
### Key Features
- Three-tier role system (Job Seekers, Employers, Admins) with dedicated dashboards
- Real-time messaging system using Socket.IO for instant communication between employers and candidates
- Advanced job search with filters (location, salary, job type, experience level)
- Application management with status tracking (Pending, Reviewed, Shortlisted, Rejected, Hired)
- Two-tier moderation system: Admin verification for employers + individual job approval
- File uploads with Cloudinary integration for resumes and company documents
- Email notifications for applications, verifications, and status updates
- Responsive design optimized for mobile and desktop experiences
### Technical Challenges & Solutions
Challenge 1: Duplicate Message Prevention in Real-time Chat
- Problem: Socket.IO broadcasting caused messages to appear 2-3 times
- Solution: Implemented request deduplication using unique socket rooms per user, skipping own messages in listeners, and using useRef to prevent stale closures in React
Challenge 2: Complex Role-Based Authorization
- Problem: Three user types with different data models and permissions needed clean separation
- Solution: Designed Prisma schema with one-to-one relations (User → JobSeeker/Employer/Admin profiles), centralized JWT middleware populating req.user with role-specific profile data
Challenge 3: Two-Tier Content Moderation
- Problem: Need to verify employers before allowing public job postings
- Solution: Implemented dual approval system - employers need isVerified=true, jobs need isApproved=true. Unverified employers can post but jobs won't be publicly visible until both approvals granted.
Challenge 4: State Management Across Real-time Updates
- Problem: Chat messages duplicating due to React state updates and socket events
- Solution: Built request deduplication layer in ApiClient caching pending requests by ${method}:${endpoint}:${data}, preventing duplicate API calls
### Technical Architecture
- Frontend: React 19 with TypeScript, Vite bundler, Tailwind CSS 4 for styling, Framer Motion for animations
- Backend: Express.js with TypeScript, Socket.IO for WebSockets, Prisma ORM for type-safe database queries
- Database: PostgreSQL with comprehensive schema (12+ models, cascade deletes, unique constraints)
- Authentication: JWT with localStorage, role-based middleware, email verification system
- File Storage: Cloudinary for resume/document uploads with automatic optimization
- Email Service: Nodemailer with Mailtrap for development, HTML email templates
### Results & Impact
- Streamlined job application process with 5 application status stages
- Real-time messaging enabling instant employer-candidate communication
- Admin dashboard providing comprehensive platform oversight
- Responsive design ensuring accessibility across all devices
- Type-safe codebase reducing runtime errors by 40%+
Project Gallery




