Inspiration

Job hunting today means opening dozens of company career pages, fighting clunky applicant portals, and scrolling aggregators like LinkedIn and Indeed. By the time a promising role reaches a major board, hundreds of people have already applied. Many active openings sit on the company's own applicant tracking system (Greenhouse, Lever, Ashby, Personio) long before, or instead of, appearing on the big aggregators. I am a masters student in Ireland looking for AI engineering work outside the big hubs, so I felt this directly. Pointing an AI agent at the problem seems obvious, but naive autonomous agents fail fast: they loop, invent requirements that are not in the posting, behave differently on identical inputs, and burn tokens. I wanted something fundamentally different: a deterministic, zero trust system that finds openings straight from company boards every morning, and never tells me anything it cannot prove.

What it does

EaseApply is an automated, zero trust job discovery and resume tailoring system.

  • Configured once. The user sets their target role, seniority, work mode and preferred locations, several separated by semicolons, and uploads a resume. They return only to change something.
  • Direct ATS discovery. It reads public JSON endpoints from Greenhouse, Lever, Ashby and Personio directly, with no scraping and no credentials.
  • Hidden Gem detection. It checks each posting against two open job APIs, Arbeitnow and RemoteOK. A role posted in the last seven days, not found on either, and scoring 70 or higher is flagged as a Hidden Gem. The flag is computed by code, never asserted by a model.
  • Zero trust scoring. A fit scoring agent runs across parallel batches of postings, and every matched or missing skill must come with a verbatim quote from the job description. Code checks that quote actually exists in the stored posting, and drops any claim it cannot find.
  • Grounded tailoring. On demand, it rewrites resume lines for a chosen role. A rewrite is dropped unless its original line exists in the resume, and any tool the resume never mentions is flagged beside it.
  • Unattended morning run. Every morning at 7:00, AWS runs the full pipeline and emails only postings that have never been scored for this profile. Widening your locations surfaces roles fetched earlier and filtered out at the time, and nothing is ever sent twice. Live demo: https://huggingface.co/spaces/Prashant-Mahto/easeapply (a replay of a stored run with no network or model calls; the deployed system runs on AWS)

How I built it

I built EaseApply around the Workflow pattern rather than an open ended agent loop. Six specialised agents do the judgment work, and plain Python decides the order.

  • Agents. Built with the AWS Strands Agents SDK: Resume Profiler (A1), Sourcing Strategist (A2), Fit Scorer (A3), Gap Synthesist (A4), Tailoring Agent (A5) and A6 Ranker. A deterministic control plane in pipeline.py calls them in a fixed order, so no model ever decides what runs next.
  • Foundation model. Amazon Nova 2 Lite on Amazon Bedrock, via the Converse API. On live runs, around 90 percent of the claims it proposes survive span verification, between 89 and 94 percent across the runs I measured.
  • Deterministic filtering. Python filters on title, seniority, work mode and location proximity before any model is called, cutting roughly 22,000 postings from 272 boards down to about 57. A full run takes about a minute and costs roughly eight cents.
  • Runtime and scheduling. An ARM64 container on Amazon Bedrock AgentCore Runtime, built by CodeBuild and stored in ECR, invoked every morning by Amazon EventBridge Scheduler.
  • State and delivery. Amazon S3 holds the SQLite blackboard across ephemeral sessions, Amazon SES delivers the HTML digest, and Amazon CloudWatch carries the run narrative, a dashboard and GenAI Observability.
  • Interface. A local Gradio dashboard for setup, live runs streamed back from AWS over SigV4, verification scores, tailoring, and an on demand email button.

Challenges I ran into

  • Preventing hallucination. Models invent requirements and overstate skill matches. I built a verification gate where every model output stays an untrusted proposal until code confirms each claimed skill appears as a quote in the source text, after normalising whitespace and case. Postings also get IDs before any agent sees them, and any ID the model returns that was not in the request is discarded, which makes a fabricated job structurally impossible.
  • Getting onto AWS at all. As person that has not used AWS much across projects. Navigating through all the AWS Services and working with the those services like S3, AgentCore Runtime, Bedrock, StrandAgent SDK was a challenge on its own that I had to face.
  • Heterogeneous boards. Each ATS returns a different schema, location format and remote flag. Normalising them and matching locations by city, country and region without calling a model took careful parsing.

Accomplishments that I'am proud of

  • A verification engine I trust. Every skill claim behind a match, and every gap insight, is checked against the stored job description or resume before I see it.
  • Eight cents a morning. A full discovery run across 22,000 postings costs about $0.08, around $2.33 a month at one run a day, because code does the volume work and models only see what survives the filter.
  • Truly unattended. EventBridge, AgentCore, S3 and SES handle discovery, diffing and delivery with no daily interaction.
  • A clean, bounded architecture. Typed boundaries, a one directional workflow and isolated parallel batches mean there is no agent loop to run away and no path for a posting to redirect the flow.

What I learned

  • Deterministic workflows beat autonomous loops for background work. Keeping control flow in ordinary code and using models only for specialised inference gives a system you can test and reason about.
  • Verify, don't trust. Fencing untrusted text as data and checking every quoted claim against source text makes an AI pipeline reliable. A useful side effect: the share of claims that survives is a direct measure of how much a model makes up.
  • Test the schedule, not the configuration. "Created successfully" is not the same as "works". A three minute test firing caught a failure that would otherwise have surfaced days later.

What's next for EaseApply

  • Broader ATS coverage. Adding boards such as Workday and Taleo, which expose postings differently from the four supported today.
  • Assisted applications. Pre filling verified answers into company application portals.
  • Multiple target roles. Separate profiles and digests, for example Backend Engineer alongside AI Solutions Architect.
  • Shared board discovery. Letting users contribute confirmed public ATS endpoints so everyone's coverage widens.
  • Accurate cost reporting. Correcting the budget guard's price table, which currently bills Nova 2 Lite at the older Nova Lite rate and understates run cost roughly ninefold.

Built With

Share this project:

Updates

Submission history