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-v2to 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
Log in or sign up for Devpost to join the conversation.