Inspiration

We were inspired by how confusing job descriptions can be for students and early-career applicants. It is often unclear which skills truly matter, how well a resume aligns with a role, and what should be prioritized when preparing. Skill Issue was built to bring clarity to this process by helping users understand job requirements, evaluate skill alignment, and focus their effort where it matters most.

What it does

Job Matching & Filtering Each job is shown with key details such as title, company, location, role, job type, deadlines, and a match score out of 100. Jobs can be filtered and smart-sorted based on skill alignment and urgency. Resume Improvement & Fix Suggestions For every job, Skill Issue shows what to prioritize, what to highlight more clearly, and what needs improvement. Resume suggestions are job-specific, helping users tailor their resume to what matters most for the role. Interview Preparation Support The platform uses job requirements and identified skill gaps to guide interview preparation, helping users focus on relevant topics and expectations for each role. Actionable Skill Development Missing or weak skills are converted into clear next steps with targeted learning recommendations, so users know what to work on first instead of making unfocused changes.

How we built it

Skill Issue is built as a full-stack web application with a clear separation between the frontend, backend, AI logic, and data storage. The frontend is developed using React with Vite, providing a fast and responsive interface for resume input, job browsing, filtering, match visualization, and action plans. Context-based authentication, reusable components, and custom hooks are used to manage state and error handling. The backend is built with Node.js and Express, exposing REST APIs for resume analysis, job processing, skill matching, filtering, and application management. Core logic is modularized into services to keep the system clean and maintainable. For AI-powered understanding, Skill Issue integrates the Groq API to analyze resumes and job descriptions, extract skills, compute match percentages, and generate job-specific action plans. AI is used specifically for understanding unstructured text, while deterministic logic is used for filtering and smart sorting to ensure consistent results. All persistent data is stored in Supabase, which handles authentication, database storage, and row-level security. User profiles, resumes, job listings, applications, and cached AI outputs are stored so data persists across refreshes and re-logins. Job data is normalized using custom scripts to enrich listings with structured fields such as skills and deadlines.

Challenges we ran into

Authentication state inconsistency — Handling user authentication across refreshes and sessions was challenging, as auth state could briefly be undefined during app load. This caused protected data (resumes, applications) to fail loading or appear missing if requests were triggered too early. Data persistence vs. session state — Differentiating between temporary frontend state and persistent user data was non-trivial. Relying on session-based state initially led to situations where resumes or application data appeared to reset after refresh or re-login. Resume reuse across workflows — Ensuring a single resume input could be reliably reused across job matching, filtering, action plan generation, and interview preparation required careful coordination between auth, profile data, and downstream logic. Skill extraction reliability — Job descriptions and resumes often expressed the same skills in different formats or levels of detail, making it difficult to consistently recognize and compare relevant skills without missing important signals.

Share this project:

Updates