Inspiration

Getting a job offer should be exciting. But the offer you receive is not always exactly the job you originally applied for.

A salary range can become a single lower number. A hybrid role can become fully on-site. A bonus can disappear. A probation period can suddenly appear.

The problem is that by the time someone receives an offer, the original job posting may be weeks old, buried in another tab, or no longer online. And because the candidate is focused on finally getting the job, it is easy to miss small changes that could have a big impact. That inspired PlotTwist.

The idea is simple:

The job you accept should be the job you applied for.

PlotTwist gives candidates a clear way to compare the original job posting with the final offer before they sign.

What it does

PlotTwist compares an original job posting with a final job offer and identifies important differences across employment terms such as:

  • Salary
  • Job title
  • Remote, hybrid, or on-site arrangements
  • Paid time off
  • Bonus
  • Location
  • Working hours
  • Probation
  • Benefits

Each term is classified as:

  • Changed — the term appears in both documents, but the details differ
  • Missing — the job posting mentioned it, but the offer does not
  • New — the offer introduces something that was not in the posting
  • Match — the terms remain consistent

Users can paste text, upload PDFs, or provide a public job-posting URL.

PlotTwist then presents the comparison alongside the original source evidence so users can see exactly where each finding came from.

Instead of negotiating for the user or providing legal advice, PlotTwist also turns important differences into practical “Things to clarify” questions that a candidate can raise before signing.

How we built it

PlotTwist is built with Next.js, React, TypeScript, Tailwind CSS, Google Gemini, Zod, Cheerio, and Vercel.

One of the most important architectural decisions was separating AI extraction from comparison logic.

Gemini is used to read messy, unstructured job postings and offer letters and extract structured employment terms.

From there, PlotTwist's own deterministic comparison logic decides whether each term is Changed, Missing, New, or Match.

This means the model does not simply generate a conclusion about whether two documents match. It extracts the facts, and the application applies predictable comparison rules to those facts.

The flow is:

  1. The user provides the job posting and offer.
  2. PlotTwist reads the source, whether it is pasted text, a PDF, or a supported public URL.
  3. Gemini extracts structured employment terms from both documents.
  4. PlotTwist compares the extracted terms deterministically.
  5. The results page shows the findings alongside source evidence.
  6. Important differences are converted into practical questions worth clarifying.

I also built dedicated states for loading, invalid or low-information inputs, blocked URLs, and responsive layouts so the experience remains understandable even when the source documents are imperfect.

Challenges we ran into

One of the hardest problems was making sure the AI treated the two documents as completely separate sources.

During PDF extraction, it was important to prevent a term found in one document from accidentally being assumed to exist in the other. I solved this by clearly separating Document A — Original Job Posting and Document B — Final Offer during extraction and keeping their evidence independent.

Another challenge was handling different input formats.

Pasted text is relatively straightforward, but PDFs and public webpages are much less predictable. Public job pages can contain navigation, unrelated content, redirects, or block automated access entirely. I built a best-effort URL reader with validation, safe redirect handling, content limits, and a clear fallback to paste or upload when a page cannot be read.

A third challenge was designing the results so they did not feel like another AI-generated summary.

The goal was not just to tell someone that something changed. The user should be able to see the original wording, see the offer wording, and understand the difference themselves.

That led to the evidence-first results interface that became one of the core parts of PlotTwist.

Accomplishments that we're proud of

I am especially proud that PlotTwist evolved from a simple comparison idea into a complete working product.

The final version includes:

  • Real AI-powered extraction rather than hard-coded demo results
  • Pasted-text comparisons
  • Direct PDF comparison
  • Best-effort public job-posting URL support
  • Deterministic Changed / Missing / New / Match classification
  • Side-by-side source evidence
  • Practical clarification questions
  • Clear loading and error states
  • Responsive design
  • A public GitHub repository
  • A live production deployment

I am also proud of how focused the product remained.

It would have been easy to turn PlotTwist into a resume tool, negotiation chatbot, legal assistant, or job tracker. Instead, I kept returning to one question:

“This is what you applied for. This is what you were offered. What changed?”

That focus made the final experience much clearer.

What we learned

The biggest technical lesson was that AI does not need to control every part of an AI product.

For PlotTwist, Gemini is extremely useful for understanding inconsistent human documents. But once those documents have been converted into structured facts, deterministic application logic is better suited to deciding the comparison status.

That combination gave me a better balance between the flexibility of AI and the predictability of traditional software. Also, I learned how important evidence is in an AI interface.

A result becomes much more useful when the user can immediately inspect the source behind it rather than simply trusting the model.

Finally, I learned that building the smallest focused version of an idea can often produce a stronger product than continuously adding features. PlotTwist became better each time I removed something that distracted from the core comparison experience.

What's next for PlotTwist

The next step is to make comparisons even easier and more useful while keeping the product focused.

Future improvements could include:

  • Better support for additional document formats and job-board pages
  • More robust normalization of complex compensation and benefit structures
  • Exportable comparison reports
  • Saved comparisons for users who want to revisit an offer later
  • More context-aware clarification questions
  • Support for comparing revised offers during later negotiation rounds

The long-term goal is simple: Before someone accepts a job, PlotTwist should make it easy to know whether the offer still matches what they originally said yes to.

Built With

Share this project:

Updates

Submission history