Skip to content
Runs on one NVIDIA GB10 box, on your premises

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.

Screening call04:12
Agent
Candidate

Both channels open at once. Interrupt it and it stops talking.

candidate  we cut p99 latency on the checkout path

agent      |

On-device

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.

Encrypted audio, straight to your box
Your premises

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.

Demo

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.

Two-minute demo videomp4, 3.3 MB

The problem, a screening call end to end, and the report it produces.

Read-only demo

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.
Open the prepared demo
Workflow

Four steps, about fifteen minutes.

One candidate at a time per box, which is also the unit you buy more of.

01

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.

02

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.

03

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.

04

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.

Architecture

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

Transcript on local diskScorer: rubric, quotes, flagsRecruiter report

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.

The interview

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.

Transcript excerptlocal disk only
04:02
agentTell me about the hardest bug you shipped a fix for this year.
04:09
candidateA race condition in our payment reconciler. We fixed it and it’s been solid since.
04:21
agentWhat did you personally do there, as opposed to the rest of the team?claim → ownership
04:26
candidateI wrote the repro harness and the advisory-lock fix.
04:38
agentRoughly how often was it firing before the fix?ownership → a number
04:44
candidateEleven double-settlements over about six weeks.
04:55
agentWhat did the lock cost you?number → tradeoff
05:01
candidateReconciliation went from parallel to serial. Batch time roughly doubled.
It stops descending when the answer gets specific, or when two answers in a row stay general.
What the recruiter sees
7/ 10

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.”

05:01 · debugging depth

System design — insufficient evidence. A dimension with nothing to quote is recorded as unevidenced, not scored low.

A recommendation, for a person to act on. Not a decision.

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.

Cost

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.

250 interviewszeg costs $7,500 more
Per seat
$2,500
zeg
$10,000
500 interviewszeg costs $5,000 more
Per seat
$5,000
zeg
$10,000
1,000 interviewsbreak even
Per seat
$10,000
zeg
$10,000
2,500 interviewszeg saves $15,000
Per seat
$25,000
zeg
$10,000

~$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.

Limits

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.

Run it locally

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.

1

A scripted call on your laptop

Python 3.9+ and make. No GPU, no weights, nothing past pytest.

Terminal
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 suites
2

A browser call against the mock

Adds aiortc and aiohttp. The mock's voice is a 220 Hz tone, not speech.

Terminal
make gateway-setup
make gateway          # open http://localhost:8080, wear headphones
3

The real interviewer, on the box

A Dell Pro Max with an NVIDIA GB10, the speech model weights and the runtime process up.

Terminal
make gateway BACKEND=gb10     # http://<box>:8080
What step 1 printsverbatim output of make 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.