Why a guard after the prompt
A prompt that says 'do not invent facts' is a request. The fact guard is a check: it compares the rewrite against the original resume and throws the rewrite away if anything new appears.
A job board for Indian freshers: twelve source adapters, explainable rule-based classification, and AI resume tools behind a fact guard that rejects anything the candidate did not write.
Freshers in India wade through listings that are mislabelled, duplicated, or scams, then rewrite the same resume for every application. AI can help with the writing, but a resume that gains a skill or a number the candidate never had is worse than no help.
01
Adapters collect jobs from applicant-tracking APIs and structured job markup, respecting robots.txt and sanitizing every field. A pure, I/O-free plan normalizes, validates, classifies, and deduplicates, then applies everything in one transaction.
02
An ordered rule set labels each job's experience level and returns the IDs of the rules that fired. 'Unknown' is a normal answer and is never shown as fresher-friendly.
03
A model router uses Gemini Flash, retries on a lighter model after a rate limit or timeout, and can use OpenAI instead. With no key at all, every AI feature falls back to a deterministic version.
04
Prompts forbid new employers, numbers, or skills and turn missing facts into placeholders. Then a post-check rejects any rewrite that adds a number, a known skill, or a proper noun that is not in the original resume.
05
Rewrites are accepted line by line. Applying one checks the source line has not changed and escapes LaTeX, so a rewrite cannot inject commands into the generated PDF.
06
Optional embeddings power job matching, built from skills and preferences only: no name, grades, or pay go to the embedding model.
07
Lookalike domains, punycode, fee or UPI requests, and personal email addresses are caught by deterministic rules, logged anonymously, and rate limited.
A prompt that says 'do not invent facts' is a request. The fact guard is a check: it compares the rewrite against the original resume and throws the rewrite away if anything new appears.
The Apply Copilot extension authenticates with its own bearer token, is allowed only from extension origins, and each user has a quota enforced in the database.
Pure functions get unit tests, the web app gets Playwright flows, the database gets pgTAP assertions run against a throwaway local Supabase in CI, and the LaTeX service gets its own build check.
Next.js · TypeScript · FastAPI · Supabase Postgres (RLS) · pgTAP · Gemini / OpenAI · Chrome extension (MV3) · Playwright · Vitest · Docker LaTeX