pmptr is a minimal virtual teleprompter that lives as a transparent, always-on-top, click-through overlay over whatever you do on your screen.
- ποΈ Control window - paste your script, tune speed, size, colors, opacity, mirror, window dimensions, and more.
- πͺ Floating prompter window - transparent, frameless, always on top, with a true OS-level click-through "lock" so you can keep working with your mouse on whatever is underneath.
- πΎ Settings persistence - settings are saved to disk in your Electron user-data folder.
- β‘ Live updates - edits in the control window apply to the prompter instantly.
- β¨οΈ Keyboard shortcuts - play/pause, reset, speed control, and click-through toggle.
The fastest way to try pmptr is via npm:
npm install -g pmptr
pmptrRequires Node.js 20 or later.
Then click Open floating prompter in the control window.
Beta - pmptr is in active beta. Expect occasional bugs and breaking changes. Please report issues you encounter.
Prefer a native installer? Grab the latest build from the Releases page.
| Platform | Format |
|---|---|
| macOS | .dmg |
| Windows | .exe (NSIS installer) |
| Linux | .AppImage or .deb |
Not code-signed - your OS may warn on first launch. That's expected during beta.
git clone https://github.com/jatinkrmalik/pmptr.git
cd pmptr
npm install
npm start| Key | Action |
|---|---|
Space |
Play / pause |
R |
Reset scroll to the top |
β / β |
Speed Β± 5 px/s |
L |
Toggle click-through (lock / unlock) |
Esc |
Close the prompter |
You can also use the small HUD in the bottom-right of the floating window (mouse over it to reveal it).
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β pmptr Architecture β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββ
β Main process β
β src/main/main.js β Creates windows, owns
β src/main/preload.js β IPC, click-through,
β β always-on-top, settings
ββββββββββββ¬βββββββββββ
β
ββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββ
β spawns β spawns β read/write
βΌ βΌ βΌ
βββββββββββββββββββββββ βββββββββββββββββββββββ ββββββββββββββββββββ
β Control window β β Prompter window β β settings.json β
β src/control/ β β src/prompter/ β β (Electron user β
β control.html β β prompter.html β β data directory)β
β control.js β β prompter.js β ββββββββββββββββββββ
βββββββββββββββββββββββ β prompter-preload.js β
βββββββββββββββββββββββ
Data flow
βββββββββ
Control window Main process Prompter window
β β β
βββ IPC: setting changed ββΊβ β
β βββ IPC: settings ββββββββββΊβ
β β β
ββββββββββ IPC: state βββββββββββββββ IPC: state βββββββ
β β β
- The **main process** spawns both windows and persists settings to `settings.json`.
- The **control window** sends new settings to the main process over IPC.
- The **prompter window** receives settings from the main process and reports its state back.
- Live edits in the control window are reflected in the prompter instantly.
The prompter is a separate BrowserWindow with transparent: true, frame: false,
and alwaysOnTop: true. When you toggle "click-through" (the lock), the main
process calls win.setIgnoreMouseEvents(true, { forward: true }) - clicks
and wheel events fall straight through to whatever app is behind, while the
window stays visible and keeps scrolling. The HUD itself is hidden while
locked, so nothing on the prompter intercepts your pointer.
The window background is a CSS rgba() color set on .frame. Move the
Background opacity slider to 0 for fully see-through, or use
Background dim to keep it readable on bright content underneath. The text
itself stays opaque.
src/
βββ main/
β βββ main.js Electron main: creates both windows, handles IPC,
β β click-through, always-on-top, position presets.
β βββ preload.js contextBridge for the control window.
βββ control/
β βββ control.html The control panel UI.
β βββ control.js Control panel logic.
β βββ control.css Control panel styles.
βββ prompter/
βββ prompter.html The floating teleprompter overlay.
βββ prompter.js Prompter logic (scroll, shortcuts, HUD).
βββ prompter.css Prompter styles.
βββ prompter-preload.js contextBridge for the prompter window.
assets/
βββ icon.svg Application icon.
.github/workflows/
ββ build.yml CI build for Linux, macOS, Windows.
βββ release.yml Tag-triggered release pipeline.
βββ nightly.yml Daily scheduled builds.
βββ pr-build.yml Comment-triggered PR artifact builds.
# Install dependencies
npm install
# Run the app
npm start
# Lint code
npm run lint
# Run tests (currently just lint)
npm test
# Build for distribution
npm run build- Wayland compositors vary in their support for
setIgnoreMouseEventsandsetAlwaysOnTop(the underlying APIs Electron uses). X11 (Xorg) and recent KDE / GNOME Wayland work fine; some lighter Wayland compositors may ignore these hints. If click-through or always-on-top does not work, the prompter is still useful - just drag it to a corner. - On macOS you may need to grant Accessibility / Screen Recording permissions to the app for click-through to behave predictably across all apps.
- The app is not code-signed. Your OS may warn on first launch.
Contributions are welcome! See CONTRIBUTING.md for details.
MIT - see LICENSE for details.