-
-
Notifications
You must be signed in to change notification settings - Fork 0
Wear OS Companion
The MoodHaven Journal Wear OS companion is a separate Android/Wear OS app that captures voice reflections and mood taps from your wrist, forwarding them to the desktop app for transcription and journaling.
For the general overview → README
- Records voice memos up to 10 minutes (16 kHz mono AAC-LC)
- Tags recordings with a quick mood tap (4 levels)
- Transfers audio to the phone over Wear OS ChannelAPI
- Optionally captures health context (heart rate, activity) at time of recording
- Offline queue: memos are held locally and retried when phone is in range
- Store journal entries
- Connect to any cloud service
- Send audio anywhere except the paired phone
Wear OS Watch
│ 1. Tap to record → tap to stop
│ 2. Audio: 16 kHz mono AAC-LC (≤10 min, ≈2.4 MB max)
│ 3. Optional mood tap via MessageAPI
│ 4. Audio: 4-byte-header ChannelAPI transfer
│ 5. AudioQueue: persist-and-retry if phone out of range
▼
Android Phone (WearListenerService)
│ 6. Receives ChannelAPI transfer
│ 7. bridgeVoiceMemo() writes file to {app_data}/voice_memos_incoming/
│ 8. Intent broadcast to Tauri WebView
▼
MoodHaven Journal Desktop App
│ 9. useWearVoiceMemos hook picks up incoming file
│ 10. store_voice_memo: moves to permanent storage, creates DB record
│ 11. transcribe_voice_memo: whisper.cpp sidecar → transcription text
│ 12. User reviews, edits, creates journal entry
│ 13. link_voice_memo_to_entry: links memo to entry
Audio never leaves your devices. There is no upload step.
- Watch opens a channel:
channelClient.openChannel(nodeId, "/audio_transfer") - Sends a 4-byte header:
[0x4D, 0x42, duration_ms_as_2_bytes](MB magic + duration) - Audio bytes follow
- Channel closes when transfer completes
-
AudioQueueretries if phone is out of range (exponential backoff)
- Watch:
messageClient.sendMessage(nodeId, "/signal", payload_bytes) - Phone
WearListenerServicereceivesMESSAGE_RECEIVEDintent - Desktop
create_signalcommand stores record withsource = 'wear_os',signal_type = 'mood_tap' -
link_signal_to_entrycan later associate the signal with a journal entry
At recording time the watch captures a health snapshot (heart rate, step count, activity level), stored as health_json on the voice memo. This context is:
- Stored unencrypted alongside memo metadata (not in journal content)
- Optionally surfaced in Writing view as a health badge
- Never sent to any AI service
| Command | Purpose |
|---|---|
store_voice_memo |
Move incoming file to permanent storage, create DB record |
list_voice_memos |
List memos awaiting review |
get_voice_memo |
Get a single memo by ID |
delete_voice_memo |
Delete memo and audio file |
patch_voice_memo_transcription |
Update transcription text after STT |
link_voice_memo_to_entry |
Associate memo with a created journal entry |
transcribe_voice_memo |
Run whisper.cpp sidecar on the audio file |
create_signal |
Store a mood tap or health snapshot from the watch |
list_entry_signals |
Get signals linked to an entry |
Record Screen — Main screen. Tap to record, tap to stop. Circular arc fills over 10 minutes (amber at 8 min, red at 9:30). Long-press while recording to discard.
Mood Tap Screen — Four emoji mood options. One tap sends a mood signal to the desktop.
Breathe Screen (Phase 2) — Guided breathing exercise with expand/contract animation.
History Screen (Phase 2) — Recent voice memos with transfer status and transcription preview.
- Wear OS 3.0+ watch
- Android 11+ phone with Bluetooth pairing to the watch
- MoodHaven Journal desktop app v0.7.0+
- MoodHaven Journal companion APK installed on phone and watch
| Phase | Status | Summary |
|---|---|---|
| 1 — Core Recording | Complete | Recording UI, AudioQueue, ChannelAPI transfer, desktop receipt |
| 2 — UX Polish | In progress | Record arc, breathe screen, nav improvements |
| 3 — Phone Integration | Upcoming | Journal creation from watch, sync status on watch |
| 4 — Deep Integration | Upcoming | Watch-side entry preview, mood correlation, activity badges |
| 5 — Watch Gateway | Planned | Watch as LAN sync relay for the full peer sync network |
Full reference: docs/watch-companion.md