Role: Full-Stack Developer & Product Owner
Stack: React, TypeScript, Supabase, PostgreSQL, Tailwind CSS, Vite, Zustand
Timeline: 2024 – Present
Status: In Production
URL: workforce.co.ls
The Challenge
Recruitment agencies in emerging markets operate in a difficult environment. They can either list jobs on major platforms like PNet, paying premium fees to rent attention alongside competitors, or rely on informal channels like WhatsApp and email, which lack structure and scalability.
Neither option serves them well. Major platforms extract value without building the agency’s brand or data assets. Informal channels create chaos — CVs buried in chat threads, no candidate pipeline visibility, and institutional knowledge walking out the door when staff leave.
Agencies need infrastructure they own. A professional platform branded to them, structured for their workflow, building their long-term talent database rather than renting access to someone else’s audience.
The Insight
The real product isn’t job listings. It’s the candidate database.
Job boards come and go. Platforms rise and fall. But a recruitment agency’s sustained competitive advantage is the talent pool they’ve cultivated over years — the candidates they can call when the right role opens.
WorkForce was designed to build that asset. Every application, every interaction, every tag and note compounds into a database that grows more valuable over time. The agency owns it. They control it. It becomes their intellectual property.
What I Built
WorkForce is a white-label recruitment platform that agencies can deploy as their own branded career portal.
Public-Facing Features
Job Listings — Clean, editorial-style job pages optimized for readability and conversion. Each listing includes role details, requirements, salary ranges, and application deadlines.
Candidate Applications — Structured application flow capturing CVs, cover letters, skill tags, salary expectations, and availability. Mobile-first design works for candidates applying from phones.
Employer Branding — Agencies customize colors, logos, and messaging. The platform feels native to their brand, not a third-party tool.
Recruiter Dashboard
Application Pipeline — Recruiters view candidates in a kanban-style pipeline, moving applicants through stages: New, Screening, Interview, Offer, Hired, Rejected.
Candidate Profiles — Full applicant profiles with downloadable CVs, application history, and recruiter notes.
Internal Notes & Tags — Recruiters add private notes and tags to candidates, building institutional memory that persists beyond individual employees.
Search & Filters — Search candidates by skills, experience, salary range, or custom tags. Find the right person quickly when a new role opens.
Architecture
Multi-Tenant Design — A single deployment serves multiple agencies with isolated data and custom branding. Row-level security in PostgreSQL ensures complete data separation at the database level.
Real-Time Updates — Supabase’s real-time subscriptions update the dashboard instantly when new applications arrive, without polling or page refreshes.
Technical Decisions
Frontend: React + TypeScript + Vite
React 18 with TypeScript provides type safety across a growing codebase. Vite delivers fast development builds and optimized production bundles. Tailwind CSS ensures consistent styling without the overhead of a custom design system.
Zustand handles client-side state with minimal boilerplate. It’s lighter than Redux and sufficient for the application’s needs.
Backend: Supabase (PostgreSQL + Auth + Real-Time)
Supabase provides PostgreSQL, authentication, and real-time subscriptions out of the box. This accelerated development significantly while maintaining the flexibility of a relational database.
Key decision: I chose Supabase over a custom Node.js backend because the project needed to ship quickly, and Supabase’s managed services reduced operational complexity. The trade-off is some vendor lock-in, but the speed gains justified it for an MVP.
Performance Optimization
The platform is built for users on slow connections and low-end devices. Lesotho’s internet infrastructure means 3G is common, data is expensive, and many users access the web from older Android phones.
Code Splitting — React.lazy and dynamic imports keep the initial bundle small. Users download only the code they need for the current page.
Image Optimization — All images are served in WebP and AVIF formats with responsive sizing via srcset. Users on small screens don’t download desktop-sized images.
Critical CSS — Above-the-fold styles are inlined; the rest loads asynchronously. This improves perceived performance and First Contentful Paint.
Bundle Analysis — Regular bundle analysis identifies and removes unnecessary dependencies. The production JavaScript bundle stays under 150KB gzipped.
Results
WorkForce is live and serving users in Lesotho.
Performance: Lighthouse scores consistently exceed 90 on mobile. Initial page load completes in under 3 seconds on simulated 3G connections.
User Outcomes: Candidates have successfully found jobs through the platform. Recruiters report that the dashboard makes candidate management significantly easier than their previous email-based workflow.
Business Validation: The pivot from a public job board to a white-label platform has attracted interest from recruitment agencies looking for ownership rather than rental.
What I Learned
Constraints force better decisions. Designing for slow connections and limited hardware produces a better product for everyone. Performance is a feature, not an afterthought.
TypeScript scales. As the codebase grew, type safety prevented countless bugs and made refactoring significantly less painful. The upfront cost of typing pays dividends continuously.
Ship early, iterate. The first version was far simpler than the current platform. Getting it in front of real users revealed what actually mattered. Features I thought were essential went unused; simple fixes I had deprioritized became urgent requests.
Own the data model. The candidate database is the real product. Features come and go, but the talent asset compounds over time. This insight drove the architectural decision to prioritize data portability and ownership.
Challenges Overcome
Multi-Tenancy Complexity — Designing row-level security policies that properly isolate agency data required careful thought. I tested extensively with different user roles to ensure no data leakage was possible.
Offline Resilience — For users with intermittent connectivity, I implemented optimistic UI updates and local storage caching for in-progress applications, reducing frustration when connections drop mid-form.
Mobile-First Recruiting — Recruiters often work from phones during commutes or off-site meetings. The dashboard had to be fully functional on mobile, not just a responsive afterthought.
Future Roadmap
Email Notifications — Automated alerts to candidates when matching jobs are posted, and to recruiters when new applications arrive.
Payment Integration — Connect to PayFast or mobile money platforms to enable agencies to monetize featured listings and premium placements.
Analytics Dashboard — Provide agencies with insights on application trends, time-to-hire, and candidate pipeline health.
API Access — Allow agencies to integrate WorkForce with their existing CRM and ATS systems.
