Whispr

Settings

Settings is where you connect the services Whispr runs on and prove they actually work. Everything runs on your own accounts: keys are stored in your credential store — the macOS Keychain, or Windows Credential Manager — and only ever used from this machine to call the services you connected.

Changes to transcription and engines apply to the next session, not the one already running.

How this screen is laid out

Four groups in the sidebar, ordered by when you need them rather than by what they configure:

Group What is in it Do you need it?
Essentials Hearing the meeting, answering, your microphone Yes — a meeting cannot happen without all three
Credentials Your API keys, each with how to get it and what the scopes buy Yes, for whichever services the essentials use
Optional Cue engines, reading answers aloud, the Claude brain No — every one is off or absent by default
Account Your name, licence, referrals, where files live No

Readiness and headroom sit above the groups rather than inside one, because they are about all of it: what has been proven, and how much is left on each account.

If you only ever touch one group, touch Essentials. If it is green there and in the chip, a meeting will work.

Which permissions each key actually needs

The single most common way to end up with a key that half-works is to give it too few permissions and get no error until the moment it matters. Every credential row in Credentials opens to show its own numbered steps; these are the two where the scope is genuinely not obvious.

Cloudflare (Workers AI)

Two permissions, and they buy different things:

Permission What it buys Skip it and…
Account · Workers AI · Read Runs the models — answering, the classifier, and Workers AI transcription nothing works
Account · Account Analytics · Read Lets whispr headroom read the Neurons left in the free daily allowance answers still work; headroom says the token is fine but cannot read billing

The prefilled token from the Workers AI panel carries the first but not the second, which is why a token that answers perfectly can still report no headroom. The Neuron figure lives in an undocumented analytics dataset, so the Workers AI permission alone returns 403 there.

You also need the account ID, shown in the same panel. It is an identifier rather than a secret, but it travels with the token.

Deepgram

Role What it buys Skip it and…
Member Transcription, the voice agent, reading answers aloud nothing works
Owner or Admin (for billing:read) Lets whispr headroom read your remaining balance everything still works; headroom reports the key is fine but cannot read billing

Member is the right choice unless you specifically want the balance reading. Confirmed against a real Member key: listing projects returned 200 and reading balances returned 403.

The others

Gemini, Anthropic and OpenAI-compatible keys have no scopes to choose — one key, full access to the API. Google, OpenAI and Anthropic publish nothing an inference key can read about remaining quota, so headroom says so rather than guessing.

Your own voice Worker needs no permission at all: the token is one you invent and set on your own deployment with wrangler secret put VOICE_TOKEN.

Ready for a call?

The block at the top is the honest summary. It reports what has been proven — a key that is saved but has never answered a request is not a working engine, and this is the screen where that difference shows before a call rather than during one.

It lists transcription, each engine, and the prep material this kind of meeting wants. Test everything re-runs the lot. Re-run setup reopens the guided walkthrough.

The chip in the title bar says the same thing in one word, and clicking it comes back here:

Chip Meaning
Ready Transcription and an answer engine are both proven
Saved, not tested Something is filled in but has never answered
Set up needed Transcription or an answer engine is missing

Once you have been through setup, a chip that is not green puts a banner under the title bar saying the same thing at greater length, in the same tone, with the button for that case — Test them when everything is saved and merely unproven, Open Settings when something is missing. It never appears during a call: there is nothing to fix mid-call and a takeover warning then is noise, so the chip is the whole of the report while a session runs.

You

Your name, which is the name answers are written in. It is committed when you click away from the field, not on every keystroke.

Your credentials

One row per key, grouped into speech, answers, and infrastructure. Each row shows a dot when something is stored, a box to paste a new value, and Clear to remove it.

Open a row and it tells you what that key switches on, what happens if you skip it, numbered steps to get it, and what it costs. That text is the detailed guidance; Credentials and costs is the shape of the whole arrangement.

The value is write-only. The app can ask whether a key is stored; it can never read one back, which is also why a saved key shows as dots rather than as characters you can check.

Below them is No key required — providers that need no stored credential, and one that is not built yet. They are listed rather than omitted, because silence reads as "unsupported".

Where the other side comes from

Under Your microphone, below the input picker. The default — this computer's own audio — is what every install does and what almost everyone should keep: Whispr hears the other person from whatever this machine plays.

Change it only when the call happens somewhere else and reaches this machine through an audio input: a phone wired in through a USB audio interface, a mixer, a conference phone with a line out. Your microphone stays you, so both sides are still told apart by which wire carried them — nothing is guessed from the sound.

Four things worth knowing before you use it:

It takes effect at the next meeting, not immediately — switching it mid-call would restart the channel carrying the other person and drop whatever they are saying. From a terminal: whispr audio-devices --set-system <id>, and whispr audio-devices shows which is in use.

Hearing the call

Four transcribers, and each difference is a real trade rather than a preference.

Two things worth knowing about Gemini live specifically. Its sessions are capped at ten minutes by Google, so Whispr replaces the connection roughly every nine — you will not notice, but it is why this transcriber reconnects during a long call when the others do not. And it is asked for verbatim text, never Google's "smart" tidied mode: that mode removes filler words, and practice measures your filler density, so a tidied transcript would report every answer as clean and the one number telling you how you actually sound would always be zero.

Headless, this is whispr transcriber — with no argument it prints the current one and the choices; with one it switches and names the credential that choice needs. There had been no way to change this outside this screen, which is a gap on a product whose first invariant is that every feature works without the app.

Languages spoken

Under the transcriber is a list of the languages actually spoken in your meetings. Leaving it empty means detect, which is how every install starts and is the right answer for a genuinely multilingual room. The reason to fill it in is the opposite case: in a quiet moment, a transcriber left to detect will invent words in a language nobody present speaks, and those words reach the question detector and the answer engines as though somebody had said them.

Each transcriber takes this differently, and Whispr does the translation:

The same panel is on the Live view under ⚙ Quick settings, because this is one of the few settings worth changing with a meeting already running.

Headless: whispr transcriber --languages en-GB,lv-LV, and whispr transcriber --languages detect to clear it.

Choosing Workers AI adds a Model field, because the model is configuration: @cf/deepgram/nova-3 is the default, and whatever speech model Cloudflare hosts next goes in the same box. Run the readiness test before a call — it opens the same authenticated socket an interview opens and requires an answer, which is what catches a token created without the Workers AI permission or a mistyped account id.

The voice Worker, and letting Whispr deploy it

The spoken practice interviewer can run on your own Cloudflare account instead of Deepgram's. That needs a small program — a "Worker" — on your account, and Whispr can put it there for you.

Choose Set it up for me, give it two things, and press Deploy:

Five steps then tick past: checking the token, uploading, giving it an address, setting the shared password, and checking it answers. If one fails, that row goes red and says what to do — a token without the deploy permission is by far the most common, and it says so by name rather than reporting "authentication error".

The token is used and forgotten unless you tick keep it for updates. Nothing else on your Cloudflare account is touched, and the Worker runs on your free allowance, not ours.

Deploy it with one click is the default, and it is the one to give a client: it opens Cloudflare's own deploy page, which copies the Worker into their account and sets it up. Nothing is needed but a browser and a Cloudflare account. It then asks them to copy the address back and set a shared password themselves — four short steps the token path removes, which is the whole difference between the two.

I already have one is the technical path, and it is the one to use if you deployed the Worker yourself — with wrangler, from the dashboard, or on an earlier install. It asks for the two things that link it:

Check the link then proves it: it opens a real socket to the Worker and closes it again, which tests the address and the password together and starts no call, so it costs nothing. Until something has answered, "linked" is an assumption.

Under What the Worker itself needs the panel lists the one secret and the three variables, with their working defaults — so if you deployed by hand you can see at a glance that only VOICE_TOKEN is actually missing. It also names the two bindings the Worker needs (Workers AI and a Durable Object, both free) and the trap worth knowing: pointing MODEL at a paid-plan or reasoning model returns a successful response containing no text, so the interviewer just says nothing.

Headless, the same two settings are whispr voice-worker <url> and whispr config set-secret WHISPR_VOICE_TOKEN.

Re-deploying later updates the Worker in place and never changes the shared password.

Reading answers into your headphones

Off by default, and it is the one setting with a way to embarrass you, so it is worth reading before switching on.

During a live call the fastest answer can be read aloud into your ear. The others stay on screen, which is what the screen is for. It starts speaking as the audio is generated, so the voice begins in well under a second rather than after the whole clip has been made — the wait is what made this unusable before.

You must choose an output device, and there is deliberately no "system default" option. This is the whole safety design, not an oversight. On a laptop the default output is the built-in speakers; anything played there is heard by your own microphone and transmitted to the meeting — which means the interviewer hears the answer being read to you. So:

Choose the headphones you are actually wearing. The switch stays disabled until you have.

What to read offers two things. The answer is capped (about half a minute of listening, during which you are not talking). Just the cue is the head and three beats the overlay shows — about two seconds, and sized for exactly the gap between the interviewer finishing and you being expected to speak. If half a minute of listening turns out to be the problem, the cue is the answer to it.

It uses your Deepgram key — the same one that transcribes the call, no second credential.

Local whisper

Whispr does not start the whisper server. You start it, and leave it running:

whisper-server -m /path/to/ggml-base.en.bin --port 8080

Then put that server's address in the Server field — http://127.0.0.1:8080 if you followed the line above — and test it before a call. By far the likeliest failure is a server nobody started, and the readiness test catches that by posting real audio at it.

Whisper transcribes a block of speech once the speaker pauses, rather than word by word as they talk. That is why answers start a second or two later than with Deepgram.

The Model field is recorded, not sent — your server already has the weights loaded. It is here because changing the model means the last successful test no longer proves anything. A bigger model is more accurate and slower, and slower is felt directly as a later answer.

Answer engines

One card per engine: whether it is on, the name you gave it, the provider it speaks to, its role, the model, and how much of your prep it may carry. Add an engine adds another; Remove takes one away, after telling you what stops working if it was the last of its kind.

Several answer engines can run at once. They answer the same question in parallel and you pick between them, which is also why one slow or broken engine never leaves you with nothing — and it is the reason to add a second.

Four roles, and they are not interchangeable:

Role What it does
answer Writes the full answers you read during the call
fast Stands in for the answer engines on short, cheap question kinds
classifier Decides what was a question, and what kind it was
anchor Writes the overlay cue — a head and a few beats

The arrangement you start with, and why

You do not have to set any of this up. A new install already holds every role, arranged so the expensive engines are spent only where they earn it:

Engine Role Why this one
claude answer The best answers, and the one you are most likely to read out
workers-ai (70B) answer A second opinion on your free Cloudflare allowance, so one slow or broken engine never leaves you with nothing
workers-ai-fast (70B) fast Answers the cheap question kinds alone, instead of every engine racing on "what's the salary range?"
workers-ai-classifier (8B) classifier Deciding what was a question needs speed, not depth
workers-ai-anchor (8B) anchor A cue is three short beats inside three seconds; the smallest model is the right one
mistral-anchor (24B) anchor A second cue engine, so Whispr can find out which one actually writes usable cues
claude-mcp answer, off Answers nothing until you attach a Claude session, and an engine that times out on every question is worse than one plainly switched off

Choosing a model, and what "the latest" means

Whispr does not ship a list of the newest models, because such a list is wrong the day after it is written — and wrong in a way that is hard to spot. A model id that Cloudflare will not run does not return an error: it returns a perfectly well-formed reply containing no text at all, which at run time looks exactly like a slow engine.

So ask your own account instead:

whispr models            # what this account is offered
whispr models --probe    # which of those actually answer

The probe sends one tiny completion to each and keeps only the ones that produce visible text. On a real free account, of thirty listed models: thirteen answered, nine returned nothing at all, one was behind a licence, and six were refused as paid-plan only.

Those six are the honest definition of a premium tier. Error 5035 means the model exists and your credential is fine — only the Workers plan is in the way. Upgrading (currently $5/month, with a far larger daily allowance) unlocks them. Re-run --probe afterwards: some of them will still turn out to return no text, and only the probe knows which.

Nothing about this changes your engines. Set a model in the engine editor above, or with whispr engines set <engine-id> --model <model-id>.

Which engine is actually earning its place

whispr engines stats

Per engine and per kind of question: how often you used its answer, its median latency, and how many times it failed. It is built from which answer you actually delivered, not from which arrived first — a race is won on speed, and fastest is not the same as best.

It refuses to name a winner until there is enough to name one (eight answers and a clear gap), so expect "not enough to call yet" for the first interview or two. That is the point: an engine named on four answers is a coin toss you would act on. When the engine you prefer is the slower one, it says so, so keeping it stays a decision rather than something you discover later from your latency.

How soon an answer starts

The engine cards carry a second figure: how long that engine takes to get its first word out, over its recent answers. It is a different question from the median above, and a more useful one.

The median latency is the whole answer, so an engine that thinks fast and writes a long, good reply looks slow on it. What decides whether an answer helps is the moment you can start reading — there are only about three seconds between the other person finishing and you being expected to speak. An engine whose first word lands after that produced something worth reading later, and nothing you could use in the moment.

So an engine that is regularly past three seconds says usually too late to help with the question asked, and one past ten seconds says something is wrong with this engine — that is not slowness, that is a stalled socket, a queue, or a cold local model. Individual answers say the same thing on the card, and only when there is something to say: a card with no note on it arrived in time.

Nothing is capped and nothing is cut off. A late answer is still a real option and still worth choosing — it just did not help with the question it was asked about. What to do with the figure is yours: a smaller or nearer model usually starts sooner. whispr engines stats and whispr preflight both print it.

Three things about that arrangement are worth knowing before you change it.

Two engines write the cue, and that is deliberate. Both anchor engines are asked, and whichever answers first with a usable cue is the one you see. The overlay is small and unforgiving — a head and three short beats, nothing longer — and a model that cannot hold that format produces nothing at all rather than a paragraph you have no time to read. Racing two is how Whispr finds out which one can, from your own interviews, instead of you having to guess. whispr doctor reports how often each was discarded and why, and there are two ways to vote for a cue: ⌘⇧L (Ctrl+Shift+L) while it is on the overlay, or the 👍 beside it in the main window. A race is won on speed, and fastest is not the same as best, so your vote is the only thing that can tell them apart.

The key matters more than it sounds. Before it existed the only vote was the button in the main window — the surface nobody looks at during a call — and on a real install not one cue in two hundred had ever been rated, which meant the recommendation below could never say anything but "not enough to go on". whispr cues prints the table, the verdict, and how many votes there have been.

Both are on your free Cloudflare allowance and a cue is a few dozen tokens, so the second one costs a rounding error against a single answer. If you would rather only one was asked, set anchorPick.preferred in config.json to that engine's id.

The fast lane is about fan-out, not quality. fast engines stand in for the answer engines on the cheap kinds — logistics and background. Which kinds those are is not a setting on this screen: it lives in config.json as fastLaneKinds, because changing it is rare and getting it wrong is expensive. On those kinds one competent free answer is enough; letting Claude and the 70B both race is paying twice for "the salary range is negotiable". If you remove the fast engine nothing breaks: those questions simply go back to every answer engine, which costs more and is slower.

Two roles fail silently if nothing holds them, so Whispr fills them in rather than letting you discover it mid-call. If your config has no classifier, question detection falls back to heuristics that cannot split one long turn into two questions; with no anchor, the overlay shows only cues drawn from your prep and nothing written for the actual question. On start-up, if either role is unheld, the app adds a small Workers AI engine for it and says so in its log. It will not re-enable an engine you switched off — if you turned the cue engine off deliberately, it stays off and a separate one is added — and it never touches a role you already have covered.

That fill exists because a default only ever applies to an install that has never run. Earlier versions shipped a cue engine in the defaults and nobody who already had a config ever received it: the overlay quietly wrote no cues, which looks exactly like a slow model.

Changing them

Everything above is a starting point, not a constraint. What each change costs:

Change What happens
Add a second answer engine Both answer every question in parallel and you choose. More cost per question, and the main protection against one engine failing
Remove the fast engine Cheap questions go to every answer engine instead of one. Nothing breaks; it costs more
Move classifier to a bigger model Slower detection of every question, for accuracy you will rarely notice. The 8B is the right trade
Move anchor to a bigger model The most likely way to make the cue useless: past three seconds it is dropped, and you get nothing. Watch Late in the cue table
Give anchor to several engines They race; the first valid cue is shown. Cheap, and it is what makes the vote table meaningful
Leave a role unheld classifier and anchor are refilled on the next start. fast is not — its absence costs money, not a feature. answer is never refilled: an install with none has usually switched them off on purpose

whispr doctor reports which engine holds each role, so it is worth running after any change.

Give the anchor role to more than one engine and they race: every one is asked, and the first cue back is the one you see. Anchor cue lower down the page shows how that is going, per engine:

Column What it counts
Shown Cues that reached the overlay — races won
Beaten Perfectly good cues that arrived second
Voted good The 👍 you pressed on a card in Live
Refused Came back as prose, or too long for the overlay to draw
Late Timed out or errored
Median How long its cues take, over Shown and Beaten

Beaten is the column that makes a slower-but-better engine visible. Without it only the fastest engine could ever collect votes, because nothing else left a trace — so the numbers would always agree with whichever engine was already winning. It also means the median is honest: measured over every valid cue an engine wrote, not only the races it happened to win.

Refused and Late are separate because they send you to different places. Refused is a model that cannot hold the format — try a different one. Late is a timeout or an error — check the credential and the network. One number for both sent people to rewrite a prompt that was never the problem.

Ordered by votes first and speed second.

Letting the votes decide

Under the table, once there is enough evidence, a line appears: "careful wrote 6 of the cues you voted good — 100% of the ones it got shown, against 20% for fast." One click applies it, and Not this one stops it being suggested again.

What applying it does is worth being precise about, because it is deliberately not what you might expect. It does not move the anchor role around. Your engines keep exactly the roles you gave them; the preference only decides which of the anchor-role engines is asked. The reason is that an engine holds one role, so promoting a winner would mean giving the old anchor some other job — and every version of that changes what your engines do or cost. Making it an answer engine bills on every question; disabling it stops whatever else it was for. Neither is a decision this should be making for you.

While a preference is set, the others are not asked at all — so they cost nothing and, equally, gather no new evidence. Let them all race again clears it, which is also how the comparison starts up again.

Nothing above 20 cues shown, 5 votes on the challenger, and a clear margin will be suggested at all. Below that the table just shows numbers, and the line says how far off it is.

Let the votes pick without asking me is off by default. With it on, the change happens between sessions and never during one — a cue engine swapped mid-interview is exactly the kind of surprise this should not be — and a notice says which engine, on what evidence, and how to undo it.

Some providers cannot take the last two roles: the Claude Code session, the MCP brain and the two voice agents all answer through one long-running conversation rather than a single completion, and a classifier or a cue engine needs the plain kind. The picker leaves those roles out rather than letting you choose one that would fail mid-call.

What each one costs, where you choose it

Every provider in the picker shows what it buys and what it costs the moment you select it — the unit it bills in, and what a 45-minute call actually consumes. The free allowance, the reference workload and anything unusual about the billing are folded underneath, and the date the figures were read is on the panel. The same numbers are in Your credentials and in whispr credentials; nothing on this screen keeps a price of its own, so a figure corrected once is corrected everywhere.

It is worth actually reading for the two voice-agent providers, whose bills are nothing like the token-priced engines. The Deepgram Voice Agent is billed by connection time — roughly $2.50 for a 45-minute call whether it answers once or twenty times, several times everything else put together. The Workers AI voice Worker is the opposite: on this surface no audio is billed in either direction, because the question goes in as text and speech is skipped, so a whole call is about 2,300 Neurons and fits inside Cloudflare's free day. The same Worker speaking in a practice run is about fourteen times as expensive per minute — see Practice.

Adding one

Pick the provider, give it a name, choose a role and name the model. If the provider needs a key you have not stored, the form says which one before you finish — and until it is stored that engine is skipped rather than failing the call. Anything OpenAI-compatible — a self-hosted proxy, Azure, Ollama — connects through the same OpenAI-compatible endpoint provider, so adding a provider is configuration rather than a new version of the app. A local endpoint such as Ollama needs no key at all.

Your own voice Worker

Choosing the Workers AI voice Worker provider adds one more field: the URL of the Worker you deployed to your own Cloudflare account. It is one field for one deployment — the same Worker serves this engine and the spoken practice interviewer — and the token you set on it goes under Your credentials as WHISPR_VOICE_TOKEN like any other secret. docs/voice-worker.md in the repository is the deployment procedure.

The Model field on that engine is a record rather than a control: which model answers is set on the Worker itself with wrangler, so what you type here is what names the answer column and the recorded test result. Keep it in step with the Worker; changing it here does not change the Worker.

The name cannot be changed

The name is the key everything else references: the test result recorded against it, whispr brain enable, the heading on each answer card. To rename an engine, add a new one and remove the old one — the editor offers no rename because a rename in place would quietly orphan all of that.

Models that return nothing

A few Cloudflare models return a perfectly successful response containing no text — the ones needing a paid plan, and reasoning models whose thinking never reaches the chat endpoint. Whispr substitutes a working model for those rather than leaving you with blank answers, and the editor says so at the moment you type one, with a button to make the substitution yourself.

Prep limit

How much of your prep material this one engine's prompt may carry, in characters. Leave it empty and it uses the provider's own default, which is conservative for the providers that could be anything from a 400k-token hosted model to an 8B running locally. Raise it if you know your model's context window is larger; an overflow is not a shorter answer, it is an error from that one engine mid-call.

Claude as the brain

If you already use Claude on this machine, it can be one of the answer engines: it answers with your own skills, files and tools behind it, alongside the provider engines rather than instead of them.

This section tells you whether a Claude session is actually attached and answering right now, which is the only thing that matters — it needs no credential, so "configured" is always true and would tell you nothing. Switch it on, and when nothing is attached it lists the three steps that connect one: two commands, and the sentence to say in a Claude session.

Your Whispr account

Sign in with your browser. If that hand-off does not work — a managed Mac, or another app holding the link — Paste a licence key signs you in exactly the same way.

This section says what your licence is, when it was last checked, and what to do if it has lapsed. If the app is locked, a new session cannot be started; a session already running is never interrupted, and everything you have recorded stays on this machine either way.

Bought Whispr on Gumroad? That is a different key from a different place, so it has its own button: Bought on Gumroad?, and you paste the licence key from your Gumroad receipt. It is checked with Gumroad and recorded on this machine, so it licenses Whispr whether or not you ever sign in — and signing in later cannot undo it.

This matters because the two are not interchangeable. Signing in creates a Whispr account, and an account that has only ever bought through Gumroad would otherwise look to us like an account that has bought nothing. Redeeming the key is what connects the two, so the app never tells somebody who has paid that they need to buy it.

Invites

When enough people you invited have subscribed, a credit comes off your next invoice. Once you are signed in, this section shows your invite link and the count so far — how many you invited, how many subscribed, how many more until the next credit.

Signed out there is no link, and that is not an oversight: only the account side knows who subscribed, so a code made up on this machine would look like a working invite link and credit nobody.

Add-ons

Under Account is Add-ons — extra methodologies, and they are free. They are switched on for everybody while we find out which ones people keep. There is nothing to buy and no key to paste.

The important thing to know about how they work: everything is already inside Whispr. A pack is not a download and not a plugin. The switch turns on content that shipped with the app, which is why it works offline, why there is nothing to install or keep updated, and why a pack cannot break when the app updates.

Nothing in the base app is behind one. Behavioural, technical, system-design and mixed interviews, and discovery, demo and pricing calls, are all included regardless. The packs are named methodologies for people who work that way:

Pack What it adds
Senior & leadership Executive/leadership and stakeholder-influence rounds
Consulting case Structured case interviews
Sales methodologies MEDDIC, Challenger, SPIN

Turning one off. Each has a switch. Off means its formats stop being offered when you choose the kind of round a meeting is; nothing is removed from your machine and turning it back on is instant.

It is worth switching off anything you will not use, and not only for a tidy list: if you are signed in to a Whispr account, which packs you have on is the one thing shared with us, and it is how we learn which of these are worth keeping. Your meetings, your prep and your answers never are — that is the promise on the first setup screen and it is unchanged.