# manishrnl/espanso-android-app architecture

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

- Interactive diagram: https://gitdiagram.com/manishrnl/espanso-android-app
- Repository: https://github.com/manishrnl/espanso-android-app

## Overview

RNL ESPANSO is an offline Android text-expansion app. Users create or import shortcuts, organize and search them, enable accessibility integration, then type a trigger in a supported field to receive an expansion; an optional bundled keyboard supports secure fields. The graph separates shortcut management, local persistence and portability, expansion runtime, and preferences/safety controls. Edges are limited to relationships shown in excerpts, indexed references, or README statements; several features documented in the README have no sampled implementation path and are represented at their enclosing source directory.

Main entry points: [`app/src/main/java/com/manishrnl/espansoandroid/ShortcutDatabase.java`](https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/ShortcutDatabase.java) (Shortcut database), [`app/src/main/java/com/manishrnl/espansoandroid/TextExpansionAccessibilityService.java`](https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/TextExpansionAccessibilityService.java) (Accessibility expansion), [`app/src/main/java/com/manishrnl/espansoandroid/SettingsActivity.java`](https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/SettingsActivity.java) (Settings), [`app/src/main/java/com/manishrnl/espansoandroid/MainActivity.java`](https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/MainActivity.java) (Shortcut home)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_management["Shortcut management"]
  node_home["Shortcut home<br/>[MainActivity.java]"]
  node_folders["Folder view"]
  node_editor["Shortcut editor"]
  node_search["Global search"]
  node_trash["Recycle bin<br/>[TrashActivity.java]"]
end

subgraph group_persistence["Local data"]
  node_model["Shortcut records<br/>[Shortcut.java]"]
  node_database[("Shortcut database")]
  node_csv["CSV codec<br/>[CsvCodec.java]"]
end

subgraph group_runtime["Expansion runtime"]
  node_accessibility["Accessibility expansion"]
  node_matcher["Trigger matcher"]
  node_renderer["Template renderer"]
  node_keyboard["Bundled keyboard"]
end

subgraph group_settings["Settings and safety"]
  node_settings["Settings"]
  node_prefs[("Preferences")]
  node_excluded["Excluded apps"]
  node_resume["Auto-resume monitor"]
end

node_user(("App user"))
node_external_keyboard(("Android input field"))
node_system_picker(("System document picker"))

node_user -->|"manages shortcuts"| node_home
node_home -->|"loads folders"| node_database
node_home -->|"opens search"| node_search
node_home -->|"opens settings"| node_settings
node_home -->|"opens folder"| node_folders
node_folders -->|"loads shortcuts"| node_database
node_folders -->|"opens editor"| node_editor
node_editor -->|"saves shortcut"| node_database
node_editor -->|"creates record"| node_model
node_search -->|"loads shortcuts"| node_database
node_search -->|"opens editor"| node_editor
node_trash -->|"restores or deletes"| node_database
node_settings -->|"imports shortcuts"| node_database
node_settings -->|"encodes or decodes"| node_csv
node_settings -->|"selects CSV file"| node_system_picker
node_database -->|"stores records"| node_model
node_settings -->|"updates options"| node_prefs
node_settings -->|"opens exclusions"| node_excluded
node_excluded -->|"stores app exclusions"| node_prefs
node_user -->|"types trigger"| node_external_keyboard
node_external_keyboard -->|"exposes text events"| node_accessibility
node_accessibility -->|"loads shortcuts"| node_database
node_accessibility -->|"checks options"| node_prefs
node_accessibility -->|"matches trigger"| node_matcher
node_accessibility -->|"renders replacement"| node_renderer
node_accessibility -->|"starts monitoring"| node_resume
node_resume -->|"reads exclusions"| node_prefs
node_user -->|"selects optionally"| node_keyboard
node_keyboard -->|"loads shortcuts"| node_database
node_keyboard -->|"checks options"| node_prefs
node_keyboard -->|"renders replacement"| node_renderer

click node_home "https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/MainActivity.java"
click node_folders "https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/FolderActivity.java"
click node_editor "https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/EditorActivity.java"
click node_search "https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/SearchActivity.java"
click node_trash "https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/TrashActivity.java"
click node_model "https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/Shortcut.java"
click node_database "https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/ShortcutDatabase.java"
click node_csv "https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/CsvCodec.java"
click node_settings "https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/SettingsActivity.java"
click node_prefs "https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/AppPreferences.java"
click node_excluded "https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/ExcludedAppsActivity.java"
click node_resume "https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/AutoResumeMonitorService.java"
click node_accessibility "https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/TextExpansionAccessibilityService.java"
click node_matcher "https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/ExpansionMatcher.java"
click node_renderer "https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/TemplateRenderer.java"
click node_keyboard "https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/EspansoInputMethodService.java"

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_home,node_folders,node_editor,node_search,node_trash,node_user toneBlue
class node_model,node_database,node_csv toneAmber
class node_accessibility,node_matcher,node_renderer,node_keyboard toneMint
class node_settings,node_prefs,node_excluded,node_resume toneRose
class node_external_keyboard,node_system_picker toneIndigo
```

## Components

### Shortcut management

- [Shortcut home](https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/MainActivity.java): `app/src/main/java/com/manishrnl/espansoandroid/MainActivity.java`
- [Folder view](https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/FolderActivity.java): `app/src/main/java/com/manishrnl/espansoandroid/FolderActivity.java`
- [Shortcut editor](https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/EditorActivity.java): `app/src/main/java/com/manishrnl/espansoandroid/EditorActivity.java`
- [Global search](https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/SearchActivity.java): `app/src/main/java/com/manishrnl/espansoandroid/SearchActivity.java`
- [Recycle bin](https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/TrashActivity.java): `app/src/main/java/com/manishrnl/espansoandroid/TrashActivity.java`

### Local data

- [Shortcut records](https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/Shortcut.java): `app/src/main/java/com/manishrnl/espansoandroid/Shortcut.java`
- [Shortcut database](https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/ShortcutDatabase.java): `app/src/main/java/com/manishrnl/espansoandroid/ShortcutDatabase.java`
- [CSV codec](https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/CsvCodec.java): `app/src/main/java/com/manishrnl/espansoandroid/CsvCodec.java`

### Expansion runtime

- [Accessibility expansion](https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/TextExpansionAccessibilityService.java): `app/src/main/java/com/manishrnl/espansoandroid/TextExpansionAccessibilityService.java`
- [Trigger matcher](https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/ExpansionMatcher.java): `app/src/main/java/com/manishrnl/espansoandroid/ExpansionMatcher.java`
- [Template renderer](https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/TemplateRenderer.java): `app/src/main/java/com/manishrnl/espansoandroid/TemplateRenderer.java`
- [Bundled keyboard](https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/EspansoInputMethodService.java): `app/src/main/java/com/manishrnl/espansoandroid/EspansoInputMethodService.java`

### Settings and safety

- [Settings](https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/SettingsActivity.java): `app/src/main/java/com/manishrnl/espansoandroid/SettingsActivity.java`
- [Preferences](https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/AppPreferences.java): `app/src/main/java/com/manishrnl/espansoandroid/AppPreferences.java`
- [Excluded apps](https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/ExcludedAppsActivity.java): `app/src/main/java/com/manishrnl/espansoandroid/ExcludedAppsActivity.java`
- [Auto-resume monitor](https://github.com/manishrnl/espanso-android-app/blob/main/app/src/main/java/com/manishrnl/espansoandroid/AutoResumeMonitorService.java): `app/src/main/java/com/manishrnl/espansoandroid/AutoResumeMonitorService.java`

### Other components

- **App user**
- **Android input field**
- **System document picker**

## Connections

- App user → Shortcut home: manages shortcuts (evidence: `README.md`)
- Shortcut home → Shortcut database: loads folders (evidence: `app/src/main/java/com/manishrnl/espansoandroid/MainActivity.java`)
- Shortcut home → Global search: opens search (evidence: `app/src/main/java/com/manishrnl/espansoandroid/MainActivity.java`)
- Shortcut home → Settings: opens settings (evidence: `app/src/main/java/com/manishrnl/espansoandroid/MainActivity.java`)
- Shortcut home → Folder view: opens folder (evidence: `app/src/main/java/com/manishrnl/espansoandroid/MainActivity.java`)
- Folder view → Shortcut database: loads shortcuts (evidence: `app/src/main/java/com/manishrnl/espansoandroid/FolderActivity.java`)
- Folder view → Shortcut editor: opens editor (evidence: `app/src/main/java/com/manishrnl/espansoandroid/FolderActivity.java`)
- Shortcut editor → Shortcut database: saves shortcut (evidence: `app/src/main/java/com/manishrnl/espansoandroid/EditorActivity.java`)
- Shortcut editor → Shortcut records: creates record (evidence: `app/src/main/java/com/manishrnl/espansoandroid/EditorActivity.java`)
- Global search → Shortcut database: loads shortcuts (evidence: `app/src/main/java/com/manishrnl/espansoandroid/SearchActivity.java`)
- Global search → Shortcut editor: opens editor (evidence: `app/src/main/java/com/manishrnl/espansoandroid/SearchActivity.java`)
- Recycle bin → Shortcut database: restores or deletes (evidence: `app/src/main/java/com/manishrnl/espansoandroid/TrashActivity.java`)
- Settings → Shortcut database: imports shortcuts (evidence: `app/src/main/java/com/manishrnl/espansoandroid/SettingsActivity.java`)
- Settings → CSV codec: encodes or decodes (evidence: `app/src/main/java/com/manishrnl/espansoandroid/SettingsActivity.java`)
- Settings → System document picker: selects CSV file (evidence: `README.md`)
- Shortcut database → Shortcut records: stores records (evidence: `app/src/main/java/com/manishrnl/espansoandroid/ShortcutDatabase.java`)
- Settings → Preferences: updates options (evidence: `app/src/main/java/com/manishrnl/espansoandroid/SettingsActivity.java`)
- Settings → Excluded apps: opens exclusions (evidence: `app/src/main/java/com/manishrnl/espansoandroid/SettingsActivity.java`)
- Excluded apps → Preferences: stores app exclusions (evidence: `app/src/main/java/com/manishrnl/espansoandroid/ExcludedAppsActivity.java`)
- App user → Android input field: types trigger (evidence: `README.md`)
- Android input field → Accessibility expansion: exposes text events (evidence: `README.md`)
- Accessibility expansion → Shortcut database: loads shortcuts (evidence: `app/src/main/java/com/manishrnl/espansoandroid/TextExpansionAccessibilityService.java`)
- Accessibility expansion → Preferences: checks options (evidence: `app/src/main/java/com/manishrnl/espansoandroid/TextExpansionAccessibilityService.java`)
- Accessibility expansion → Trigger matcher: matches trigger (evidence: `app/src/main/java/com/manishrnl/espansoandroid/TextExpansionAccessibilityService.java`)
- Accessibility expansion → Template renderer: renders replacement (evidence: `app/src/main/java/com/manishrnl/espansoandroid/TextExpansionAccessibilityService.java`)
- Accessibility expansion → Auto-resume monitor: starts monitoring (evidence: `app/src/main/java/com/manishrnl/espansoandroid/TextExpansionAccessibilityService.java`)
- Auto-resume monitor → Preferences: reads exclusions (evidence: `app/src/main/java/com/manishrnl/espansoandroid/AutoResumeMonitorService.java`)
- App user → Bundled keyboard: selects optionally (evidence: `README.md`)
- Bundled keyboard → Shortcut database: loads shortcuts (evidence: `app/src/main/java/com/manishrnl/espansoandroid/EspansoInputMethodService.java`)
- Bundled keyboard → Preferences: checks options (evidence: `app/src/main/java/com/manishrnl/espansoandroid/EspansoInputMethodService.java`)
- Bundled keyboard → Template renderer: renders replacement (evidence: `app/src/main/java/com/manishrnl/espansoandroid/EspansoInputMethodService.java`)
