# horizon-sky/gkd architecture

> Architecture diagram of the GitHub repository horizon-sky/gkd, 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/horizon-sky/gkd
- Repository: https://github.com/horizon-sky/gkd

## Overview

gkd is an Android accessibility-driven screen-clicking app: users manage subscriptions and matching settings, then accessibility events and screen context drive selector-based rule matching and target actions. Snapshot review and an HTTP inspection interface support rule authoring and debugging. The README documents subscriptions, advanced selectors, and snapshot inspection; sampled code confirms accessibility matching, selector parsing, snapshot capture entry points, and HTTP operations. Some subscription-resolution and persistence wiring is not shown, so those links are kept conservative.

Main entry points: [`app/src/main/kotlin/li/songe/gkd/service/A11yService.kt`](https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/service/A11yService.kt) (Accessibility matcher), [`app/src/main/kotlin/li/songe/gkd/debug/HttpService.kt`](https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/debug/HttpService.kt) (Inspection HTTP API), [`app/src/main/kotlin/li/songe/gkd/ui/home/HomePage.kt`](https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/ui/home/HomePage.kt) (Home and settings), [`app/src/main/kotlin/li/songe/gkd/data/RawSubscription.kt`](https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/data/RawSubscription.kt) (Subscription rules)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["App and settings"]
  node_main["Main activity<br/>[MainActivity.kt]"]
  node_home["Home and settings<br/>[HomePage.kt]"]
  node_subsui["Subscription UI<br/>[SubsPage.kt]"]
  node_accessui["App and rule settings<br/>[AppConfigPage.kt]"]
end

subgraph group_rules["Rules and matching"]
  node_subscriptions["Subscription rules<br/>[RawSubscription.kt]"]
  node_resolved["Resolved rules<br/>[ResolvedRule.kt]"]
  node_selector["Selector engine<br/>[Selector.kt]"]
  node_actions["Action definitions<br/>[GkdAction.kt]"]
end

subgraph group_inspect["Snapshot inspection"]
  node_snapshotui["Snapshot review<br/>[SnapshotPage.kt]"]
  node_snapshotcapture["Snapshot capture<br/>[SnapshotExt.kt]"]
  node_tile["Snapshot quick tile"]
  node_http["Inspection HTTP API<br/>[HttpService.kt]"]
end

subgraph group_platform["Android services"]
  node_accessibility["Accessibility matcher<br/>[A11yService.kt]"]
  node_servicecontext["Accessibility context<br/>[A11yContext.kt]"]
  node_shizuku["Shizuku service<br/>[UserService.kt]"]
end

subgraph group_state["State and persistence"]
  node_db[("Room database<br/>[DbSet.kt]")]
  node_store[("App preferences<br/>[Store.kt]")]
end

node_user(("User"))
node_target(("Foreground app"))

node_user -->|"opens"| node_main
node_main -->|"shows"| node_home
node_home -->|"opens"| node_subsui
node_home -->|"opens"| node_accessui
node_subsui -->|"manages"| node_subscriptions
node_subscriptions -.->|"defines rules"| node_resolved
node_target -->|"sends events"| node_accessibility
node_accessibility -->|"queries context"| node_servicecontext
node_accessibility -->|"checks rules"| node_resolved
node_accessibility -->|"parses and queries"| node_selector
node_accessibility -->|"executes matches"| node_actions
node_user -->|"requests capture"| node_tile
node_tile -->|"captures"| node_snapshotcapture
node_snapshotui -.->|"reads snapshots"| node_db
node_http -->|"captures snapshot"| node_snapshotcapture
node_http -->|"reads snapshot list"| node_db
node_http -->|"accepts subscription"| node_subscriptions
node_http -->|"executes selector action"| node_accessibility
node_accessui -.->|"updates settings"| node_store
node_accessibility -.->|"uses optional service"| node_shizuku

click node_main "https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/MainActivity.kt"
click node_home "https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/ui/home/HomePage.kt"
click node_subsui "https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/ui/SubsPage.kt"
click node_accessui "https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/ui/AppConfigPage.kt"
click node_subscriptions "https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/data/RawSubscription.kt"
click node_resolved "https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/data/ResolvedRule.kt"
click node_selector "https://github.com/horizon-sky/gkd/blob/main/selector/src/commonMain/kotlin/li/songe/selector/Selector.kt"
click node_accessibility "https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/service/A11yService.kt"
click node_servicecontext "https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/service/A11yContext.kt"
click node_actions "https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/data/GkdAction.kt"
click node_snapshotui "https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/ui/SnapshotPage.kt"
click node_snapshotcapture "https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/debug/SnapshotExt.kt"
click node_tile "https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/debug/SnapshotTileService.kt"
click node_http "https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/debug/HttpService.kt"
click node_db "https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/db/DbSet.kt"
click node_store "https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/util/Store.kt"
click node_shizuku "https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/shizuku/UserService.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_main,node_home,node_subsui,node_accessui,node_user toneBlue
class node_subscriptions,node_resolved,node_selector,node_actions toneAmber
class node_snapshotui,node_snapshotcapture,node_tile,node_http toneMint
class node_accessibility,node_servicecontext,node_shizuku toneRose
class node_db,node_store,node_target toneIndigo
```

## Components

### App and settings

- [Main activity](https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/MainActivity.kt): `app/src/main/kotlin/li/songe/gkd/MainActivity.kt`
- [Home and settings](https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/ui/home/HomePage.kt): `app/src/main/kotlin/li/songe/gkd/ui/home/HomePage.kt`
- [Subscription UI](https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/ui/SubsPage.kt): `app/src/main/kotlin/li/songe/gkd/ui/SubsPage.kt`
- [App and rule settings](https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/ui/AppConfigPage.kt): `app/src/main/kotlin/li/songe/gkd/ui/AppConfigPage.kt`

### Rules and matching

- [Subscription rules](https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/data/RawSubscription.kt): `app/src/main/kotlin/li/songe/gkd/data/RawSubscription.kt`
- [Resolved rules](https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/data/ResolvedRule.kt): `app/src/main/kotlin/li/songe/gkd/data/ResolvedRule.kt`
- [Selector engine](https://github.com/horizon-sky/gkd/blob/main/selector/src/commonMain/kotlin/li/songe/selector/Selector.kt): `selector/src/commonMain/kotlin/li/songe/selector/Selector.kt`
- [Action definitions](https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/data/GkdAction.kt): `app/src/main/kotlin/li/songe/gkd/data/GkdAction.kt`

### Snapshot inspection

- [Snapshot review](https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/ui/SnapshotPage.kt): `app/src/main/kotlin/li/songe/gkd/ui/SnapshotPage.kt`
- [Snapshot capture](https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/debug/SnapshotExt.kt): `app/src/main/kotlin/li/songe/gkd/debug/SnapshotExt.kt`
- [Snapshot quick tile](https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/debug/SnapshotTileService.kt): `app/src/main/kotlin/li/songe/gkd/debug/SnapshotTileService.kt`
- [Inspection HTTP API](https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/debug/HttpService.kt): `app/src/main/kotlin/li/songe/gkd/debug/HttpService.kt`

### Android services

- [Accessibility matcher](https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/service/A11yService.kt): `app/src/main/kotlin/li/songe/gkd/service/A11yService.kt`
- [Accessibility context](https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/service/A11yContext.kt): `app/src/main/kotlin/li/songe/gkd/service/A11yContext.kt`
- [Shizuku service](https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/shizuku/UserService.kt): `app/src/main/kotlin/li/songe/gkd/shizuku/UserService.kt`

### State and persistence

- [Room database](https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/db/DbSet.kt): `app/src/main/kotlin/li/songe/gkd/db/DbSet.kt`
- [App preferences](https://github.com/horizon-sky/gkd/blob/main/app/src/main/kotlin/li/songe/gkd/util/Store.kt): `app/src/main/kotlin/li/songe/gkd/util/Store.kt`

### Other components

- **User**
- **Foreground app**

## Connections

- User → Main activity: opens
- Main activity → Home and settings: shows
- Home and settings → Subscription UI: opens
- Home and settings → App and rule settings: opens
- Subscription UI → Subscription rules: manages
- Subscription rules → Resolved rules: defines rules
- Foreground app → Accessibility matcher: sends events
- Accessibility matcher → Accessibility context: queries context
- Accessibility matcher → Resolved rules: checks rules
- Accessibility matcher → Selector engine: parses and queries
- Accessibility matcher → Action definitions: executes matches
- User → Snapshot quick tile: requests capture
- Snapshot quick tile → Snapshot capture: captures
- Snapshot review → Room database: reads snapshots
- Inspection HTTP API → Snapshot capture: captures snapshot
- Inspection HTTP API → Room database: reads snapshot list
- Inspection HTTP API → Subscription rules: accepts subscription
- Inspection HTTP API → Accessibility matcher: executes selector action
- App and rule settings → App preferences: updates settings
- Accessibility matcher → Shizuku service: uses optional service
