Skip to content
CheyYuAnPublic

About

A teleprompter on your own screen that never reaches the audience. macOS menu bar app.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CueBook

A teleprompter on your own screen that never reaches the audience.

license MIT version 0.1.0 macOS 26.0+ no network stars forks

Install • Permissions • Usage • How it works • Self-checks

CueBook puts your script on the screen in front of you and sends that same screen to the projector, minus the script. You keep working on your own display as usual, the audience sees everything on it, and the teleprompter is simply not there. Where it sits on top of a slide, the audience sees the whole slide, not a black hole.

It is a macOS menu bar app. No window, no Dock icon, no recording, no network access.

Install

Download CueBook-<version>-macos.zip from Releases, unzip it, then:

mv CueBook.app /Applications/
xattr -dr com.apple.quarantine /Applications/CueBook.app
open /Applications/CueBook.app

The xattr line clears the quarantine flag macOS puts on browser downloads. CueBook is signed with a self-signed certificate and not notarized, so without it macOS refuses to open the app. Put the app in /Applications before turning on Launch at Login, because the login item remembers where the app was.

Universal app, Apple Silicon and Intel, macOS 26.0 or later.

From source, with Xcode 27 or later:

git clone https://github.com/CheyYuAn/CueBook.git
cd CueBook
xcodebuild -project CueBook.xcodeproj -scheme CueBook -configuration Release -derivedDataPath build/DerivedData CONFIGURATION_BUILD_DIR="$PWD/build/Release" CODE_SIGN_IDENTITY=- build
open build/Release/CueBook.app

CODE_SIGN_IDENTITY=- signs ad hoc, because the project is set up for a certificate you do not have. Launch the app with open or from Finder. Running Contents/MacOS/CueBook directly bypasses LaunchServices and macOS refuses it screen recording.

An ad hoc signature changes with every build, and macOS treats each new one as a different program, so the permissions below have to be granted again after each rebuild. If you build often, sign with a certificate of your own by passing its name as CODE_SIGN_IDENTITY; with a stable identity the grants survive rebuilds.

Permissions

macOS asks for two grants in System Settings under Privacy & Security.

  • Screen Recording, to capture the presenter display. Mirroring cannot start without it.
  • Accessibility, to take over the mouse side buttons while the prompter is shown. CueBook asks the first time you show the prompter. Without it the side buttons do nothing and the menu shows an Accessibility Access item.

If a grant seems stuck, tccutil reset ScreenCapture com.haoyuchen.cuebook clears it and the next launch asks again.

Usage

  1. In System Settings, set your displays to extend, not mirror. See How it works for why.
  2. In the CueBook menu, pick the display you work on under Presenter Screen and the projector under Audience Screen. While either list is expanded, every display shows its own name in large type, so you can tell which entry is which.
  3. Choose Start Mirroring. The audience display now shows the presenter display.
  4. Choose Show Prompter. A sample script, the story of the tortoise and the hare, is loaded until you choose Load Script… and pick a .txt or .md file. Scripts can be up to 20,000 characters, in UTF-8 or GB18030. CueBook keeps the text itself, so moving or renaming the file afterwards changes nothing.
  5. Advance with the forward side button on your mouse, the one nearer your fingertips, and go back with the other one. Each press moves half the visible lines, so the half you just read stays in place and your eyes keep their spot. While the prompter is shown, both buttons belong to CueBook and never reach the app underneath, so your browser will not jump back a page. Hiding the prompter hands them back.

Turn on Adjust Position & Size to move and resize the prompter: drag the middle to move it, drag an edge or corner to resize it. The rest of the time it ignores the mouse entirely. The width sets the font size, large enough that one line holds about 20 Chinese characters, between 10 and 72 points. The height only decides how many lines you see.

The Prompter section also holds Text Color, Alignment and Opacity, which defaults to 20%. Text Color is one of three:

  • White, with a heavy shadow so it stays readable on light slides.
  • Black, without a shadow.
  • Blend with background, which samples what is under each character and draws it a shade lighter or darker, with a thin outline. You can read it face on, but it is hard to read from the side or from a distance. It still cannot beat a privacy filter on the screen.

Picture Fit decides how the presenter display fills an audience display of a different shape: fit keeps the whole picture with black bars, fill crops the edges, stretch distorts. It switches without restarting capture.

Launch at Login only starts CueBook. Mirroring always waits for you to choose Start Mirroring.

Mouse drivers can remap the side buttons. If they do nothing even with Accessibility granted, check your mouse vendor's app and set them back to the standard buttons 4 and 5.

How it works

CueBook captures the whole presenter display with ScreenCaptureKit and excludes its own windows at capture time, then shows the filtered frames full screen on the audience display. Because the exclusion happens while the frame is composed, whatever lies beneath the prompter is captured as if the prompter were not there.

That is why the displays must extend. In system mirroring, one composited picture goes to both displays, and by then there is no notion of separate windows left to remove.

If capture fails, the audience display goes black and the menu shows the error. CueBook never falls back to the unfiltered picture, because showing the script on the projector is worse than showing nothing.

The prompter draws text only, with no background or frame. If the exclusion ever failed, a few faint words on the projector are easier to miss than a dark panel.

One known gap: the CueBook menu bar icon is part of the display picture rather than a window, so it cannot be excluded and appears on the audience display.

Self-checks

Debug builds carry self-checks in CueBook/Testing/, triggered by environment variables. Each run writes a report to the given directory and quits. Build with -configuration Debug and CONFIGURATION_BUILD_DIR="$PWD/build/Debug", then run:

open --env CUEBOOK_SELFTEST=1 --env CUEBOOK_SELFTEST_DIR="$PWD/tmp" build/Debug/CueBook.app

That checks the menu, the font sizing and the scrolling, and writes menu-selftest.txt. With Accessibility granted it also sends one synthetic side button press, which CueBook swallows, and checks that the script moved. Add --env CUEBOOK_SELFTEST_SHOT=1 to save images of the menu and the prompter. These are drawn by CueBook's own windows and views, so nothing else on your screen ends up in them.

CUEBOOK_BUTTONPROBE=1 instead listens for 60 seconds and writes the button numbers your mouse sends to side-buttons.txt, without intercepting anything. CUEBOOK_BLENDCHECK=1 renders the Blend with background colors over a checkerboard, one image per parameter set.

Capture and exclusion have no automated check. Verify them by eye: with mirroring on and the prompter shown, the audience display should show what lies beneath the prompter.

Privacy

No network connections. Nothing is recorded or saved. Blend with background samples only the area beneath the prompter, about every 0.7 seconds, scaled down to 64 pixels wide and kept in memory, and stops as soon as the prompter hides or another color is chosen. Scripts and settings live in the app's preferences.

License

MIT.

About

A teleprompter on your own screen that never reaches the audience. macOS menu bar app.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages