DresvyanskiyDenis/stenopad

Fully-local meeting recorder, transcriber and minute-taker. Records mic + system audio, transcribes and writes minutes on-device. Nothing leaves your machine.

0

stars

2

commits

Python

primary language

Aug 27, 2026

updated

README

Stenopad

A steno pad is the reporter's notebook — narrow, ruled down the middle, made for shorthand taken at the speed of speech.

A fully-local meeting recorder, transcriber and minute-taker that runs in your browser.

Records your microphone and whatever your Mac is playing (Teams, Zoom, Meet, in-person), transcribes it with a local speech model, and writes meeting minutes with a local LLM. Nothing leaves your machine.

uv run stenopad-web

A tab opens at http://127.0.0.1:8477. That is the entire installation.

Why a web app

This is a port of the Tauri desktop build. The ML core, the React UI and the native audio-capture helper are unchanged; the Rust shell, the PyInstaller bundle, the DMG, the code-signing and the Gatekeeper dance are gone.

Desktop (v0.1)Web (v0.2)
ShellTauri 2 + Rust (2 097 LOC)FastAPI (909 LOC)
Frontend ↔ backendTauri invoke + 32 contract testsone WebSocket, same JSON protocol
Installbuild → sign → notarise → DMG → drag → xattr -druv run stenopad-web, or make app for a 1.0 GB .app
Updaterebuild + redistribute a 385 MB DMGgit pull

Audio capture

Two paths, because browsers cannot tap another application's audio:

  1. Native helper (default). native/stenopad-audio — a 288 KB Swift binary using the Core Audio process-tap API (macOS 14.4+). Captures the microphone on the left channel and system audio on the right, with no picker dialog, including the Teams desktop app. The Python server spawns it and speaks JSON-lines over stdio.
  2. Browser fallback (zero install). getUserMedia for the mic plus getDisplayMedia for a shared tab's audio. Works anywhere Chrome or Edge runs, but only captures meetings joined in a browser tab, and the user must pick the tab and tick "Share tab audio" each time.

Requirements

  • macOS 14.4+ on Apple Silicon (for the native helper; the fallback is looser)
  • Python 3.12+ and uv
  • Chrome or Edge (Safari and Firefox cannot capture tab audio at all)
  • An OpenAI-compatible LLM server for summarisation — or none, in which case the app starts its own llama-server against the GGUF it downloaded

Documentation

Licence

MIT — see LICENSE.

Contributors

DresvyanskiyDenis/stenopad

Fully-local meeting recorder, transcriber and minute-taker. Records mic + system audio, transcribes and writes minutes on-device. Nothing leaves your machine.

0

stars

2

commits

Python

primary language

Aug 27, 2026

updated

README

Stenopad

A steno pad is the reporter's notebook — narrow, ruled down the middle, made for shorthand taken at the speed of speech.

A fully-local meeting recorder, transcriber and minute-taker that runs in your browser.

Records your microphone and whatever your Mac is playing (Teams, Zoom, Meet, in-person), transcribes it with a local speech model, and writes meeting minutes with a local LLM. Nothing leaves your machine.

uv run stenopad-web

A tab opens at http://127.0.0.1:8477. That is the entire installation.

Why a web app

This is a port of the Tauri desktop build. The ML core, the React UI and the native audio-capture helper are unchanged; the Rust shell, the PyInstaller bundle, the DMG, the code-signing and the Gatekeeper dance are gone.

Desktop (v0.1)Web (v0.2)
ShellTauri 2 + Rust (2 097 LOC)FastAPI (909 LOC)
Frontend ↔ backendTauri invoke + 32 contract testsone WebSocket, same JSON protocol
Installbuild → sign → notarise → DMG → drag → xattr -druv run stenopad-web, or make app for a 1.0 GB .app
Updaterebuild + redistribute a 385 MB DMGgit pull

Audio capture

Two paths, because browsers cannot tap another application's audio:

  1. Native helper (default). native/stenopad-audio — a 288 KB Swift binary using the Core Audio process-tap API (macOS 14.4+). Captures the microphone on the left channel and system audio on the right, with no picker dialog, including the Teams desktop app. The Python server spawns it and speaks JSON-lines over stdio.
  2. Browser fallback (zero install). getUserMedia for the mic plus getDisplayMedia for a shared tab's audio. Works anywhere Chrome or Edge runs, but only captures meetings joined in a browser tab, and the user must pick the tab and tick "Share tab audio" each time.

Requirements

  • macOS 14.4+ on Apple Silicon (for the native helper; the fallback is looser)
  • Python 3.12+ and uv
  • Chrome or Edge (Safari and Firefox cannot capture tab audio at all)
  • An OpenAI-compatible LLM server for summarisation — or none, in which case the app starts its own llama-server against the GGUF it downloaded

Documentation

Licence

MIT — see LICENSE.

Contributors

Languages

Python

55.5%

TypeScript

32.6%

CSS

6.3%

Swift

5.1%