IntelliPrompter

September 19, 2026 · View on GitHub

A teleprompter of talking points, not a script. You talk in your own words and in any order, and each point is checked off once you have covered it.

Try it: https://finetuningsingh.github.io/intelliprompter/ (paste an OpenRouter key; for a TypeSafe key, run it locally, see below).

The idea and design come from Allie at TypeSafe. She built the original IntelliPrompter so she would not forget anything in the long list of announcements that opens her stage shows. She demoed it at a TypeSafe Discord town hall. It was her first app with AI inside, and running it on LLMs cost about $40 an hour. With Jev it costs at most about $0.50 an hour (two calls a second at about $0.00007 each), and less in practice, since calls stop while you are silent and checked points are no longer sent. This is an independent rebuild of her design, as she described it.

How it works

Every talking point is a separate Jev Score question, and all the open points are scored in parallel, in one request, against everything you have said so far:

state: { transcript: "…what you have said so far…" }
questions: {
  p0: { type: 'score', instructions: 'How much has the speaker covered this talking point: "Where the emergency exits are"?',
        criteria: ['No mention of this topic at all',
                   'Topic is mentioned but not expanded upon at all',
                   'Topic is discussed',
                   'Topic is thoroughly discussed'] },
  p1: { … one per open point … },
}

Jev returns a score from 0 to 3 for each point: the probability-weighted level, so it can fall between levels. The code owns the rules:

  • A point is checked off when its score reaches the threshold (1.5 by default: between "mentioned" and "discussed"; adjustable on the page from 0.5 to 2.5). At 1.0, a passing mention was enough to check a point off, for example saying "performers" before saying anything about tipping them.
  • Order does not matter, because every open point is scored on every call.
  • Checked points stay checked and are no longer sent. You can also click a point to check or uncheck it yourself.
  • Confidence is shown but ignored, as in Allie's version. It measures how concentrated Jev's probabilities are, not whether a point was covered.
  • The page sends an update every 500 ms, but only when the transcript has changed and no request is already waiting. Only the last 6,000 characters are sent.

The page's "How Jev scores each point" section explains Score step by step and shows Jev's latest answer for every point: the probability of each level and the sum that gives the score.

The shared logic is in prompter.js. Allie used ElevenLabs for live transcription; this page uses the browser's built-in speech recognition (Chrome, Edge or Safari). "Start without microphone" lets you type or paste what you say instead.

Keys: OpenRouter or TypeSafe

Jev is available two ways, with the same questions and answers:

KeyEndpointWorks on the hosted pageWorks locally
OpenRouter (sk-or-…)openrouter.ai/api/alpha/decisions, model typesafe/jev-1.13yesyes
TypeSafeapi.typesafe.ai/v1/systemone, model jev-1.13.0noyes

The page tells the two apart by the sk-or- prefix. api.typesafe.ai does not accept calls from web pages (CORS), so a TypeSafe key needs the small local server in server.js. The server serves the page and passes the page's TypeSafe requests on to the API. OpenRouter calls always go straight from your browser to openrouter.ai.

Both paths are pinned to Jev 1.13, the version the 1.5 threshold was tuned on; TypeSafe's docs advise pinning a version rather than the moving jev-latest alias once thresholds are tuned. Requests follow TypeSafe's SDK defaults: a 10-second timeout, and up to two retries with backoff (honoring Retry-After) on timeouts, 408, 429, 529 and other server errors. After further failures the page waits longer each time, up to 30 seconds. A rejected key (401) stops the requests.

Your key is stored only in your browser

  • Stored only in your browser. A key you paste is kept in the tab (session storage) and cleared when you close it. If you tick "Remember on this device", it goes in local storage instead, until you press "Forget key".
  • Sent only to the service that bills it. An OpenRouter key goes from the browser straight to openrouter.ai. A TypeSafe key goes to server.js on your own computer, which passes it on to api.typesafe.ai and doesn't store or log it. With the local server you can also put TYPESAFE_API_KEY in .env, and then the page never sees a key at all. The server only relays requests from its own page, so other websites open in your browser can't spend that key.
  • No server of ours. The hosted page is two static files on GitHub Pages, with no backend, no analytics and no third-party scripts. You can check this in your browser's developer tools (Network tab) or by reading index.html and prompter.js.

Each request also carries your transcript to the same service. In Chrome, speech recognition sends your microphone audio to Google.

Run locally

Requires Node 18+. There is nothing to install.

git clone https://github.com/finetuningsingh/intelliprompter.git
cd intelliprompter
cp .env.example .env    # optional: add TYPESAFE_API_KEY and/or OPENROUTER_API_KEY
npm start               # http://127.0.0.1:8787/

The microphone needs localhost or HTTPS, so open the page through the server rather than as a file.

Replay a talk in the terminal

npm run replay                                   # examples/show-opening-*.txt
node replay.js --every=10 --threshold=1.5
node replay.js --transcript=talk.txt --points=points.txt

This feeds a transcript to Jev 15 words at a time, as live speech would arrive, and prints when each point is checked off. It uses TYPESAFE_API_KEY if it is set, and OPENROUTER_API_KEY otherwise.

Results (2026-09-19, OpenRouter, typesafe/jev-1.13, threshold 1.5)

npm run replay on the example show opening (383 words, 7 points). The talk covers the points in a different order from the list and never mentions the bar:

PointChecked at wordScore
Welcome everyone and introduce yourself as the host301.97
Where the emergency exits are1201.80
Phones on silent, no flash photography1651.70
Tip the performers, and bring cash2552.38
Thank the theater and the staff3152.00
Introduce the first performer3601.91
The bar is open during intermissionneverbest 0.03

This took 26 calls averaging 236 ms and cost $0.0011 in total. On a longer recorded talk (1,581 words, 7 points), all 6 points covered were checked off, and the point never mentioned peaked at 0.23. That run took 106 calls averaging 252 ms, for $0.0074 in total.

License

MIT