Inspiration
Remote interviews have gotten weird.
With AI copilots like Cluely helping candidates answer questions in real time, it's becoming harder for recruiters to know whether they're hearing from the candidate or an AI assisting them in the background. That makes it harder to assess what someone actually knows and how they think under pressure.
However, we do not want to create a soulless black-box system that filters out candidates directly. Rather, we want to create a solution that empowers recruiters to make more accurate and faster decisions.
What it does
Snitch is an end-to-end online interview platform with built-in video calling and interview analytics. It surfaces signs of AI-generated answers from real-time cheating tools, checks how well responses align with the candidate's CV, and tracks speaking rhythm. It is also equipped with signature AI defence that involves planting visual canaries that humans can't see but multimodal AI assistants can, stopping them from interfering with the interview.
How we built it
We built Snitch around a Next.js interview room and recruiter review dashboard, with a Python + FastAPI pipeline handling the analysis and Firebase managing our data and recorded files.
- Next.js: Live interview room and recruiter review dashboard.
- Python + FastAPI: Interview signal processing and analysis pipeline.
- AssemblyAI: Word-level transcription, including pauses.
- GPTZero + OpenAI: AI-shaped language analysis and CV consistency checks.
- Firebase: Firestore and Storage for application data and recordings.
Codex and Claude Code were part of our development workflow throughout the weekend. They helped us move quickly, but we still had to make the architecture decisions, validate the approaches, and figure out what actually worked.
Codex helped us turn our idea into a working prototype through implementation, debugging, testing, and iteration. It helped build the live interview and screen-sharing workflow, connect recordings to post-interview reviews, and add automatic checks for canary-related language in candidate answers.
It also helped prototype, troubleshoot backend connection errors and Git conflicts, write tests for answer matching, and verify the recording workflow. We initially explored subtle visual overlays, then evolved our approach into a script that embeds a hidden message in an image without a noticeable visual change.
Challenges we ran into
One of our biggest challenges was figuring out how to make our canary approach work in practice.
We initially explored using audio canaries to detect AI copilots, but ran into concerns about whether the signals would survive noise suppression. That led us to explore visual canaries instead, embedding subtle identifiers into shared content and checking whether they could later be detected in a candidate's responses. Getting the approach to work reliably took a lot of research, experimentation, and iteration.
We also had to decide whether to build our own video conferencing experience or integrate with an existing platform like Zoom. Building it ourselves added more work, but gave us greater control over the interview experience, screen sharing, recording, and how our detection experiments fit into the product.
On top of that, we had to think about how to make the interface approachable for recruiters. There's a lot of complexity happening under the hood, but the person reviewing an interview shouldn't need to understand the entire pipeline to use the product.
Accomplishments that we're proud of
We're proud that we built a complete interview experience rather than just a standalone analysis script.
Recruiters and candidates can join a video call, share their screens, and record an interview. Behind that, we built a review pipeline that combines transcription, timing and language signals, resume consistency checks, and GPTZero integration.
We're especially proud of the visual canary experiment. It took a lot of trial and error to move from the initial idea to something we could actually integrate into the interview experience.
Most importantly, we tried to make the results useful to a recruiter. Instead of returning a single suspiciousness score, Snitch surfaces specific moments, provides context, and gives the recruiter a starting point for further investigation.
What we learned
Building detection is the easy part. Deciding what the detection actually means is much harder.
A model can identify patterns, but it doesn't know the whole story behind a candidate's answer. We learned that a useful system needs to communicate uncertainty instead of hiding it behind a score.
We also learned how much work goes into making several imperfect signals work together. A long pause isn't proof of anything. Neither is an unusual phrase or a mismatch in someone's response. The goal is to give recruiters more context and better questions to ask, not to make the decision for them.
Building Snitch made us think beyond whether we could detect something and towards whether the result would actually be useful, fair, and actionable in a real interview.
What's next for Snitch
We'd like to explore how our visual canary approach performs across different AI copilots and real-time interview environments.
On the analysis side, we'd improve paraphrased-answer detection, expand the CV consistency checks, and test the system across a wider range of accents, speaking styles, and recording setups.
We'd also like to make the review experience more useful for recruiters by improving how evidence is presented and making it easier to follow up on specific moments from an interview.
Built With
- fastapi
- firebase
- firestore
- gptzero
- next.js
- openai
- pydantic
- python
- railway
- react
- typescript
- uvicorn
- vercel
Log in or sign up for Devpost to join the conversation.