I've sent out hundreds of job applications through platforms like JobStreet, Glints, and LinkedIn, and rarely heard back. Not even a rejection email.
The reason? My CV was buried under thousands of other applicants. On most job platforms, HR receives a massive pile of applications through an internal dashboard, and if your CV isn't near the top, it's practically invisible.
I thought: what if applications landed directly in HR's email inbox instead? An email feels personal. It stands out. It doesn't get lost in a dashboard full of 500 other applicants. So I built lokerbaru.id (https://lokerbaru.id) — a job board where applications go straight to the employer's email, making every application feel more personal and significantly more visible.
I built lokerbaru.id using the MERN stack (MongoDB, Express, React, Node.js) — but with significant additions:
Frontend: React 19 + Vite => Fast dev experience with HMR; React's component model made it easy to build complex multi-role UIs (Job Seeker, Employer, Admin)
Backend: Express 5 + Node.js => Lightweight and flexible — perfect for building a REST API with middleware-heavy architecture
Database: MongoDB + Mongoose => Schema flexibility was key — job listings, user profiles, articles, and subscriptions all have very different shapes
Caching: Redis => Implemented SWR (Stale-While-Revalidate) caching to handle high traffic without overloading the database
🧗 Challenges
Building a Multi-Role System from Scratch
Infoloker isn't just one app — it's three. Job seekers browse and apply, employers post and manage listings, and admins moderate everything. Each role has its own dashboard, permissions, and data flow. Designing the auth middleware to cleanly separate these roles without duplicating code was one of the hardest architectural decisions.Making Applications Feel Personal (Email Delivery)
The core differentiator — sending applications via email — sounds simple, but getting it right was tricky. I had to handle email formatting, file attachments (CVs), error handling for invalid addresses, and rate limiting to prevent abuse. Making sure emails didn't land in spam folders was an ongoing battle.Performance at Scale with Redis Caching
Early on, the app was slow when loading job listings because every request hit the database. I implemented a Stale-While-Revalidate (SWR) caching pattern with Redis — the frontend shows cached data instantly while the backend refreshes it in the background. This dramatically improved perceived performance.Security Hardening
As a job platform handling personal data (CVs, emails, phone numbers), security couldn't be an afterthought. I implemented:
Helmet for HTTP security headers
Rate limiting to prevent brute-force attacks
MongoDB sanitization to prevent NoSQL injection
HPP (HTTP Parameter Pollution) protection
Input validation with Yup on every endpoint
HTML sanitization to prevent XSS in rich-text content
Payment Integration
Integrating Midtrans for premium subscriptions meant handling webhooks, payment verification, subscription expiry via cron jobs, and graceful error states — all while keeping the UX smooth.Deployment & DevOps
Deploying a full-stack app across two platforms (Fly.io + Vercel) introduced challenges: CORS configuration, environment variable management, Docker containerization for the backend, and ensuring the SPA routing worked correctly on Vercel.
✅ Results
Full-stack production app deployed and live
3 user roles with dedicated dashboards (Job Seeker, Employer, Admin)
Direct-to-email applications — the core differentiator
Premium subscription system with real payment integration
Article/blog CMS with rich text editing
Real-time notifications for application updates
Analytics dashboard for admins with Recharts visualization
Multi-language support (Indonesian & English)
Redis-powered caching for fast page loads
Comprehensive security middleware stack
here's the link: https://lokerbaru.id
and also here several screenshots of my project:





Top comments (0)