# korenkrita/simul-subtitle architecture

> Architecture diagram of the GitHub repository korenkrita/simul-subtitle, 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/korenkrita/simul-subtitle
- Repository: https://github.com/korenkrita/simul-subtitle

## Overview

Simul Subtitle is a cross-platform live-captioning app for Android, macOS, and Windows. Users configure source and target languages and an optional translation service, grant audio/overlay permissions as needed, then start captions: platform audio capture feeds shared speech segmentation and offline recognition, followed by optional online translation and floating-caption rendering. The product also supports scene and glossary settings, optional Jev assistance, session logs and transcripts, and Android update checks. Several platform internals are unsampled; documented capabilities are shown without asserting unverified implementation links.

Main entry points: [`app/src/main/java/io/github/korenkrita/simulsub/MainActivity.kt`](https://github.com/korenkrita/simul-subtitle/blob/main/app/src/main/java/io/github/korenkrita/simulsub/MainActivity.kt) (Android App), [`core/src/main/java/io/github/korenkrita/simulsub/CaptionSession.kt`](https://github.com/korenkrita/simul-subtitle/blob/main/core/src/main/java/io/github/korenkrita/simulsub/CaptionSession.kt) (Caption Session), [`desktop/src/main/java/io/github/korenkrita/simulsub/App.kt`](https://github.com/korenkrita/simul-subtitle/blob/main/desktop/src/main/java/io/github/korenkrita/simulsub/App.kt) (Desktop App), [`core/src/main/java/io/github/korenkrita/simulsub/Pipeline.kt`](https://github.com/korenkrita/simul-subtitle/blob/main/core/src/main/java/io/github/korenkrita/simulsub/Pipeline.kt) (Caption Pipeline)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_clients["Platform Apps"]
  node_android_ui["Android App<br/>[MainActivity.kt]"]
  node_desktop_ui["Desktop App<br/>[App.kt]"]
  node_desktop_entry["Desktop Entry<br/>[Main.kt]"]
  node_updater["App Updater<br/>[AppUpdater.kt]"]
end

subgraph group_capture["Audio and Captions"]
  node_android_capture["Android Capture<br/>[CaptionService.kt]"]
  node_android_overlay["Android Overlay"]
  node_desktop_session["Desktop Session<br/>[Session.kt]"]
  node_desktop_overlay["Desktop Overlay<br/>[Overlay.kt]"]
  node_session["Caption Session<br/>[CaptionSession.kt]"]
end

subgraph group_language["Speech and Translation"]
  node_segmenter["Speech Segmenter<br/>[Segmenter.kt]"]
  node_pipeline["Caption Pipeline<br/>[Pipeline.kt]"]
  node_engines["Offline Engines<br/>[Engines.kt]"]
  node_translation["BYOK Translation<br/>[Translation.kt]"]
end

subgraph group_settings["Settings and Services"]
  node_prefs_android["Android Preferences<br/>[Prefs.kt]"]
  node_prefs_desktop["Desktop Preferences<br/>[Prefs.kt]"]
  node_jev["Jev Assistance<br/>[Jev.kt]"]
  node_service_status["Service Status<br/>[ServiceStatus.kt]"]
  node_setup_order["Setup Ordering<br/>[SetupOrder.kt]"]
end

subgraph group_records["Session Records"]
  node_session_log[("Session Logs<br/>[SessionLog.kt]")]
end

node_user(("Viewer"))
node_audio_source(("System Audio"))
node_llm_service(("LLM Endpoint"))
node_jev_service(("Jev Service"))
node_release_service(("Release Service"))

node_user -->|"configures and starts"| node_android_ui
node_user -->|"configures and starts"| node_desktop_ui
node_android_ui -->|"starts service"| node_android_capture
node_android_ui -->|"checks updates"| node_updater
node_desktop_entry -->|"launches"| node_desktop_ui
node_desktop_ui -->|"controls session"| node_desktop_session
node_audio_source -->|"provides playback audio"| node_android_capture
node_audio_source -->|"provides system audio"| node_desktop_session
node_android_capture -->|"runs session"| node_session
node_desktop_session -->|"uses shared session"| node_session
node_session -->|"feeds audio frames"| node_segmenter
node_session -->|"submits speech jobs"| node_pipeline
node_pipeline -.->|"uses offline recognition"| node_engines
node_pipeline -.->|"requests translation"| node_translation
node_translation -->|"sends text"| node_llm_service
node_pipeline -->|"requests optional judgment"| node_jev
node_jev -->|"sends optional requests"| node_jev_service
node_android_capture -->|"renders captions"| node_android_overlay
node_desktop_session -.->|"shows captions"| node_desktop_overlay
node_session -->|"records session"| node_session_log
node_android_ui -.->|"edits settings"| node_prefs_android
node_desktop_ui -.->|"edits settings"| node_prefs_desktop
node_session -->|"orders setup"| node_setup_order
node_android_ui -->|"views and shares logs"| node_session_log
node_desktop_ui -->|"manages transcripts"| node_session_log
node_android_ui -.->|"checks releases"| node_release_service

click node_android_ui "https://github.com/korenkrita/simul-subtitle/blob/main/app/src/main/java/io/github/korenkrita/simulsub/MainActivity.kt"
click node_desktop_ui "https://github.com/korenkrita/simul-subtitle/blob/main/desktop/src/main/java/io/github/korenkrita/simulsub/App.kt"
click node_desktop_entry "https://github.com/korenkrita/simul-subtitle/blob/main/desktop/src/main/java/io/github/korenkrita/simulsub/Main.kt"
click node_updater "https://github.com/korenkrita/simul-subtitle/blob/main/app/src/main/java/io/github/korenkrita/simulsub/AppUpdater.kt"
click node_android_capture "https://github.com/korenkrita/simul-subtitle/blob/main/app/src/main/java/io/github/korenkrita/simulsub/CaptionService.kt"
click node_android_overlay "https://github.com/korenkrita/simul-subtitle/blob/main/app/src/main/java/io/github/korenkrita/simulsub/CaptionOverlayView.kt"
click node_desktop_session "https://github.com/korenkrita/simul-subtitle/blob/main/desktop/src/main/java/io/github/korenkrita/simulsub/Session.kt"
click node_desktop_overlay "https://github.com/korenkrita/simul-subtitle/blob/main/desktop/src/main/java/io/github/korenkrita/simulsub/Overlay.kt"
click node_session "https://github.com/korenkrita/simul-subtitle/blob/main/core/src/main/java/io/github/korenkrita/simulsub/CaptionSession.kt"
click node_segmenter "https://github.com/korenkrita/simul-subtitle/blob/main/core/src/main/java/io/github/korenkrita/simulsub/Segmenter.kt"
click node_pipeline "https://github.com/korenkrita/simul-subtitle/blob/main/core/src/main/java/io/github/korenkrita/simulsub/Pipeline.kt"
click node_engines "https://github.com/korenkrita/simul-subtitle/blob/main/app/src/main/java/io/github/korenkrita/simulsub/Engines.kt"
click node_translation "https://github.com/korenkrita/simul-subtitle/blob/main/core/src/main/java/io/github/korenkrita/simulsub/Translation.kt"
click node_prefs_android "https://github.com/korenkrita/simul-subtitle/blob/main/app/src/main/java/io/github/korenkrita/simulsub/Prefs.kt"
click node_prefs_desktop "https://github.com/korenkrita/simul-subtitle/blob/main/desktop/src/main/java/io/github/korenkrita/simulsub/Prefs.kt"
click node_jev "https://github.com/korenkrita/simul-subtitle/blob/main/core/src/main/java/io/github/korenkrita/simulsub/Jev.kt"
click node_service_status "https://github.com/korenkrita/simul-subtitle/blob/main/core/src/main/java/io/github/korenkrita/simulsub/ServiceStatus.kt"
click node_session_log "https://github.com/korenkrita/simul-subtitle/blob/main/core/src/main/java/io/github/korenkrita/simulsub/SessionLog.kt"
click node_setup_order "https://github.com/korenkrita/simul-subtitle/blob/main/core/src/main/java/io/github/korenkrita/simulsub/SetupOrder.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_android_ui,node_desktop_ui,node_desktop_entry,node_updater,node_user toneBlue
class node_android_capture,node_android_overlay,node_desktop_session,node_desktop_overlay,node_session toneAmber
class node_segmenter,node_pipeline,node_engines,node_translation toneMint
class node_prefs_android,node_prefs_desktop,node_jev,node_service_status,node_setup_order toneRose
class node_session_log,node_audio_source,node_llm_service,node_jev_service,node_release_service toneIndigo
```

## Components

### Platform Apps

- [Android App](https://github.com/korenkrita/simul-subtitle/blob/main/app/src/main/java/io/github/korenkrita/simulsub/MainActivity.kt): `app/src/main/java/io/github/korenkrita/simulsub/MainActivity.kt`
- [Desktop App](https://github.com/korenkrita/simul-subtitle/blob/main/desktop/src/main/java/io/github/korenkrita/simulsub/App.kt): `desktop/src/main/java/io/github/korenkrita/simulsub/App.kt`
- [Desktop Entry](https://github.com/korenkrita/simul-subtitle/blob/main/desktop/src/main/java/io/github/korenkrita/simulsub/Main.kt): `desktop/src/main/java/io/github/korenkrita/simulsub/Main.kt`
- [App Updater](https://github.com/korenkrita/simul-subtitle/blob/main/app/src/main/java/io/github/korenkrita/simulsub/AppUpdater.kt): `app/src/main/java/io/github/korenkrita/simulsub/AppUpdater.kt`

### Audio and Captions

- [Android Capture](https://github.com/korenkrita/simul-subtitle/blob/main/app/src/main/java/io/github/korenkrita/simulsub/CaptionService.kt): `app/src/main/java/io/github/korenkrita/simulsub/CaptionService.kt`
- [Android Overlay](https://github.com/korenkrita/simul-subtitle/blob/main/app/src/main/java/io/github/korenkrita/simulsub/CaptionOverlayView.kt): `app/src/main/java/io/github/korenkrita/simulsub/CaptionOverlayView.kt`
- [Desktop Session](https://github.com/korenkrita/simul-subtitle/blob/main/desktop/src/main/java/io/github/korenkrita/simulsub/Session.kt): `desktop/src/main/java/io/github/korenkrita/simulsub/Session.kt`
- [Desktop Overlay](https://github.com/korenkrita/simul-subtitle/blob/main/desktop/src/main/java/io/github/korenkrita/simulsub/Overlay.kt): `desktop/src/main/java/io/github/korenkrita/simulsub/Overlay.kt`
- [Caption Session](https://github.com/korenkrita/simul-subtitle/blob/main/core/src/main/java/io/github/korenkrita/simulsub/CaptionSession.kt): `core/src/main/java/io/github/korenkrita/simulsub/CaptionSession.kt`

### Speech and Translation

- [Speech Segmenter](https://github.com/korenkrita/simul-subtitle/blob/main/core/src/main/java/io/github/korenkrita/simulsub/Segmenter.kt): `core/src/main/java/io/github/korenkrita/simulsub/Segmenter.kt`
- [Caption Pipeline](https://github.com/korenkrita/simul-subtitle/blob/main/core/src/main/java/io/github/korenkrita/simulsub/Pipeline.kt): `core/src/main/java/io/github/korenkrita/simulsub/Pipeline.kt`
- [Offline Engines](https://github.com/korenkrita/simul-subtitle/blob/main/app/src/main/java/io/github/korenkrita/simulsub/Engines.kt): `app/src/main/java/io/github/korenkrita/simulsub/Engines.kt`
- [BYOK Translation](https://github.com/korenkrita/simul-subtitle/blob/main/core/src/main/java/io/github/korenkrita/simulsub/Translation.kt): `core/src/main/java/io/github/korenkrita/simulsub/Translation.kt`

### Settings and Services

- [Android Preferences](https://github.com/korenkrita/simul-subtitle/blob/main/app/src/main/java/io/github/korenkrita/simulsub/Prefs.kt): `app/src/main/java/io/github/korenkrita/simulsub/Prefs.kt`
- [Desktop Preferences](https://github.com/korenkrita/simul-subtitle/blob/main/desktop/src/main/java/io/github/korenkrita/simulsub/Prefs.kt): `desktop/src/main/java/io/github/korenkrita/simulsub/Prefs.kt`
- [Jev Assistance](https://github.com/korenkrita/simul-subtitle/blob/main/core/src/main/java/io/github/korenkrita/simulsub/Jev.kt): `core/src/main/java/io/github/korenkrita/simulsub/Jev.kt`
- [Service Status](https://github.com/korenkrita/simul-subtitle/blob/main/core/src/main/java/io/github/korenkrita/simulsub/ServiceStatus.kt): `core/src/main/java/io/github/korenkrita/simulsub/ServiceStatus.kt`
- [Setup Ordering](https://github.com/korenkrita/simul-subtitle/blob/main/core/src/main/java/io/github/korenkrita/simulsub/SetupOrder.kt): `core/src/main/java/io/github/korenkrita/simulsub/SetupOrder.kt`

### Session Records

- [Session Logs](https://github.com/korenkrita/simul-subtitle/blob/main/core/src/main/java/io/github/korenkrita/simulsub/SessionLog.kt): `core/src/main/java/io/github/korenkrita/simulsub/SessionLog.kt`

### Other components

- **Viewer**
- **System Audio**
- **LLM Endpoint**
- **Jev Service**
- **Release Service**

## Connections

- Viewer → Android App: configures and starts (evidence: `README.md`)
- Viewer → Desktop App: configures and starts (evidence: `README.md`)
- Android App → Android Capture: starts service (evidence: `app/src/main/java/io/github/korenkrita/simulsub/MainActivity.kt`)
- Android App → App Updater: checks updates (evidence: `app/src/main/java/io/github/korenkrita/simulsub/MainActivity.kt`)
- Desktop Entry → Desktop App: launches (evidence: `desktop/src/main/java/io/github/korenkrita/simulsub/Main.kt`)
- Desktop App → Desktop Session: controls session (evidence: `desktop/src/main/java/io/github/korenkrita/simulsub/App.kt`)
- System Audio → Android Capture: provides playback audio (evidence: `app/src/main/java/io/github/korenkrita/simulsub/CaptionService.kt`)
- System Audio → Desktop Session: provides system audio (evidence: `README.md`)
- Android Capture → Caption Session: runs session (evidence: `app/src/main/java/io/github/korenkrita/simulsub/CaptionService.kt`)
- Desktop Session → Caption Session: uses shared session (evidence: `desktop/src/main/java/io/github/korenkrita/simulsub/Session.kt`)
- Caption Session → Speech Segmenter: feeds audio frames (evidence: `core/src/main/java/io/github/korenkrita/simulsub/CaptionSession.kt`)
- Caption Session → Caption Pipeline: submits speech jobs (evidence: `core/src/main/java/io/github/korenkrita/simulsub/CaptionSession.kt`)
- Caption Pipeline → Offline Engines: uses offline recognition
- Caption Pipeline → BYOK Translation: requests translation (evidence: `README.md`)
- BYOK Translation → LLM Endpoint: sends text (evidence: `README.md`)
- Caption Pipeline → Jev Assistance: requests optional judgment (evidence: `core/src/main/java/io/github/korenkrita/simulsub/Pipeline.kt`)
- Jev Assistance → Jev Service: sends optional requests (evidence: `core/src/main/java/io/github/korenkrita/simulsub/Jev.kt`)
- Android Capture → Android Overlay: renders captions (evidence: `app/src/main/java/io/github/korenkrita/simulsub/CaptionService.kt`)
- Desktop Session → Desktop Overlay: shows captions (evidence: `README.md`)
- Caption Session → Session Logs: records session (evidence: `core/src/main/java/io/github/korenkrita/simulsub/CaptionSession.kt`)
- Android App → Android Preferences: edits settings (evidence: `README.md`)
- Desktop App → Desktop Preferences: edits settings (evidence: `README.md`)
- Caption Session → Setup Ordering: orders setup (evidence: `core/src/main/java/io/github/korenkrita/simulsub/CaptionSession.kt`)
- Android App → Session Logs: views and shares logs (evidence: `app/src/main/java/io/github/korenkrita/simulsub/MainActivity.kt`)
- Desktop App → Session Logs: manages transcripts (evidence: `desktop/src/main/java/io/github/korenkrita/simulsub/App.kt`)
- Android App → Release Service: checks releases
