Skip to content

Commit 0362fcf

Browse files
authored
Merge pull request #20 from jatinkrmalik/docs/fix-readme
chore: v0.1.0 alpha release preparation
2 parents f68b3b5 + ceaffd7 commit 0362fcf

5 files changed

Lines changed: 380 additions & 89 deletions

File tree

.github/workflows/ci.yml

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,40 @@ on:
66
pull_request:
77
branches: [main]
88

9+
concurrency:
10+
group: ci-${{ github.ref }}
11+
cancel-in-progress: true
12+
913
jobs:
1014
build-and-test:
1115
name: Build & Test
1216
runs-on: macos-15
17+
timeout-minutes: 30
1318

1419
steps:
1520
- name: Checkout
1621
uses: actions/checkout@v4
1722

18-
- name: Build
23+
- name: Cache SPM dependencies
24+
uses: actions/cache@v4
25+
with:
26+
path: .build
27+
key: spm-${{ runner.os }}-${{ hashFiles('Package.resolved') }}
28+
restore-keys: |
29+
spm-${{ runner.os }}-
30+
31+
- name: Build (Debug)
1932
run: swift build
2033

2134
- name: Test
2235
run: swift test
36+
37+
- name: Build (Release)
38+
run: swift build -c release
39+
40+
- name: Verify app bundle
41+
run: |
42+
./scripts/build.sh release
43+
test -d VocaMac.app || exit 1
44+
codesign -v VocaMac.app
45+
echo "App bundle verified"

.github/workflows/release.yml

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
name: Release
2+
3+
on:
4+
push:
5+
tags:
6+
- 'v*'
7+
8+
permissions:
9+
contents: write
10+
11+
jobs:
12+
build-and-release:
13+
name: Build & Release
14+
runs-on: macos-15
15+
timeout-minutes: 30
16+
17+
steps:
18+
- name: Checkout
19+
uses: actions/checkout@v4
20+
21+
- name: Extract version from tag
22+
id: version
23+
run: echo "VERSION=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"
24+
25+
- name: Update version in build script
26+
run: |
27+
sed -i '' "s/CFBundleVersion.*/<key>CFBundleVersion<\/key>/" scripts/build.sh || true
28+
echo "Building version: ${{ steps.version.outputs.VERSION }}"
29+
30+
- name: Build release app bundle
31+
run: ./scripts/build.sh release
32+
33+
- name: Verify code signature
34+
run: codesign -v --deep --strict VocaMac.app
35+
36+
- name: Run tests
37+
run: swift test
38+
39+
- name: Create DMG
40+
run: |
41+
mkdir -p dmg-staging
42+
cp -R VocaMac.app dmg-staging/
43+
ln -s /Applications dmg-staging/Applications
44+
45+
hdiutil create -volname "VocaMac" \
46+
-srcfolder dmg-staging \
47+
-ov -format UDZO \
48+
"VocaMac-${{ steps.version.outputs.VERSION }}-arm64.dmg"
49+
50+
echo "DMG created:"
51+
ls -lh VocaMac-*.dmg
52+
53+
- name: Create ZIP archive
54+
run: |
55+
ditto -c -k --sequesterRsrc --keepParent VocaMac.app \
56+
"VocaMac-${{ steps.version.outputs.VERSION }}-arm64.zip"
57+
58+
echo "ZIP created:"
59+
ls -lh VocaMac-*.zip
60+
61+
- name: Generate checksums
62+
run: |
63+
shasum -a 256 VocaMac-*.dmg VocaMac-*.zip > checksums.txt
64+
cat checksums.txt
65+
66+
- name: Create GitHub Release
67+
uses: softprops/action-gh-release@v2
68+
with:
69+
generate_release_notes: true
70+
draft: true
71+
files: |
72+
VocaMac-*.dmg
73+
VocaMac-*.zip
74+
checksums.txt
75+
body: |
76+
## VocaMac ${{ steps.version.outputs.VERSION }}
77+
78+
### Installation
79+
80+
1. Download `VocaMac-${{ steps.version.outputs.VERSION }}-arm64.dmg`
81+
2. Open the DMG and drag VocaMac to Applications
82+
3. Open VocaMac from Applications
83+
4. Grant Microphone, Accessibility, and Input Monitoring permissions when prompted
84+
85+
### Checksums (SHA-256)
86+
See `checksums.txt` for verification.
87+
88+
### Requirements
89+
- macOS 13 (Ventura) or later
90+
- Apple Silicon (arm64)

README.md

Lines changed: 78 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,27 @@
44

55
<h1 align="center">VocaMac</h1>
66

7-
[![Build & Test](https://github.com/jatinkrmalik/vocamac/actions/workflows/ci.yml/badge.svg)](https://github.com/jatinkrmalik/vocamac/actions/workflows/ci.yml) [![License: AGPL-3.0](https://img.shields.io/badge/License-AGPL--3.0-blue.svg)](https://www.gnu.org/licenses/agpl-3.0) [![Platform: macOS](https://img.shields.io/badge/Platform-macOS%2013%2B-lightgrey.svg)](https://github.com/jatinkrmalik/vocamac) [![Swift 5.9+](https://img.shields.io/badge/Swift-5.9%2B-orange.svg)](https://swift.org) [![Website](https://img.shields.io/badge/Web-vocamac.com-007AFF.svg)](https://vocamac.com) [![GitHub stars](https://img.shields.io/github/stars/jatinkrmalik/vocamac?style=social)](https://github.com/jatinkrmalik/vocamac/stargazers)
7+
[![Build & Test](https://github.com/jatinkrmalik/vocamac/actions/workflows/ci.yml/badge.svg)](https://github.com/jatinkrmalik/vocamac/actions/workflows/ci.yml) [![License: AGPL-3.0](https://img.shields.io/badge/License-AGPL--3.0-blue.svg)](https://www.gnu.org/licenses/agpl-3.0) [![Platform: macOS](https://img.shields.io/badge/Platform-macOS%2013%2B-lightgrey.svg)](https://github.com/jatinkrmalik/vocamac) [![Swift 5.9+](https://img.shields.io/badge/Swift-5.9%2B-orange.svg)](https://swift.org)
88

99

10-
**Local voice-to-text for macOS powered by [WhisperKit](https://github.com/argmaxinc/WhisperKit)**
10+
**Local voice-to-text for macOS - powered by [WhisperKit](https://github.com/argmaxinc/WhisperKit)**
1111

1212
VocaMac is a native macOS menu bar application that transcribes your voice to text locally on your machine. No cloud, no subscriptions, no data leaves your device. Just hold a hotkey, speak, and your words appear wherever your cursor is.
1313

14-
🌐 [vocamac.com](https://vocamac.com) · 🐧 [VocaLinux](https://github.com/jatinkrmalik/vocalinux) · 🪟 VocaWin *(coming soon)*
14+
[VocaLinux](https://github.com/jatinkrmalik/vocalinux) · **VocaMac** · 🪟 VocaWin *(coming soon)* · 🌐 [vocamac.com](https://vocamac.com)
1515

1616
---
1717

1818
## ✨ Features
1919

20-
- **🔒 100% Local** All audio processing happens on your machine. No internet required (except for one-time model downloads).
21-
- **⌨️ System-Wide Text Injection** Transcribed text is typed wherever your cursor is: browsers, Slack, VS Code, spreadsheets, terminals everywhere.
22-
- **🎯 Push-to-Talk** Hold a hotkey (default: Right Option) to record. Release to transcribe.
23-
- **👆 Double-Tap Toggle** Double-tap the hotkey to start/stop recording.
24-
- **🧠 Smart Model Selection** Auto-detects your hardware (Apple Silicon/Intel, RAM) and recommends the best whisper model via WhisperKit.
25-
- **⚡ Native Apple Acceleration** CoreML + Metal + Neural Engine acceleration on Apple Silicon. No manual setup.
26-
- **📊 Visual Feedback** Menu bar icon changes color during recording and processing. Audio level indicator shows input.
27-
- **⚙️ Configurable** Choose hotkeys, models, languages, silence detection thresholds, and more.
20+
- **🔒 100% Local** - All audio processing happens on your machine. No internet required (except for one-time model downloads).
21+
- **⌨️ System-Wide Text Injection** - Transcribed text is typed wherever your cursor is: browsers, Slack, VS Code, spreadsheets, terminals - everywhere.
22+
- **🎯 Push-to-Talk** - Hold a hotkey (default: Right Option) to record. Release to transcribe.
23+
- **👆 Double-Tap Toggle** - Double-tap the hotkey to start/stop recording.
24+
- **🧠 Smart Model Selection** - Auto-detects your hardware (Apple Silicon/Intel, RAM) and recommends the best whisper model via WhisperKit.
25+
- **⚡ Native Apple Acceleration** - CoreML + Metal + Neural Engine acceleration on Apple Silicon. No manual setup.
26+
- **📊 Visual Feedback** - Menu bar icon changes color during recording and processing. Audio level indicator shows input.
27+
- **⚙️ Configurable** - Choose hotkeys, models, languages, silence detection thresholds, and more.
2828

2929
---
3030

@@ -50,8 +50,8 @@ Same accuracy, dramatically better Apple platform integration.
5050

5151
- **macOS 13 (Ventura)** or later
5252
- **Xcode 15+** or Swift 5.9+ (for building)
53-
- **Microphone permission** For audio capture
54-
- **Accessibility permission** For global hotkeys and text injection
53+
- **Microphone permission** - For audio capture
54+
- **Accessibility permission** - For global hotkeys and text injection
5555

5656
---
5757

@@ -64,7 +64,7 @@ Same accuracy, dramatically better Apple platform integration.
6464
git clone https://github.com/jatinkrmalik/vocamac.git
6565
cd vocamac
6666

67-
# Build (first build downloads WhisperKit dependency ~1 min)
67+
# Build (first build downloads WhisperKit dependency - ~1 min)
6868
swift build -c release
6969

7070
# Run VocaMac
@@ -75,9 +75,9 @@ swift run -c release VocaMac
7575

7676
1. **VocaMac appears in your menu bar** (microphone icon, no Dock icon)
7777
2. **Grant Microphone permission** when prompted
78-
3. **Grant Accessibility permission** VocaMac will guide you to System Settings → Privacy & Security → Accessibility
79-
4. **First model download** WhisperKit automatically downloads the recommended model for your device (~40-500MB depending on hardware)
80-
5. **Start dictating** Hold the **Right Option** key, speak, and release. Your words appear at the cursor!
78+
3. **Grant Accessibility permission** - VocaMac will guide you to System Settings → Privacy & Security → Accessibility
79+
4. **First model download** - WhisperKit automatically downloads the recommended model for your device (~40-500MB depending on hardware)
80+
5. **Start dictating** - Hold the **Right Option** key, speak, and release. Your words appear at the cursor!
8181

8282
---
8383

@@ -124,15 +124,16 @@ Models are downloaded automatically from [HuggingFace](https://huggingface.co/ar
124124
Open Settings from the menu bar popover or with **⌘,**
125125

126126
### General
127-
- **Activation mode** Push-to-Talk or Double-Tap Toggle
128-
- **Hotkey** Choose from Right Option, Right Command, Fn, function keys, etc.
129-
- **Language** Auto-detect or specify (English, Spanish, French, German, Chinese, Japanese, and more)
127+
- **Activation mode** - Push-to-Talk or Double-Tap Toggle
128+
- **Hotkey** - Choose from Right Option, Right Command, Fn, function keys, etc.
129+
- **Language** - Auto-detect or specify (English, Spanish, French, German, Chinese, Japanese, and more)
130130
- **Launch at login**
131131

132132
### Audio
133-
- **Max recording duration** — 30s, 60s, 120s, or 300s
134-
- **Silence detection** — Auto-stop recording after configurable silence
135-
- **Input device** — Select which microphone to use
133+
- **Max recording duration** - 30s, 60s, 120s, or 300s
134+
- **Silence detection** - Auto-stop recording after configurable silence
135+
- **Sound effects** - Toggle audio feedback for recording start/stop
136+
- **Input device** - Select which microphone to use
136137

137138
### Models
138139
- View system info and WhisperKit's hardware recommendation
@@ -147,21 +148,21 @@ VocaMac is built with a clean, modular architecture using native Swift and Swift
147148

148149
```
149150
VocaMacApp (SwiftUI MenuBarExtra)
150-
├── AppState — Central observable state
151-
├── HotKeyManager — CGEventTap global hotkey listener
152-
├── AudioEngine — AVAudioEngine mic capture (16kHz, mono, Float32)
153-
├── WhisperService — WhisperKit async transcription wrapper
154-
│ └── ModelManager — Model download, storage, device recommendations
155-
│ └── SystemInfo — Hardware detection & model recommendation
156-
├── TextInjector — Clipboard + Cmd+V text injection
157-
├── MenuBarView — Status popover UI
158-
└── SettingsView — Configuration tabs (General, Models, Audio, About)
151+
├── AppState - Central observable state
152+
├── HotKeyManager - CGEventTap global hotkey listener
153+
├── AudioEngine - AVAudioEngine mic capture (16kHz, mono, Float32)
154+
├── WhisperService - WhisperKit async transcription wrapper
155+
│ └── ModelManager - Model download, storage, device recommendations
156+
│ └── SystemInfo - Hardware detection & model recommendation
157+
├── SoundManager - Audio feedback (start/stop recording cues)
158+
├── TextInjector - Clipboard + Cmd+V text injection
159+
├── MenuBarView - Status popover UI
160+
└── SettingsView - Configuration tabs (General, Models, Audio, About)
159161
```
160162

161163
For detailed documentation, see:
162-
- [`docs/PRD.md`](docs/PRD.md) — Product Requirements Document
163-
- [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) — Technical Architecture
164-
- [`docs/DATA_MODEL.md`](docs/DATA_MODEL.md) — Data Model & Entity Relationships
164+
- [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) - Technical Architecture
165+
- [`docs/DATA_MODEL.md`](docs/DATA_MODEL.md) - Data Model & Entity Relationships
165166

166167
---
167168

@@ -189,6 +190,7 @@ VocaMac/
189190
│ │ ├── HotKeyManager.swift # CGEventTap global hotkeys
190191
│ │ ├── WhisperService.swift# WhisperKit transcription wrapper
191192
│ │ ├── ModelManager.swift # Model download & management
193+
│ │ ├── SoundManager.swift # Audio feedback for recording
192194
│ │ ├── TextInjector.swift # Clipboard-based text injection
193195
│ │ └── SystemInfo.swift # Hardware detection
194196
│ ├── Models/
@@ -198,10 +200,14 @@ VocaMac/
198200
│ └── Resources/
199201
├── Tests/
200202
│ └── VocaMacTests/
203+
├── scripts/
204+
│ ├── build.sh # Build .app bundle
205+
│ ├── install.sh # Install to ~/.local/bin
206+
│ └── uninstall.sh # Full uninstall & cleanup
207+
├── web/ # Marketing website (vocamac.com)
201208
├── docs/
202-
│ ├── PRD.md # Product Requirements Document
203209
│ ├── ARCHITECTURE.md # Technical Architecture
204-
│ └── DATA_MODEL.md # Data Model & ERD
210+
│ └── DATA_MODEL.md # Data Model & Entity Relationships
205211
├── LICENSE # AGPL-3.0 License
206212
└── .gitignore
207213
```
@@ -212,56 +218,73 @@ VocaMac/
212218
# Debug build
213219
swift build
214220

215-
# Release build (optimized — recommended for actual use)
221+
# Release build (optimized)
216222
swift build -c release
217223

218224
# Run
219225
swift run VocaMac
220226

221227
# Run tests (requires Xcode)
222228
swift test
229+
230+
# Build .app bundle
231+
./scripts/build.sh
232+
233+
# Install launcher scripts to ~/.local/bin
234+
./scripts/install.sh
223235
```
224236

225-
---
237+
### Uninstall
238+
239+
To completely remove VocaMac and all its data (downloaded models, preferences, caches):
226240

227-
## 🗺️ Roadmap
241+
```bash
242+
./scripts/uninstall.sh
243+
```
228244

229-
- [x] **v0.1.0** — MVP: Menu bar app, push-to-talk, double-tap toggle, WhisperKit integration, text injection, settings
230-
- [ ] **v0.2.0** — Onboarding flow, transcription history, audio feedback sounds
231-
- [ ] **v0.3.0** — Custom prompts, real-time streaming transcription, word-level timestamps
232-
- [ ] **v0.4.0** — Auto-updates via Sparkle, code signing, DMG distribution
233-
- [ ] **v1.0.0** — Homebrew Cask, polished UI, performance tuning
245+
Use `--keep-build` to preserve build artifacts:
246+
247+
```bash
248+
./scripts/uninstall.sh --keep-build
249+
```
234250

235251
---
236252

253+
237254
## 🌐 Cross-Platform
238255

239256
VocaMac is the macOS member of the Voca family:
240257

241258
| Platform | Project | Status |
242259
|----------|---------|--------|
243-
| 🐧 Linux | [VocaLinux](https://github.com/jatinkrmalik/vocalinux) | ✅ Available |
244-
| 🍎 macOS | **VocaMac** (this project) | 🚧 MVP |
245-
| 🪟 Windows | VocaWin ([vocawin.com](https://vocawin.com)) | 📋 Planned |
260+
| Linux | [VocaLinux](https://github.com/jatinkrmalik/vocalinux) | ✅ Available |
261+
| macOS | [VocaMac](https://github.com/jatinkrmalik/vocamac) | 🚧 Alpha |
262+
| 🪟 Windows | [VocaWin](https://vocawin.com) | 📋 Planned |
246263

247264
Each platform uses native technologies for the best possible integration, while sharing the same UX patterns and Whisper model family.
248265

249266
---
250267

251268
## 🤝 Related Projects
252269

253-
- [WhisperKit](https://github.com/argmaxinc/WhisperKit) Swift native on-device speech recognition
254-
- [VocaLinux](https://github.com/jatinkrmalik/vocalinux) Voice-to-text for Linux
255-
- [OpenAI Whisper](https://github.com/openai/whisper) Original Whisper model
270+
- [WhisperKit](https://github.com/argmaxinc/WhisperKit) - Swift native on-device speech recognition
271+
- [VocaLinux](https://github.com/jatinkrmalik/vocalinux) - Voice-to-text for Linux
272+
- [OpenAI Whisper](https://github.com/openai/whisper) - Original Whisper model
256273

257274
---
258275

259-
## 📄 License
276+
## ⚠️ Known Limitations
260277

261-
AGPL-3.0 License — see [LICENSE](LICENSE) for details.
278+
- **Ad-hoc code signing** - Accessibility and Input Monitoring permissions reset on every rebuild. Re-grant them after each build.
279+
- **First launch requires internet** - WhisperKit downloads the speech recognition model on first run. All subsequent launches work fully offline.
280+
- **macOS only** - Requires macOS 13 (Ventura) or later.
262281

263282
---
264283

265-
## 👨‍💻 Author
284+
## 📄 License
285+
286+
AGPL-3.0 License - see [LICENSE](LICENSE) for details.
287+
288+
---
266289

267-
**Jatin Kumar Malik** · [GitHub](https://github.com/jatinkrmalik) · [vocamac.com](https://vocamac.com)
290+
Made with ❤️ for the macOS community!

0 commit comments

Comments
 (0)