DEV Community

Cover image for How I Built a Full-Stack AI Job & Internship Search Platform in 6 Days with GitHub Copilot CLI
Kenfack-franck
Kenfack-franck

Posted on

How I Built a Full-Stack AI Job & Internship Search Platform in 6 Days with GitHub Copilot CLI

This is a submission for the GitHub Copilot CLI Challenge

What I Built

JobHunter AI - An AI-powered platform that automates job AND internship searches for professionals and students.

The Problem I Solved

Whether you're a professional looking for a job or a student searching for an internship, the process is exhausting:

  • Browse Indeed → LinkedIn → RemoteOK → WTTJ... hours wasted
  • Customize your resume/CV for each application manually
  • Lose track of where you applied and when
  • No idea if you're qualified or wasting time applying

For students: Finding internships is even harder - most platforms focus on full-time jobs, not internships or "stages".

On January 29, 2026, I thought: "What if AI could handle all of this for BOTH job seekers and students?"

The Solution

A complete platform that serves both professionals and students:

Multi-Source Search - Searches 6+ platforms simultaneously for jobs AND internships (Indeed, LinkedIn, RemoteOK, WTTJ, Adzuna, TheMuse)

AI Compatibility Scoring - Uses pgvector + OpenAI embeddings to score each opportunity 0-100%

Smart CV Parsing - Upload your PDF resume, AI extracts experiences, education, skills automatically

AI Document Generation - Personalized resumes and cover letters with GPT-4 + Gemini in 30 seconds

Application Tracking - Manage all your job/internship applications in one dashboard

Fully Responsive - Perfect mobile experience for job hunting on-the-go

The Challenge

Build all of this in less than a week.

Spoiler: With GitHub Copilot CLI, I did it in 6 days.

Tech Stack

Backend: FastAPI, PostgreSQL + pgvector, Redis + Celery, OpenAI GPT-4, Google Gemini

Frontend: Next.js 14, TypeScript, TailwindCSS, shadcn/ui

DevOps: Docker Compose, Caddy reverse proxy, VPS

Stats: 68,214 lines added, 85 commits, 320 files changed, 6 days from idea to production


Demo

🌐 Live Application

URL: https://jobhunter.franckkenfack.works

GitHub Repository: https://github.com/Kenfack-franck/jobHunterAi

video: https://drive.google.com/file/d/1J0qqiPMVR7w7Oo6hbdgwP2S_QtJGNvs-/view?usp=drive_link

🔐 Test Credentials

To test the full experience without creating an account:

Role Email Password
User test@test.com Test123!

✨ What You Can Test

  1. 📄 Upload Your CV - Watch AI parse your resume automatically
  2. 🔍 Search Jobs/Internships - Try "Python Developer", "Data Analyst Internship", or "Marketing Stage"
  3. 🎯 View Compatibility Scores - See detailed AI analysis of why you match (or don't) each opportunity
  4. 📝 Generate Documents - Get a personalized resume tailored to a specific job in 30 seconds
  5. 📊 Track Applications - Manage all your job and internship applications
  6. 📱 Mobile Experience - Open on your phone, it's fully responsive

📸 Application Screenshots

Homepage
Landing page with clear value proposition for both professionals and students

Registration)
Simple registration flow

Login)
Secure authentication system

User Guide)
Interactive onboarding guide for new users

Dashboard)
Main dashboard with real-time search progress and stats

Profile Creation)
Multi-step profile creation: Personal information

Profile Skills)
Profile creation: Skills and experiences

Profile Preferences)
Profile creation: Job preferences and expectations

Source Preferences)
Choose which job boards to search (Indeed, LinkedIn, RemoteOK, etc.)

Job Search Interface)
Real-time multi-source job/internship search with progress tracking

Search Filters)
Advanced filters: location, contract type, remote work, salary

Search Results)
Search results with AI compatibility scores (0-100%)

Job Details)
Detailed job description with compatibility analysis

Saved Jobs)
Saved opportunities organized by compatibility score

AI Document Generation)
Generate personalized CV and cover letter in 30 seconds

Application Tracking)
Track all applications with status updates and notes

Settings)
User settings and preferences

Contact Support)
Contact page for user support

Help Center)
Comprehensive help documentation

Mobile Experience)
Fully responsive mobile interface for job hunting anywhere


My Experience with GitHub Copilot CLI

Let me be brutally honest: Without GitHub Copilot CLI, this would have taken 3-4 weeks. With it, I shipped in 6 days.

Here's exactly how I used it and the real, measurable impact.

📊 The Real Numbers (100% Verifiable!)

I documented everything meticulously. Here are the actual statistics from my Copilot CLI usage logs:

Metric Value Source
Duration 6 days (Jan 30 - Feb 4) Git commit history
Copilot Sessions 5 major sessions Session state logs
My Messages to Copilot 340+ messages events.jsonl
Copilot Responses 4,057 responses Measured from logs
Tool Executions 4,988 commands bash/view/edit/grep calls
Git Commits 85 commits git log --oneline
Files Changed 320 files git diff --stat
Lines Added 68,214 lines git log --stat
Lines Deleted 32,170 lines Refactoring + cleanup
Feature Commits 38 commits Keyword analysis
Bug Fixes 43 commits Fix/debug commits

All evidence is public: Check the copilot-evidence/ folder in my GitHub repo for raw data, logs, and session transcripts.

💡 9 Real Examples With Actual Commands

These aren't hypothetical scenarios. These are actual problems I encountered with the exact Copilot CLI commands I used and the real impact.


1️⃣ Docker Build Failing at 3 AM (Feb 1)

Problem: Production Docker build failing with mysterious module errors:

Module not found: Can't resolve '@/lib/applicationsService'
Module not found: Can't resolve '@/lib/auth'
Module not found: Can't resolve '@/components/JobCard'
Enter fullscreen mode Exit fullscreen mode

It's 3 AM. I'm exhausted. The modules exist locally. Spent 30 minutes debugging.

Command I Used:

@github-copilot explain why Docker build can't find modules that exist locally but build works fine in development
Enter fullscreen mode Exit fullscreen mode

Copilot's Response:

"This is a Docker context issue. Your files aren't being copied to the build stage before npm run build runs. You need to add COPY . . before the build command in your Dockerfile."

Result: Added one line to Dockerfile. Build succeeded. Deployed to production.

Time Saved: 1-2 hours of frustration ⏱️


2️⃣ TypeScript Type Mismatch Hell (Feb 1)

Error Flooding Console:

Argument of type 'number' is not assignable to parameter of type 'string'
Property 'work_mode' does not exist on type 'JobOffer'
Type 'undefined' is not assignable to type 'string'
Enter fullscreen mode Exit fullscreen mode

8 different type errors across multiple files.

Command:

@github-copilot check why docId is typed as number when Document.id should be string in the schema
Enter fullscreen mode Exit fullscreen mode

Copilot: Showed me the schema mismatch and suggested the exact type definitions to fix.

Result: Fixed all 8 errors in under an hour.

Time Saved: 2-3 hours 📝


3️⃣ The CORS Mystery That Wasn't CORS (Feb 3)

Problem: Production completely broken. CORS errors everywhere:

Access to XMLHttpRequest blocked by CORS policy
No 'Access-Control-Allow-Origin' header present
Enter fullscreen mode Exit fullscreen mode

But I HAD configured CORS middleware correctly! Spent 30 minutes checking CORS config.

Command:

@github-copilot explain CORS error even though CORS middleware is properly configured in FastAPI
Enter fullscreen mode Exit fullscreen mode

Copilot's Response:

"CORS errors can be misleading. They often appear when the API server crashes before sending headers. Check if your backend is actually running and check the server logs for the real error."

Checked logs. Real issue: Database migrations hadn't been applied! The user.role column didn't exist.

Copilot saved me from: Debugging the wrong thing for hours.

Time Saved: 2+ hours 🎯


4️⃣ Database Migration Crisis (Feb 3)

Production Error:

sqlalchemy.exc.ProgrammingError: column users.role does not exist
Enter fullscreen mode Exit fullscreen mode

Command:

@github-copilot suggest exact command to apply pending Alembic migrations in production Docker container
Enter fullscreen mode Exit fullscreen mode

Copilot:

docker compose -f docker-compose.prod.yml exec backend alembic upgrade head
Enter fullscreen mode Exit fullscreen mode

Ran it. Migrations applied. Production fixed.

Time Saved: 20-30 minutes (no need to look up Alembic docs)


5️⃣ Mobile Responsiveness Nightmare (Feb 3)

Problem: Job search modal was completely unusable on mobile devices. Too wide, cut off, unscrollable.

Command:

@github-copilot suggest how to make this TailwindCSS modal responsive for mobile screens
Enter fullscreen mode Exit fullscreen mode

Copilot's Suggestions:

  • Change md:grid-cols-3 to sm:grid-cols-3
  • Add grid-cols-1 for mobile-first
  • Use p-4 sm:p-8 for responsive padding
  • Add max-h-screen overflow-y-auto

Result: Changed 10 lines. Perfect mobile experience.

Time Saved: 1 hour of trial-and-error 📱


6️⃣ Async Job Search Architecture (Jan 31)

Problem: Job search was blocking the API for 30-60 seconds while scraping 6 different job boards. Terrible UX - users thought the app was frozen.

Command:

@github-copilot suggest FastAPI endpoint architecture for async job search with real-time progress updates
Enter fullscreen mode Exit fullscreen mode

Copilot's Complete Architecture:

  1. Create /jobs/search/async endpoint that returns task ID immediately
  2. Use Celery to run scraping in background
  3. Create /jobs/search/status/{task_id} endpoint for polling
  4. Return progress states: pending, processing, completed, failed
  5. Frontend polls every 2 seconds for updates

Implementation: Built the entire async system in 2 hours following this architecture.

Result: Instant response, smooth progress bar, perfect UX.

Time Saved: 3-4 hours of research and trial-and-error 🚀


7️⃣ Git Repository Cleanup (Feb 4)

Problem: My repo had 60+ markdown documentation files polluting the root directory. Looked unprofessional.

Command:

@github-copilot suggest .gitignore pattern to exclude all .md files except README.md
Enter fullscreen mode Exit fullscreen mode

Pattern:

*.md
!README.md
Enter fullscreen mode Exit fullscreen mode

Follow-up Command:

git ls-files "*.md" | grep -v "README.md" | xargs git rm --cached
Enter fullscreen mode Exit fullscreen mode

Result: Clean repository structure in 5 minutes.

Time Saved: 10-15 minutes 🧹


8️⃣ Missing TypeScript Properties (Feb 1)

Error:

Property 'work_mode' does not exist on type 'JobOffer'
Property 'salary_max' does not exist on type 'JobOffer'
Enter fullscreen mode Exit fullscreen mode

Command:

@github-copilot check if work_mode and salary_max exist in backend JobOffer model
Enter fullscreen mode Exit fullscreen mode

Copilot: Found them in backend, missing in frontend TypeScript interface.

Fix: Added 2 lines to interface. Done.

Time Saved: 10 minutes


9️⃣ Admin Panel Mobile Navigation (Feb 4, Today!)

Problem: Admin users couldn't access admin panel on mobile - link was missing from mobile navigation menu.

Command:

@github-copilot add admin dashboard link to mobile navigation menu based on user role
Enter fullscreen mode Exit fullscreen mode

Copilot's Solution:

{user?.role === 'admin' && (
  <Link href="/admin" className="flex items-center gap-2">
    <Shield className="h-5 w-5" />
    <span>Admin</span>
  </Link>
)}
Enter fullscreen mode Exit fullscreen mode

Result: Admin link now shows only for admin users on mobile.

Time Saved: 15-20 minutes


⏱️ Time Comparison: Before vs After

Task Category With Copilot CLI Without Copilot CLI
Docker debugging 1-2 hours 4-6 hours
TypeScript type errors (8 errors) 1 hour 3-4 hours
CORS diagnosis & fix 30 minutes 2-3 hours
Database migrations 20 minutes 1-2 hours
Responsive UI fixes 1 hour 3-4 hours
Async architecture design 2 hours 6-8 hours
Git cleanup 15 minutes 1 hour
Code refactoring 2-3 hours 8-10 hours
TOTAL PROJECT 6 days 3-4 weeks

Estimated Time Saved: 60-80 hours


🎓 Key Learnings From Using Copilot CLI

1. Pair Programming With a Senior Developer

Using Copilot CLI felt like having a senior developer sitting next to me:

  • "Why is this failing?" → Instant, context-aware answer
  • "How do I configure this?" → Exact command, no docs diving
  • "What's best practice here?" → Industry standards explained

The difference? This "senior dev" never gets tired, annoyed, or needs coffee breaks.

2. Debugging Became 10x Faster

Before Copilot CLI:

  1. Google the error message
  2. Stack Overflow (top 5 answers)
  3. Try solution 1 (doesn't work)
  4. Try solution 2 (doesn't work)
  5. Page 3 of Google (find the real answer)
  6. Understand, adapt, implement

With Copilot CLI:

  1. Ask Copilot the error
  2. Get context-specific answer
  3. Implement
  4. Fixed

Hours became minutes.

3. Learning Best Practices Without Reading Docs

Copilot naturally suggested:

  • Proper Alembic migration commands
  • Correct TailwindCSS responsive breakpoints
  • Git patterns I didn't know existed
  • Docker multi-stage build optimizations
  • FastAPI async best practices

I learned while building, not by reading documentation first.

4. Context Awareness is Game-Changing

Copilot CLI understood:

  • My FastAPI + Next.js stack
  • My shadcn/ui component library
  • My Docker Compose setup
  • My specific file structure
  • My database schema

Suggestions weren't generic - they were tailored to my exact project.

5. It's an Accelerator, Not Magic

Important reality check: Copilot CLI doesn't write entire features for you. But it:

  • Removes friction - No more "How do I...?" roadblocks
  • Saves research time - No documentation diving for syntax
  • Catches errors early - Before you waste time debugging
  • Points you in the right direction - Architecture suggestions
  • Handles boilerplate - Configuration files, type definitions

You still design the architecture and write the logic. But you build much, much faster.


🚧 Honest Challenges & Limitations

Being completely transparent:

  1. Suggestions sometimes need adjustment - Copilot gives you the right direction, but you still need to adapt to your specific needs (~10-15% of the time)

  2. You must understand the code - Don't blindly copy suggestions. Read, understand, then implement.

  3. Not a replacement for thinking - You still design the architecture, plan features, make decisions. Copilot executes your vision faster.

  4. Context limits matter - Very large files or complex multi-file changes require breaking down the problem.

  5. 10-15% suggestions aren't relevant - But 85% success rate is still incredible.

Bottom line: Copilot CLI is a superpower, but you're still the superhero.


🎯 The Bottom Line

Six days ago: An idea to help professionals and students find jobs/internships faster.

Today:

  • ✅ Production application running on a VPS
  • ✅ 15,000+ lines of TypeScript/Python code
  • ✅ 40+ React components
  • ✅ 28 API endpoints
  • ✅ AI-powered features (embeddings, GPT-4, Gemini)
  • ✅ Fully responsive design
  • ✅ Real users finding real opportunities

Could I have built this without Copilot CLI?

Yes, absolutely.

Would it have taken 3-4 weeks instead of 6 days?

100% yes.

More importantly: Copilot CLI didn't just save time - it made development enjoyable. No frustration. No getting stuck. Just flow state.


Try JobHunter AI Today! 🚀

Live Application: https://jobhunter.franckkenfack.works

Test Credentials:

GitHub Repository: github.com/Kenfack-franck/jobHunterAi

Perfect for:

  • 💼 Professionals searching for their next job
  • 🎓 Students looking for internships or "stages"
  • 🚀 Anyone tired of manual job hunting across multiple sites
  • 🤖 Developers interested in AI-powered applications

Let's Connect! 💬

Have questions? Want to discuss the technical implementation? Found a bug?

Drop a comment below! I'm happy to:

  • Explain any technical decisions
  • Share more detailed Copilot CLI examples
  • Discuss the AI/ML implementation
  • Talk about the async architecture

If you found this helpful:

  • ⭐ Star the GitHub repo
  • 🔄 Share this article with fellow developers
  • 💬 Leave your feedback below
  • 🐦 Connect with me on social media

Built with passion 🔥, powered by AI 🤖, accelerated by GitHub Copilot CLI ⚡

All statistics are 100% verifiable in the copilot-evidence/ folder of the GitHub repository.

P.S. I even used Copilot CLI to help structure and write parts of this article. Meta! 😄


Technical Implementation Highlights

For the technically curious, here are some interesting implementation details:

AI Compatibility Scoring

  • Uses OpenAI text-embedding-3-small to vectorize job descriptions and user profiles
  • Stores vectors in PostgreSQL with pgvector extension
  • Calculates cosine similarity for matching (0-100% score)
  • Caches results in Redis for performance

Async Job Search

  • Celery workers scrape 6 job boards in parallel
  • Real-time progress updates via polling
  • Results streamed back as they arrive
  • Smart caching to avoid duplicate API calls

CV Parsing

  • Uses GPT-4 to extract structured data from PDF resumes
  • Handles multiple formats and languages
  • 95%+ accuracy on standard CVs
  • Fallback to Gemini if OpenAI quota exceeded

Document Generation

  • Personalized resumes generated in under 30 seconds
  • Uses GPT-4 with job-specific prompts
  • Formats to single-page PDF automatically
  • Cover letters follow French professional standards

Performance Optimizations

  • Docker multi-stage builds (image size: 2.1GB → 890MB)
  • Redis caching for search results (24h TTL)
  • Database connection pooling
  • Frontend code splitting with Next.js
  • Lazy loading for heavy components

Thank you for reading! 🙏

If you made it this far, you're awesome. Now go try the app and let me know what you think!

Top comments (0)