This is a submission for the Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle
What I Built
Every placement season, a lot of students in India get some version of this message. (This one is a composite I wrote; the pattern is the real part.)
"Congratulations! You have been selected for our internship. Please pay a βΉ1,999 registration fee to confirm your seat. Share your Aadhaar and the OTP you receive for verification. Offer valid for 24 hours only."
It comes from a Gmail address, for a company whose website is a month old. And it works, because a student chasing their first rΓ©sumΓ© line is the person least likely to stop and check.
TrustIntern is an investigation desk for internship offers. You paste in the company name, the recruiter's email, the website and the message, and you can attach the offer letter as a PDF or a screenshot. TrustIntern then:
- runs fixed checks (email domain vs. company, domain age via RDAP, the website itself, the wording of the message),
- sends a small team of research agents to look into the company, the recruiter and public complaints, with a Gemma 4 planner deciding which agents to launch,
- has Gemma 4 vision read the offer letter or screenshot,
- and returns a risk score you can recompute by hand. Every point is tied to a specific piece of evidence.
Every report says: "Heuristic indicator score, not a probability of fraud." It shows evidence and calls nobody a scammer.
The side hustle
Who would pay for this? Not students, and that's on purpose.
- Students: free. The people being targeted shouldn't have to pay for protection. With local Gemma it costs almost nothing to run.
- Colleges and placement cells: paid. Bulk verification of the offers circulating in student WhatsApp groups, with a shareable report per offer.
- Job boards and internship platforms: paid API. Screen listings and recruiter accounts before they go live.
- Postmortem report: a one-off paid report for someone who has already been scammed. It's an evidence-backed write-up of what happened, which they can attach to a complaint to their college, the platform, or the cybercrime portal.
That last idea didn't come from me. It came from my first tester (more on that below).
Demo
π Live: https://trustintern.charancodes.com
In the recording I typed in a fresh fake offer from "Global Talent Solutions Ltd": a Gmail recruiter, a βΉ1,999 "refundable registration fee" via UPI within 24 hours, and a request for Aadhaar plus OTP. It scored 80/100: Upfront fee +25, Email domain mismatch +20, Sensitive data request +20, Urgency or guarantee +10, Personal email provider +5. The company name did appear in the domain, so that check came back clear and added nothing. Live lookups were on, but the fake domain didn't resolve, so the website and domain-age checks say Not checked instead of guessing. The built-in "Consistent offer" sample scored 0/100.
And here's the built-in Suspicious sample (a fictional "Aurora Tech Pvt Ltd" offer):
Hit investigate, and the run streams live over SSE: checkers, then spawned agents, then findings.
The finding leads with the number, then shows the arithmetic:
90 = 25 upfront fee
+ 20 email domain mismatch
+ 20 sensitive data request
+ 10 company not in domain
+ 10 urgency or guarantee
+ 5 personal email provider
Each chip is tied to the sentence that triggered it. Nothing is subtracted, and the total is capped at 100.
Download it all as a PDF:
Code
compteccharan
/
TrustIntern
TrustIntern is an AI-powered platform that evaluates the authenticity and scam risk of internship and job opportunities by analyzing company details, recruiters, websites, communications, documents, and digital evidence to generate an explainable risk assessment.
TrustIntern π΅οΈ
An investigation desk that tells students whether an internship offer is a scam, and shows its working.
TrustIntern looks at the company name, recruiter email, website, message text, and an offer-letter PDF or screenshot. It runs a small team of research agents and returns an explainable risk score: every point is tied to a specific piece of evidence. Reports download as a PDF.
Heuristic indicator score, not a probability of fraud.
Live demo: https://trustintern.charancodes.com
How it works
- Fixed checkers look at the email domain, domain age (RDAP), website and message text.
- Gemma 4 plans which research agents to launch: company, recruiter, complaints, domain, document, follow-up. Only allowlisted agent types run; at most 8 agents and depth 2.
- Gemma 4 vision reads the offer letter (PDF or screenshot) and flags inconsistencies.
-
Deterministic scoring (
backend/app/scoring.py) adds up fixed indicator points: upfront fee 25, domain mismatch 20, sensitiveβ¦
MIT licensed. The API contract, including the scoring rules, lives in backend/CONTRACT.md.
How I Built It
Architecture
ββββββββββββββββββββββββββββββββββββββββββββ
Student ββΆ β Investigation desk (Vite + React, jsPDF)β
βββββββββββββββββ¬βββββββββββββββββββββββββββ
β POST run Β· SSE event stream
βββββββββββββββββΌβββββββββββββββββββββββββββ
β FastAPI (Vercel services: /api β py) β
β β
β 1. Fixed checkers βββ β
β domain, RDAP, β evidence ledger β
β wording, site βΌ β
β 2. Planner βββΆ allowlisted agents β
β Gemma 4 company Β· recruiter Β· β
β (fallback: complaints Β· domain Β· β
β heuristics) document Β· follow-up β
β max 8 agents, depth 2 β
β 3. Gemma 4 vision: offer PDF/screenshot β
β β β
β 4. scoring.py βββββββ deterministic, β
β (Gemma never recomputable β
β touches this) β
ββββββββββββββββββββββββββββββββββββββββββββ
Gemma 4: local gemma4:e2b via Ollama
hosted demo β Gemma 4 via Google's Gemini API
Stack: FastAPI, Python agents (requests, BeautifulSoup, pypdf, pypdfium2), Gemma 4, React 18 + Vite, jsPDF, Vercel, GitHub Actions CI.
Gemma 4 does the thinking, rules do the math
Gemma 4 has two jobs:
-
Planner. It reads what the fixed checkers found and decides which research agents to launch next. If a recruiter's name turns up, a recruiter agent goes after it. If a strange domain turns up, a domain agent does. The planner can only pick from an allowlist: in
registry.py, "Unknown types from the planner are never executed." - Multimodal reader. Scam offers rarely arrive as tidy PDFs. They arrive as WhatsApp screenshots, so Gemma 4 vision reads either and pulls out claims to compare against everything else.
Locally, I run gemma4:e2b through Ollama on my own laptop, and it was fast. The hosted demo can't reach my laptop, so it falls back to Gemma 4 served through Google's Gemini API (gemma-4-26b-a4b-it). Same open-weight family. If no model is reachable at all, a heuristic planner takes over and the investigation still finishes.
The one rule I never let bend, written into CONTRACT.md under "Scoring boundary (non-negotiable)":
Gemma / OSINT never invent indicator points.
The docstring on gemma_client.py says it in four words: "Never scores." Gemma interprets evidence; scoring.py sums fixed points. Run the Suspicious sample with live lookups off and you get 90 every time, pinned by tests.
The pivot I didn't plan for
When I asked my agent to "run a real test case and check if the osint ai and hueristics hold" against real Reddit and LinkedIn data, reality pushed back:
"DuckDuckGo and Reddit's own API are blocked from this network. Switching OSINT to PullPush (Reddit archives) and Wikipedia, then running a live end-to-end case."
A few minutes later: "Live OSINT worked." That fix now lives in agents/workers/_fetch.py, and the reason for it is one search away (next section).
The Agent Sessions Behind It
I built TrustIntern in a single day, inside a 5.5-hour hackathon plan, by directing Cursor agents, subagents and parallel workers. I saved the sessions with DevRelay, and they're public on my DEV profile. Here's the build, told through five moments from them.
1. "It would not win"
I opened with a plan and a demand: "this plan must win me an hackathon , so plan the best , i need the best plan." The agent's answer changed the whole project:
"The current plan would finish. It would not win. The score a judge can recompute, with the exact sentence beside each point, is the part other teams will not have."
That's the reason scoring.py exists the way it does.
2. A locked plan, then workers in parallel
I split the work ("build just the backend , another member builds the frontend"), and the agent turned the split into a contract: "Backend owns the number." Then I locked it: "lock in with the final plan , I will do a final review and lets get building." Each worker agent got the plan file with one instruction in capitals: "Do NOT edit the plan file." The Gemma worker also had to keep "locked sample scores (suspicious=90 with live_lookups=false)."
3. Choosing the brain
I asked for "a multi agent orchestrator that does real time osint research β¦ dont use api alone." The agent made me choose. I picked an "LLM planner (Gemma or similar) β¦ with heuristic spawn as fallback when the model is down," and replied, with my usual eloquence: "use gemma for the multi modal orchestration :0 btw sse it is ( its cool )."
4. "Is there really multimodal AI?"
Later I got suspicious of my own project: "is there really multimodal ai , and is it using an open source or gemma ai ? because both the conditions are very much required for this to ever win." The agent checked honestly. Gemma was wired up, but it only ever saw a PDF page. So it added screenshot upload into the same Gemma 4 vision call, and noted: "Points still come only from scoring.py." Commit eed6eba: "Judges need a live open-weight Gemma call on an uploaded image, and the desk only sent PDFs."
5. Gemma on my own machine, secrets kept out
"i need to use gemma 4 locally and run this project" got me Ollama and gemma4:e2b:
The deploy prompt opened with guardrails: "Do not print secrets. Do not commit or push git. Do not read or upload backend/.env."








Top comments (1)
An Exceptional , innovative and Urated Idea I've heard . Hoping to get many inspirations from your side. βπ»πΏ