JobJam — Project Story

Inspiration

When preparing for interviews, I noticed most apps offered AI-only simulations — but they lacked real human interaction. Practicing alone with a chatbot doesn’t prepare you for the nerves, improvisation, and connection required in a real conversation. It also doesn’t help those without a professional network to practice with.

That’s where the idea for JobJam came from:
A mobile app where users can instantly get matched with someone else based on similar job interests, hop on a live video call, and practice interviews together — anonymously and safely.

The goal is to make career prep inclusive, human, and accessible to everyone, no matter their background or connections.


What I Learned

  • How to implement real-time matching systems using embedding vectors and similarity thresholds
  • How to integrate Hugging Face Inference APIs into mobile apps
  • How to host and secure a video token server using Render
  • Best practices for creating anonymous yet secure user flows using Firebase Authentication
  • How to combine human interaction with AI assistance in a seamless UX

How I Built It

JobJam was built using:

  • SwiftUI for the frontend
  • Firebase for anonymous auth and Firestore database
  • Hugging Face Inference API using the model intfloat/e5-large-v2 to convert user job descriptions into embeddings
  • A custom matching system that calculates cosine similarity between embedding vectors:

$$ \cos(\theta) = \frac{A \cdot B}{|A| |B|} $$

where ( A ) and ( B ) are the two users’ embeddings

  • If the similarity score exceeds a certain threshold (e.g., 0.8), users are paired
  • Agora powers the video call interface
  • A Node.js token server deployed on Render generates secure channel tokens
  • In-call chatbot support is powered by Gemini API, so users can ask for interview questions, tips, or feedback without leaving the call

Challenges I Faced

  • Real-time matching with embeddings required careful queue logic to avoid stale matches or overmatching
  • Handling asynchronous API calls (Hugging Face + Firestore) while maintaining a responsive user interface in SwiftUI
  • Integrating Agora with SwiftUI and ensuring smooth transitions between matched calls
  • Managing edge cases — such as users leaving the queue or dropping the call mid-match
  • Ensuring that the Gemini-powered chatbot didn’t interfere with the natural flow of the conversation, but added value

What's Next

I plan to continue building JobJam to:

  • Add rating/feedback features after calls
  • Create structured interview modes with timed questions
  • Enable persistent profiles and resume uploads
  • Expand the matchmaking algorithm to support broader categories and experience levels

Built With

Share this project:

Updates