# hd838a/remote-mic-app architecture

> Architecture diagram of the GitHub repository hd838a/remote-mic-app, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/hd838a/remote-mic-app
- Repository: https://github.com/hd838a/remote-mic-app

## Overview

SayAll is a macOS menu-bar app that turns supported Bluetooth voice remotes into voice-input and Mac-control devices. The main user flow is remote input → voice/audio handling or mapped action → the active app; optional local transcript history can be read by authorized AI clients over stdio MCP. The README documents additional capabilities whose wiring is not shown in the sampled source, so those links are limited to documented relationships.

Main entry points: [`Sources/SayAllMCPKit/SayAllMCPService.swift`](https://github.com/hd838a/remote-mic-app/blob/main/Sources/SayAllMCPKit/SayAllMCPService.swift) (MCP Service), [`Sources/RemoteMic/RemoteButtonGestureRecognizer.swift`](https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/RemoteButtonGestureRecognizer.swift) (Gesture Recognition), [`Sources/RemoteMic/SettingsView.swift`](https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/SettingsView.swift) (Settings UI), [`Sources/RemoteMic/HIDRemoteMonitor.swift`](https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/HIDRemoteMonitor.swift) (HID Monitor)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["Mac App"]
  node_settings_ui["Settings UI<br/>[SettingsView.swift]"]
  node_app_model["App Model"]
  node_root_ui["App Shell"]
end

subgraph group_remote["Remote Input"]
  node_hid_monitor["HID Monitor"]
  node_scheduler["Input Scheduler"]
  node_gesture["Gesture Recognition"]
  node_mapping["Button Mapping"]
  node_function_mapper["Voice Key Mode"]
end

subgraph group_voice["Voice Audio"]
  node_audio_client["Apple Audio Client"]
  node_capture_helper["Audio Capture Helper<br/>[main.swift]"]
  node_voice_parser["Voice Packet Parser"]
  node_voice_session["Voice Session"]
  node_audio_output["Audio Output<br/>[AudioOutput.swift]"]
end

subgraph group_history["Local History"]
  node_transcript_capture["Transcript Capture"]
  node_transcript_store[("Transcript Archive")]
  node_mcp_settings["Agent Access UI"]
  node_mcp_integration["Client Integration"]
  node_mcp_command["MCP Helper<br/>[main.swift]"]
  node_mcp_service["MCP Service"]
  node_authorization[("Authorization Store")]
  node_history_store[("History Query Store")]
  node_audit_log[("Audit Log")]
end

node_user(("User"))
node_mac["Active Mac App"]
node_voice_remote["Bluetooth Remote"]
node_agent(("AI Client"))

node_user -->|"configures"| node_settings_ui
node_settings_ui -->|"updates settings"| node_app_model
node_user -->|"presses"| node_voice_remote
node_voice_remote -->|"sends HID events"| node_hid_monitor
node_hid_monitor -->|"dispatches events"| node_scheduler
node_scheduler -->|"recognizes presses"| node_gesture
node_gesture -->|"resolves actions"| node_mapping
node_mapping -->|"performs mapped action"| node_mac
node_gesture -->|"routes voice key"| node_function_mapper
node_function_mapper -->|"starts or ends"| node_voice_session
node_audio_client -.->|"controls capture"| node_capture_helper
node_capture_helper -->|"feeds packets"| node_voice_parser
node_voice_session -->|"enqueues audio"| node_audio_output
node_audio_output -->|"provides microphone input"| node_mac
node_transcript_capture -->|"saves records"| node_transcript_store
node_user -->|"authorizes clients"| node_mcp_settings
node_mcp_settings -->|"manages access"| node_authorization
node_mcp_integration -->|"configures client"| node_agent
node_agent -->|"connects over stdio"| node_mcp_command
node_mcp_command -->|"dispatches requests"| node_mcp_service
node_mcp_service -->|"checks access"| node_authorization
node_mcp_service -->|"queries history"| node_history_store
node_mcp_service -->|"records requests"| node_audit_log
node_history_store -->|"reads records"| node_transcript_store

click node_settings_ui "https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/SettingsView.swift"
click node_app_model "https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/BridgeAppModel.swift"
click node_root_ui "https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/RemoteMicRootView.swift"
click node_hid_monitor "https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/HIDRemoteMonitor.swift"
click node_scheduler "https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/HIDRemoteScheduler.swift"
click node_gesture "https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/RemoteButtonGestureRecognizer.swift"
click node_mapping "https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/RemoteButtons.swift"
click node_function_mapper "https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/RemoteVoiceFunctionMapper.swift"
click node_audio_client "https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/AppleRemoteAudioClient.swift"
click node_capture_helper "https://github.com/hd838a/remote-mic-app/blob/main/Sources/AppleRemoteAudioCapture/main.swift"
click node_voice_parser "https://github.com/hd838a/remote-mic-app/blob/main/Sources/AppleRemoteAudioCore/AppleRemoteXPCVoiceParser.swift"
click node_voice_session "https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/VoiceFnTapSessionController.swift"
click node_audio_output "https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/AudioOutput.swift"
click node_transcript_capture "https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/TranscriptCaptureCoordinator.swift"
click node_transcript_store "https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/TranscriptArchiveStore.swift"
click node_mcp_settings "https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/TranscriptAgentAccessModel.swift"
click node_mcp_integration "https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/MCPClientIntegrationService.swift"
click node_mcp_command "https://github.com/hd838a/remote-mic-app/blob/main/Sources/SayAllMCP/main.swift"
click node_mcp_service "https://github.com/hd838a/remote-mic-app/blob/main/Sources/SayAllMCPKit/SayAllMCPService.swift"
click node_authorization "https://github.com/hd838a/remote-mic-app/blob/main/Sources/SayAllMCPKit/SayAllMCPAuthorizationStore.swift"
click node_history_store "https://github.com/hd838a/remote-mic-app/blob/main/Sources/SayAllMCPKit/SayAllMCPHistoryStore.swift"
click node_audit_log "https://github.com/hd838a/remote-mic-app/blob/main/Sources/SayAllMCPKit/SayAllMCPAuditLog.swift"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_settings_ui,node_app_model,node_root_ui,node_user,node_agent toneBlue
class node_hid_monitor,node_scheduler,node_gesture,node_mapping,node_function_mapper toneAmber
class node_audio_client,node_capture_helper,node_voice_parser,node_voice_session,node_audio_output toneMint
class node_transcript_capture,node_transcript_store,node_mcp_settings,node_mcp_integration,node_mcp_command,node_mcp_service,node_authorization,node_history_store,node_audit_log toneRose
class node_mac,node_voice_remote toneIndigo
```

## Components

### Mac App

- [Settings UI](https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/SettingsView.swift): `Sources/RemoteMic/SettingsView.swift`
- [App Model](https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/BridgeAppModel.swift): `Sources/RemoteMic/BridgeAppModel.swift`
- [App Shell](https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/RemoteMicRootView.swift): `Sources/RemoteMic/RemoteMicRootView.swift`

### Remote Input

- [HID Monitor](https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/HIDRemoteMonitor.swift): `Sources/RemoteMic/HIDRemoteMonitor.swift`
- [Input Scheduler](https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/HIDRemoteScheduler.swift): `Sources/RemoteMic/HIDRemoteScheduler.swift`
- [Gesture Recognition](https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/RemoteButtonGestureRecognizer.swift): `Sources/RemoteMic/RemoteButtonGestureRecognizer.swift`
- [Button Mapping](https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/RemoteButtons.swift): `Sources/RemoteMic/RemoteButtons.swift`
- [Voice Key Mode](https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/RemoteVoiceFunctionMapper.swift): `Sources/RemoteMic/RemoteVoiceFunctionMapper.swift`

### Voice Audio

- [Apple Audio Client](https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/AppleRemoteAudioClient.swift): `Sources/RemoteMic/AppleRemoteAudioClient.swift`
- [Audio Capture Helper](https://github.com/hd838a/remote-mic-app/blob/main/Sources/AppleRemoteAudioCapture/main.swift): `Sources/AppleRemoteAudioCapture/main.swift`
- [Voice Packet Parser](https://github.com/hd838a/remote-mic-app/blob/main/Sources/AppleRemoteAudioCore/AppleRemoteXPCVoiceParser.swift): `Sources/AppleRemoteAudioCore/AppleRemoteXPCVoiceParser.swift`
- [Voice Session](https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/VoiceFnTapSessionController.swift): `Sources/RemoteMic/VoiceFnTapSessionController.swift`
- [Audio Output](https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/AudioOutput.swift): `Sources/RemoteMic/AudioOutput.swift`

### Local History

- [Transcript Capture](https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/TranscriptCaptureCoordinator.swift): `Sources/RemoteMic/TranscriptCaptureCoordinator.swift`
- [Transcript Archive](https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/TranscriptArchiveStore.swift): `Sources/RemoteMic/TranscriptArchiveStore.swift`
- [Agent Access UI](https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/TranscriptAgentAccessModel.swift): `Sources/RemoteMic/TranscriptAgentAccessModel.swift`
- [Client Integration](https://github.com/hd838a/remote-mic-app/blob/main/Sources/RemoteMic/MCPClientIntegrationService.swift): `Sources/RemoteMic/MCPClientIntegrationService.swift`
- [MCP Helper](https://github.com/hd838a/remote-mic-app/blob/main/Sources/SayAllMCP/main.swift): `Sources/SayAllMCP/main.swift`
- [MCP Service](https://github.com/hd838a/remote-mic-app/blob/main/Sources/SayAllMCPKit/SayAllMCPService.swift): `Sources/SayAllMCPKit/SayAllMCPService.swift`
- [Authorization Store](https://github.com/hd838a/remote-mic-app/blob/main/Sources/SayAllMCPKit/SayAllMCPAuthorizationStore.swift): `Sources/SayAllMCPKit/SayAllMCPAuthorizationStore.swift`
- [History Query Store](https://github.com/hd838a/remote-mic-app/blob/main/Sources/SayAllMCPKit/SayAllMCPHistoryStore.swift): `Sources/SayAllMCPKit/SayAllMCPHistoryStore.swift`
- [Audit Log](https://github.com/hd838a/remote-mic-app/blob/main/Sources/SayAllMCPKit/SayAllMCPAuditLog.swift): `Sources/SayAllMCPKit/SayAllMCPAuditLog.swift`

### Other components

- **User**
- **Active Mac App**
- **Bluetooth Remote**
- **AI Client**

## Connections

- User → Settings UI: configures
- Settings UI → App Model: updates settings
- User → Bluetooth Remote: presses
- Bluetooth Remote → HID Monitor: sends HID events
- HID Monitor → Input Scheduler: dispatches events
- Input Scheduler → Gesture Recognition: recognizes presses
- Gesture Recognition → Button Mapping: resolves actions
- Button Mapping → Active Mac App: performs mapped action
- Gesture Recognition → Voice Key Mode: routes voice key
- Voice Key Mode → Voice Session: starts or ends
- Apple Audio Client → Audio Capture Helper: controls capture
- Audio Capture Helper → Voice Packet Parser: feeds packets
- Voice Session → Audio Output: enqueues audio
- Audio Output → Active Mac App: provides microphone input
- Transcript Capture → Transcript Archive: saves records
- User → Agent Access UI: authorizes clients
- Agent Access UI → Authorization Store: manages access
- Client Integration → AI Client: configures client
- AI Client → MCP Helper: connects over stdio
- MCP Helper → MCP Service: dispatches requests
- MCP Service → Authorization Store: checks access
- MCP Service → History Query Store: queries history
- MCP Service → Audit Log: records requests
- History Query Store → Transcript Archive: reads records
