Kjel Halsey Schlemmer Contact
← Back

Creel

A companion for parallel-dialer call blocks. It shows account context the moment a prospect answers, then turns every recording into a disposition, tasks, and a drafted follow-up for review. 1,921 calls processed.

In use Chrome MV3 Node Claude API Deepgram

Results

1,921
Calls processed, July to August 2026
0
Model calls in the live path
12
Fields extracted per call, schema-enforced
~$0.002
Cost per precomputed opener, per account

Across three weeks of my own call blocks. 47 follow-up drafts, 29 callbacks, and 13 referrals extracted.

Problem

A parallel-dialer block produces 50 to 150 conversations an hour across different verticals. Live context was whatever the rep had open at that moment, which in practice meant remembering 50 value props in the half-second before someone says hello. After the block, callbacks, referrals, and promised emails were reconstructed from memory, and each follow-up was written by hand. Some were missed.

How it works

1

Read the dialer

A Chrome extension reads the live dialing session and shows a card for whoever answers: account context, pain points, and a ready opener. The card is a cache read.

2

Precompute openers

Openers are generated offline on a small model at roughly $0.002 per account and cached per domain. Around 30,000 contacts are snapshot locally for instant lookup.

3

Transcribe in batch

After the block, recordings are transcribed with Deepgram in multichannel mode. The stereo channels separate rep and prospect deterministically, with no diarization model.

4

Extract a record

One model call per call extracts a fixed 12-field record: outcome, callback, referral, data-cleanup flags, and whether an email is warranted.

5

Review and send

Follow-ups are drafted in my own writing voice from a maintained voice file. Everything lands in one review queue, and a rep sends every email.

The latency budget

What fits before the pickup

A model call cannot finish before the prospect says hello. So generation never runs at dial time.

Prospect says hello
Card lookupcache read, <5 ms
Live model calltypical range
0 s1 s2 s3 s4 s
Fig. 1 · Why the live path is a cache read

Key decisions

Generation never touches dial time

A human answers in about a second, and no model call fits that window. Openers precompute offline; the live path is a cache read.

Extraction is schema-enforced

Extraction uses API-enforced JSON schemas with refusal checks. A response that does not match is rejected, not repaired downstream.

The pipeline never sends

It produces dispositions, tasks, and drafts. Human review is the final stage by design.

Technical details

Integration
The dialer's documented REST API was effectively empty. The working integration uses OAuth 2.0 + PKCE and JSON-RPC against the vendor's machine interface.
Transcription
Deepgram nova-3, multichannel, batched after each block
Audio capture
An earlier build captured dual-side call audio in the browser, merged to stereo. Retired when vendor recordings proved sufficient; the simpler path shipped.
Guardrails
Prompts prohibit invented facts and numbers; drafts carry only transcript-grounded content
Testing
A harness covers the extraction contract, the schema boundary where correctness matters most
Ownership
Designed, built, and run by me; I am its user on my own call blocks