Job-Giene: The Career OS That Turns AI Advice Into a Progress Loop

A TypeScript full-stack app that scores resumes, simulates interviews, tracks XP, and forces Gemini into structured JSON so the whole system can stay coherent.

10 min read • View on GitHub • More from Arnavj217

A wide editorial scene shows a career game board made of resume pages, interview cards, and learning tiles, with a user avatar moving along a track while a central machine feeds structured cards into the system. The image explains that the product is built around persistent progress, not one-off AI answers.
Job-Giene treats career prep like a system that remembers. Progress is the point, and AI is the mechanism that keeps feeding the loop.
Key Takeaways

Career prep, but with memory

Most career tools stop at a useful output. Job-Giene keeps going. It stores profile state, gamification signals, resume data, and scoring history so each new action can build on the last one instead of replacing it.

That design choice is the real product thesis. XP, streaks, badges, and completed tasks are not decoration. They are the visible surface of a backend that treats career development as an accumulating state machine.

THIS PROJECT IS IN ALPHA. IT IS AN EXPERIMENT. DO NOT USE THIS ON YOUR MAIN LINKEDIN ACCOUNT. YOU WILL GET BANNED. USE A FAKE ACCOUNT.

Arnav Jain, Creator/Maintainer · Job-Giene GitHub README
A hedcut-style portrait of Arnav Jain based on his GitHub avatar. The portrait serves as a verified reference for the creator behind the project and anchors the article in the repo's actual maintainer.

The part most AI apps skip: state

The codebase’s biggest clue is the data model. A User document carries far more than login data. It appears to hold XP, streaks, badges, profile fields, and completed tasks alongside authentication state. That means the product is designed around continuity, not isolated sessions.

Just as important, the repository keeps analytical records separate. Resume and ATSScore are modeled as distinct entities, which lets the app preserve raw resume content while tracking scoring over time. That separation matters because it makes trends visible without forcing every new insight to overwrite the old one.

The app does not trust the model to be neat. It cleans the response, validates the shape, and only then lets the UI and database touch it.

How Gemini becomes a product feature instead of a text box

The technical center of gravity is cleanAndParseJSON. The function exists because LLMs are messy in predictable ways. They wrap JSON in markdown, add stray commentary, or return almost-correct fragments that break a UI if you trust them blindly.

Job-Giene responds with a defensive pipeline. It extracts the usable JSON, repairs common formatting issues, and only then hands the result to the rest of the app. That is a subtle but important product move: the frontend is never asked to interpret prose. It receives contracts.

A close editorial scene shows a messy strip of paper emerging from an LLM output machine, with tangled text, markdown markers, and half-finished JSON on one side. On the other side of a narrowing gate, the same information is cleaned into orderly cards that feed a dashboard, explaining how structured parsing protects the product from model noise.
The app survives by turning unpredictable model output into typed objects. That gate is the difference between an AI demo and an AI product.
function cleanAndParseJSON(raw: string) {
  const start = raw.indexOf('{');
  const end = raw.lastIndexOf('}');
  if (start === -1 || end === -1 || end <= start) return null;

  const candidate = raw.slice(start, end + 1)
    .replace(/```json|```/g, '')
    .trim();

  try {
    return JSON.parse(candidate);
  } catch {
    return null;
  }
}

Authentication that hints at a transition

The auth layer mixes JWT verification with a fallback x-user-email header. That reads like a product in transition. The system is clearly moving toward stricter sessions, but it still preserves a developer-friendly path for interim flows and admin checks.

The result is pragmatic, not elegant. It works because it balances security, convenience, and migration reality. In a young product, that often matters more than theoretical purity.

Why separate Resume from ATSScore?

This schema choice keeps the system honest. Resume content is the source material. ATSScore is the analysis of that material. By separating them, the app can show improvement over time without pretending the analysis is the same thing as the document itself.

DimensionResume builderATSScoreJob-Giene
Source of truthDocument textEvaluation resultBoth, kept separate
Time dimensionUsually overwrittenUsually ephemeralPersistent history
AI roleDrafting helpScoring helpStructured service layer
User experienceSingle outputSingle metricClosed loop progression

That separation also creates room for iteration. If the scoring rubric changes, the app can update the analysis model without losing the original resume record. That is the kind of small architectural decision that makes dashboards, trends, and coaching possible later.

What this competes with

Job-Giene sits across several categories at once, but it does not fully belong to any of them. It is closer to a system that combines pieces competitors usually sell separately.

Tool typeWhat it gives youWhat it lacksJob-Giene's edge
Resume buildersPolished documentsMemory and progressionPersistent state and scoring
ATS toolsScreening feedbackNext-step planningLooped guidance across tasks
Interview prep appsPractice promptsProfile continuityShared user state
Generic chatbotsFlexible adviceStructure and persistenceTyped JSON contracts
All-in-one dashboardsMany featuresUnified progression modelCareer loop as the core unit

The differentiator is not feature count. It is the unit of value. Job-Giene treats progress over time as the primary product object, and everything else is there to support that.

The tradeoff: more coherence, more fragility

This architecture is strong because it is coherent. It is fragile because every layer has to behave. If the model output drifts, the parser has to catch it. If the auth model shifts, the fallback path has to stay safe. If the gamified state gets out of sync, the whole loop feels broken instead of helpful.

That is the cost of building a stateful AI product. You get memory, compounding progress, and richer UX. You also inherit a much harder consistency problem than a simple chatbot ever has to solve.