huske 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- huske-0.1.0/.gitignore +40 -0
- huske-0.1.0/CHANGELOG.md +22 -0
- huske-0.1.0/CODE_OF_CONDUCT.md +27 -0
- huske-0.1.0/CONTRIBUTING.md +79 -0
- huske-0.1.0/LICENSE +21 -0
- huske-0.1.0/PKG-INFO +156 -0
- huske-0.1.0/README.md +116 -0
- huske-0.1.0/SECURITY.md +31 -0
- huske-0.1.0/SUPPORT.md +22 -0
- huske-0.1.0/THIRD_PARTY_NOTICES.md +29 -0
- huske-0.1.0/docs/development.md +78 -0
- huske-0.1.0/docs/issue-triage.md +45 -0
- huske-0.1.0/docs/releasing.md +340 -0
- huske-0.1.0/examples/config.toml +36 -0
- huske-0.1.0/huske/__init__.py +3 -0
- huske-0.1.0/huske/__main__.py +4 -0
- huske-0.1.0/huske/capture/__init__.py +0 -0
- huske-0.1.0/huske/capture/coordinator.py +359 -0
- huske-0.1.0/huske/capture/devices.py +94 -0
- huske-0.1.0/huske/capture/system_audio.py +255 -0
- huske-0.1.0/huske/chunker/__init__.py +0 -0
- huske-0.1.0/huske/chunker/rotator.py +153 -0
- huske-0.1.0/huske/cli.py +117 -0
- huske-0.1.0/huske/config.py +91 -0
- huske-0.1.0/huske/doctor.py +239 -0
- huske-0.1.0/huske/logging_setup.py +71 -0
- huske-0.1.0/huske/models.py +126 -0
- huske-0.1.0/huske/output_readme.py +57 -0
- huske-0.1.0/huske/paths.py +112 -0
- huske-0.1.0/huske/recovery/__init__.py +0 -0
- huske-0.1.0/huske/recovery/scanner.py +165 -0
- huske-0.1.0/huske/run_loop.py +399 -0
- huske-0.1.0/huske/session.py +62 -0
- huske-0.1.0/huske/transcribe/__init__.py +0 -0
- huske-0.1.0/huske/transcribe/worker.py +252 -0
- huske-0.1.0/huske/transcribe/writer.py +99 -0
- huske-0.1.0/huske/ui/__init__.py +0 -0
- huske-0.1.0/huske/ui/live.py +239 -0
- huske-0.1.0/pyproject.toml +103 -0
- huske-0.1.0/specs/001-huske-recorder/checklists/requirements.md +37 -0
- huske-0.1.0/specs/001-huske-recorder/contracts/cli.md +168 -0
- huske-0.1.0/specs/001-huske-recorder/contracts/transcript-format.md +136 -0
- huske-0.1.0/specs/001-huske-recorder/data-model.md +191 -0
- huske-0.1.0/specs/001-huske-recorder/plan.md +132 -0
- huske-0.1.0/specs/001-huske-recorder/quickstart.md +210 -0
- huske-0.1.0/specs/001-huske-recorder/research.md +270 -0
- huske-0.1.0/specs/001-huske-recorder/spec.md +148 -0
- huske-0.1.0/specs/001-huske-recorder/tasks.md +244 -0
- huske-0.1.0/tests/__init__.py +0 -0
- huske-0.1.0/tests/integration/__init__.py +0 -0
- huske-0.1.0/tests/integration/conftest.py +35 -0
- huske-0.1.0/tests/integration/test_pipeline_no_whisper.py +168 -0
- huske-0.1.0/tests/integration/test_real_whisper.py +90 -0
- huske-0.1.0/tests/integration/test_smoke.py +72 -0
- huske-0.1.0/tests/integration/test_system_audio.py +54 -0
- huske-0.1.0/tests/unit/__init__.py +0 -0
- huske-0.1.0/tests/unit/test_chunker.py +126 -0
- huske-0.1.0/tests/unit/test_config.py +76 -0
- huske-0.1.0/tests/unit/test_coordinator_buffer.py +99 -0
- huske-0.1.0/tests/unit/test_output_readme.py +30 -0
- huske-0.1.0/tests/unit/test_paths.py +124 -0
- huske-0.1.0/tests/unit/test_paths_disambiguation.py +58 -0
- huske-0.1.0/tests/unit/test_recovery.py +132 -0
- huske-0.1.0/tests/unit/test_render_state.py +46 -0
- huske-0.1.0/tests/unit/test_sleep_wake.py +47 -0
- huske-0.1.0/tests/unit/test_writer.py +111 -0
huske-0.1.0/.gitignore
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.egg-info/
|
|
6
|
+
.pytest_cache/
|
|
7
|
+
.ruff_cache/
|
|
8
|
+
.mypy_cache/
|
|
9
|
+
|
|
10
|
+
# Virtualenvs
|
|
11
|
+
.venv/
|
|
12
|
+
venv/
|
|
13
|
+
env/
|
|
14
|
+
|
|
15
|
+
# Build artifacts
|
|
16
|
+
build/
|
|
17
|
+
dist/
|
|
18
|
+
*.egg
|
|
19
|
+
|
|
20
|
+
# OS
|
|
21
|
+
.DS_Store
|
|
22
|
+
Thumbs.db
|
|
23
|
+
|
|
24
|
+
# Editors
|
|
25
|
+
.vscode/
|
|
26
|
+
.idea/
|
|
27
|
+
*.swp
|
|
28
|
+
*.swo
|
|
29
|
+
|
|
30
|
+
# Local data
|
|
31
|
+
.env
|
|
32
|
+
.env.local
|
|
33
|
+
.env.*
|
|
34
|
+
!.env.example
|
|
35
|
+
|
|
36
|
+
# Generated recordings, transcripts, logs, and model/cache data
|
|
37
|
+
audio/
|
|
38
|
+
transcripts/
|
|
39
|
+
logs/
|
|
40
|
+
models/
|
huske-0.1.0/CHANGELOG.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to huske will be documented in this file.
|
|
4
|
+
|
|
5
|
+
This project uses semantic versioning after the first public release.
|
|
6
|
+
|
|
7
|
+
## Unreleased
|
|
8
|
+
|
|
9
|
+
- Nothing yet.
|
|
10
|
+
|
|
11
|
+
## 0.1.0
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- Initial always-on macOS terminal recorder.
|
|
16
|
+
- Microphone and system audio capture.
|
|
17
|
+
- Local transcription through faster-whisper.
|
|
18
|
+
- Day-organized Markdown transcript output.
|
|
19
|
+
- Recovery for orphaned audio chunks.
|
|
20
|
+
- Rich terminal UI and setup doctor.
|
|
21
|
+
- Open source project structure: license, contribution guide, code of conduct,
|
|
22
|
+
security policy, support guide, issue templates, PR template, and CI.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Code of Conduct
|
|
2
|
+
|
|
3
|
+
huske should be a practical, respectful project for people building local-first
|
|
4
|
+
audio tooling.
|
|
5
|
+
|
|
6
|
+
## Expected behavior
|
|
7
|
+
|
|
8
|
+
- Be direct, kind, and constructive.
|
|
9
|
+
- Assume privacy-sensitive context around audio, transcripts, logs, and device
|
|
10
|
+
details.
|
|
11
|
+
- Keep critique focused on code, documentation, behavior, and project outcomes.
|
|
12
|
+
- Respect maintainer decisions about project scope and user safety.
|
|
13
|
+
|
|
14
|
+
## Unacceptable behavior
|
|
15
|
+
|
|
16
|
+
- Harassment, insults, threats, or sustained disruption.
|
|
17
|
+
- Publishing another person's private information.
|
|
18
|
+
- Sharing audio, transcripts, logs, screenshots, or identifiers without consent.
|
|
19
|
+
- Pressuring contributors to disclose sensitive local environment details.
|
|
20
|
+
- Repeatedly ignoring maintainer guidance after being asked to stop.
|
|
21
|
+
|
|
22
|
+
## Enforcement
|
|
23
|
+
|
|
24
|
+
Maintainers may edit or delete comments, close issues, reject contributions, or
|
|
25
|
+
block participants when needed to keep the project safe and productive. Reports
|
|
26
|
+
can be sent privately through the security reporting path in
|
|
27
|
+
[SECURITY.md](SECURITY.md) when public discussion would expose sensitive details.
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Contributing to huske
|
|
2
|
+
|
|
3
|
+
Thanks for helping improve huske. This project records microphone and system
|
|
4
|
+
audio, so contribution quality includes privacy hygiene as much as code quality.
|
|
5
|
+
|
|
6
|
+
## Code of conduct
|
|
7
|
+
|
|
8
|
+
Participating in this project means following the project
|
|
9
|
+
[Code of Conduct](CODE_OF_CONDUCT.md).
|
|
10
|
+
|
|
11
|
+
## Before opening an issue
|
|
12
|
+
|
|
13
|
+
1. Search existing issues and pull requests for the same report or proposal.
|
|
14
|
+
2. Run `huske doctor` and include only non-sensitive results.
|
|
15
|
+
3. Check [README.md](README.md), [docs/development.md](docs/development.md),
|
|
16
|
+
and the feature specs under [specs/](specs/).
|
|
17
|
+
4. Remove names, meeting details, raw transcript text, audio files, paths that
|
|
18
|
+
expose private information, and any credentials before posting.
|
|
19
|
+
|
|
20
|
+
Use the issue templates when available:
|
|
21
|
+
|
|
22
|
+
- Bug report: reproducible failures, crashes, bad transcripts, device problems.
|
|
23
|
+
- Feature request: new behavior, platform support, workflow improvements.
|
|
24
|
+
- Documentation: unclear, missing, or outdated docs.
|
|
25
|
+
- Security or privacy vulnerability: follow [SECURITY.md](SECURITY.md) instead
|
|
26
|
+
of opening a public issue.
|
|
27
|
+
|
|
28
|
+
## Finding work to pick up
|
|
29
|
+
|
|
30
|
+
Good first issues should be small, reproducible, and covered by a focused test
|
|
31
|
+
or documentation change. Useful labels for maintainers are documented in
|
|
32
|
+
[docs/issue-triage.md](docs/issue-triage.md). If an issue is not clearly scoped,
|
|
33
|
+
ask for clarification before starting implementation.
|
|
34
|
+
|
|
35
|
+
## Development setup
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
python3 -m venv .venv
|
|
39
|
+
source .venv/bin/activate
|
|
40
|
+
python -m pip install --upgrade pip
|
|
41
|
+
python -m pip install -e ".[dev]"
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
For macOS capture checks, run:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
huske doctor
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
For the current CI baseline, run:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
pytest tests/unit
|
|
54
|
+
pytest tests/integration/test_pipeline_no_whisper.py tests/integration/test_smoke.py
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Ruff and Mypy configuration is present for local quality work, but they are not
|
|
58
|
+
CI gates yet while the 0.1 codebase is being stabilized. Integration tests are
|
|
59
|
+
documented in [docs/development.md](docs/development.md); some need macOS
|
|
60
|
+
permissions or download a Whisper model.
|
|
61
|
+
|
|
62
|
+
## Pull requests
|
|
63
|
+
|
|
64
|
+
1. Open an issue first for non-trivial behavior changes.
|
|
65
|
+
2. Keep PRs focused on one concern.
|
|
66
|
+
3. Add or update tests when behavior changes.
|
|
67
|
+
4. Update README, docs, examples, or specs when user-facing behavior changes.
|
|
68
|
+
5. Do not commit generated audio, transcripts, logs, local config, model caches,
|
|
69
|
+
credentials, or screenshots containing private content.
|
|
70
|
+
6. Link the relevant issue in the PR description.
|
|
71
|
+
7. Fill out the PR checklist and include the exact checks you ran.
|
|
72
|
+
|
|
73
|
+
Commit messages should be short and descriptive. Existing history uses a simple
|
|
74
|
+
conventional style such as `feat:`, `fix:`, `docs:`, `test:`, and `chore:`.
|
|
75
|
+
|
|
76
|
+
## License of contributions
|
|
77
|
+
|
|
78
|
+
By submitting a contribution, you agree that your contribution is licensed under
|
|
79
|
+
the same [MIT License](LICENSE) as the project.
|
huske-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Tiago Moraes
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
huske-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: huske
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Always-on terminal audio recorder + local transcription (Whisper)
|
|
5
|
+
Project-URL: Homepage, https://github.com/tiagomoraes/huske
|
|
6
|
+
Project-URL: Repository, https://github.com/tiagomoraes/huske
|
|
7
|
+
Project-URL: Issues, https://github.com/tiagomoraes/huske/issues
|
|
8
|
+
Project-URL: Changelog, https://github.com/tiagomoraes/huske/blob/develop/CHANGELOG.md
|
|
9
|
+
Author: Tiago Moraes
|
|
10
|
+
License-Expression: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: audio,terminal,transcription,tui,whisper
|
|
13
|
+
Classifier: Development Status :: 3 - Alpha
|
|
14
|
+
Classifier: Environment :: Console
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: Operating System :: MacOS
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Topic :: Multimedia :: Sound/Audio :: Capture/Recording
|
|
22
|
+
Requires-Python: <3.14,>=3.11
|
|
23
|
+
Requires-Dist: faster-whisper>=1.0.3
|
|
24
|
+
Requires-Dist: numpy>=1.26
|
|
25
|
+
Requires-Dist: pydantic>=2.6
|
|
26
|
+
Requires-Dist: pyobjc-framework-coremedia>=10; sys_platform == 'darwin'
|
|
27
|
+
Requires-Dist: pyobjc-framework-screencapturekit>=10; sys_platform == 'darwin'
|
|
28
|
+
Requires-Dist: pyyaml>=6.0
|
|
29
|
+
Requires-Dist: rich>=13.7
|
|
30
|
+
Requires-Dist: sounddevice>=0.4.6
|
|
31
|
+
Requires-Dist: soundfile>=0.12.1
|
|
32
|
+
Requires-Dist: structlog>=24.1
|
|
33
|
+
Requires-Dist: typer>=0.12
|
|
34
|
+
Provides-Extra: dev
|
|
35
|
+
Requires-Dist: mypy>=1.10; extra == 'dev'
|
|
36
|
+
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
|
|
37
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
38
|
+
Requires-Dist: ruff>=0.4; extra == 'dev'
|
|
39
|
+
Description-Content-Type: text/markdown
|
|
40
|
+
|
|
41
|
+
# huske
|
|
42
|
+
|
|
43
|
+
[](https://github.com/tiagomoraes/huske/actions/workflows/ci.yml)
|
|
44
|
+
[](LICENSE)
|
|
45
|
+
|
|
46
|
+
> *huske* — Norwegian for "to remember"
|
|
47
|
+
|
|
48
|
+
A terminal app that runs in the background, continuously records your microphone
|
|
49
|
+
plus your computer's system audio, and transcribes the audio locally with
|
|
50
|
+
[faster-whisper](https://github.com/SYSTRAN/faster-whisper) — producing a
|
|
51
|
+
day-organized, LLM-friendly knowledge base of everything that was said on your
|
|
52
|
+
machine throughout the day.
|
|
53
|
+
|
|
54
|
+
Point Claude Code (or any other LLM agent) at `~/huske/transcripts/` and ask
|
|
55
|
+
it about your day.
|
|
56
|
+
|
|
57
|
+
```text
|
|
58
|
+
~/huske/transcripts/
|
|
59
|
+
├── 2026-05-07/
|
|
60
|
+
│ ├── 091500_8a3f2c19_001.md
|
|
61
|
+
│ ├── 093000_8a3f2c19_002.md
|
|
62
|
+
│ └── 094500_8a3f2c19_003.md
|
|
63
|
+
└── README.md
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Features
|
|
67
|
+
|
|
68
|
+
- **Continuous capture** — mic (sounddevice) + system audio (Apple ScreenCaptureKit),
|
|
69
|
+
mixed in software, no gaps at chunk boundaries.
|
|
70
|
+
- **No drivers, no Audio MIDI Setup** — system audio comes through Apple's
|
|
71
|
+
modern ScreenCaptureKit framework. Just grant Screen Recording permission once.
|
|
72
|
+
- **Local transcription** — `faster-whisper`, default `base` model. Audio never
|
|
73
|
+
leaves your machine.
|
|
74
|
+
- **Configurable chunk size** — default 15 minutes, anything from 6 s to 60 min.
|
|
75
|
+
- **Resilient** — graceful stop finalizes the partial chunk; SIGKILL + restart
|
|
76
|
+
auto-recovers orphaned audio.
|
|
77
|
+
- **Pretty terminal UI** — Rich Live panel with countdown, mic + system level
|
|
78
|
+
meters, queue depth, last-saved transcript, rolling event log.
|
|
79
|
+
- **LLM-ready output** — every transcript is a single Markdown file with full
|
|
80
|
+
YAML frontmatter; the directory layout is documented in
|
|
81
|
+
`~/huske/transcripts/README.md` (auto-generated).
|
|
82
|
+
|
|
83
|
+
## Requirements
|
|
84
|
+
|
|
85
|
+
- macOS 13 (Ventura) or newer. Apple Silicon is the primary target.
|
|
86
|
+
- Python 3.11, 3.12, or 3.13.
|
|
87
|
+
|
|
88
|
+
## Quickstart
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# 1. Install
|
|
92
|
+
uv tool install huske
|
|
93
|
+
|
|
94
|
+
# pipx works too:
|
|
95
|
+
# pipx install huske
|
|
96
|
+
|
|
97
|
+
# 2. Validate setup (will prompt for Screen Recording permission on first run)
|
|
98
|
+
huske doctor
|
|
99
|
+
|
|
100
|
+
# 3. Record (Ctrl+C to stop)
|
|
101
|
+
huske run
|
|
102
|
+
|
|
103
|
+
# 4. Reclaim orphans from a prior crash without recording
|
|
104
|
+
huske recover
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
On first launch macOS will prompt you to grant **Screen Recording** permission
|
|
108
|
+
to your Python interpreter — that's what ScreenCaptureKit needs to capture
|
|
109
|
+
system audio. After approving once, it's silent forever.
|
|
110
|
+
|
|
111
|
+
For prerelease builds or exact GitHub tags, install directly from the repository:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
uv tool install "git+https://github.com/tiagomoraes/huske.git@v0.1.0"
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
See [quickstart.md](specs/001-huske-recorder/quickstart.md) for the full setup.
|
|
118
|
+
|
|
119
|
+
## Privacy and consent
|
|
120
|
+
|
|
121
|
+
huske is local-first: audio capture and transcription run on your machine, and
|
|
122
|
+
the app writes transcripts to your configured filesystem path. That does not
|
|
123
|
+
make the data low-risk. Recordings, transcripts, logs, filenames, and device
|
|
124
|
+
metadata can contain private or legally sensitive information.
|
|
125
|
+
|
|
126
|
+
- Get consent before recording other people or regulated conversations.
|
|
127
|
+
- Do not commit generated audio, transcripts, logs, local configs, model caches,
|
|
128
|
+
or screenshots containing private content.
|
|
129
|
+
- Redact `huske doctor` output before sharing it publicly.
|
|
130
|
+
- Report security or privacy vulnerabilities privately through
|
|
131
|
+
[SECURITY.md](SECURITY.md).
|
|
132
|
+
|
|
133
|
+
## Documentation
|
|
134
|
+
|
|
135
|
+
- [Development](docs/development.md) — local setup, checks, and test strategy.
|
|
136
|
+
- [Contributing](CONTRIBUTING.md) — how to open issues and pull requests.
|
|
137
|
+
- [Issue triage](docs/issue-triage.md) — labels and maintainer workflow.
|
|
138
|
+
- [Release checklist](docs/releasing.md) — release preparation notes.
|
|
139
|
+
- [Spec](specs/001-huske-recorder/spec.md) — what huske does and why.
|
|
140
|
+
- [Plan](specs/001-huske-recorder/plan.md) — technical context and architecture.
|
|
141
|
+
- [CLI contract](specs/001-huske-recorder/contracts/cli.md) — flags, exit codes.
|
|
142
|
+
- [Transcript format contract](specs/001-huske-recorder/contracts/transcript-format.md) — the LLM-consumer interface.
|
|
143
|
+
- [Quickstart](specs/001-huske-recorder/quickstart.md) — end-to-end setup.
|
|
144
|
+
|
|
145
|
+
## Community
|
|
146
|
+
|
|
147
|
+
- Follow the [Code of Conduct](CODE_OF_CONDUCT.md).
|
|
148
|
+
- Use issue templates for bugs, features, and documentation reports.
|
|
149
|
+
- Use the [pull request template](.github/PULL_REQUEST_TEMPLATE.md) and include
|
|
150
|
+
the exact checks you ran.
|
|
151
|
+
- For help, see [SUPPORT.md](SUPPORT.md).
|
|
152
|
+
|
|
153
|
+
## License
|
|
154
|
+
|
|
155
|
+
huske is released under the [MIT License](LICENSE). Third-party notices are in
|
|
156
|
+
[THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
|
huske-0.1.0/README.md
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# huske
|
|
2
|
+
|
|
3
|
+
[](https://github.com/tiagomoraes/huske/actions/workflows/ci.yml)
|
|
4
|
+
[](LICENSE)
|
|
5
|
+
|
|
6
|
+
> *huske* — Norwegian for "to remember"
|
|
7
|
+
|
|
8
|
+
A terminal app that runs in the background, continuously records your microphone
|
|
9
|
+
plus your computer's system audio, and transcribes the audio locally with
|
|
10
|
+
[faster-whisper](https://github.com/SYSTRAN/faster-whisper) — producing a
|
|
11
|
+
day-organized, LLM-friendly knowledge base of everything that was said on your
|
|
12
|
+
machine throughout the day.
|
|
13
|
+
|
|
14
|
+
Point Claude Code (or any other LLM agent) at `~/huske/transcripts/` and ask
|
|
15
|
+
it about your day.
|
|
16
|
+
|
|
17
|
+
```text
|
|
18
|
+
~/huske/transcripts/
|
|
19
|
+
├── 2026-05-07/
|
|
20
|
+
│ ├── 091500_8a3f2c19_001.md
|
|
21
|
+
│ ├── 093000_8a3f2c19_002.md
|
|
22
|
+
│ └── 094500_8a3f2c19_003.md
|
|
23
|
+
└── README.md
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Features
|
|
27
|
+
|
|
28
|
+
- **Continuous capture** — mic (sounddevice) + system audio (Apple ScreenCaptureKit),
|
|
29
|
+
mixed in software, no gaps at chunk boundaries.
|
|
30
|
+
- **No drivers, no Audio MIDI Setup** — system audio comes through Apple's
|
|
31
|
+
modern ScreenCaptureKit framework. Just grant Screen Recording permission once.
|
|
32
|
+
- **Local transcription** — `faster-whisper`, default `base` model. Audio never
|
|
33
|
+
leaves your machine.
|
|
34
|
+
- **Configurable chunk size** — default 15 minutes, anything from 6 s to 60 min.
|
|
35
|
+
- **Resilient** — graceful stop finalizes the partial chunk; SIGKILL + restart
|
|
36
|
+
auto-recovers orphaned audio.
|
|
37
|
+
- **Pretty terminal UI** — Rich Live panel with countdown, mic + system level
|
|
38
|
+
meters, queue depth, last-saved transcript, rolling event log.
|
|
39
|
+
- **LLM-ready output** — every transcript is a single Markdown file with full
|
|
40
|
+
YAML frontmatter; the directory layout is documented in
|
|
41
|
+
`~/huske/transcripts/README.md` (auto-generated).
|
|
42
|
+
|
|
43
|
+
## Requirements
|
|
44
|
+
|
|
45
|
+
- macOS 13 (Ventura) or newer. Apple Silicon is the primary target.
|
|
46
|
+
- Python 3.11, 3.12, or 3.13.
|
|
47
|
+
|
|
48
|
+
## Quickstart
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# 1. Install
|
|
52
|
+
uv tool install huske
|
|
53
|
+
|
|
54
|
+
# pipx works too:
|
|
55
|
+
# pipx install huske
|
|
56
|
+
|
|
57
|
+
# 2. Validate setup (will prompt for Screen Recording permission on first run)
|
|
58
|
+
huske doctor
|
|
59
|
+
|
|
60
|
+
# 3. Record (Ctrl+C to stop)
|
|
61
|
+
huske run
|
|
62
|
+
|
|
63
|
+
# 4. Reclaim orphans from a prior crash without recording
|
|
64
|
+
huske recover
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
On first launch macOS will prompt you to grant **Screen Recording** permission
|
|
68
|
+
to your Python interpreter — that's what ScreenCaptureKit needs to capture
|
|
69
|
+
system audio. After approving once, it's silent forever.
|
|
70
|
+
|
|
71
|
+
For prerelease builds or exact GitHub tags, install directly from the repository:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
uv tool install "git+https://github.com/tiagomoraes/huske.git@v0.1.0"
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
See [quickstart.md](specs/001-huske-recorder/quickstart.md) for the full setup.
|
|
78
|
+
|
|
79
|
+
## Privacy and consent
|
|
80
|
+
|
|
81
|
+
huske is local-first: audio capture and transcription run on your machine, and
|
|
82
|
+
the app writes transcripts to your configured filesystem path. That does not
|
|
83
|
+
make the data low-risk. Recordings, transcripts, logs, filenames, and device
|
|
84
|
+
metadata can contain private or legally sensitive information.
|
|
85
|
+
|
|
86
|
+
- Get consent before recording other people or regulated conversations.
|
|
87
|
+
- Do not commit generated audio, transcripts, logs, local configs, model caches,
|
|
88
|
+
or screenshots containing private content.
|
|
89
|
+
- Redact `huske doctor` output before sharing it publicly.
|
|
90
|
+
- Report security or privacy vulnerabilities privately through
|
|
91
|
+
[SECURITY.md](SECURITY.md).
|
|
92
|
+
|
|
93
|
+
## Documentation
|
|
94
|
+
|
|
95
|
+
- [Development](docs/development.md) — local setup, checks, and test strategy.
|
|
96
|
+
- [Contributing](CONTRIBUTING.md) — how to open issues and pull requests.
|
|
97
|
+
- [Issue triage](docs/issue-triage.md) — labels and maintainer workflow.
|
|
98
|
+
- [Release checklist](docs/releasing.md) — release preparation notes.
|
|
99
|
+
- [Spec](specs/001-huske-recorder/spec.md) — what huske does and why.
|
|
100
|
+
- [Plan](specs/001-huske-recorder/plan.md) — technical context and architecture.
|
|
101
|
+
- [CLI contract](specs/001-huske-recorder/contracts/cli.md) — flags, exit codes.
|
|
102
|
+
- [Transcript format contract](specs/001-huske-recorder/contracts/transcript-format.md) — the LLM-consumer interface.
|
|
103
|
+
- [Quickstart](specs/001-huske-recorder/quickstart.md) — end-to-end setup.
|
|
104
|
+
|
|
105
|
+
## Community
|
|
106
|
+
|
|
107
|
+
- Follow the [Code of Conduct](CODE_OF_CONDUCT.md).
|
|
108
|
+
- Use issue templates for bugs, features, and documentation reports.
|
|
109
|
+
- Use the [pull request template](.github/PULL_REQUEST_TEMPLATE.md) and include
|
|
110
|
+
the exact checks you ran.
|
|
111
|
+
- For help, see [SUPPORT.md](SUPPORT.md).
|
|
112
|
+
|
|
113
|
+
## License
|
|
114
|
+
|
|
115
|
+
huske is released under the [MIT License](LICENSE). Third-party notices are in
|
|
116
|
+
[THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
|
huske-0.1.0/SECURITY.md
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Supported versions
|
|
4
|
+
|
|
5
|
+
huske is pre-1.0 software. Security and privacy fixes are handled on the
|
|
6
|
+
`develop` branch and released with the next tagged version when releases begin.
|
|
7
|
+
|
|
8
|
+
## Reporting a vulnerability
|
|
9
|
+
|
|
10
|
+
Do not open a public issue for vulnerabilities or privacy-sensitive reports.
|
|
11
|
+
Use GitHub private vulnerability reporting when available:
|
|
12
|
+
|
|
13
|
+
<https://github.com/tiagomoraes/huske/security/advisories/new>
|
|
14
|
+
|
|
15
|
+
If private reporting is unavailable, open a minimal public issue asking for a
|
|
16
|
+
private maintainer contact without including exploit details, audio, transcripts,
|
|
17
|
+
logs, credentials, or private paths.
|
|
18
|
+
|
|
19
|
+
Useful reports include:
|
|
20
|
+
|
|
21
|
+
- A concise description of the risk.
|
|
22
|
+
- Affected version or commit.
|
|
23
|
+
- Reproduction steps using synthetic or redacted data.
|
|
24
|
+
- Expected impact.
|
|
25
|
+
- Any suggested mitigation.
|
|
26
|
+
|
|
27
|
+
## Privacy-sensitive data
|
|
28
|
+
|
|
29
|
+
huske can create audio chunks, transcripts, logs, and local configuration that
|
|
30
|
+
may contain private information. Never attach raw recordings, real transcripts,
|
|
31
|
+
or personal logs to public issues or pull requests.
|
huske-0.1.0/SUPPORT.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Support
|
|
2
|
+
|
|
3
|
+
huske is maintained as an open source project with best-effort support.
|
|
4
|
+
|
|
5
|
+
## Where to ask
|
|
6
|
+
|
|
7
|
+
- Bugs: open a bug report with the issue template.
|
|
8
|
+
- Feature ideas: open a feature request and describe the workflow it enables.
|
|
9
|
+
- Documentation gaps: open a documentation issue or a focused PR.
|
|
10
|
+
- Security or privacy vulnerabilities: follow [SECURITY.md](SECURITY.md).
|
|
11
|
+
|
|
12
|
+
## What to include
|
|
13
|
+
|
|
14
|
+
- `huske --version`
|
|
15
|
+
- macOS version and hardware class
|
|
16
|
+
- Python version
|
|
17
|
+
- `huske doctor` output with private details removed
|
|
18
|
+
- The exact command you ran
|
|
19
|
+
- Minimal reproduction steps using synthetic or redacted data
|
|
20
|
+
|
|
21
|
+
Do not share audio files, real transcripts, private logs, credentials, meeting
|
|
22
|
+
names, participant names, customer data, or screenshots with private content.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Third-party notices
|
|
2
|
+
|
|
3
|
+
This repository includes project scaffolding generated from
|
|
4
|
+
[GitHub Spec Kit](https://github.com/github/spec-kit), primarily under
|
|
5
|
+
`.specify/` and `.claude/`. GitHub Spec Kit is licensed under the MIT License.
|
|
6
|
+
|
|
7
|
+
## GitHub Spec Kit
|
|
8
|
+
|
|
9
|
+
MIT License
|
|
10
|
+
|
|
11
|
+
Copyright GitHub, Inc.
|
|
12
|
+
|
|
13
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
14
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
15
|
+
in the Software without restriction, including without limitation the rights
|
|
16
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
17
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
18
|
+
furnished to do so, subject to the following conditions:
|
|
19
|
+
|
|
20
|
+
The above copyright notice and this permission notice shall be included in all
|
|
21
|
+
copies or substantial portions of the Software.
|
|
22
|
+
|
|
23
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
24
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
25
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
26
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
27
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
28
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
29
|
+
SOFTWARE.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Development
|
|
2
|
+
|
|
3
|
+
huske is a Python CLI/TUI application for macOS audio capture and local
|
|
4
|
+
transcription. Most core behavior is testable without real devices; device and
|
|
5
|
+
Whisper checks are isolated in integration tests.
|
|
6
|
+
|
|
7
|
+
## Local setup
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
python3 -m venv .venv
|
|
11
|
+
source .venv/bin/activate
|
|
12
|
+
python -m pip install --upgrade pip
|
|
13
|
+
python -m pip install -e ".[dev]"
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
On macOS, grant Screen Recording permission to the Python interpreter before
|
|
17
|
+
running real system-audio capture. `huske doctor` validates the local setup.
|
|
18
|
+
|
|
19
|
+
## Common commands
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
huske --help
|
|
23
|
+
huske doctor
|
|
24
|
+
huske run
|
|
25
|
+
huske recover
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Checks
|
|
29
|
+
|
|
30
|
+
Run the current CI baseline before opening a PR:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
pytest tests/unit
|
|
34
|
+
pytest tests/integration/test_pipeline_no_whisper.py tests/integration/test_smoke.py
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Additional local quality checks:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
ruff check .
|
|
41
|
+
mypy huske
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Ruff and Mypy are useful while changing Python code, but they are not required
|
|
45
|
+
CI gates yet because the 0.1 branch still needs a dedicated lint/type baseline
|
|
46
|
+
cleanup.
|
|
47
|
+
|
|
48
|
+
Optional integration checks:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
pytest tests/integration/test_system_audio.py
|
|
52
|
+
pytest tests/integration/test_real_whisper.py
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
`test_system_audio.py` requires macOS Screen Recording permission.
|
|
56
|
+
`test_real_whisper.py` downloads and runs the `tiny` faster-whisper model.
|
|
57
|
+
|
|
58
|
+
## Project layout
|
|
59
|
+
|
|
60
|
+
```text
|
|
61
|
+
huske/
|
|
62
|
+
capture/ microphone and system-audio capture
|
|
63
|
+
chunker/ WAV chunk rotation
|
|
64
|
+
recovery/ orphaned audio recovery
|
|
65
|
+
transcribe/ worker process and transcript writing
|
|
66
|
+
ui/ Rich live terminal UI
|
|
67
|
+
specs/ feature specs, contracts, and planning notes
|
|
68
|
+
tests/ unit and integration tests
|
|
69
|
+
examples/ example user configuration
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Privacy rules for development
|
|
73
|
+
|
|
74
|
+
- Use synthetic audio in tests and examples.
|
|
75
|
+
- Do not commit generated recordings, transcripts, logs, local configs, model
|
|
76
|
+
caches, or screenshots containing private content.
|
|
77
|
+
- Redact paths and device names when they reveal private information.
|
|
78
|
+
- Keep reproduction cases minimal and deterministic.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Issue Triage
|
|
2
|
+
|
|
3
|
+
This guide keeps issues actionable once the project is public.
|
|
4
|
+
|
|
5
|
+
## Labels
|
|
6
|
+
|
|
7
|
+
- `bug`: confirmed or likely defect.
|
|
8
|
+
- `feature`: new or changed behavior.
|
|
9
|
+
- `docs`: documentation-only work.
|
|
10
|
+
- `privacy`: behavior involving audio, transcripts, logs, consent, or local data.
|
|
11
|
+
- `good first issue`: small, well-scoped, low-context task.
|
|
12
|
+
- `help wanted`: scoped work where outside contribution is welcome.
|
|
13
|
+
- `needs reproduction`: report needs a minimal repro.
|
|
14
|
+
- `needs decision`: maintainer needs to choose product or architecture direction.
|
|
15
|
+
- `blocked`: cannot progress until an external condition changes.
|
|
16
|
+
|
|
17
|
+
## Bug reports
|
|
18
|
+
|
|
19
|
+
A bug is actionable when it has:
|
|
20
|
+
|
|
21
|
+
- Version or commit.
|
|
22
|
+
- Platform and Python version.
|
|
23
|
+
- Command or workflow that failed.
|
|
24
|
+
- Expected behavior.
|
|
25
|
+
- Actual behavior.
|
|
26
|
+
- Minimal reproduction with synthetic or redacted data.
|
|
27
|
+
|
|
28
|
+
If a report depends on private audio or transcripts, ask for a synthetic repro
|
|
29
|
+
instead of requesting the private material.
|
|
30
|
+
|
|
31
|
+
## Feature requests
|
|
32
|
+
|
|
33
|
+
A feature request is actionable when it describes:
|
|
34
|
+
|
|
35
|
+
- The workflow or user problem.
|
|
36
|
+
- Why existing behavior is insufficient.
|
|
37
|
+
- Proposed behavior.
|
|
38
|
+
- Privacy or consent implications.
|
|
39
|
+
- Acceptance criteria or examples.
|
|
40
|
+
|
|
41
|
+
## Closing issues
|
|
42
|
+
|
|
43
|
+
Close issues that are duplicates, unsupported by a reproduction after follow-up,
|
|
44
|
+
outside project scope, or unsafe to handle publicly. Link to the relevant issue,
|
|
45
|
+
PR, or documentation when closing.
|