DEV Community

Cover image for I Built an AI Job Board That Deploys in 30 Minutes — Here's How
Kim Len
Kim Len

Posted on

I Built an AI Job Board That Deploys in 30 Minutes — Here's How

Last month I built a job platform where users upload their CV and AI matches them to real jobs. It worked well, so I packaged it as a template anyone can deploy.

Here's how it works and what I learned.

The Concept

Simple idea: drop your CV, get matched to jobs. No registration needed. AI reads your skills and finds relevant listings from real job APIs.

The full platform includes:

  • Homepage with CV upload and AI matching
  • Employer portal (register, post jobs, manage listings)
  • Admin dashboard (approve jobs, manage users, view stats)
  • AI blog generator (SEO-optimised articles, one click)
  • AI social media content generator (7 platforms)

Tech Stack

I kept it deliberately simple:

  • Vanilla JavaScript — no React, no Vue, no build step
  • Vercel — serverless hosting, free tier
  • Upstash Redis — database, free tier
  • Anthropic Claude API — AI matching and content generation
  • Adzuna API — live job listings (free)

Total running cost: $5-20/month (only the AI API costs money).

22 files. No node_modules nightmare. No webpack config. Edit a file, push to GitHub, it deploys.

Architecture

ai-job-board/
config.js ← all settings in one file
api/
_kv.js ← Upstash Redis helper
chat.js ← Claude AI proxy
jobs.js ← job aggregator (5 APIs supported)
register.js ← employer auth
admin.js ← admin operations
apply.js ← job applications
approved-jobs.js ← public jobs + blog + sitemap + RSS
employer-jobs.js ← employer job management
seeker.js ← job seeker profiles
seeker-apps.js ← application tracking
reset-password.js ← password reset
cron-alerts.js ← weekly email alerts
public/
index.html ← homepage
admin.html ← admin dashboard
employer-portal.html ← employer portal
vercel.json ← routes

The Config File

Everything customisable lives in one file. Change the site name, colours, country, job API, and employer plans without touching any other code:

javascript
module.exports = {
siteName: "My Job Board",
siteUrl: "https://www.myjobboard.com",
colorPrimary: "#10b981",
defaultCountry: "gb",
jobAggregator: "adzuna",
plans: {
free: { price: 0, maxListings: 1, durationDays: 30 },
basic: { price: 29, maxListings: 5, durationDays: 60 },
pro: { price: 79, maxListings: -1, durationDays: 90 },
},
};

Supporting 5 Job APIs
Not everyone wants Adzuna. So the jobs.js endpoint supports five aggregators through a single config switch:

API Countries Cost
Adzuna 15+ Free
JSearch (RapidAPI) Global Free tier
Jooble 60+ Free
Careerjet 50+ Free
Reed UK only Free
Set jobAggregator: "jooble" in config.js and it just works. Or set it to "none" to only show employer-posted jobs.

The AI Matching Flow
User uploads CV (PDF, DOCX, or TXT)
Client-side JavaScript extracts the text (mammoth.js for DOCX)
POST to /api/chat with the CV text and a matching prompt
Claude AI returns 5 job role suggestions as JSON
For each suggestion, POST to /api/jobs to find live listings
Display results with match percentages and live job links
The prompt asks Claude to analyse skills and suggest specific roles with match percentages, locations, and search queries. The search queries then hit the job aggregator API to find real openings.

Blog System with SEO
The admin dashboard has a one-click blog generator. AI writes SEO-optimised articles about the job market. Each post gets:

Its own URL (/blog/how-to-write-a-cv)
Unique meta title and description
Open Graph and Twitter Card tags
Schema.org BlogPosting structured data
Breadcrumb navigation with structured data
There is also a dynamic XML sitemap at /sitemap.xml that auto-includes every blog post with lastmod dates, and an RSS feed at /blog/rss.

All server-rendered from a single serverless function — no static site generator needed.

Social Media Generator
The admin panel also generates social media posts for 7 platforms (Twitter, LinkedIn, Facebook, Instagram, TikTok, YouTube, Reddit) with one click. Choose a tone (funny, professional, hype, casual) and a focus topic. It even generates branded images at the correct dimensions for each platform using the Canvas API.

What I Learned
Vanilla JS is underrated. No build step means instant deploys. No dependency updates. No breaking changes from framework upgrades. The entire codebase is readable by anyone who knows JavaScript.

One config file changes everything. If someone wants to launch a job board in Germany, they change defaultCountry: "de" and siteName: "MeinJobBoard" and deploy. That decision saved hours of support.

Serverless free tiers are generous. Vercel hobby tier + Upstash free tier handles thousands of users before you pay anything. The only cost is Claude AI at roughly $0.01-0.05 per CV match.

AI content generation is a killer feature for admin tools. Nobody wants to write blog posts or social media captions manually. Having the admin dashboard generate them with one click makes the product much more valuable.

Try It
The template is available on Gumroad. Full source code, documentation, and setup guide. Deploy your own AI job board in 30 minutes.

Happy to answer questions about the architecture or implementation in the comments.

Top comments (0)