# open-less/openless architecture

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

- Interactive diagram: https://gitdiagram.com/open-less/openless
- Repository: https://github.com/open-less/openless

## Overview

OpenLess is a cross-platform voice-input application: a user starts dictation, speaks, and receives polished text at the active cursor, with clipboard fallback if insertion fails. The main runtime spans the app UI, native coordination, shared dictation orchestration, speech recognition, text polishing, and insertion. The README also describes style packs, vocabulary learning, selection tools, provider configuration, marketplace, history, and encrypted cloud sync. Paths and workflow reflect the tree, README, and sampled excerpts; several feature links are documented capabilities rather than inspected call sites.

Main entry points: [`openless-all/app/crates/openless-core/src/dictation_engine.rs`](https://github.com/open-less/openless/blob/beta/openless-all/app/crates/openless-core/src/dictation_engine.rs) (Dictation engine), [`openless-all/app/src-tauri/src/coordinator.rs`](https://github.com/open-less/openless/blob/beta/openless-all/app/src-tauri/src/coordinator.rs) (Dictation coordinator), [`openless-all/app/src/App.tsx`](https://github.com/open-less/openless/blob/beta/openless-all/app/src/App.tsx) (App UI), [`openless-all/app/crates/openless-core/src/polish.rs`](https://github.com/open-less/openless/blob/beta/openless-all/app/crates/openless-core/src/polish.rs) (Text polishing)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_experience["App experience"]
  node_app["App UI<br/>[App.tsx]"]
  node_linux_ui["Linux UI<br/>[main.rs]"]
  node_settings_ui["Settings UI"]
end

subgraph group_dictation["Dictation runtime"]
  node_coordinator["Dictation coordinator<br/>[coordinator.rs]"]
  node_engine["Dictation engine"]
  node_recorder["Audio recorder<br/>[recorder.rs]"]
end

subgraph group_language["Language services"]
  node_asr["Speech recognition<br/>[mod.rs]"]
  node_local_asr["Local ASR<br/>[mod.rs]"]
  node_polish["Text polishing<br/>[polish.rs]"]
  node_styles["Style packs<br/>[style_packs.rs]"]
  node_dictionary["Vocabulary<br/>[vocabulary.rs]"]
end

subgraph group_platform["Platform integration"]
  node_insert["Text insertion<br/>[insertion.rs]"]
  node_selection["Selection tools<br/>[selection.rs]"]
  node_android_ime["Android keyboard"]
end

subgraph group_account["Settings and sync"]
  node_providers["Provider configuration<br/>[providers.rs]"]
  node_marketplace["Style marketplace<br/>[marketplace.rs]"]
  node_history[("Dictation history<br/>[history.rs]")]
  node_sync["Encrypted cloud sync<br/>[service.rs]"]
end

node_user(("User"))
node_host["Target text field"]
node_clipboard["System clipboard"]
node_asr_service["ASR providers"]
node_llm_service["Polish model"]
node_cloud["Sync service"]

node_user -->|"starts dictation"| node_app
node_user -->|"starts dictation"| node_linux_ui
node_app -->|"dispatches commands"| node_coordinator
node_linux_ui -->|"dispatches commands"| node_coordinator
node_coordinator -->|"orchestrates session"| node_engine
node_engine -->|"captures audio"| node_recorder
node_engine -->|"transcribes audio"| node_asr
node_asr -.->|"streams audio"| node_asr_service
node_asr -.->|"uses local models"| node_local_asr
node_engine -->|"polishes transcript"| node_polish
node_polish -->|"uses selected style"| node_styles
node_polish -->|"uses vocabulary"| node_dictionary
node_polish -.->|"sends text"| node_llm_service
node_coordinator -->|"inserts result"| node_insert
node_insert -->|"types text"| node_host
node_insert -->|"copies on failure"| node_clipboard
node_user -->|"invokes selection tools"| node_selection
node_user -->|"dictates on Android"| node_android_ime
node_android_ime -->|"calls native backend"| node_coordinator
node_settings_ui -->|"configures providers"| node_providers
node_app -->|"accesses packs"| node_marketplace
node_engine -->|"records session"| node_history
node_app -->|"manages sync"| node_sync
node_sync -.->|"syncs encrypted data"| node_cloud

click node_app "https://github.com/open-less/openless/blob/beta/openless-all/app/src/App.tsx"
click node_linux_ui "https://github.com/open-less/openless/blob/beta/openless-all/app/linux-egui/src/main.rs"
click node_settings_ui "https://github.com/open-less/openless/blob/beta/openless-all/app/src/pages/settings/DataStorageSection.tsx"
click node_coordinator "https://github.com/open-less/openless/blob/beta/openless-all/app/src-tauri/src/coordinator.rs"
click node_engine "https://github.com/open-less/openless/blob/beta/openless-all/app/crates/openless-core/src/dictation_engine.rs"
click node_recorder "https://github.com/open-less/openless/blob/beta/openless-all/app/src-tauri/src/recorder.rs"
click node_asr "https://github.com/open-less/openless/blob/beta/openless-all/app/crates/openless-core/src/asr/mod.rs"
click node_local_asr "https://github.com/open-less/openless/blob/beta/openless-all/app/src-tauri/src/asr/local/mod.rs"
click node_polish "https://github.com/open-less/openless/blob/beta/openless-all/app/crates/openless-core/src/polish.rs"
click node_styles "https://github.com/open-less/openless/blob/beta/openless-all/app/crates/openless-core/src/style_packs.rs"
click node_dictionary "https://github.com/open-less/openless/blob/beta/openless-all/app/crates/openless-core/src/vocabulary.rs"
click node_insert "https://github.com/open-less/openless/blob/beta/openless-all/app/src-tauri/src/insertion.rs"
click node_selection "https://github.com/open-less/openless/blob/beta/openless-all/app/src-tauri/src/selection.rs"
click node_android_ime "https://github.com/open-less/openless/blob/beta/openless-all/app/android/kotlin/OpenLessImeService.kt"
click node_providers "https://github.com/open-less/openless/blob/beta/openless-all/app/src-tauri/src/commands/providers.rs"
click node_marketplace "https://github.com/open-less/openless/blob/beta/openless-all/app/src-tauri/src/commands/marketplace.rs"
click node_history "https://github.com/open-less/openless/blob/beta/openless-all/app/src-tauri/src/persistence/history.rs"
click node_sync "https://github.com/open-less/openless/blob/beta/openless-all/app/crates/openless-core/src/cloud_sync_e2ee/service.rs"

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_app,node_linux_ui,node_settings_ui,node_user toneBlue
class node_coordinator,node_engine,node_recorder toneAmber
class node_asr,node_local_asr,node_polish,node_styles,node_dictionary toneMint
class node_insert,node_selection,node_android_ime toneRose
class node_providers,node_marketplace,node_history,node_sync,node_host,node_clipboard,node_asr_service,node_llm_service,node_cloud toneIndigo
```

## Components

### App experience

- [App UI](https://github.com/open-less/openless/blob/beta/openless-all/app/src/App.tsx): `openless-all/app/src/App.tsx`
- [Linux UI](https://github.com/open-less/openless/blob/beta/openless-all/app/linux-egui/src/main.rs): `openless-all/app/linux-egui/src/main.rs`
- [Settings UI](https://github.com/open-less/openless/blob/beta/openless-all/app/src/pages/settings/DataStorageSection.tsx): `openless-all/app/src/pages/settings/DataStorageSection.tsx`

### Dictation runtime

- [Dictation coordinator](https://github.com/open-less/openless/blob/beta/openless-all/app/src-tauri/src/coordinator.rs): `openless-all/app/src-tauri/src/coordinator.rs`
- [Dictation engine](https://github.com/open-less/openless/blob/beta/openless-all/app/crates/openless-core/src/dictation_engine.rs): `openless-all/app/crates/openless-core/src/dictation_engine.rs`
- [Audio recorder](https://github.com/open-less/openless/blob/beta/openless-all/app/src-tauri/src/recorder.rs): `openless-all/app/src-tauri/src/recorder.rs`

### Language services

- [Speech recognition](https://github.com/open-less/openless/blob/beta/openless-all/app/crates/openless-core/src/asr/mod.rs): `openless-all/app/crates/openless-core/src/asr/mod.rs`
- [Local ASR](https://github.com/open-less/openless/blob/beta/openless-all/app/src-tauri/src/asr/local/mod.rs): `openless-all/app/src-tauri/src/asr/local/mod.rs`
- [Text polishing](https://github.com/open-less/openless/blob/beta/openless-all/app/crates/openless-core/src/polish.rs): `openless-all/app/crates/openless-core/src/polish.rs`
- [Style packs](https://github.com/open-less/openless/blob/beta/openless-all/app/crates/openless-core/src/style_packs.rs): `openless-all/app/crates/openless-core/src/style_packs.rs`
- [Vocabulary](https://github.com/open-less/openless/blob/beta/openless-all/app/crates/openless-core/src/vocabulary.rs): `openless-all/app/crates/openless-core/src/vocabulary.rs`

### Platform integration

- [Text insertion](https://github.com/open-less/openless/blob/beta/openless-all/app/src-tauri/src/insertion.rs): `openless-all/app/src-tauri/src/insertion.rs`
- [Selection tools](https://github.com/open-less/openless/blob/beta/openless-all/app/src-tauri/src/selection.rs): `openless-all/app/src-tauri/src/selection.rs`
- [Android keyboard](https://github.com/open-less/openless/blob/beta/openless-all/app/android/kotlin/OpenLessImeService.kt): `openless-all/app/android/kotlin/OpenLessImeService.kt`

### Settings and sync

- [Provider configuration](https://github.com/open-less/openless/blob/beta/openless-all/app/src-tauri/src/commands/providers.rs): `openless-all/app/src-tauri/src/commands/providers.rs`
- [Style marketplace](https://github.com/open-less/openless/blob/beta/openless-all/app/src-tauri/src/commands/marketplace.rs): `openless-all/app/src-tauri/src/commands/marketplace.rs`
- [Dictation history](https://github.com/open-less/openless/blob/beta/openless-all/app/src-tauri/src/persistence/history.rs): `openless-all/app/src-tauri/src/persistence/history.rs`
- [Encrypted cloud sync](https://github.com/open-less/openless/blob/beta/openless-all/app/crates/openless-core/src/cloud_sync_e2ee/service.rs): `openless-all/app/crates/openless-core/src/cloud_sync_e2ee/service.rs`

### Other components

- **User**
- **Target text field**
- **System clipboard**
- **ASR providers**
- **Polish model**
- **Sync service**

## Connections

- User → App UI: starts dictation
- User → Linux UI: starts dictation
- App UI → Dictation coordinator: dispatches commands
- Linux UI → Dictation coordinator: dispatches commands
- Dictation coordinator → Dictation engine: orchestrates session
- Dictation engine → Audio recorder: captures audio
- Dictation engine → Speech recognition: transcribes audio
- Speech recognition → ASR providers: streams audio
- Speech recognition → Local ASR: uses local models
- Dictation engine → Text polishing: polishes transcript
- Text polishing → Style packs: uses selected style
- Text polishing → Vocabulary: uses vocabulary
- Text polishing → Polish model: sends text
- Dictation coordinator → Text insertion: inserts result
- Text insertion → Target text field: types text
- Text insertion → System clipboard: copies on failure
- User → Selection tools: invokes selection tools
- User → Android keyboard: dictates on Android
- Android keyboard → Dictation coordinator: calls native backend
- Settings UI → Provider configuration: configures providers
- App UI → Style marketplace: accesses packs
- Dictation engine → Dictation history: records session
- App UI → Encrypted cloud sync: manages sync
- Encrypted cloud sync → Sync service: syncs encrypted data
