Inspiration
Job hunting in Vietnam often feels like shouting into the void: CVs go unanswered, salaries hide behind "negotiable", and fake postings ask for deposit fees. We asked: what if a job site competed on honesty instead of volume? That became our tagline — Real jobs. Clear pay. Real replies.
What it does
JobPortal is a job marketplace for Vietnam that connects candidates, employers and admins, with transparency built into every step.
For candidates
- Search jobs by keyword, location, industry, salary, level and experience. Search ignores Vietnamese diacritics, and you can filter to Fast responders only.
- ⚡ One-click apply with the default CV. No CV yet? A PDF CV is generated from the profile and submitted in the same click.
- Online CV builder: 3 templates, custom colors, live PDF preview, and save to "My CVs".
- AI job recommendations: a match percentage, the skills you have and the ones you're missing, and a short explanation written by Claude.
- Track every application's status in real time, chat with the recruiter, save jobs, follow companies, get job alerts, and write anonymous company reviews.
For employers
- Create a company profile and get it verified with a business license.
- Post jobs and move applicants through a clear pipeline: Submitted → Viewed → Shortlisted → Interview → Offer / Rejected. Interview invites and rejection letters notify the candidate automatically.
- Message candidates, keep private notes, and invite teammates as owners or members.
- See a dashboard with views, applications, a hiring funnel, and the company's public response score.
- Buy plans with VietQR bank transfer to feature jobs at the top of search and unlock contact details of candidates found in "Search CVs".
For admins
- Moderate jobs, verify companies, handle reports, approve reviews, and confirm payments.
- Manage users, categories, site content and settings, with an audit log of every admin action.
- Answer a customer-support inbox and maintain the FAQ that powers the chatbot.
For everyone
- A floating support chatbot answers instantly from the FAQ (using Claude if configured) and hands the conversation to a human admin when needed.
- Realtime notifications, mobile-friendly UI, and privacy by default: anonymized AI input, CVs only through short-lived signed links, and contact details hidden until a candidate applies or opts in.
How we built it
NestJS + TypeORM on SQL Server, React 19 + Vite + Tailwind, Server-Sent Events for realtime chat and notifications, Docker + Caddy for deployment. AI job recommendations start from a transparent score:
$$S(c,j) = 40\,s_{\text{skill}} + 15\,s_{\text{title}} + 15\,s_{\text{category}} + 10\,s_{\text{location}} + 10\,s_{\text{exp}} + 10\,s_{\text{salary}}$$
Claude then explains the top matches using an anonymized profile. Each company gets a public response score $R = \frac{\text{answered}}{\text{eligible}}$; companies with $R \ge 0.8$ and an average reply time $\bar t \le 72\,\text{h}$ earn a ⚡ Fast responder badge.
Challenges we ran into
SQL Server setup and its "multiple cascade paths" rule; a 7-hour time-zone bug between GETDATE() and UTC timestamps; diacritic-insensitive Vietnamese search; and keeping the support chatbot grounded in the FAQ, with a human handoff and a fallback when the AI is unavailable.
Accomplishments that we're proud of
- A complete three-sided product, not a demo screen. Candidates, employers and admins each have a full workflow: apply → screen → interview → offer, job moderation, company verification, reports, reviews, plans and payments, and customer support.
- The ⚡ Fast responder badge. It turns "will anyone ever reply?" into a number candidates can filter by. We think it is the most honest feature on the site, and it gives recruiters a reason to reply.
- One-click apply that works even without a CV. If a candidate hasn't uploaded one, we generate a clean PDF from their profile and submit it in the same tap.
- AI that explains itself and degrades gracefully. Job matches come with a score breakdown and missing skills, and the support bot answers only from the FAQ. With no API key, both features still work on rules alone.
- Privacy by design. Data sent to the AI is anonymized. CVs are only reachable through 5-minute signed links. Candidate contact details stay hidden unless the candidate applies or opts in.
- Quality we can show. 120+ unit tests, an end-to-end test of the full hiring flow against real SQL Server (11/11 passing), 307 manual test cases traced to PRD requirement IDs, CI on every push, and a one-command VPS setup with HTTPS and daily backups.
- Built for Vietnam. Diacritic-insensitive search, VietQR payment codes, Vietnamese-first UI, and time handling we fixed carefully so that "2 hours ago" means 2 hours ago in UTC+7.
What we learned
Trust is a feature you can measure. Start with an explainable baseline before adding AI. Time zones and encodings are where "it works on my machine" lives.
What's next for job-portal
Built With
- anthropic-api
- caddy
- claude
- docker
- github-action
- jest
- jwt
- nestjs
- nginx
- node.js
- pdfmake
- react
- react-hook-form
- react-router
- sever-sent-event
- sqlsever
- swagger
- tailwindcss
- tanstack-query
- tiptap
- typeorm
- typescript
- vieqr
- vite
- zod
Log in or sign up for Devpost to join the conversation.