@fastagent-sh/voicenote 0.17.9
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.
- package/LICENSE +21 -0
- package/README.md +351 -0
- package/README.zh-CN.md +351 -0
- package/package.json +58 -0
- package/src/cli.ts +2843 -0
- package/src/envConfig.ts +110 -0
- package/src/runLock.ts +20 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 fastagent-sh
|
|
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.
|
package/README.md
ADDED
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
# voicenote
|
|
2
|
+
|
|
3
|
+
Voice recordings → diarized transcripts → integrated semantic Markdown notes.
|
|
4
|
+
|
|
5
|
+
CLI command: `vn`
|
|
6
|
+
|
|
7
|
+
[中文文档 / Chinese documentation](README.zh-CN.md)
|
|
8
|
+
|
|
9
|
+
Currently tuned for the PHILIPS VTR6500 voice recorder, but the workflow is generic: scan recordings under a mount point → transcribe with speaker diarization → GPT performs the necessary cleanup and process reconstruction inside the notes-generation stage → produce smart notes.
|
|
10
|
+
|
|
11
|
+
**Two ways to use it:**
|
|
12
|
+
|
|
13
|
+
- 🖥️ **Desktop app (GUI)** — for non-terminal users, a self-contained `.app`, one-line install:
|
|
14
|
+
```bash
|
|
15
|
+
curl -fsSL https://raw.githubusercontent.com/fastagent-sh/voicenote/main/scripts/install-app.sh | bash
|
|
16
|
+
```
|
|
17
|
+
See [Desktop app](#desktop-app-gui-app) below.
|
|
18
|
+
- ⌨️ **CLI (`vn`)** — for terminal users / developers, see "Install (CLI)" below.
|
|
19
|
+
|
|
20
|
+
## Install (CLI)
|
|
21
|
+
|
|
22
|
+
> The CLI installs from the npm package `@fastagent-sh/voicenote`. The install script / `bun add -g` below require the package to be **published to npm** (see "Development" at the end for the release flow).
|
|
23
|
+
|
|
24
|
+
Recommended: the install script (macOS):
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
curl -fsSL https://raw.githubusercontent.com/fastagent-sh/voicenote/main/scripts/install.sh | bash
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
The install script does **no interactive configuration** by default: it installs/checks `ffmpeg`, Bun, Node/npm, pi, and `vn`, then writes an editable `config.json` template. After installation, open the config file and fill in your keys and name:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
open ~/.config/voicenote/config.json
|
|
34
|
+
# or open the directory
|
|
35
|
+
vn open config
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Advanced users can preseed the template with environment variables:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
VOICENOTE_NAME="Jane Doe" \
|
|
42
|
+
VOICENOTE_ALIAS="jane" \
|
|
43
|
+
VOICENOTE_WORKSPACE="$HOME/Documents/meetings" \
|
|
44
|
+
VOLCANO_ASR_KEY="..." \
|
|
45
|
+
VOLCANO_TOS_BUCKET="..." \
|
|
46
|
+
VOLCANO_TOS_ACCESS_KEY="..." \
|
|
47
|
+
VOLCANO_TOS_SECRET_KEY="..." \
|
|
48
|
+
bash <(curl -fsSL https://raw.githubusercontent.com/fastagent-sh/voicenote/main/scripts/install.sh)
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
The first install creates `~/.config/voicenote/config.json`. A legacy `speakers.json` is still read for compatibility and migrated into `config.json.speakers`. Once configured, run `vn doctor` to check the environment, and `vn install-launch-agent` if you want background monitoring.
|
|
52
|
+
|
|
53
|
+
Manual install:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
bun add -g @fastagent-sh/voicenote
|
|
57
|
+
mkdir -p ~/.local/bin
|
|
58
|
+
ln -sf ~/.bun/bin/vn ~/.local/bin/vn
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
An older `git+…#main` install is replaced in place by `bun add -g @fastagent-sh/voicenote`; no uninstall needed.
|
|
62
|
+
|
|
63
|
+
### Windows (CLI)
|
|
64
|
+
|
|
65
|
+
The CLI is cross-platform. Prerequisites: Bun, ffmpeg (provides `ffprobe.exe`), Node + pi.
|
|
66
|
+
|
|
67
|
+
```powershell
|
|
68
|
+
bun add -g @fastagent-sh/voicenote
|
|
69
|
+
# Windows has no /Volumes mount points; set the recorder drive explicitly
|
|
70
|
+
setx VOICENOTE_RECORD_DIR "E:\RECORD"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
- Config: `%APPDATA%\voicenote\config.json`; logs/locks: `%LOCALAPPDATA%\voicenote\`
|
|
74
|
+
- Background automation uses the **Windows Task Scheduler**: `vn install-launch-agent` to register / `vn status` to inspect / `vn uninstall-launch-agent` to remove (same command names as macOS; dispatched per platform internally)
|
|
75
|
+
|
|
76
|
+
## Dependencies
|
|
77
|
+
|
|
78
|
+
- **Bun >= 1.3 (required at runtime)** — the code uses `Bun.Glob` / `Bun.file`; plain Node cannot run it
|
|
79
|
+
- Node / npm — only used to install the pi CLI (pi-codex backend)
|
|
80
|
+
- ffmpeg / ffprobe (audio duration detection):
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
brew install ffmpeg
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
The install script only writes `vn` / Bun / Homebrew PATH entries to your shell config; app configuration lives in `~/.config/voicenote/config.json`. A manual setup needs at least:
|
|
87
|
+
|
|
88
|
+
```json
|
|
89
|
+
{
|
|
90
|
+
"VOICENOTE_WORKSPACE": "/Users/you/Documents/meetings",
|
|
91
|
+
"VOLCANO_ASR_KEY": "...",
|
|
92
|
+
"VOLCANO_ASR_RESOURCE_ID": "volc.seedasr.auc",
|
|
93
|
+
"VOLCANO_TOS_REGION": "cn-guangzhou",
|
|
94
|
+
"VOLCANO_TOS_ENDPOINT": "tos-s3-cn-guangzhou.volces.com",
|
|
95
|
+
"VOLCANO_TOS_BUCKET": "...",
|
|
96
|
+
"VOLCANO_TOS_ACCESS_KEY": "...",
|
|
97
|
+
"VOLCANO_TOS_SECRET_KEY": "...",
|
|
98
|
+
"VOLCANO_TOS_KEEP": "0",
|
|
99
|
+
"speakers": {
|
|
100
|
+
"self": { "name": "Your name", "aliases": ["nickname", "alias"] },
|
|
101
|
+
"known": []
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Optional settings:
|
|
107
|
+
|
|
108
|
+
```json
|
|
109
|
+
{
|
|
110
|
+
"VOICENOTE_DEVICE_VOLUME": "VTR6500",
|
|
111
|
+
"VOICENOTE_RECORD_DIR": "/Volumes/VTR6500/RECORD",
|
|
112
|
+
"VOICENOTE_MAX_AGE_HOURS": "48",
|
|
113
|
+
"VOICENOTE_PI_BIN": "pi",
|
|
114
|
+
"VOICENOTE_PI_PROVIDER": "openai-codex,openai",
|
|
115
|
+
"VOICENOTE_PI_MODEL": "gpt-5.5",
|
|
116
|
+
"VOICENOTE_PI_THINKING": "high",
|
|
117
|
+
"VOICENOTE_PI_SUMMARY_TOOLS": "read,grep",
|
|
118
|
+
"VOICENOTE_CONTEXT_DIR": "/Users/you/vault"
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Usage
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
vn doctor # check environment and config
|
|
126
|
+
vn run # default: Volcano ASR + pi-codex notes
|
|
127
|
+
vn run --mode transcript # transcript only, skip semantic notes
|
|
128
|
+
vn run --latest # process only the latest valid recording
|
|
129
|
+
vn run --latest --force # re-run the latest one
|
|
130
|
+
vn run --pdf # additionally render a PDF after notes
|
|
131
|
+
vn run --dry-run # print the plan only
|
|
132
|
+
vn list # list this month's notes
|
|
133
|
+
vn list --month 2026-05 # specific month
|
|
134
|
+
vn last # print the latest processing summary
|
|
135
|
+
vn open # open the notes directory in Finder
|
|
136
|
+
vn open config # open ~/.config/voicenote/
|
|
137
|
+
vn open logs # open the logs directory
|
|
138
|
+
vn open <slug> # open a note by filename fragment
|
|
139
|
+
vn forget <id|filename> # let a recording be processed again
|
|
140
|
+
vn log # print today's log tail (--lines N / -f follow / --err include launchd.err / --date YYYY-MM-DD)
|
|
141
|
+
vn errors # print recent ERROR logs
|
|
142
|
+
vn login # sign in to ChatGPT (Codex device-code flow, for the notes backend; no pi TUI needed)
|
|
143
|
+
vn upgrade # reinstall latest npm package
|
|
144
|
+
vn install-launch-agent
|
|
145
|
+
vn status
|
|
146
|
+
vn uninstall-launch-agent
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Configuration file
|
|
150
|
+
|
|
151
|
+
The install script writes an editable template:
|
|
152
|
+
|
|
153
|
+
```text
|
|
154
|
+
~/.config/voicenote/config.json # workspace, Volcano ASR/TOS, summary backend, your name/aliases, etc.
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
`speakers` maps Speaker A/B/C back to real names; `known` lists known contacts:
|
|
158
|
+
|
|
159
|
+
```json
|
|
160
|
+
{
|
|
161
|
+
"speakers": {
|
|
162
|
+
"self": { "name": "Your name", "aliases": ["nickname", "alias"] },
|
|
163
|
+
"known": []
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Changes take effect on the next `vn run`. A legacy `~/.config/voicenote/speakers.json` is still read as a compatibility fallback.
|
|
169
|
+
|
|
170
|
+
## Workflow
|
|
171
|
+
|
|
172
|
+
1. Scan recordings under `/Volumes/VTR6500/RECORD/`
|
|
173
|
+
2. Filter: ignore `._*`, small files (<100KB), short recordings (<60s), and already-processed recordings; if a previous run failed only at the summary stage and the transcript is saved, it is not considered done — processing resumes from there
|
|
174
|
+
3. Copy the original audio into `${VOICENOTE_WORKSPACE}/_audio/YYYY-MM/`
|
|
175
|
+
4. Transcribe with the Volcano Doubao large-model audio-file recognition API: upload local audio to TOS, submit the job, poll for results, and delete the TOS object by default when done
|
|
176
|
+
5. Persist the raw transcript immediately after transcription (no lossy cleanup), so a later-stage failure never wastes the ASR spend
|
|
177
|
+
6. The summary model (default: pi codex via ChatGPT Plus) reads the raw transcript directly, performing necessary cleanup, speaker restoration, and reconstruction of views/debates/consensus inside the notes-generation stage; if the summary fails, the next `vn run` / `vn run --latest` reuses the saved transcript and retries only the notes generation — no `vn forget` needed
|
|
178
|
+
7. Write notes / metadata; the system makes no archiving decisions — files stay in the configured workspace
|
|
179
|
+
|
|
180
|
+
## Output locations
|
|
181
|
+
|
|
182
|
+
The installer defaults to `VOICENOTE_WORKSPACE=~/Documents/meetings`.
|
|
183
|
+
|
|
184
|
+
- Notes entry point: `${VOICENOTE_WORKSPACE}/YYYY-MM/`
|
|
185
|
+
- Original audio: `${VOICENOTE_WORKSPACE}/_audio/YYYY-MM/`
|
|
186
|
+
- Full transcripts: `${VOICENOTE_WORKSPACE}/_transcripts/YYYY-MM/`
|
|
187
|
+
- Metadata: `${VOICENOTE_WORKSPACE}/_metadata/YYYY-MM/`
|
|
188
|
+
- State: `${VOICENOTE_WORKSPACE}/_state/processed.json`
|
|
189
|
+
- Index: `${VOICENOTE_WORKSPACE}/_index/notes.jsonl`
|
|
190
|
+
|
|
191
|
+
## Automation
|
|
192
|
+
|
|
193
|
+
The install script can set this up automatically. Manual setup:
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
vn install-launch-agent
|
|
197
|
+
launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/sh.fastagent.voicenote.plist 2>/dev/null || true
|
|
198
|
+
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/sh.fastagent.voicenote.plist
|
|
199
|
+
launchctl enable gui/$(id -u)/sh.fastagent.voicenote
|
|
200
|
+
vn status
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
The LaunchAgent invokes `vn run` every 60 seconds. It skips safely when no recorder is plugged in; once the VTR6500 is connected, new recordings are processed automatically.
|
|
204
|
+
|
|
205
|
+
> Config changes (`config.json` or `~/.zshrc`) are picked up automatically by the background agent on its next run — no reinstall needed. The plist only snapshots real environment variables and pi's absolute path: **after changing `VOICENOTE_PI_BIN`, re-run `vn install-launch-agent` and reload** (`vn upgrade` regenerates the plist automatically). If pi is not signed in or ASR is not configured, the agent skips processing instead of burning ASR spend.
|
|
206
|
+
>
|
|
207
|
+
> Exception: if you `export http_proxy=...` directly in your shell (instead of using `LOCAL_PROXY_HOST`) and then run `vn install-launch-agent`, that real env value is snapshotted into the plist and keeps overriding later `LOCAL_PROXY_HOST` changes; re-run `vn install-launch-agent` to clear it. Prefer `LOCAL_PROXY_HOST`/`LOCAL_PROXY_PORT` for proxy configuration.
|
|
208
|
+
|
|
209
|
+
Logs:
|
|
210
|
+
|
|
211
|
+
```text
|
|
212
|
+
~/.local/state/voicenote/logs/launchd.out.log
|
|
213
|
+
~/.local/state/voicenote/logs/launchd.err.log
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## Development
|
|
217
|
+
|
|
218
|
+
```bash
|
|
219
|
+
git clone https://github.com/fastagent-sh/voicenote.git
|
|
220
|
+
cd voicenote
|
|
221
|
+
bun install
|
|
222
|
+
bun run typecheck
|
|
223
|
+
bun src/cli.ts doctor
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
Distribution: vn ships as **source** with no build step — it only runs on bun (shebang + `bun:ffi` + `engines.bun`), and bun runs TypeScript natively, so `bin` points straight at `src/cli.ts` and the npm tarball only contains `src/{cli,envConfig,runLock}.ts`. The install script / `vn upgrade` install from the published npm package (`bun add -g @fastagent-sh/voicenote`); a `git+https` install also works directly (the git tree carries the source; no build or install script needed).
|
|
227
|
+
|
|
228
|
+
Routine release (tag triggers CI):
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
npm version patch
|
|
232
|
+
git push --follow-tags
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
The workflow lives at `.github/workflows/release.yml`: CI explicitly runs typecheck/test/build + an artifact smoke test, then `npm publish --ignore-scripts` (deterministic publishing, no lifecycle dependence). Publishing uses **npm trusted publishing (OIDC)**: no long-lived token (`id-token: write` + a Trusted Publisher configured on npmjs.com), with provenance attached automatically. A bare local `npm publish` is still guarded by `prepublishOnly` (typecheck+test+build).
|
|
236
|
+
|
|
237
|
+
> **First-release exception**: npm has no pending-publisher, so trusted publishing cannot publish a package's very first version. Publish once manually with `npm login` + `npm publish --ignore-scripts`, then add a Trusted Publisher on the package settings page at npmjs.com (repo `fastagent-sh/voicenote`, workflow `release.yml`); CI takes over afterwards (the npm account needs 2FA).
|
|
238
|
+
|
|
239
|
+
## Desktop app (GUI, `app/`)
|
|
240
|
+
|
|
241
|
+
A self-contained macOS `.app` (Tauri v2) for **non-terminal users**: the target machine needs no pre-installed bun / pi / ffprobe / global `vn`.
|
|
242
|
+
|
|
243
|
+
**Positioning**: the GUI is only a "status dashboard + quick access to output" — it does **not** drive processing. The full pipeline runs autonomously every 60s via the background LaunchAgent using the bundled engine (it keeps running with the GUI closed).
|
|
244
|
+
|
|
245
|
+
- First run: setup wizard (identity / Volcano keys / proxy) → ChatGPT sign-in (no terminal on the device; uses `vn login`'s browser-callback flow)
|
|
246
|
+
- After that: the main view shows agent activity + recent notes (open note / open folder)
|
|
247
|
+
|
|
248
|
+
### What's bundled
|
|
249
|
+
|
|
250
|
+
`bun build --compile` compiles the `vn` engine (bun runtime + pi-ai included) into a single-file sidecar; pi cannot be compiled (it reads data files from disk at runtime), so the whole package ships alongside and runs with a bundled `bun`:
|
|
251
|
+
|
|
252
|
+
| Component | Form | Purpose |
|
|
253
|
+
|------|------|------|
|
|
254
|
+
| `vn` (compiled) | externalBin | pipeline + ChatGPT sign-in |
|
|
255
|
+
| `bun` | externalBin | runs pi |
|
|
256
|
+
| `ffprobe` (native arm64 static) | externalBin | audio duration (pi only needs ffprobe, not all of ffmpeg) |
|
|
257
|
+
| `pi` + node_modules | resource | notes backend (ChatGPT Codex agent) |
|
|
258
|
+
|
|
259
|
+
At runtime, Rust generates a wrapper (`exec <bundled bun> <bundled pi/cli.js> "$@"`) and injects `VOICENOTE_PI_BIN` / `VOICENOTE_FFPROBE_BIN` into `vn`. Release builds are **universal** (x86_64 + arm64; vn/bun/ffprobe each merged with `lipo`; pi is JS and needs none).
|
|
260
|
+
|
|
261
|
+
### Build
|
|
262
|
+
|
|
263
|
+
Prerequisites: Rust + cargo, bun, node/npm, Xcode CLT, and **pi installed globally on the build machine** (`npm i -g @earendil-works/pi-coding-agent`; the build script stages pi from there).
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
cd app
|
|
267
|
+
bun install
|
|
268
|
+
bun run tauri build
|
|
269
|
+
# Output: src-tauri/target/release/bundle/macos/VoiceNote.app
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
**Windows** (build on Windows with Rust + MSVC C++ build tools; WebView2 is preinstalled on Win10/11, NSIS is downloaded by Tauri automatically):
|
|
273
|
+
|
|
274
|
+
```powershell
|
|
275
|
+
cd app
|
|
276
|
+
bun install
|
|
277
|
+
bun run tauri build --config src-tauri/tauri.windows.conf.json
|
|
278
|
+
# Output: app\src-tauri\target\release\bundle\nsis\VoiceNote_<version>_x64-setup.exe
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
Windows uses `scripts/build-vn-sidecar.ps1` to stage `vn.exe` (`--windows-hide-console`, no console window) / `bun.exe` / `ffprobe.exe` + pi; `tauri.windows.conf.json` produces the NSIS installer (currentUser, no admin).
|
|
282
|
+
|
|
283
|
+
`beforeBuildCommand` first runs `scripts/build-vn-sidecar.sh` to stage vn/bun/ffprobe/pi (`binaries/` and `resources/` are gitignored; pi/ffprobe copying is idempotent). For development use `bun run tauri dev` (dev mode runs `../src/cli.ts` directly, no bundling, no background agent install).
|
|
284
|
+
|
|
285
|
+
### How users install (one line, recommended)
|
|
286
|
+
|
|
287
|
+
> This is separate from the CLI `install.sh` above: the CLI script targets developers (installs bun/pi/vn); this one targets **non-technical users** (download .app → /Applications).
|
|
288
|
+
|
|
289
|
+
```bash
|
|
290
|
+
curl -fsSL https://raw.githubusercontent.com/fastagent-sh/voicenote/main/scripts/install-app.sh | bash
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
**Windows** (one line, no admin):
|
|
294
|
+
|
|
295
|
+
```powershell
|
|
296
|
+
irm https://raw.githubusercontent.com/fastagent-sh/voicenote/main/scripts/install-app.ps1 | iex
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
`install-app.ps1` downloads the NSIS installer from the GitHub Release (self-contained vn/bun/ffprobe/pi) → silent install into `%LOCALAPPDATA%` (no admin) → launches it.
|
|
300
|
+
|
|
301
|
+
`install-app.sh` downloads the packaged `.app` from GitHub Releases → installs to `/Applications` → **removes the quarantine flag for the user** (Gatekeeper bypass for un-notarized builds) → opens it. The target machine needs no bun/pi/ffprobe/global vn (all bundled).
|
|
302
|
+
|
|
303
|
+
**First launch**: the app lands on Settings → fill in identity + your own Volcano ASR/TOS keys + proxy (BYOK) → save → click "Sign in to ChatGPT" in the Status panel (one-time browser authorization). The GUI then installs and loads the background LaunchAgent (pointing at the bundled engine); plug in the recorder and transcription + notes happen automatically.
|
|
304
|
+
|
|
305
|
+
> The background agent label is `sh.fastagent.voicenote` (same as the CLI version; only one exists per machine). If the `.app` is moved, open it once to recalibrate the plist.
|
|
306
|
+
|
|
307
|
+
**Upgrades**: since 0.1.9 the app has a built-in updater — open the app → "Settings → Software update" → "Check for updates"; when a new version appears, click "Download & install"; the app restarts automatically with config/notes preserved. For first installs, or upgrades from 0.1.8 and earlier (which had no updater), re-run the one-line install script above.
|
|
308
|
+
|
|
309
|
+
### Maintainers: packaging + release
|
|
310
|
+
|
|
311
|
+
**Automatic (recommended)**: push an `app-v*` tag to trigger `.github/workflows/release-app.yml`:
|
|
312
|
+
|
|
313
|
+
```bash
|
|
314
|
+
git tag app-v0.1.0 && git push --tags
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
**One `app-v*` tag = one Release covering mac + Windows.** `release-app.yml` is a single workflow: mac (universal + ad-hoc deep signing) and Windows (NSIS) build in parallel, then the `release` job publishes. Each Release carries:
|
|
318
|
+
|
|
319
|
+
- **First-install packages** `VoiceNote.zip` (mac) / `VoiceNote-setup.exe` (win) — fetched by `install-app.*` from `releases/latest/download/...`;
|
|
320
|
+
- **Updater artifacts** `VoiceNote.app.tar.gz` + `latest.json` — used by the in-app Tauri updater (Settings → Software update).
|
|
321
|
+
|
|
322
|
+
> The updater needs signing secrets `TAURI_SIGNING_PRIVATE_KEY` / `TAURI_SIGNING_PRIVATE_KEY_PASSWORD` (generated with `tauri signer generate`; the public key goes in `tauri.conf.json`); the `preflight` job blocks the release while the pubkey is still a placeholder.
|
|
323
|
+
|
|
324
|
+
> Use `app-v*` (distinct from the CLI's `v*` npm release tags). Artifacts are **universal** (x86_64 + arm64), working on both Intel and Apple Silicon.
|
|
325
|
+
|
|
326
|
+
**Manual**:
|
|
327
|
+
|
|
328
|
+
```bash
|
|
329
|
+
cd app
|
|
330
|
+
bash scripts/package.sh # → app/release/VoiceNote-<version>.zip (~110MB)
|
|
331
|
+
gh release create app-v0.1.0 app/release/VoiceNote-<version>.zip#VoiceNote.zip -t "VoiceNote 0.1.0" -n "Desktop app"
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
The asset name must be **`VoiceNote.zip`** (`install-app.sh` fetches `releases/latest/download/VoiceNote.zip`). For local testing bypass the Release with: `VOICENOTE_APP_URL=file:///path/to/VoiceNote.zip bash scripts/install-app.sh`.
|
|
335
|
+
|
|
336
|
+
### Signing / notarization (no `xattr`, double-click to run)
|
|
337
|
+
|
|
338
|
+
JIT entitlements are in place (`src-tauri/entitlements.plist`: `allow-jit` etc. for bun/vn; referenced from `tauri.conf.json`). `scripts/sign-macos.sh` performs inside-out deep signing (hardened runtime + entitlements):
|
|
339
|
+
|
|
340
|
+
```bash
|
|
341
|
+
# Internal ad-hoc (JIT verified to survive under hardened runtime)
|
|
342
|
+
bash scripts/sign-macos.sh /Applications/VoiceNote.app
|
|
343
|
+
|
|
344
|
+
# Official distribution (requires a Developer ID certificate, Apple Developer Program $99/yr)
|
|
345
|
+
bash scripts/sign-macos.sh VoiceNote.app "Developer ID Application: NAME (TEAMID)"
|
|
346
|
+
xcrun notarytool submit ... && xcrun stapler staple VoiceNote.app
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
## License
|
|
350
|
+
|
|
351
|
+
MIT
|