Inspiration

I built Verity because finding opportunities online is unnecessarily difficult.

Students and early-career professionals constantly search for internships, jobs, fellowships, scholarships, and Master's programmes across dozens of websites. The problem isn't always a lack of opportunities; it's finding the right ones and knowing whether the information can actually be trusted.

A search result might say an opportunity is remote, but the actual page may not confirm it. A listing may appear paid without clearly stating the stipend. An opportunity may look perfect until you discover that applicants from your country aren't eligible.

I wanted to build something that doesn't just find opportunities, but checks the important details before presenting them to the user.

That became Verity.

What it does

Verity is an AI-powered opportunity discovery and verification agent.

Users tell Verity what they are looking for using simple filters:

  • Opportunity type — internship, job, Master's, fellowship, or grant
  • Field — AI/ML, data science, software engineering, data engineering, and more
  • Location
  • Remote, hybrid, or on-site
  • Funding requirements

Verity then searches the web for relevant opportunities, retrieves the actual opportunity pages, analyses the available evidence, and ranks the results based on how well they match the user's requirements.

Each result includes:

  • Match score
  • Opportunity description
  • Funding information
  • Location
  • Eligibility
  • Deadline
  • Verification status
  • Why it matched
  • Direct application link

Most importantly, Verity does not fill missing information with guesses. When an important detail cannot be confirmed, it says "Not verified."

How we built it

We built Verity with Python, Streamlit, Gemini, web search, and web scraping.

The system follows a multi-stage pipeline:

   text

User preferences ↓ Search query generation ↓ Web discovery ↓ Opportunity candidates ↓ Page scraping ↓ Gemini AI analysis ↓ Evidence-based matching ↓ Verification + ranking ↓ Personalized results

The Streamlit interface handles the user experience and lets users define exactly what they want.

The search layer discovers potential opportunities across the web. I then scraped the relevant pages so that the AI agent has access to the actual opportunity content rather than relying only on search snippets.

Gemini acts as the reasoning layer. It evaluates each opportunity against the user's requirements and produces structured JSON containing the opportunity details, match score, verification status, and explanation.

I also added defensive cleaning and validation to prevent AI-generated HTML or Markdown from leaking into the application UI.

The core design principle was simple:

Search broadly. Verify carefully. Never invent.

Challenges I ran into

The biggest challenge was trustworthy information retrieval.

The web is messy. Job boards, reposted listings, search snippets, expired opportunities, and incomplete pages can all contain conflicting information.

I had to make Verity distinguish between:

  • What the source explicitly confirms
  • What can reasonably be matched
  • What is missing
  • What is no longer valid

Another challenge was getting the AI output into a reliable structure that the application could render consistently. Early iterations sometimes returned HTML formatting inside supposedly structured results. We solved this by enforcing structured JSON output, strengthening the system instructions, and adding a cleaning layer before displaying results.

I also had to think carefully about match scores. A result shouldn't receive a high score just because it contains the words "AI" and "remote." A high score should mean the important requirements are actually supported by evidence.**

Accomplishments that I am proud of

I am proud that we turned a simple idea "help me find opportunities" into an end-to-end AI agent that can actually discover, analyze, verify, and rank opportunities.

I am particularly proud of the verification-first approach.

Instead of presenting AI-generated answers as facts, Verity makes uncertainty visible. If it cannot confirm whether something is paid, remote, eligible for a particular country, or still open, the user sees "Not verified."

I also built a user-friendly interface that transforms a complicated search query into a few simple choices.

Most importantly, Verity is not just a chatbot returning recommendations. It is a working pipeline that connects user intent → web research → page retrieval → AI reasoning → structured verification → actionable opportunities.

What I learned

I learned that building a useful AI application requires much more than connecting an LLM to a prompt.

Garbage in, garbage out became very real during development.

The quality of the AI's answer depends on the quality of the sources I retrieve and the evidence I provide to the model.

I also learned the importance of separating discovery from verification. Search engines are excellent for finding candidates, but they aren't necessarily enough to verify an opportunity.

Most importantly, I learned that knowing when not to claim something is just as important as knowing what to say.

That principle became central to Verity.

What's next for Verity

Verity's next step is turning opportunity discovery into a continuous personal career assistant.

I want to add:

  • Personalised profiles based on a user's skills, education, and experience
  • CV-based opportunity matching
  • Deadline tracking and reminders
  • Application tracking
  • Automatic monitoring for newly posted opportunities
  • Stronger source credibility scoring
  • Personalised opportunity alerts
  • Application-readiness checks
  • More education opportunities such as scholarships and fully funded Master's programmes

The long-term vision is simple:

Verity should know what opportunities exist, understand which ones make sense for you, and help you act on them before they disappear.

Find opportunities. Verify the important details. Make your next move.

Built With

Share this project:

Updates

Submission history