Screening interviewsthat never leave the building.
zeg is a voice agent that runs a technical screen for a software engineering role. A candidate opens a link and talks. It probes what they actually did rather than taking the first answer. Your recruiter gets a 1-10 assessment with the quotes behind it — and the audio never left your hardware.
Both channels open at once. Interrupt it and it stops talking.
candidate we cut p99 latency on the checkout path
agent |
The audio has nowhere else to go.
Speech recognition, the reasoning, the voice, the transcript and the score all run on a single workstation you own. This is the part that is hard to copy and the part that closes deals.
Candidate's browser
A link, a microphone, nothing to install.
straight to your box
Speech in and out
Full-duplex audio-to-audio model, resident in GPU memory
Interview logic
Prompt, plan, wall clock, memory, prohibited-question check
Transcript
Written to local disk, under your retention policy
Assessment
1-10 with quoted evidence, scored on the same machine
One machine. Pull its network cable after the call connects and the interview still finishes.
Hosted speech API·Frontier model provider·Transcription vendor— none of these are in the diagram.
No third-party processor
Nothing in the pipeline is a vendor you have to add to a data-processing agreement. That is not a smaller compliance review. For this pipeline it is the absence of one.
Residency is physical, not contractual
Where the audio lives is a question about which rack it is in, answerable by pointing at it. No region flags, no sub-processor list, no transfer mechanism.
Pinned weights, no silent swaps
The model is a file on your disk at a version you chose. It does not change underneath a calibrated rubric because a vendor shipped an update on a Tuesday.
No voiceprints
The agent and the candidate are already on separate audio channels, so the two speakers are told apart by channel. Nothing derives a speaker embedding, which keeps biometric statutes out of scope by design.
See a call, then read the report.
The model needs the GB10 box, so it cannot run on this website. Here is a recording of a real screening call, and the candidate page with prepared sample data.
The problem, a screening call end to end, and the report it produces.
The candidate page, with sample data
The candidate page from the gateway, playing seven pre-recorded interviewer clips. Answer out loud if you like; press space to move on, or it moves on by itself after nine seconds. At the end it shows the scorecard view.
- No microphone is opened and nothing is recorded.
- The interviewer lines are fixed clips, not a live model.
- The 7/10 scorecard is written copy, labelled as such.
Four steps, about fifteen minutes.
One candidate at a time per box, which is also the unit you buy more of.
Send a link
The recruiter creates a call for an open role. The candidate opens it in a browser. No account, no download, no app.
It discloses, then asks
In the first twenty seconds it says it is an AI and asks permission to record. If the answer is no, the call ends and routes to a human.
It talks, and it probes
One question at a time, under twenty seconds a turn, following each claim down until the answer gets specific. Interrupt it and it yields.
A human reads the report
Each rubric dimension gets a score and a quoted span with a timestamp. No evidence means insufficient evidence, never a low score.
Four processes, one box.
The candidate's audio goes from the browser to a gateway, an agent and a speech model, all on the same machine. The report is written there too.
Live call path
Candidate browser
any laptop
- Mic and speaker over WebRTC
- No account, no install
Gateway
aiohttp + aiortc
- Signaling and media
- Resamples caller audio to 16 kHz
- Playback queue, flushed on barge-in
Agent
call process, Python stdlib
- Interview engine: a state machine
- Voice gate owns turn boundaries
- Wall clock, rubric coverage, legal follow-ups
Model process
PyTorch on the GB10
- Full-duplex speech-to-speech model
- One step per 80 ms, in lockstep
- Binds 127.0.0.1 only
After the call
Full duplex, not turn-taking
Both channels are open for the whole call. When the candidate talks over the agent, the call process drops its playout queue at once and then tells the model to close its response cleanly, so the model never believes it is still mid-sentence.
The 80 ms frame is the clock
One model step takes 80 ms of caller audio (1,280 samples at 16 kHz) and returns one text token plus 80 ms of agent audio (1,764 samples at 22.05 kHz). That is exactly four 20 ms transport frames each way, so nothing drifts over a 15-minute call. Over-budget frames are counted, never hidden in a queue.
Scorecards cite the transcript
After the call a separate pass scores each rubric dimension from 1 to 4 and quotes the timestamped line behind it. A dimension with nothing to quote is marked insufficient evidence, not scored low. The overall 1-10 is a recommendation for a human.
The model sits behind one contract, backends/base.py. A mock backend implements it with no model, so everything above the model runs and is tested on a laptop.
It does not accept the first answer.
Anyone can rehearse a project story. Almost nobody rehearses the third follow-up. zeg keeps descending until the answer is specific enough to quote.
Advance with reservations
Concrete on debugging and on the tradeoff they accepted. Thin on system design; the topic was raised twice and not covered.
Evidence
“Reconciliation went from parallel to serial. Batch time roughly doubled.”
System design — insufficient evidence. A dimension with nothing to quote is recorded as unevidenced, not scored low.
What did you personally do?
Separates the claim from the team it belongs to.
What is the number?
A rehearsed story survives one follow-up. It rarely survives a quantity.
What did you give up?
Every real engineering decision cost something. Naming it is the tell.
What broke afterwards?
The people who shipped it remember. The people who heard about it do not.
A meter that never stops, versus a thing you own.
Hosted screening is priced per interview, so the bill grows with every hire you try to make. A box is bought once. That is the whole argument, and it is the reason this is aimed at teams without a recruiting budget to burn.
~$10
roughly what a hosted screening interview costs, per interview, every interview
~$10,000
one workstation, once, and it is still yours next year
1,000
interviews to break even; after that the marginal cost is electricity
Our own arithmetic, not a quote from anyone. It assumes ten dollars an interview and a ten-thousand-dollar machine, and it ignores the electricity and the hours someone on your side spends running it. Put your own two numbers in; the crossover moves, the shape does not.
What it will not do, and where it is weak.
Hiring is one of the most regulated places to put a model, and overclaiming here costs someone a job. So here is the honest version.
It does not decide
zeg produces evidence and a recommendation band. A person reads the report and makes every call about a candidate. There is no autopilot setting and there will not be one.
It does not read personality
No culture fit, no confidence score, no inference from accent, affect or hesitation. It scores technical dimensions against a rubric and quotes the span it scored.
It does not hide
It says it is an AI in the first twenty seconds and asks before recording. Ask it directly and it confirms immediately and offers a human instead. Decline and the call routes to a person.
It is not an accessibility substitute
A voice-only screen excludes some candidates. A path to a human screen has to exist, be advertised ahead of the call, and be requestable without anyone explaining why.
Known technical limits
Measured in the runtime we build on, not guessed at.
- One interview at a time
- Single client, single GPU. More throughput means more boxes, which is also the pricing model.
- Sessions cap near 16 minutes
- A hard runtime limit. The wall clock wraps the interview up before it, so it never cuts off mid-sentence.
- The model's own memory is short
- It is trained on short audio context. Our layer holds the state and re-injects a compact summary, which is why the interview is a state machine and not a prompt.
- The speech checkpoint is research-grade
- It can skip a tool, loop, or drop a transcript word. Anything that has to be reliable — the prohibited-question check, the clock, the rubric — lives in our code, not the model's.
Before a real candidate is ever screened: automated employment decision tools carry bias-audit, advance-notice and impact-assessment duties that vary by where the candidate sits, not where you do. Running locally removes a processor from the diagram. It does not remove any of that. None of this page is legal advice, and every deployment needs counsel.
Hear the shape of a call without the hardware.
A mock backend implements the same contract as the model, so the conversation harness, the interview engine and the scorer all run on a laptop: full duplex, barge-in, a timestamped transcript and the post-call report.
A scripted call on your laptop
Python 3.9+ and make. No GPU, no weights, nothing past pytest.
git clone https://github.com/zero-abd/zeg.git && cd zeg
make setup # .venv with pytest
make demo # a scripted interview through the mock backend
make test # agent and gateway test suitesA browser call against the mock
Adds aiortc and aiohttp. The mock's voice is a 220 Hz tone, not speech.
make gateway-setup
make gateway # open http://localhost:8080, wear headphonesThe real interviewer, on the box
A Dell Pro Max with an NVIDIA GB10, the speech model weights and the runtime process up.
make gateway BACKEND=gb10 # http://<box>:8080make demo: mock backend, scripted caller, heuristic judge[00:00] agent Hi, thanks for making the time. Before we start, two things you should know. I am an AI interviewer, not a person. And this call is recorded so a human reviewer can go through it afterwards. Is that okay with you?
[00:18] caller yes that is fine
[00:18] agent Thanks. Tell me about the hardest bug you shipped a fix for this year.
[00:28] caller a race condition in our payment reconciler
[00:28] agent What did you personally do there, as opposed to the rest of the team?
[00:38] caller i wrote the fix and the repro harness
[00:38] agent Do you remember roughly what the throughput was before and after?
[00:47] caller about twelve hundred a second before, forty thousand after
[00:47] agent What did you give up to get that? Every fix costs something.
[00:52] caller we gave up strict ordering across shards
[00:52] agent Last one. What broke afterwards that you did not expect?
[01:00] caller a downstream report started double counting
[01:00] agent That is my time. Thanks for talking me through it.
backend mock
call duration 65.3 s
consent granted
interruptions 1
briefings sent 1
probes issued 4
session rollovers 0
7/10 — advance with reservations
Scored by the heuristic judge, which matches wording rather than judging answers. For testing only: not for a hiring decision.
Evidence for technical depth, ownership, tradeoffs and debugging; nothing on communication. Call length 1:00, the call ended before the wrap-up.
technical depth 3/4
[00:47] "about twelve hundred a second before, forty thousand after"
ownership 3/4
[00:38] "i wrote the fix and the repro harness"
tradeoffs 3/4
[00:52] "we gave up strict ordering across shards"
debugging 3/4
[00:38] "i wrote the fix and the repro harness"
communication insufficient evidence
Nothing in the transcript speaks to this. Not a low score.
Notable moments:
[00:38] Specific across 2 of the five dimensions in one answer
"i wrote the fix and the repro harness"
Flags, for a human to weigh:
- The call ended before the wrap-up, so the interview is incomplete: it stopped early.
A human reviews this before any decision. zeg does not decide.The replies come from a fixed script, the voice is a test tone and the clock is virtual, so the durations are frame accounting, not measurements. The heuristic judge matches wording; the model judge runs on the box.
There is no signup here, because there is nothing to sign up to yet. zeg is a hackathon build in the open. The repository is the front door.