Skip to main content

Always-on terminal audio recorder + local transcription (Whisper)

Project description

huske

CI License: MIT

huske — Norwegian for "to remember"

A terminal app that runs in the background, continuously records your microphone plus your computer's system audio, and transcribes the audio locally with mlx-whisper — producing a day-organized, LLM-friendly knowledge base of everything that was said on your machine throughout the day.

Point Claude Code (or any other LLM agent) at ~/huske/transcripts/ and ask it about your day.

~/huske/transcripts/
├── 2026-05-07/
│   ├── 091500_8a3f2c19_001.md
│   ├── 093000_8a3f2c19_002.md
│   └── 094500_8a3f2c19_003.md
└── README.md

Features

  • Continuous capture — mic (sounddevice) + system audio (Apple ScreenCaptureKit), mixed in software, no gaps at chunk boundaries.
  • No drivers, no Audio MIDI Setup — system audio comes through Apple's modern ScreenCaptureKit framework. Just grant Screen Recording permission once.
  • Local transcriptionmlx-whisper, default base model, runs on the Apple Silicon GPU via MLX. Audio never leaves your machine.
  • Configurable chunk size — default 15 minutes, anything from 6 s to 60 min.
  • Resilient — graceful stop finalizes the partial chunk; SIGKILL + restart auto-recovers orphaned audio.
  • Pretty terminal UI — Rich Live panel with countdown, mic + system level meters, queue depth, last-saved transcript, rolling event log, and runtime controls for pause/resume and screenshots.
  • LLM-ready output — every transcript is a single Markdown file with full YAML frontmatter; the directory layout is documented in ~/huske/transcripts/README.md (auto-generated).
  • Optional periodic screenshots — opt in with --screenshots to also capture a JPEG of every attached display every 10 s, stored under ~/huske/screenshots/YYYY-MM-DD/<session>/HHMMSS_dN.jpg for downstream multimodal LLM use. Off by default; see Periodic screenshots.

Requirements

  • macOS 13 (Ventura) or newer. Apple Silicon is the primary target.
  • Python 3.11, 3.12, or 3.13.

Quickstart

# 1. Install
uv tool install huske

# 2. Validate setup (will prompt for Screen Recording permission on first run)
huske doctor

# 3. Record (Ctrl+C to stop)
huske run

# 4. Reclaim orphans from a prior crash without recording
huske recover

Other install options:

# Alternative Python tool installer:
pipx install huske

# macOS Apple Silicon with Homebrew:
brew tap tiagomoraes/huske
brew install huske

On first launch macOS will prompt you to grant Screen Recording permission to your Python interpreter — that's what ScreenCaptureKit needs to capture system audio. After approving once, it's silent forever.

Runtime controls in the live UI:

?       open or close the controls overlay

Inside controls:
p       pause or resume audio recording
s       enable or disable periodic screenshots
q       graceful stop
Esc     close controls

Ctrl+C  graceful stop from anywhere

Pausing finalizes the current partial chunk and stops writing audio until you resume. Toggling screenshots takes effect immediately, using the configured screenshots directory and interval.

For prerelease builds or exact GitHub tags, install directly from the repository:

uv tool install "git+https://github.com/tiagomoraes/huske.git@v0.1.0"

See quickstart.md for the full setup.

Run on login (macOS)

huske autostart install registers a per-user LaunchAgent that runs huske run --no-ui automatically every time you log in.

# Install — writes ~/Library/LaunchAgents/me.huske.plist and loads it now.
huske autostart install

# Optional: pass a config file or non-default log level.
huske autostart install --config ~/.config/huske/config.toml --log-level DEBUG

# Show current state (installed, loaded, pid, last exit code).
huske autostart status

# Manually start/stop without uninstalling.
huske autostart start
huske autostart stop

# Remove entirely.
huske autostart uninstall

Restart policy is "restart on crash only" by default (KeepAlive={SuccessfulExit:false}): if you huske autostart stop or huske exits cleanly, it stays stopped until next login. Pass --no-keep-alive to disable auto-restart on crash too.

Permissions. The first time the agent records, macOS will prompt for Microphone and Screen Recording permissions for the resolved huske binary (or its Python interpreter). Approve both in System Settings → Privacy & Security. If the prompts don't appear after login, run huske autostart start once from the terminal so they fire while you're present.

Logs. The agent has no TUI; stdout and stderr are appended to:

~/Library/Logs/huske/agent.out.log
~/Library/Logs/huske/agent.err.log

Tail those if you suspect the agent isn't recording.

huske autostart is macOS-only (it uses launchd); the commands exit with a friendly error on other systems.

Update notifications

On startup, huske checks PyPI at most once every 24 hours and prints an "update available" banner with the right upgrade command for your install method (uv tool upgrade huske, pipx upgrade huske, or brew upgrade huske). The check runs in a background thread, is silent on network errors, on non-TTY stderr, and for editable installs. Disable it with:

export HUSKE_NO_UPDATE_CHECK=1

Periodic screenshots (opt-in)

huske run --screenshots enables a background thread that captures a JPEG of every attached display every 10 seconds (configurable). Screenshots are written to:

~/huske/screenshots/YYYY-MM-DD/<session_id>/HHMMSS_dN.jpg

…where dN is the display index (d1 is the main display). Filenames are timestamped so a downstream multimodal LLM can correlate each screenshot with that day's transcripts.

Capture uses macOS's built-in screencapture, so no extra dependency is needed and the same Screen Recording permission you've already granted for system audio is reused.

Flags:

huske run --screenshots                       # opt in
huske run --screenshots --screenshot-interval 30
huske run --screenshots --screenshots-root ~/another/path

The screenshot interval must be at least 1 second.

Privacy. Screenshots can capture passwords, private chats, financial details, and anything else on screen. They're stored unencrypted on disk and read-accessible to any process running as your user. Treat ~/huske/screenshots/ exactly like the audio and transcript directories: never commit it, share with care, and review the Privacy and consent section before enabling.

Privacy and consent

huske is local-first: audio capture and transcription run on your machine, and the app writes transcripts to your configured filesystem path. That does not make the data low-risk. Recordings, transcripts, logs, filenames, and device metadata can contain private or legally sensitive information.

  • Get consent before recording other people or regulated conversations.
  • Do not commit generated audio, transcripts, logs, local configs, model caches, or screenshots containing private content.
  • The --screenshots flag captures everything visible on every attached display every 10 s — including any password manager popovers, banking tabs, or private DMs that happen to be open. Leave it off unless you've consciously decided you want this in the on-disk record.
  • Redact huske doctor output before sharing it publicly.
  • Report security or privacy vulnerabilities privately through SECURITY.md.

Documentation

Community

License

huske is released under the MIT License. Third-party notices are in THIRD_PARTY_NOTICES.md.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

huske-0.5.0.tar.gz (120.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

huske-0.5.0-py3-none-any.whl (65.2 kB view details)

Uploaded Python 3

File details

Details for the file huske-0.5.0.tar.gz.

File metadata

  • Download URL: huske-0.5.0.tar.gz
  • Upload date:
  • Size: 120.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for huske-0.5.0.tar.gz
Algorithm Hash digest
SHA256 a062d1f3b9f5f2b7c1a3563ce01c9afe12063cb52a9016f8e522cbaa4f5a0d46
MD5 854ccf7955a58536fd95b3fe17dbaacf
BLAKE2b-256 9e3bf2fb09303f2d7389502e18a6f97a4e01cf3eae406224359a5ef989e11fa3

See more details on using hashes here.

Provenance

The following attestation bundles were made for huske-0.5.0.tar.gz:

Publisher: release.yml on tiagomoraes/huske

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file huske-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: huske-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 65.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for huske-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 cc605ff8ad21f2f5054e4c0dcb11b59ad05c4c8a1c8c63b09c7fb0caac95c556
MD5 94b9807d2c399dcc7edbf8fa4572dfdb
BLAKE2b-256 0fc84036f2fdb7d26d9a8f641ed35a02be9ec23fecfd612ae3b39991980facc7

See more details on using hashes here.

Provenance

The following attestation bundles were made for huske-0.5.0-py3-none-any.whl:

Publisher: release.yml on tiagomoraes/huske

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page