Inspiration
Every team has sent or received an email like "hey, they need it finalized soon." It's not laziness, it's that context lives in a document somewhere, not in the inbox. That gap between what someone means and what the recipient can actually act on is where deadlines get missed, threads spiral into "wait, who's 'they'?", and the wrong person ends up owning the wrong task. We wanted to see if an AI model that could actually read the surrounding documents not just the sentence in isolation could close that gap automatically, right where the vague email is being written.
What it does
Contxtify is a Chrome extension that runs inside Gmail. As you type, it flags genuinely vague references pronouns like "they," "it," "this," and timeframes like "soon," "later," "asap" without drowning your draft in markup. Attach context (upload a PDF or paste in a doc, a thread, meeting notes anything), and Contxtify resolves each vague word into the specific name, date, or team that document actually points to, with the source cited next to the suggestion so it's never a black box. Resolving one reference also re-evaluates everything connected to it: once you confirm who "they" is, the suggestions for the rest of the draft get re-ranked around that answer instead of staying static.
How we built it
The extension is Manifest V3, vanilla JS, no build step a content script watches the compose box using the CSS Custom Highlight API to flag vague words without touching the underlying DOM text. Since Gmail runs on HTTPS and can't directly call a local backend, the content script messages a background service worker, which proxies every request out to our Node/Express server. That server chains two Mistral models: open-mistral-nemo does fast first-pass detection, and mistral-large-2512 does the actual contextual reasoning reading the attached document and resolving each flagged word against it. PDF context is extracted server-side with pdfjs-dist (the same engine behind Firefox's PDF viewer).
Challenges we ran into
Calling Mistral once per vague word hit rate limits almost immediately, so the "re-rank the rest after one selection" step batches every remaining word into a single call instead of one call each. The detector also over-flagged early on words like "end" got flagged even when a specific date sat right next to them so we hard-coded a whitelist and explicit disambiguation rules instead of trusting the model's judgment alone. The harder call was what to do when Mistral genuinely couldn't resolve a word: we decided against ever inventing a plausible-sounding fallback answer, since a confident-looking wrong guess is worse than an honest "couldn't resolve this one" especially live in front of judges.
Accomplishments that we're proud of
Getting a real two-model pipeline working reliably enough to demo live, not just in a controlled test run. The re-ranking behavior in particular where resolving one reference sharpens every other suggestion in the draft turned out to be the thing that made people go "wait, it does that?" when we showed it. We're also proud that every suggestion is traceable back to where it came from in the source document, instead of just trusting the model blind.
What we learned
Splitting detection and resolution into two smaller, cheaper model calls beat throwing everything at one large call faster, and easier to keep reliable. We also learned that trust comes less from raw model capability and more from the guardrails around it: a whitelist, a refusal to fabricate answers, and citing sources did more for how "real" the tool felt than any single prompt tweak.
What's next for Contxtify
Pulling context automatically from tools teams already use Slack threads, Confluence pages, Jira tickets instead of requiring a manual upload or paste. Awareness of multiple recipients on a thread, since "they" can mean something different to each person reading it. A hosted, authenticated backend instead of localhost, and surfacing the model's own uncertainty in the UI when a resolution is a best guess rather than a confident match.
Log in or sign up for Devpost to join the conversation.