<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Jing</title>
    <description>The latest articles on Forem by Jing (@jing_2026).</description>
    <link>https://forem.com/jing_2026</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3823091%2Faf4780f7-4592-443e-9d58-540c56fdaef9.png</url>
      <title>Forem: Jing</title>
      <link>https://forem.com/jing_2026</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jing_2026"/>
    <language>en</language>
    <item>
      <title>LearnMateAI: Building an Intelligent Teaching Assistant Platform</title>
      <dc:creator>Jing</dc:creator>
      <pubDate>Tue, 21 Apr 2026 06:10:39 +0000</pubDate>
      <link>https://forem.com/jing_2026/learnmateai-building-an-intelligent-teaching-assistant-platform-48pb</link>
      <guid>https://forem.com/jing_2026/learnmateai-building-an-intelligent-teaching-assistant-platform-48pb</guid>
      <description>&lt;p&gt;LearnMateAI Jing Ng &amp;amp; Liuyi · Spring 2026&lt;/p&gt;

&lt;h1&gt;
  
  
  LearnMateAI: Building an Intelligent Teaching Assistant Platform
&lt;/h1&gt;

&lt;p&gt;LearnMateAI: Making Online Learning Better&lt;/p&gt;

&lt;h1&gt;
  
  
  The Problem
&lt;/h1&gt;

&lt;p&gt;Online education today is boring. Students scroll through endless PDFs and read flat text. Teachers don't see what students are actually learning—they only find out when they grade hundreds of assignments. It's like there's a wall between teaching and learning. Plus, students need real feedback fast, not days later.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Solution
&lt;/h1&gt;

&lt;p&gt;LearnMateAI fixes this. It's a smart app that helps both instructors and students:&lt;/p&gt;

&lt;p&gt;For Instructors: A live dashboard shows exactly where the class is struggling. You can see patterns in mistakes across all students without invading anyone's privacy. It's like having radar for class confusion.&lt;/p&gt;

&lt;p&gt;For Students: You get interactive flashcards that flip in 3D, quizzes that adapt to your speed, and instant feedback from an AI tutor. It's like having a personal teaching assistant grade your work while you're still thinking about it.&lt;/p&gt;

&lt;h1&gt;
  
  
  How We Built It: Two People, Two Jobs
&lt;/h1&gt;

&lt;p&gt;We split the work so we could code without getting in each other's way.&lt;/p&gt;

&lt;p&gt;Jing's Part (Backend):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up the server that handles all the data&lt;/li&gt;
&lt;li&gt;Built the database that stores courses, students, and quizzes&lt;/li&gt;
&lt;li&gt;Created the AI agents that generate study materials&lt;/li&gt;
&lt;li&gt;Wrote strict tests to make sure the AI output is correct every time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Liuyi's Part (Frontend):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built the interface students see&lt;/li&gt;
&lt;li&gt;Built the interface instructors see&lt;/li&gt;
&lt;li&gt;Made the 3D flashcards and quiz experience feel smooth and fun&lt;/li&gt;
&lt;li&gt;Tested the whole system end-to-end&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  How We Used AI: Two Different Ways
&lt;/h1&gt;

&lt;p&gt;Claude Web Chat — We used this for big-picture thinking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Designing what the database should look like&lt;/li&gt;
&lt;li&gt;Planning our testing strategy&lt;/li&gt;
&lt;li&gt;Sketching out how the interface should flow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Antigravity &amp;amp; Claude Code (Terminal) — We used this for actual coding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writing and testing code in the IDE&lt;/li&gt;
&lt;li&gt;Making sure the AI outputs are reliable&lt;/li&gt;
&lt;li&gt;Preventing the AI from making stuff up (hallucinating)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The split was clean: Claude Web for strategy, Terminal Claude for execution.&lt;/p&gt;

&lt;h1&gt;
  
  
  Part 1: The Foundation
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Authentication (Logging In Safely)
&lt;/h1&gt;

&lt;p&gt;The app treats instructors and students completely differently. Once you log in, the system instantly knows what you can and can't see. Students can't peek at teacher dashboards. Teachers can't see individual student passwords. Everything is locked down.&lt;/p&gt;

&lt;h1&gt;
  
  
  Database Design
&lt;/h1&gt;

&lt;p&gt;We designed the database to store:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User accounts (name, email, role)&lt;/li&gt;
&lt;li&gt;Courses and modules&lt;/li&gt;
&lt;li&gt;Student quiz submissions and scores&lt;/li&gt;
&lt;li&gt;Learning goals for each module&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key insight: We store individual student data separately from class-wide statistics. This way, a teacher can see "the class average on this question is 62%" without knowing which student got it wrong.&lt;/p&gt;

&lt;h1&gt;
  
  
  Teacher Control: "Audience Customization"
&lt;/h1&gt;

&lt;p&gt;Before the AI generates anything (quiz, flashcard, summary), the teacher sets an "audience profile." This tells the AI who it's writing for. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"High school biology, age 14-15"&lt;/li&gt;
&lt;li&gt;"No religious references"&lt;/li&gt;
&lt;li&gt;"Use analogies from sports"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This prevents the AI from making weird or inappropriate content.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Real-Time Dashboard
&lt;/h1&gt;

&lt;p&gt;Instead of showing numbers in a boring table, we built a live dashboard that updates as students submit quizzes. It shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where the class is strongest&lt;/li&gt;
&lt;li&gt;Where the class is struggling most&lt;/li&gt;
&lt;li&gt;How fast students are improving&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The teacher can see this instantly and adjust their next lesson.&lt;/p&gt;

&lt;h1&gt;
  
  
  Part 2: The Brain (AI Features)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  The AI Agents
&lt;/h1&gt;

&lt;p&gt;We built three AI "workers" that each do one job:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Summary Agent — Reads the course material and writes a short study guide&lt;/li&gt;
&lt;li&gt;Flashcard Agent — Creates question-and-answer pairs from the material&lt;/li&gt;
&lt;li&gt;Quiz Agent — Generates multiple-choice and essay questions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These agents don't just output raw text. They output structured data (JSON) that the app can use immediately.&lt;/p&gt;

&lt;h1&gt;
  
  
  Keeping AI Honest: Testing
&lt;/h1&gt;

&lt;p&gt;AI can make things up. So we force every AI output through tests before it gets used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the JSON look right?&lt;/li&gt;
&lt;li&gt;Are there enough questions?&lt;/li&gt;
&lt;li&gt;Is the answer actually in the source material?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If any test fails, the AI tries again. We even set up Git hooks that prevent code changes if tests are broken.&lt;/p&gt;

&lt;h1&gt;
  
  
  Cool UI: 3D Flashcards &amp;amp; Smart Quizzes
&lt;/h1&gt;

&lt;p&gt;Instead of just showing text, we made:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;3D Flashcards — Flip them over with a realistic 3D animation&lt;/li&gt;
&lt;li&gt;Smart Quizzes — One question at a time. When you submit, the AI instantly tells you why you got it wrong (not just "that's incorrect")&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Part 3: Quality &amp;amp; Testing
&lt;/h1&gt;

&lt;p&gt;Automated Testing Pipeline (CI/CD)&lt;/p&gt;

&lt;p&gt;Every time someone pushes code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tests run (Pytest for backend, Vitest for frontend)&lt;/li&gt;
&lt;li&gt;The code is scanned for bugs (linting)&lt;/li&gt;
&lt;li&gt;Browser tests run automatically (Playwright)&lt;/li&gt;
&lt;li&gt;Security checks run (scan for passwords accidentally committed)&lt;/li&gt;
&lt;li&gt;The app deploys automatically to the live server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All 9 stages run in parallel. If any stage fails, the deployment stops.&lt;/p&gt;

&lt;h1&gt;
  
  
  Checking if AI Is Good
&lt;/h1&gt;

&lt;p&gt;When the AI generates a quiz, we ask another AI: "Is this a good quiz?" It scores it on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is it related to the lesson?&lt;/li&gt;
&lt;li&gt;Is it clear and understandable?&lt;/li&gt;
&lt;li&gt;Did the AI make up false information?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We track these scores over time to see if our AI is getting better or worse.&lt;/p&gt;

&lt;h1&gt;
  
  
  Part 4: How We Actually Used AI (The Workflow That Worked)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  How MCP Solved the Context Problem
&lt;/h1&gt;

&lt;p&gt;The biggest waste of time with traditional AI tools is copy-pasting. You paste your database schema into chat. Then your API routes. Then your data models. Back and forth, over and over.&lt;/p&gt;

&lt;p&gt;We solved this with MCP (Model Context Protocol). It's a configuration file that lets Claude Code read our project files automatically. Claude could see our database structure, our API routes, and our data models without us having to explain them.&lt;/p&gt;

&lt;p&gt;When we asked Claude Code to build the teacher dashboard API, it already knew our database setup. It wrote correct code immediately. This cut our bugs and back-and-forth by about 70%.&lt;/p&gt;

&lt;h1&gt;
  
  
  Git Hooks: Stopping Bad Code Before It Happens
&lt;/h1&gt;

&lt;p&gt;AI can make mistakes. Code might have bugs, or data might be formatted wrong. We didn't want broken code in our main branch.&lt;/p&gt;

&lt;p&gt;So we set up Git hooks. When Claude Code finished writing code, the system automatically ran all tests. If any test failed, the code couldn't be saved. Claude had to read the error message and fix it. This forced Claude to debug itself until everything passed.&lt;/p&gt;

&lt;p&gt;We never once merged broken code to main.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Workflow Pattern That Worked
&lt;/h1&gt;

&lt;p&gt;Instead of just saying "write code," we created a repeatable process: Explore → Plan → Implement → Commit&lt;/p&gt;

&lt;p&gt;Here's what that means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explore: Claude searches through our project files to understand the structure&lt;/li&gt;
&lt;li&gt;Plan: Claude writes out the steps before writing any code&lt;/li&gt;
&lt;li&gt;Implement: Claude writes the actual code&lt;/li&gt;
&lt;li&gt;Commit: Claude saves the work with clear messages about what changed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This meant Claude Code wasn't just guessing. It followed the same workflow every time, which made the code better and more predictable.&lt;/p&gt;

&lt;h1&gt;
  
  
  Two Different AI Jobs
&lt;/h1&gt;

&lt;p&gt;We used Claude in two completely different ways:&lt;/p&gt;

&lt;p&gt;Claude Web (the browser) handled big-picture thinking: database design, testing strategy, interface wireframes. We didn't need to be super technical with it.&lt;/p&gt;

&lt;p&gt;Claude Code (the terminal) handled actual coding: writing functions, running tests, debugging. It worked inside our IDE with access to our actual files.&lt;/p&gt;

&lt;p&gt;This separation was crucial. The browser Claude didn't need every detail. The terminal Claude focused only on writing and testing. When you split the work like this, both tools get better at their specific jobs.&lt;/p&gt;

&lt;h1&gt;
  
  
  Lessons Learned
&lt;/h1&gt;

&lt;p&gt;The biggest one: AI doesn't fix bad architecture. If your database design is messy, or your tests are weak, AI code will be messy too. We won the game by building strong foundations first, then using AI to fill in the details.&lt;/p&gt;

&lt;p&gt;The key insight: Don't use AI like a chatbot. Use it like a tool in your development pipeline. When you give it clear context (MCP), a repeatable process (the Explore → Plan → Implement → Commit pattern), and automatic quality checks (Git hooks), AI can move incredibly fast while staying reliable.&lt;/p&gt;

&lt;p&gt;For a two-person team, this made the difference between a 12-week project being impossible and being doable.&lt;/p&gt;

&lt;h1&gt;
  
  
  Tech Used
&lt;/h1&gt;

&lt;p&gt;Frontend: React, Vite, Tailwind CSS&lt;br&gt;
Backend: FastAPI, Python&lt;br&gt;
Database: PostgreSQL&lt;br&gt;
AI: Claude API with structured outputs&lt;br&gt;
Hosting: Vercel (frontend), Render (backend)&lt;/p&gt;

&lt;h1&gt;
  
  
  Links
&lt;/h1&gt;

&lt;p&gt;Code: &lt;a href="https://github.com/MelanieLLY/LearnMateAI" rel="noopener noreferrer"&gt;https://github.com/MelanieLLY/LearnMateAI&lt;/a&gt;&lt;br&gt;
Live App: &lt;a href="https://learn-mate-ai-zeta.vercel.app" rel="noopener noreferrer"&gt;https://learn-mate-ai-zeta.vercel.app&lt;/a&gt;&lt;br&gt;
API: &lt;a href="https://learnmate-api.onrender.com" rel="noopener noreferrer"&gt;https://learnmate-api.onrender.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Key Features&lt;/p&gt;

&lt;p&gt;✅ Teachers see live class confusion radar (no privacy invasion)&lt;br&gt;
✅ Students get AI tutors that give instant feedback&lt;br&gt;
✅ 3D interactive flashcards and quizzes&lt;br&gt;
✅ AI-generated study materials tested for accuracy&lt;br&gt;
✅ Automatic testing pipeline for every code change&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>SkillGap: Building an AI-Powered Career Assistant</title>
      <dc:creator>Jing</dc:creator>
      <pubDate>Fri, 13 Mar 2026 22:09:56 +0000</pubDate>
      <link>https://forem.com/jing_2026/skillgap-building-an-ai-powered-career-assistant-2985</link>
      <guid>https://forem.com/jing_2026/skillgap-building-an-ai-powered-career-assistant-2985</guid>
      <description>&lt;h2&gt;
  
  
  SkillGap: Building an AI-Powered Career Assistant
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Jing Ng &amp;amp; Liuyi · Spring 2026&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction: The Vision of SkillGap
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Problem
&lt;/h3&gt;

&lt;p&gt;Job descriptions are hard to read. They are long, full of buzzwords, and it is genuinely difficult to know if you qualify. Most people either talk themselves out of jobs they could get, or apply to roles they are not ready for.&lt;/p&gt;

&lt;p&gt;There is no quick, honest way to compare your skills to what a job actually needs. That is the problem we wanted to solve.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Solution
&lt;/h3&gt;

&lt;p&gt;SkillGap does the comparison for you. Paste a job description into the app. It checks it against your saved skill profile and gives you a match score, a breakdown of your skills into three groups (Have / Missing / Bonus), and a personalized AI learning roadmap.&lt;/p&gt;

&lt;p&gt;You get a clear, actionable plan instead of a guess. As you learn and update your profile, your results improve too.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Two-Person, Two-Tier Approach
&lt;/h3&gt;

&lt;p&gt;We divided the work so both of us could build at the same time without conflicts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jing&lt;/strong&gt; built the foundation: JWT authentication, skill profile CRUD, the keyword extraction engine, and the animated match ring.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Liuyi&lt;/strong&gt; built the smarter layer: Claude API integration for the learning roadmap, the TDD testing framework, framer-motion UI animations, Skeleton UI loading states, and the AI evaluation suite.&lt;/p&gt;

&lt;h3&gt;
  
  
  Two Ways We Used AI
&lt;/h3&gt;

&lt;p&gt;We used two AI tools in different roles throughout the project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Web&lt;/strong&gt; handled planning and artifacts. Jing used it to turn early ideas into a prioritized plan. Liuyi used it to convert a hand-drawn wireframe into a proper UI reference, and later to generate the evaluation results webpage from real test data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Antigravity&lt;/strong&gt; handled coding inside the IDE. Both of us used it to write, refactor, and debug code across the frontend and backend.&lt;/p&gt;

&lt;p&gt;The split was simple: Claude Web for planning, Antigravity for building.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part I: The Foundation: Building the Core
&lt;/h2&gt;

&lt;h3&gt;
  
  
  JWT Authentication and User Accounts
&lt;/h3&gt;

&lt;p&gt;Everything in SkillGap depends on knowing who the user is. We built JWT-based authentication first: signup, login, logout, and protected routes that reject unauthenticated requests at the API boundary.&lt;/p&gt;

&lt;p&gt;Passwords are salted and hashed before they reach the database. JWT tokens are validated on every protected request. We built this first because every other feature depends on it.&lt;/p&gt;

&lt;p&gt;On top of auth, we built full CRUD operations for the skill profile. Users can add, edit, and delete skills at any time. Changes persist immediately, so every new analysis uses the latest version of the profile.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data Modeling with SQLAlchemy
&lt;/h3&gt;

&lt;p&gt;We designed the SQLAlchemy schema to support the full app from the start. The core tables cover users, skill profiles, and analysis history. The history table lets users look back at past analyses and track how their match scores improve over time.&lt;/p&gt;

&lt;p&gt;We used Alembic for migrations. Any schema change is a migration file that can be reviewed, tested, and rolled back cleanly instead of a risky manual database edit.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Keyword Extraction Engine
&lt;/h3&gt;

&lt;p&gt;This is the core algorithm of the product. The engine takes a job description and a user's skill profile, compares both against a curated list of tech skills, and produces three outputs: skills the user has that the job wants, skills the job wants that the user does not have, and bonus skills the user brings that the job did not ask for.&lt;/p&gt;

&lt;p&gt;The matching uses keyword normalization so common variations map to the same skill. "React," "ReactJS," and "React.js" all resolve to the same entry. The vocabulary covers frontend, backend, infrastructure, and data tools.&lt;/p&gt;

&lt;p&gt;The engine lives in its own module, separate from the auth and profile modules. That made it straightforward to unit test in isolation and easy to extend later.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Animated Match Ring
&lt;/h3&gt;

&lt;p&gt;A raw percentage is hard to read at a glance. We built an animated SVG ring that shows the match score visually: green for a strong match, yellow for partial, red for a significant gap. The ring draws progressively on page load so the result feels like it is being calculated rather than just appearing.&lt;/p&gt;

&lt;p&gt;Below the ring, the three-column view shows the exact skills behind the score so users can see what drove the number.&lt;/p&gt;

&lt;h3&gt;
  
  
  Claude Web for Early Product Definition
&lt;/h3&gt;

&lt;p&gt;Before writing any code, Jing used Claude Web to work through the project design in plain language. The conversations helped pin down the core user flow, figure out which features to build first, and surface questions that the PRD did not answer yet. For example, what should the app do when a job description mentions a skill that is not in the curated list? What should a new user see before they have set up a profile?&lt;/p&gt;

&lt;p&gt;Getting those decisions made before touching the code saved significant debugging time later.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part II: The Brain: AI and Engineering
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Claude API Integration for Learning Roadmaps
&lt;/h3&gt;

&lt;p&gt;The extraction engine tells you what skills you are missing. The Claude API tells you what to do about it.&lt;/p&gt;

&lt;p&gt;After the engine produces a list of missing skills, the FastAPI backend sends those skills and the original job description to the Claude API. Claude returns a structured JSON roadmap. Each step in the roadmap has a skill focus, recommended resources, estimated time, and a short explanation of why that skill appears at that point in the sequence.&lt;/p&gt;

&lt;p&gt;The React frontend parses the JSON and renders it as a row of cards, one per topic, so the plan is easy to read and act on. It is not a generic list of links. It is a personalized, ordered plan built around what the specific job needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  TDD for the Engine, AI Evaluation for the Roadmap
&lt;/h3&gt;

&lt;p&gt;AI features are harder to test than deterministic code because the output changes every time. We handled the two parts with different approaches.&lt;/p&gt;

&lt;p&gt;For the extraction engine, we used strict TDD. Tests were written before any implementation code. Every module in &lt;code&gt;server/tests/&lt;/code&gt; has a corresponding &lt;code&gt;test_&amp;lt;module_name&amp;gt;.py&lt;/code&gt; file, and the CI pipeline blocks any merge that drops pytest coverage below 80%.&lt;/p&gt;

&lt;p&gt;For the Claude roadmap, we built an AI Assessment Test Suite that scores each response on three dimensions: Relevance (do the resources match the missing skill?), Specificity (does it give concrete next steps rather than vague advice?), and Completeness (does it cover every missing skill?). These scores feed into the eval dashboard.&lt;/p&gt;

&lt;h3&gt;
  
  
  Backend Security
&lt;/h3&gt;

&lt;p&gt;Two security issues came up during development that were not in the original plan.&lt;/p&gt;

&lt;p&gt;The first was client-side score spoofing. The match score was being calculated on the React frontend and sent to the FastAPI backend for storage, which meant a user could manipulate the value before it was saved. We moved the calculation entirely to the server so any client-provided score is ignored.&lt;/p&gt;

&lt;p&gt;The second was unhandled SQLAlchemy exceptions. Database errors were returning 500 responses that included full stack traces, which exposes internal implementation details. We added a global error handler that logs the full detail server-side and returns a clean, safe error message to the client.&lt;/p&gt;

&lt;p&gt;Both issues were caught in code review before they reached production.&lt;/p&gt;

&lt;h3&gt;
  
  
  UI Polish with framer-motion and Skeleton UI
&lt;/h3&gt;

&lt;p&gt;We did a focused UI pass to make the app feel responsive, especially during the Claude API call which takes a few seconds.&lt;/p&gt;

&lt;p&gt;We used framer-motion to add staggered animations to the skill columns and roadmap cards. Results animate in one after another rather than all appearing at once, which makes the page feel like it is presenting information rather than dumping it.&lt;/p&gt;

&lt;p&gt;While the Claude API call is in flight, the results panel shows a Skeleton UI placeholder that matches the shape of the real content. Users see the layout of what is coming instead of a blank screen, which makes the wait feel much shorter.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wireframe to Production: Liuyi's UI Workflow
&lt;/h3&gt;

&lt;p&gt;Liuyi started with a hand-drawn sketch of the dashboard layout. That sketch went into Claude Web, which generated a detailed wireframe with component suggestions and layout reasoning. The wireframe became the design spec for the production implementation, which was then built with Antigravity inside the IDE.&lt;/p&gt;

&lt;p&gt;The workflow was: sketch to Claude Web wireframe to production build. Having a concrete reference before writing any React code meant fewer design guesses and fewer rewrites.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part III: Quality and Evaluation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  CI/CD with GitHub Actions
&lt;/h3&gt;

&lt;p&gt;Every pull request goes through a multi-stage GitHub Actions pipeline before it can merge: lint (ruff and ESLint), security scan, pytest, and build. The coverage check is a hard gate. If backend coverage drops below 80%, the pipeline fails and the PR is blocked.&lt;/p&gt;

&lt;p&gt;No secrets live in the codebase. API keys, JWT secrets, and database connection strings are stored in GitHub Secrets and injected at runtime. The app deploys to Render automatically when a PR merges to main.&lt;/p&gt;

&lt;p&gt;The pipeline enforces the quality standards that are easy to skip when they only live in a document. A rule wired into CI runs every single time.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI-as-a-Judge Evaluation
&lt;/h3&gt;

&lt;p&gt;To evaluate the roadmaps Claude generates, we used a second AI call as the judge. After Claude produces a roadmap, a batch evaluation job sends that roadmap plus the original missing skills and job description to an LLM evaluator. The evaluator scores the response on Relevance, Specificity, and Completeness using a fixed rubric.&lt;/p&gt;

&lt;p&gt;Using AI to evaluate AI output is the practical approach for testing non-deterministic results at scale. It does not replace human review, but it makes it possible to run evaluations across many test cases and get consistent, structured scores that can be tracked over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Evaluation Webpage Artifact
&lt;/h3&gt;

&lt;p&gt;Liuyi ran the full evaluation suite on real test data and passed the results into Claude Web. Claude Web generated an evaluation webpage artifact: a clean, readable summary of all the scores with notes explaining what drove the high and low marks.&lt;/p&gt;

&lt;p&gt;The page served two purposes. It gave us a concrete quality signal on the Claude API integration. And it produced shareable documentation that shows exactly how the AI output was measured and what the results were.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Efficiency Gains from an AI-First Workflow
&lt;/h3&gt;

&lt;p&gt;Using Claude Web for planning and Antigravity for implementation made the whole development process significantly faster. The biggest gains came from two places: early planning conversations that cleared up ambiguity before any code was written, and in-IDE acceleration that handled boilerplate and caught errors during implementation rather than after.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why the Two AI Roles Needed to Stay Separate
&lt;/h3&gt;

&lt;p&gt;Claude Web is a conversation. It works well for open-ended thinking, generating artifacts, and working through decisions that are not well-defined yet. Antigravity operates directly on your files. It works well for writing, refactoring, and debugging real code.&lt;/p&gt;

&lt;p&gt;Mixing the two roles would have been slower. Copying code from a chat window into a file adds friction. Using a conversational tool for planning loses the iterative loop that surfaces better decisions. Keeping each tool in its role made both more effective.&lt;/p&gt;

&lt;h3&gt;
  
  
  Future Roadmap
&lt;/h3&gt;

&lt;p&gt;The most valuable technical upgrade from here would be replacing keyword extraction with sentence-transformer embeddings for semantic skill matching. The current engine only matches exact keywords. It cannot recognize that "component-based UI development" means React. Semantic matching would make the app useful for a much wider range of job descriptions, including ones written in plain English rather than keyword lists.&lt;/p&gt;

&lt;p&gt;Other ideas include resume parsing so users can build their skill profile from an uploaded document, and a reverse analysis mode where an employer checks a candidate's profile against a job posting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;SkillGap started as a class project and became something we are proud to show. The modular architecture meant both of us could work independently without stepping on each other's code. A shared &lt;code&gt;.antigravityrules&lt;/code&gt; file meant we agreed on conventions before they became conflicts. And splitting AI responsibilities cleanly between planning and building gave us speed without losing control of the output quality.&lt;/p&gt;

&lt;p&gt;The biggest thing we learned: AI tools make a good engineering process faster. They do not replace the need for one.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Tech Stack Skill Gap Analyzer · Jing Ng &amp;amp; Liuyi · Spring 2026&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/MelanieLLY" rel="noopener noreferrer"&gt;
        MelanieLLY
      &lt;/a&gt; / &lt;a href="https://github.com/MelanieLLY/SkillGap" rel="noopener noreferrer"&gt;
        SkillGap
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;SkillGap — Tech Stack Skill Gap Analyzer&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A web app that helps job seekers identify skill gaps from job descriptions
Paste a JD, see your match score, and get an AI-generated learning roadmap.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Team 7:&lt;/strong&gt; Jing Ng · Liuyi Yang&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Project links&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;GitHub repository link: &lt;a href="https://github.com/MelanieLLY/SkillGap" rel="noopener noreferrer"&gt;https://github.com/MelanieLLY/SkillGap&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Frontend production URL: &lt;a href="https://skillgapweb.netlify.app" rel="nofollow noopener noreferrer"&gt;https://skillgapweb.netlify.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Backend API base URL (optional): &lt;a href="https://skillgap-api-hrsc.onrender.com" rel="nofollow noopener noreferrer"&gt;https://skillgap-api-hrsc.onrender.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Eval Dashboard document link or repo path:
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/MelanieLLY/SkillGap/docs/skillgap_eval_dashboard.html" rel="noopener noreferrer"&gt;docs/skillgap_eval_dashboard.html&lt;/a&gt; or &lt;a href="https://github.com/MelanieLLY/SkillGap/docs/skillgap_eval_dashboard.pdf" rel="noopener noreferrer"&gt;docs/skillgap_eval_dashboard.pdf&lt;/a&gt; if prefer pdf.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MelanieLLY/SkillGap/docs/eval_roadmaps/ai_eval_results.pdf" rel="noopener noreferrer"&gt;docs/eval_roadmaps/ai_eval_results.pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Blog post link:
&lt;ul&gt;
&lt;li&gt;Jing: &lt;a href="https://dev.to/jing_2026/skillgap-building-an-ai-powered-career-assistant-2985" rel="nofollow"&gt;https://dev.to/jing_2026/skillgap-building-an-ai-powered-career-assistant-2985&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Liuyi: &lt;a href="https://www.melanieyang.info/post/skillgap-building-an-ai-powered-career-assistant" rel="nofollow noopener noreferrer"&gt;https://www.melanieyang.info/post/skillgap-building-an-ai-powered-career-assistant&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Video link: &lt;a href="https://youtu.be/MdN4UXqrERU" rel="nofollow noopener noreferrer"&gt;https://youtu.be/MdN4UXqrERU&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Relative paths for key documentation package artifacts: &lt;a href="https://github.com/MelanieLLY/SkillGap/docs/" rel="noopener noreferrer"&gt;docs/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Tech Stack&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; React 18, TypeScript, Vite, Tailwind CSS, Zustand&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; FastAPI, Python 3.11, SQLAlchemy, PostgreSQL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI:&lt;/strong&gt; Claude API (claude-sonnet-4-20250514)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;
&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/36835097/562615579-a8bc11e0-ef4b-4c96-b46f-4b56c599619a.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NDM3MTYsIm5iZiI6MTc3NDY0MzQxNiwicGF0aCI6Ii8zNjgzNTA5Ny81NjI2MTU1NzktYThiYzExZTAtZWY0Yi00Yzk2LWI0NmYtNGI1NmM1OTk2MTlhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAzMjclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMzI3VDIwMzAxNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTliN2ZjMmZiMmFlMGM0MmM4ODM4NGMyM2JjNzg0ZTBhM2ZhYzM5NmQ3ZmYzYTZiNjYzZjY1Y2UxOGM5YjliNTUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.l5xqrZfkE-UEty2SeF18jWgweveINqpEDmF4IdZALlE"&gt;&lt;img width="600" alt="Screenshot 2026-03-12 at 4 28 16 PM" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F36835097%2F562615579-a8bc11e0-ef4b-4c96-b46f-4b56c599619a.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NDM3MTYsIm5iZiI6MTc3NDY0MzQxNiwicGF0aCI6Ii8zNjgzNTA5Ny81NjI2MTU1NzktYThiYzExZTAtZWY0Yi00Yzk2LWI0NmYtNGI1NmM1OTk2MTlhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAzMjclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMzI3VDIwMzAxNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTliN2ZjMmZiMmFlMGM0MmM4ODM4NGMyM2JjNzg0ZTBhM2ZhYzM5NmQ3ZmYzYTZiNjYzZjY1Y2UxOGM5YjliNTUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.l5xqrZfkE-UEty2SeF18jWgweveINqpEDmF4IdZALlE"&gt;&lt;/a&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Screenshots&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Login page&lt;/h3&gt;

&lt;/div&gt;
&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/36835097/562564320-e87a84cc-509c-4268-af6e-f27dbcf52289.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NDM3MTYsIm5iZiI6MTc3NDY0MzQxNiwicGF0aCI6Ii8zNjgzNTA5Ny81NjI1NjQzMjAtZTg3YTg0Y2MtNTA5Yy00MjY4LWFmNmUtZjI3ZGJjZjUyMjg5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAzMjclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMzI3VDIwMzAxNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPThjZjI0ZWRiMTMzODRkZTgzZWQ0NjZmNGY0ODQwYThmNTJjYjJjM2E2NDE5MTNhNWYzOTYzYzE2MWRjZTNiMzAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.-GK6Tg8hkaOWbZdk5wFnL89LV3EyqC1D8wd0yygBXNI"&gt;&lt;img width="600" alt="Login page" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F36835097%2F562564320-e87a84cc-509c-4268-af6e-f27dbcf52289.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NDM3MTYsIm5iZiI6MTc3NDY0MzQxNiwicGF0aCI6Ii8zNjgzNTA5Ny81NjI1NjQzMjAtZTg3YTg0Y2MtNTA5Yy00MjY4LWFmNmUtZjI3ZGJjZjUyMjg5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAzMjclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMzI3VDIwMzAxNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPThjZjI0ZWRiMTMzODRkZTgzZWQ0NjZmNGY0ODQwYThmNTJjYjJjM2E2NDE5MTNhNWYzOTYzYzE2MWRjZTNiMzAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.-GK6Tg8hkaOWbZdk5wFnL89LV3EyqC1D8wd0yygBXNI"&gt;&lt;/a&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Sign up page&lt;/h3&gt;

&lt;/div&gt;
&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/36835097/562564557-80c94f72-4cc7-4d7c-a633-ef2272248f9c.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NDM3MTYsIm5iZiI6MTc3NDY0MzQxNiwicGF0aCI6Ii8zNjgzNTA5Ny81NjI1NjQ1NTctODBjOTRmNzItNGNjNy00ZDdjLWE2MzMtZWYyMjcyMjQ4ZjljLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAzMjclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMzI3VDIwMzAxNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWI5NmRkNjM4NTJlODY4MzEwNTlkNDIwNDIwNTk0NTRiYWRmMTExZDI4MjZhZmM1Mjg2NDU5ZGExZGFlODFlZjAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.IirrgU-qqTf3qrCuyPfWQ7maStHmEmXGE2iW87X2NmA"&gt;&lt;img width="600" alt="Sign up page" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F36835097%2F562564557-80c94f72-4cc7-4d7c-a633-ef2272248f9c.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NDM3MTYsIm5iZiI6MTc3NDY0MzQxNiwicGF0aCI6Ii8zNjgzNTA5Ny81NjI1NjQ1NTctODBjOTRmNzItNGNjNy00ZDdjLWE2MzMtZWYyMjcyMjQ4ZjljLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAzMjclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMzI3VDIwMzAxNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWI5NmRkNjM4NTJlODY4MzEwNTlkNDIwNDIwNTk0NTRiYWRmMTExZDI4MjZhZmM1Mjg2NDU5ZGExZGFlODFlZjAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.IirrgU-qqTf3qrCuyPfWQ7maStHmEmXGE2iW87X2NmA"&gt;&lt;/a&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Profile Setup Page&lt;/h3&gt;

&lt;/div&gt;
&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/36835097/562570707-3a92c5ea-fade-4b8b-9baa-9a702f9cbda9.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NDM3MTYsIm5iZiI6MTc3NDY0MzQxNiwicGF0aCI6Ii8zNjgzNTA5Ny81NjI1NzA3MDctM2E5MmM1ZWEtZmFkZS00YjhiLTliYWEtOWE3MDJmOWNiZGE5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAzMjclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMzI3VDIwMzAxNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTFmNzA1Y2Q5OTRhNzEwZWEzZGE2YWM0YTQ4NDRhMzQ1ZjgxZWI2MDdjOTY2MjExZTVkN2FiN2JlYTU1Y2Y2ZGMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.NNiLG39h2dTRx8hj63ZzAk2oXMRnn7jaDA0diEFxdrY"&gt;&lt;img width="1000" alt="Screenshot 2026-03-12 at 2 44 13 PM" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F36835097%2F562570707-3a92c5ea-fade-4b8b-9baa-9a702f9cbda9.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NDM3MTYsIm5iZiI6MTc3NDY0MzQxNiwicGF0aCI6Ii8zNjgzNTA5Ny81NjI1NzA3MDctM2E5MmM1ZWEtZmFkZS00YjhiLTliYWEtOWE3MDJmOWNiZGE5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAzMjclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMzI3VDIwMzAxNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTFmNzA1Y2Q5OTRhNzEwZWEzZGE2YWM0YTQ4NDRhMzQ1ZjgxZWI2MDdjOTY2MjExZTVkN2FiN2JlYTU1Y2Y2ZGMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.NNiLG39h2dTRx8hj63ZzAk2oXMRnn7jaDA0diEFxdrY"&gt;&lt;/a&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Main Dashboard - Skill Match Analysis&lt;/h3&gt;

&lt;/div&gt;
&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/36835097/562607907-bedb4ad3-89da-4c37-98ef-d4654d7b6de7.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NDM3MTYsIm5iZiI6MTc3NDY0MzQxNiwicGF0aCI6Ii8zNjgzNTA5Ny81NjI2MDc5MDctYmVkYjRhZDMtODlkYS00YzM3LTk4ZWYtZDQ2NTRkN2I2ZGU3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAzMjclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMzI3VDIwMzAxNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTg0ZDgyZTc2Y2I3ZjRhOGQ3NDMzYmU3OWY3YTIzYTcxZGE1MTlhMjY0M2VmZjE5ZDIyY2Y5ZjI2YzhkODAyZGUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.C7s0QuluhSkCMnPqjl_pv3J1OGsDV0xIH4_wUUNbLS4"&gt;&lt;img width="1094" height="1245" alt="Screenshot 2026-03-12 at 4 07 02 PM" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F36835097%2F562607907-bedb4ad3-89da-4c37-98ef-d4654d7b6de7.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NDM3MTYsIm5iZiI6MTc3NDY0MzQxNiwicGF0aCI6Ii8zNjgzNTA5Ny81NjI2MDc5MDctYmVkYjRhZDMtODlkYS00YzM3LTk4ZWYtZDQ2NTRkN2I2ZGU3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAzMjclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMzI3VDIwMzAxNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTg0ZDgyZTc2Y2I3ZjRhOGQ3NDMzYmU3OWY3YTIzYTcxZGE1MTlhMjY0M2VmZjE5ZDIyY2Y5ZjI2YzhkODAyZGUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.C7s0QuluhSkCMnPqjl_pv3J1OGsDV0xIH4_wUUNbLS4"&gt;&lt;/a&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;System Architecture&lt;/h2&gt;

&lt;/div&gt;
&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/36835097/562550422-d3def8ab-c815-4c69-aa8d-dd8b4037d7ce.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NDM3MTYsIm5iZiI6MTc3NDY0MzQxNiwicGF0aCI6Ii8zNjgzNTA5Ny81NjI1NTA0MjItZDNkZWY4YWItYzgxNS00YzY5LWFhOGQtZGQ4YjQwMzdkN2NlLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAzMjclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMzI3VDIwMzAxNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTFhMGMyNWQ2NGUwNmZiNzVhYzViMjA0YzNhZTQzOTM4ZGQwMTczMjIzZGE3YzA4OGQ1NzEyMDRjYjAzNThjODAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.kmucCZ6q8-z9OIZd7TObfx7q6TeYISzOU3KFXGXvzYg"&gt;&lt;img width="600" alt="System architecture" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F36835097%2F562550422-d3def8ab-c815-4c69-aa8d-dd8b4037d7ce.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NDM3MTYsIm5iZiI6MTc3NDY0MzQxNiwicGF0aCI6Ii8zNjgzNTA5Ny81NjI1NTA0MjItZDNkZWY4YWItYzgxNS00YzY5LWFhOGQtZGQ4YjQwMzdkN2NlLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAzMjclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMzI3VDIwMzAxNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTFhMGMyNWQ2NGUwNmZiNzVhYzViMjA0YzNhZTQzOTM4ZGQwMTczMjIzZGE3YzA4OGQ1NzEyMDRjYjAzNThjODAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.kmucCZ6q8-z9OIZd7TObfx7q6TeYISzOU3KFXGXvzYg"&gt;&lt;/a&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Request flow when user submits a job description&lt;/h3&gt;

&lt;/div&gt;
&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/36835097/562550775-b5f22eee-229e-4164-9734-40b3c3a0bd4f.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NDM3MTYsIm5iZiI6MTc3NDY0MzQxNiwicGF0aCI6Ii8zNjgzNTA5Ny81NjI1NTA3NzUtYjVmMjJlZWUtMjI5ZS00MTY0LTk3MzQtNDBiM2MzYTBiZDRmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAzMjclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMzI3VDIwMzAxNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTBlOTgzZGMzMGE1YmQyY2U5N2ZiYzIzODEyOTM0OWNjOWJkNjBjMzE0ODMwYWRlZGQ3NTNiMGMzZDAwMTdiNGMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.KwMW0wS917qX1qc1MoC957I1saCg42xMlike1Y8Y1-0"&gt;&lt;img width="500" alt="Request flow" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F36835097%2F562550775-b5f22eee-229e-4164-9734-40b3c3a0bd4f.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NDM3MTYsIm5iZiI6MTc3NDY0MzQxNiwicGF0aCI6Ii8zNjgzNTA5Ny81NjI1NTA3NzUtYjVmMjJlZWUtMjI5ZS00MTY0LTk3MzQtNDBiM2MzYTBiZDRmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAzMjclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMzI3VDIwMzAxNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTBlOTgzZGMzMGE1YmQyY2U5N2ZiYzIzODEyOTM0OWNjOWJkNjBjMzE0ODMwYWRlZGQ3NTNiMGMzZDAwMTdiNGMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.KwMW0wS917qX1qc1MoC957I1saCg42xMlike1Y8Y1-0"&gt;&lt;/a&gt;
&lt;p&gt;The user pastes a job description, our server compares it against their saved skill profile, calculates…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/MelanieLLY/SkillGap" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




</description>
      <category>ai</category>
      <category>webdev</category>
      <category>antigravity</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
