Inspiration

Every job seeker knows the ritual: fire off applications into the void, hear nothing back, and never actually find out why. You don't know if your CV matches the role, what skills you're missing, or whether it's even worth the time to tailor your application. Meanwhile, the good listings get buried under a flood of irrelevant ones, and checking job boards every day for the one new posting that fits becomes its own part-time job.

Hovvac started from a simple frustration: applying to jobs is a guessing game, and it shouldn't be. I wanted an app that tells you the truth before you apply — how well your CV actually matches a role, what's missing, and what to fix — and then does the tedious searching for you, every day, automatically.

What it does

Hovvac pairs real-time job search (powered by Careerjet's listings) with AI-driven CV analysis (powered by Claude): upload your CV once, then compare it against any job in seconds to get a match score, the skills that line up, the gaps, and concrete suggestions. Daily Auto Search runs your saved searches in the background every day and pushes a notification the moment a new match appears — so you find out about the right job the same day it's posted, not a week later. Everything is bilingual-ready across five languages, with a full subscription tier (Hovvac Pro) for unlimited analysis and automated search.

How we built it

The frontend is Flutter (iOS + Android from one codebase), talking to a .NET 8 Web API backend on Azure, backed by Azure SQL. The stack layers cleanly by responsibility: Firebase handles auth, crash reporting, and push delivery; Careerjet supplies the job listings; Claude powers the CV gap analysis; RevenueCat manages the subscription layer across both app stores; and Brevo carries transactional email through a domain with real sender reputation, rather than relying on Firebase's own client-side email sending.

Challenges we ran into

Email deliverability. Firebase's built-in verification and password-reset emails come from a shared, low-reputation firebaseapp.com domain — they were landing in spam more often than not. The fix was generating the action links server-side via the Firebase Admin SDK and routing them through the backend's existing Brevo pipeline instead, which already had real sender reputation from live production traffic.

A ghost in the auto-search scheduler. Daily Auto Search appeared to just stop running, with no errors anywhere obvious. Tracing it down meant reading the actual crash logs line by line: a transient Azure SQL connection reset during a TLS handshake, silently swallowed because the scheduler's outer loop had no error handling around it. Fixing it meant two layers — wrapping the loop in proper error handling so one bad tick doesn't take down the whole service, and enabling EF Core's built-in retry-on-failure so transient cloud blips resolve themselves instead of losing a whole scheduled run.

A Riverpod race condition, caught by Crashlytics. A "Bad state: Future already completed" crash kept surfacing from the auth flow — a state-management notifier being torn down mid-flight (right after a successful sign-in redirect) while an async action was still completing. The documented fix (ref.mounted) turned out not to even exist in the installed framework version; I had to dig into the actual package source to confirm that before implementing the older, manually-tracked-disposal workaround — and then found the identical vulnerable pattern in six other places and fixed all of them proactively, since Crashlytics had only caught the one that happened to fire first.

Store submission, the long tail. Getting through App Store and Play Store review surfaced a string of small, specific requirements: a missing NSPhotoLibraryUsageDescription purpose string that Apple's static analysis flagged even though the feature in question was never actually exercised at runtime; the AD_ID permission needing an explicit declaration (and removal, since Hovvac does no ad targeting); Google Sign-In failing with a DEVELOPER_ERROR traced to unregistered SHA certificate fingerprints — complicated further by Play Console's newly introduced post-quantum-cryptography signing keys, which meant tracking down which of several certificates was actually the one signing what real users install.

Accomplishments that we're proud of

Real AI value, not a gimmick. The CV gap analysis isn't a novelty feature bolted on for the pitch — it returns an actual match score, the skills that line up, the gaps, and concrete suggestions, and a one-time free analysis lets anyone experience that before ever hitting a paywall.

Five languages from the start. English, French, Spanish, German, and Portuguese are fully supported throughout the app — not a stretch goal, part of the initial build.

What we learned

That the interesting bugs are rarely where you first look. A "feature isn't working" report was really a database migration gap; a "sign-in is broken" report was really a framework-internals race condition several layers below the actual auth code. Reading the actual error — the full stack trace, the actual package source, the actual database state — instead of pattern-matching to the nearest familiar bug, was the difference every time.

I also came away with a much more concrete understanding of how much surface area "ready to submit" actually covers beyond the app itself: certificate fingerprints, permission declarations, purpose strings, subscription entitlements for reviewers, deliverability reputation for transactional email — all invisible until the platform tells you it's missing, and all part of actually shipping something real.

What's next for Hovvac: Job Search & CV Match

Broader job coverage. Careerjet powers search today, but no single source catches everything. Adding a second aggregator like Adzuna alongside it — with the same content-based deduplication already built for Auto Search — would meaningfully widen the pool of listings without duplicating results.

Deeper AI feedback. The CV gap analysis tells you what's missing; the natural next step is helping you fix it — targeted resume rewrite suggestions, a tailored cover letter draft from the same match data, or interview prep questions pulled from the specific gaps identified for that role.

Smarter Auto Search. Today it matches on keywords and location. Real relevance ranking — weighting by CV match score, filtering by salary range or remote-work preference, learning from which auto-found jobs a user actually saves versus ignores — turns it from "search on a timer" into something closer to a real recommendation engine.

Beyond mobile. The backend already serves a clean, platform-agnostic API — a web companion app would let job seekers do a first CV comparison from a laptop before ever installing the app, lowering the barrier to that first "aha" moment.

Built With

  • .net-8
  • android
  • anthropic-claude-api
  • asp.net-core
  • azure-app-service
  • azure-sql-database
  • brevo
  • c#
  • careerjet-api
  • dart
  • entity-framework-core
  • firebase-analytics
  • firebase-authentication
  • firebase-cloud-messaging
  • firebase-crashlytics
  • flutter
  • github-actions
  • google-play-console
  • google-sign-in
  • ios
  • revenuecat
  • riverpod
  • sign-in-with-apple
  • sql-server
Share this project:

Updates

Submission history