# tortextrx/meetrec architecture

> Architecture diagram of the GitHub repository tortextrx/meetrec, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-13). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/tortextrx/meetrec
- Repository: https://github.com/tortextrx/meetrec

## Overview

MeetRec is an Android meeting-capture app: users record a meeting, then request a timestamped Whisper transcript, an executive summary with agreements and assigned actions, and a locally generated, shareable PDF. The graph follows the documented workflow and includes history, API-key/model settings, and background recording. Edges are limited to calls visible in excerpts or relationships documented in the README; uninspected implementations are represented only where the tree or README supports them.

Main entry points: [`app/src/main/java/com/meetrec/app/ui/detail/MeetingDetailScreen.kt`](https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/ui/detail/MeetingDetailScreen.kt) (Meeting details), [`app/src/main/java/com/meetrec/app/data/remote/TranscriptionService.kt`](https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/data/remote/TranscriptionService.kt) (Whisper transcription), [`app/src/main/java/com/meetrec/app/data/remote/SummaryService.kt`](https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/data/remote/SummaryService.kt) (AI summarization), [`app/src/main/java/com/meetrec/app/service/RecordingService.kt`](https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/service/RecordingService.kt) (Background recorder)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_capture["Meeting capture"]
  node_recording_service["Background recorder"]
  node_audio_engine["Audio capture"]
  node_wav_writer["WAV segments<br/>[WavAudioWriter.kt]"]
  node_vu_meter["Audio level meter<br/>[VuMeter.kt]"]
end

subgraph group_processing["Transcript and summary"]
  node_transcription["Whisper transcription"]
  node_summary_service["AI summarization<br/>[SummaryService.kt]"]
end

subgraph group_records["Meeting records"]
  node_session_model["Meeting session<br/>[MeetingSession.kt]"]
  node_repository[("Meeting repository")]
  node_transcript_model["Timestamped transcript"]
  node_summary_model["Summary and actions<br/>[MeetingSummary.kt]"]
end

subgraph group_presentation["Screens and export"]
  node_app["App navigation<br/>[MainActivity.kt]"]
  node_recorder["Recorder screen"]
  node_history["Meeting history"]
  node_detail["Meeting details"]
  node_pdf["Native PDF generator"]
end

subgraph group_settings["App settings"]
  node_settings_screen["API key dialog<br/>[ApiKeyDialog.kt]"]
  node_settings_repository[("Local settings")]
end

node_user(("Meeting user"))
node_openrouter{{"OpenRouter API"}}
node_pdf_viewer(("PDF viewer or share"))

node_user -->|"opens app"| node_app
node_app -->|"shows"| node_recorder
node_app -->|"shows"| node_history
node_app -->|"opens selection"| node_detail
node_user -->|"starts recording"| node_recorder
node_recorder -->|"starts or stops"| node_recording_service
node_recording_service -->|"controls capture"| node_audio_engine
node_audio_engine -->|"writes samples"| node_wav_writer
node_audio_engine -->|"reports segments"| node_recording_service
node_recorder -->|"renders levels"| node_vu_meter
node_recording_service -->|"saves session"| node_repository
node_recording_service -->|"creates session"| node_session_model
node_history -->|"loads meetings"| node_repository
node_detail -->|"loads meeting data"| node_repository
node_user -->|"requests transcript or summary"| node_detail
node_detail -->|"transcribes audio"| node_transcription
node_transcription -->|"uploads audio"| node_openrouter
node_transcription -->|"saves transcript"| node_repository
node_transcription -->|"builds transcript"| node_transcript_model
node_detail -->|"generates summary"| node_summary_service
node_summary_service -->|"requests summary"| node_openrouter
node_summary_service -->|"saves summary"| node_repository
node_summary_service -->|"parses result"| node_summary_model
node_detail -->|"generates report"| node_pdf
node_pdf -->|"opens or shares"| node_pdf_viewer
node_user -->|"enters API key"| node_settings_screen
node_settings_screen -->|"saves settings"| node_settings_repository
node_transcription -->|"reads API key"| node_settings_repository
node_summary_service -->|"reads model and key"| node_settings_repository

click node_app "https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/MainActivity.kt"
click node_recorder "https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/ui/recorder/MeetingRecorderScreen.kt"
click node_recording_service "https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/service/RecordingService.kt"
click node_audio_engine "https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/data/audio/AudioRecordEngine.kt"
click node_wav_writer "https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/data/audio/WavAudioWriter.kt"
click node_vu_meter "https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/ui/components/VuMeter.kt"
click node_session_model "https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/data/model/MeetingSession.kt"
click node_repository "https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/data/repository/MeetingRepository.kt"
click node_history "https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/ui/history/MeetingListScreen.kt"
click node_detail "https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/ui/detail/MeetingDetailScreen.kt"
click node_transcription "https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/data/remote/TranscriptionService.kt"
click node_transcript_model "https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/data/model/MeetingTranscript.kt"
click node_summary_service "https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/data/remote/SummaryService.kt"
click node_summary_model "https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/data/model/MeetingSummary.kt"
click node_pdf "https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/pdf/NativePdfGenerator.kt"
click node_settings_screen "https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/ui/components/ApiKeyDialog.kt"
click node_settings_repository "https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/data/repository/SettingsRepository.kt"

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_recording_service,node_audio_engine,node_wav_writer,node_vu_meter,node_user,node_pdf_viewer toneBlue
class node_transcription,node_summary_service toneAmber
class node_session_model,node_repository,node_transcript_model,node_summary_model,node_openrouter toneMint
class node_app,node_recorder,node_history,node_detail,node_pdf toneRose
class node_settings_screen,node_settings_repository toneIndigo
```

## Components

### Meeting capture

- [Background recorder](https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/service/RecordingService.kt): `app/src/main/java/com/meetrec/app/service/RecordingService.kt`
- [Audio capture](https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/data/audio/AudioRecordEngine.kt): `app/src/main/java/com/meetrec/app/data/audio/AudioRecordEngine.kt`
- [WAV segments](https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/data/audio/WavAudioWriter.kt): `app/src/main/java/com/meetrec/app/data/audio/WavAudioWriter.kt`
- [Audio level meter](https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/ui/components/VuMeter.kt): `app/src/main/java/com/meetrec/app/ui/components/VuMeter.kt`

### Transcript and summary

- [Whisper transcription](https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/data/remote/TranscriptionService.kt): `app/src/main/java/com/meetrec/app/data/remote/TranscriptionService.kt`
- [AI summarization](https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/data/remote/SummaryService.kt): `app/src/main/java/com/meetrec/app/data/remote/SummaryService.kt`

### Meeting records

- [Meeting session](https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/data/model/MeetingSession.kt): `app/src/main/java/com/meetrec/app/data/model/MeetingSession.kt`
- [Meeting repository](https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/data/repository/MeetingRepository.kt): `app/src/main/java/com/meetrec/app/data/repository/MeetingRepository.kt`
- [Timestamped transcript](https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/data/model/MeetingTranscript.kt): `app/src/main/java/com/meetrec/app/data/model/MeetingTranscript.kt`
- [Summary and actions](https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/data/model/MeetingSummary.kt): `app/src/main/java/com/meetrec/app/data/model/MeetingSummary.kt`

### Screens and export

- [App navigation](https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/MainActivity.kt): `app/src/main/java/com/meetrec/app/MainActivity.kt`
- [Recorder screen](https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/ui/recorder/MeetingRecorderScreen.kt): `app/src/main/java/com/meetrec/app/ui/recorder/MeetingRecorderScreen.kt`
- [Meeting history](https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/ui/history/MeetingListScreen.kt): `app/src/main/java/com/meetrec/app/ui/history/MeetingListScreen.kt`
- [Meeting details](https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/ui/detail/MeetingDetailScreen.kt): `app/src/main/java/com/meetrec/app/ui/detail/MeetingDetailScreen.kt`
- [Native PDF generator](https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/pdf/NativePdfGenerator.kt): `app/src/main/java/com/meetrec/app/pdf/NativePdfGenerator.kt`

### App settings

- [API key dialog](https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/ui/components/ApiKeyDialog.kt): `app/src/main/java/com/meetrec/app/ui/components/ApiKeyDialog.kt`
- [Local settings](https://github.com/tortextrx/meetrec/blob/main/app/src/main/java/com/meetrec/app/data/repository/SettingsRepository.kt): `app/src/main/java/com/meetrec/app/data/repository/SettingsRepository.kt`

### Other components

- **Meeting user**
- **OpenRouter API**
- **PDF viewer or share**

## Connections

- Meeting user → App navigation: opens app (evidence: `app/src/main/java/com/meetrec/app/MainActivity.kt`)
- App navigation → Recorder screen: shows (evidence: `app/src/main/java/com/meetrec/app/MainActivity.kt`)
- App navigation → Meeting history: shows (evidence: `app/src/main/java/com/meetrec/app/MainActivity.kt`)
- App navigation → Meeting details: opens selection (evidence: `app/src/main/java/com/meetrec/app/MainActivity.kt`)
- Meeting user → Recorder screen: starts recording (evidence: `app/src/main/java/com/meetrec/app/ui/recorder/MeetingRecorderScreen.kt`)
- Recorder screen → Background recorder: starts or stops (evidence: `app/src/main/java/com/meetrec/app/ui/recorder/MeetingRecorderScreen.kt`)
- Background recorder → Audio capture: controls capture (evidence: `app/src/main/java/com/meetrec/app/service/RecordingService.kt`)
- Audio capture → WAV segments: writes samples (evidence: `app/src/main/java/com/meetrec/app/data/audio/AudioRecordEngine.kt`)
- Audio capture → Background recorder: reports segments (evidence: `app/src/main/java/com/meetrec/app/service/RecordingService.kt`)
- Recorder screen → Audio level meter: renders levels (evidence: `app/src/main/java/com/meetrec/app/ui/recorder/MeetingRecorderScreen.kt`)
- Background recorder → Meeting repository: saves session (evidence: `app/src/main/java/com/meetrec/app/service/RecordingService.kt`)
- Background recorder → Meeting session: creates session (evidence: `app/src/main/java/com/meetrec/app/service/RecordingService.kt`)
- Meeting history → Meeting repository: loads meetings (evidence: `app/src/main/java/com/meetrec/app/ui/history/MeetingListScreen.kt`)
- Meeting details → Meeting repository: loads meeting data (evidence: `app/src/main/java/com/meetrec/app/ui/detail/MeetingDetailScreen.kt`)
- Meeting user → Meeting details: requests transcript or summary (evidence: `app/src/main/java/com/meetrec/app/ui/detail/MeetingDetailScreen.kt`)
- Meeting details → Whisper transcription: transcribes audio (evidence: `app/src/main/java/com/meetrec/app/ui/detail/MeetingDetailScreen.kt`)
- Whisper transcription → OpenRouter API: uploads audio (evidence: `app/src/main/java/com/meetrec/app/data/remote/TranscriptionService.kt`)
- Whisper transcription → Meeting repository: saves transcript (evidence: `app/src/main/java/com/meetrec/app/data/remote/TranscriptionService.kt`)
- Whisper transcription → Timestamped transcript: builds transcript (evidence: `app/src/main/java/com/meetrec/app/data/remote/TranscriptionService.kt`)
- Meeting details → AI summarization: generates summary (evidence: `app/src/main/java/com/meetrec/app/ui/detail/MeetingDetailScreen.kt`)
- AI summarization → OpenRouter API: requests summary (evidence: `app/src/main/java/com/meetrec/app/data/remote/SummaryService.kt`)
- AI summarization → Meeting repository: saves summary (evidence: `app/src/main/java/com/meetrec/app/data/remote/SummaryService.kt`)
- AI summarization → Summary and actions: parses result (evidence: `app/src/main/java/com/meetrec/app/data/remote/SummaryService.kt`)
- Meeting details → Native PDF generator: generates report (evidence: `README.md`)
- Native PDF generator → PDF viewer or share: opens or shares (evidence: `README.md`)
- Meeting user → API key dialog: enters API key (evidence: `README.md`)
- API key dialog → Local settings: saves settings (evidence: `app/src/main/java/com/meetrec/app/ui/components/ApiKeyDialog.kt`)
- Whisper transcription → Local settings: reads API key (evidence: `app/src/main/java/com/meetrec/app/data/remote/TranscriptionService.kt`)
- AI summarization → Local settings: reads model and key (evidence: `app/src/main/java/com/meetrec/app/data/remote/SummaryService.kt`)
