Michael Lynn

September 18, 2026 · Michael Lynn

I Built a Teleprompter Because My Screen Share Kept Showing My Notes

Lozenge started as a prompter for live demos and went through four names before one stuck. The one thing that never changed was that the audience can't see the window.

A lot of my job right now is live demos. I share my whole screen, open an editor, and talk through something while I build it in front of people. The demo part is fine. The part I kept getting wrong was the talk track. I'd have a script in a notes window or on a second monitor, and every time I looked over at it the room watched me look away. When I put it on the main screen instead, it showed up in the share, which is worse.
There are teleprompter apps for the Mac. The ones I tried either scrolled at a speed I had to guess, or they sat in a normal window that a full-desktop share picked up like anything else. I wanted the words right under my camera, moving when I moved, and invisible to Zoom.

The part that turned out to be easy

macOS already has the thing I needed most. An NSWindow has a sharingType, and if you set it to none the window server leaves it out of screen capture. Zoom, Meet and a Slack huddle all capture the desktop the same way, so one property covers all three. The first version of the app was mostly that property and a scrolling text view.
What took longer was making sure it applied to every window, not just the main one. An Open panel that pops up mid-talk is still a window. So is an alert, the Settings sheet, a QR code for the phone remote. Each of those needed the same treatment, and now there's a list in the docs of every window the app opens and a note that you should still check it yourself once. Share your screen, join the call from your phone, and look. I didn't trust it until I'd done that, and I wrote the thing.

Following my voice instead of a clock

The scroll speed problem was the one I cared about. A teleprompter that scrolls at a fixed rate is fine for a newsreader and useless for a demo, because in a demo I stop talking for twenty seconds while something builds, and then I talk fast to catch up.
So the script is split into beats, and Listening Sync listens to the mic and matches what I say against the current beat. When I get to the end of it, it moves. It needs a strong match plus a short pause before it advances. Without that it either sat there when I paraphrased, or it jumped ahead when I stopped to breathe, and I went back and forth on the numbers for a while before it felt right. Saying "next slide" moves it too, and if a Google Slides deck is paired through the Chrome extension, the deck moves with it.
The notch prompter came out of the same itch. It hangs a strip of the current beat from the top of the screen, about a finger's width from the camera, so when I read it I'm looking roughly at the lens.

Four names

The first name on the repo was a long, literal one about demo teleprompting, which tells you exactly how narrow the idea was. Then it was grokprompter, then Demo Prompter, and finally Lozenge. That last one stuck because of what happened in between.
Once the prompter worked, I noticed the other half of my calls. In a lot of meetings I'm not presenting, I'm listening, and what I want then is a transcript, a nudge when someone asks something I should know the answer to, and notes I don't have to write afterward. Same Mac, same hour, often the same meeting. So Listen got added next to the Prompter: a live transcript with speaker labels, and a card that shows up when a question lands, with talking points drawn from a folder of my own docs.
After that it wasn't a demo tool anymore. Templates for a recruiting interview, a 1:1, a discovery call, a postmortem. An interview template that writes your questions from the job description and resume you attach. A wrap-up brief when the call ends. The people who'd use that are recruiters and managers, not just someone doing a product walkthrough, so the name had to stop saying "demo." A lozenge is what you take before you have to talk. I've been told not to explain that in the marketing copy, so I'm explaining it here instead.
Lozenge in Listen mode during a mock interview. Prepared questions with checkboxes on the left, a live transcript in the middle, and a live answer card on the right responding to the question just asked.

Keeping it on the Mac

A tool that listens to your calls and reads your job descriptions should not be shipping any of that to a server I run, so there isn't one. There's no account. Transcription runs on the Mac by default, with Apple's on-device speech engine on macOS 26 and Whisper before that. The model calls for research and wrap-ups go to whatever provider you set up with your own key, or to Ollama running locally, and the keys sit in the Keychain.
A few rules came out of that and got pinned with tests so I couldn't quietly break them later. The app opens at rest, and nothing listens until you press Start. A template field marked Never send doesn't reach a model by any route. A follow-up email opens as a draft in your mail app, and a Slack update doesn't post until you press Post. There's a Usage page that shows what each model has cost, because I got tired of guessing.
Lozenge is at lozenge.ai. It's macOS 14 and up, free while it's in early release, and the details on everything above are on the project page.