JOBSPRINT - TECHFEST HACKATHON 2026
JobSprint is an end-to-end career companion platform that helps users discover jobs, understand skill gaps, plan learning, and track applications in one integrated workflow.
It combines a web app (Next.js), a backend API (Spring Boot + PostgreSQL), a data ingestion pipeline (Python fetchers + backend ingestion endpoints), and an AI chatbot service (FastAPI) for job-aware Q&A and roadmap generation.
1. Login and authorization (User stories)
- As a user, I want to register and log in so that my skills, saved jobs, and applications are private.
- As a user, I want my session to stay valid so I don’t log in every time.
- As an admin, I want to manage dictionary and ingestion actions securely.
Technical design (high level)
- JWT based auth (access token)
- Role based authorization (USER, ADMIN)
- Protect endpoints using Spring Security filters
2. User profile skill management (list, add, batch add, remove) + resume upload parsing to auto add skills (User stories)
- As a user, I want to add skills from a list so job matching becomes personal.
- As a user, I want to add many skills quickly (batch add) so setup is fast.
- As a user, I want to upload my resume so the app can detect and add skills automatically.
Technical design (high level)
- Use skill dictionary as the source of truth
- Store user skills as a simple set: user has skill or not (no level)
- Resume parsing extracts text then matches against skill dictionary
3. Jobs browsing (search with keyword/location filters) + job detail (User stories)
- As a user, I want to search jobs by keyword so I find relevant roles.
- As a user, I want to filter by location or remote so results fit me.
- As a user, I want job detail to show full description and extracted skills.
Technical design (high level)
- Store jobs in job_posting
- Use Postgres search for MVP (simple, no extra infra)
- Return job skills from job_skill (extracted from description)
4. Skill gap analysis (User stories)
- As a user, I want to see which skills I’m missing for a job so I know what to learn.
Technical design (high level)
- Compare job’s extracted skills vs user’s skills
- Output missing and matched
5. Courses recommended based on skill gap (User stories)
- As a user, I want course recommendations to close my missing skills quickly.
Technical design (high level)
- Maintain a course catalog
- Map courses to skills they teach
- Recommend courses for missing skills first
6. Applications tracker (create, update, status, history, timestamps) + saved jobs (User stories)
- As a user, I want to save jobs for later so I can apply when ready.
- As a user, I want to track applications and statuses so I don’t lose progress.
- As a user, I want to see history so I remember what happened and when.
Technical design (high level)
- Treat “Saved” as an application status (simplifies data model)
- Every status change writes a history row
7) Recommendations (personalized job recommendations based on skills) with paging + sorting best matchUser stories
- As a user, I want the app to recommend jobs that match my skills so I spend less time searching.
- As a user, I want results sorted by best match and pageable.
Technical design (high level)
- Score jobs by skill overlap:
- score = count of matched skills between job_skill and user_skill
- Return ranked jobs with reasons (matched skill names)
8. AI chatbot to recommend key skills and course recommendations (User stories)
- As a user, I want to chat and get guidance on what skills to learn and which courses to take.
- As a user, I want the chatbot to use my profile and job gap, not generic advice.
Technical design (high level)
- Chat endpoint calls an LLM (Gemini or similar)
- The LLM is given structured context from your database:
- user skills
- target job skills and gap
- course list for missing skills
- Use “tool calls” pattern (LLM asks the backend for gap and courses)
9. Job ingestion from job boards once per day + manual ingestion, parser (User stories)
- As a user, I want the app to have fresh jobs every day.
- As an admin, I want to run ingestion manually when needed.
- As a developer, I want parsers per source that output the same internal job format.
Technical design (high level)
- Ingestion runner calls one parser per source (mycareersfuture)
- Each parser returns standardized JobPosting objects
- Save jobs idempotently by (source, source_job_key)
- After saving, run skill extraction to populate job_skill
Log in or sign up for Devpost to join the conversation.