# chadyi/studyontv architecture

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

## Overview

StudyOnTV is an Android-based learning-first screen-time control system for phones, tablets, and TVs. A child completes questions on the controlled device; the learning engine evaluates progress and time rules, then the gate controls access and playback. A parent connects over the local network to manage schedules, question banks, grading, and records. The README documents these product flows; source-index references and excerpts support the internal links shown. Several UI and integration details are documented but their implementations were not sampled.

Main entry points: [`app/native/app/src/main/java/com/studyontv/tv/LearningEngine.kt`](https://github.com/chadyi/studyontv/blob/main/app/native/app/src/main/java/com/studyontv/tv/LearningEngine.kt) (Learning engine), [`parent-ui/src/main.tsx`](https://github.com/chadyi/studyontv/blob/main/parent-ui/src/main.tsx) (Parent console), [`app/native/app/src/main/java/com/studyontv/tv/GateService.kt`](https://github.com/chadyi/studyontv/blob/main/app/native/app/src/main/java/com/studyontv/tv/GateService.kt) (Access gate), [`app/native/app/src/main/java/com/studyontv/tv/DeviceRuntime.kt`](https://github.com/chadyi/studyontv/blob/main/app/native/app/src/main/java/com/studyontv/tv/DeviceRuntime.kt) (Device runtime)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_learning["Learning and rewards"]
  node_learning_ui["Learning screen<br/>[GateOverlay.kt]"]
  node_engine["Learning engine<br/>[LearningEngine.kt]"]
  node_question_bank["Question bank<br/>[QuestionBank.tsx]"]
  node_grading["Answer grading<br/>[GradingService.kt]"]
  node_records[("Study records<br/>[LocalStore.kt]")]
end

subgraph group_control["Device control"]
  node_gate["Access gate<br/>[GateService.kt]"]
  node_time_rules["Time rules<br/>[TimePolicy.kt]"]
  node_foreground["Foreground monitor<br/>[Foreground.kt]"]
  node_media["Playback control<br/>[MediaPause.kt]"]
  node_accessibility["Settings protection"]
end

subgraph group_parent["Parent management"]
  node_parent_app["Parent console<br/>[main.tsx]"]
  node_api["Console API<br/>[api.ts]"]
  node_rules_ui["Rules and schedules<br/>[RulesPage.tsx]"]
  node_review_ui["Review console<br/>[GradingPage.tsx]"]
end

subgraph group_platform["Local platform"]
  node_device["Device runtime<br/>[DeviceRuntime.kt]"]
  node_lan["LAN server<br/>[LanServer.kt]"]
end

node_child(("Child"))
node_parent(("Parent"))
node_ai_service["Configured AI service"]

node_child -->|"answers on"| node_learning_ui
node_learning_ui -.->|"submits answers"| node_engine
node_engine -->|"reads and writes"| node_records
node_engine -->|"uses policy"| node_time_rules
node_engine -.->|"queues reviews"| node_grading
node_grading -->|"reads and writes"| node_records
node_grading -->|"sends submissions"| node_ai_service
node_gate -->|"checks status"| node_engine
node_gate -->|"shows gate"| node_learning_ui
node_gate -->|"pauses playback"| node_media
node_gate -->|"checks foreground"| node_foreground
node_accessibility -->|"ensures service"| node_gate
node_parent -->|"manages device"| node_parent_app
node_parent_app -->|"uses API"| node_api
node_parent_app -->|"opens bank"| node_question_bank
node_parent_app -->|"opens rules"| node_rules_ui
node_parent_app -->|"opens grading"| node_review_ui
node_api -->|"calls over LAN"| node_lan
node_device -->|"starts server"| node_lan
node_device -->|"initializes store"| node_records
node_device -->|"initializes engine"| node_engine

click node_learning_ui "https://github.com/chadyi/studyontv/blob/main/app/native/app/src/main/java/com/studyontv/tv/GateOverlay.kt"
click node_engine "https://github.com/chadyi/studyontv/blob/main/app/native/app/src/main/java/com/studyontv/tv/LearningEngine.kt"
click node_question_bank "https://github.com/chadyi/studyontv/blob/main/parent-ui/src/QuestionBank.tsx"
click node_grading "https://github.com/chadyi/studyontv/blob/main/app/native/app/src/main/java/com/studyontv/tv/GradingService.kt"
click node_records "https://github.com/chadyi/studyontv/blob/main/app/native/app/src/main/java/com/studyontv/tv/LocalStore.kt"
click node_gate "https://github.com/chadyi/studyontv/blob/main/app/native/app/src/main/java/com/studyontv/tv/GateService.kt"
click node_time_rules "https://github.com/chadyi/studyontv/blob/main/app/native/app/src/main/java/com/studyontv/tv/TimePolicy.kt"
click node_foreground "https://github.com/chadyi/studyontv/blob/main/app/native/app/src/main/java/com/studyontv/tv/Foreground.kt"
click node_media "https://github.com/chadyi/studyontv/blob/main/app/native/app/src/main/java/com/studyontv/tv/MediaPause.kt"
click node_accessibility "https://github.com/chadyi/studyontv/blob/main/app/native/app/src/main/java/com/studyontv/tv/WatchAccessibilityService.kt"
click node_parent_app "https://github.com/chadyi/studyontv/blob/main/parent-ui/src/main.tsx"
click node_api "https://github.com/chadyi/studyontv/blob/main/parent-ui/src/api.ts"
click node_rules_ui "https://github.com/chadyi/studyontv/blob/main/parent-ui/src/RulesPage.tsx"
click node_review_ui "https://github.com/chadyi/studyontv/blob/main/parent-ui/src/GradingPage.tsx"
click node_device "https://github.com/chadyi/studyontv/blob/main/app/native/app/src/main/java/com/studyontv/tv/DeviceRuntime.kt"
click node_lan "https://github.com/chadyi/studyontv/blob/main/app/native/app/src/main/java/com/studyontv/tv/LanServer.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_learning_ui,node_engine,node_question_bank,node_grading,node_records toneBlue
class node_gate,node_time_rules,node_foreground,node_media,node_accessibility toneAmber
class node_parent_app,node_api,node_rules_ui,node_review_ui toneMint
class node_device,node_lan toneRose
class node_child,node_parent,node_ai_service toneIndigo
```

## Components

### Learning and rewards

- [Learning screen](https://github.com/chadyi/studyontv/blob/main/app/native/app/src/main/java/com/studyontv/tv/GateOverlay.kt): `app/native/app/src/main/java/com/studyontv/tv/GateOverlay.kt`
- [Learning engine](https://github.com/chadyi/studyontv/blob/main/app/native/app/src/main/java/com/studyontv/tv/LearningEngine.kt): `app/native/app/src/main/java/com/studyontv/tv/LearningEngine.kt`
- [Question bank](https://github.com/chadyi/studyontv/blob/main/parent-ui/src/QuestionBank.tsx): `parent-ui/src/QuestionBank.tsx`
- [Answer grading](https://github.com/chadyi/studyontv/blob/main/app/native/app/src/main/java/com/studyontv/tv/GradingService.kt): `app/native/app/src/main/java/com/studyontv/tv/GradingService.kt`
- [Study records](https://github.com/chadyi/studyontv/blob/main/app/native/app/src/main/java/com/studyontv/tv/LocalStore.kt): `app/native/app/src/main/java/com/studyontv/tv/LocalStore.kt`

### Device control

- [Access gate](https://github.com/chadyi/studyontv/blob/main/app/native/app/src/main/java/com/studyontv/tv/GateService.kt): `app/native/app/src/main/java/com/studyontv/tv/GateService.kt`
- [Time rules](https://github.com/chadyi/studyontv/blob/main/app/native/app/src/main/java/com/studyontv/tv/TimePolicy.kt): `app/native/app/src/main/java/com/studyontv/tv/TimePolicy.kt`
- [Foreground monitor](https://github.com/chadyi/studyontv/blob/main/app/native/app/src/main/java/com/studyontv/tv/Foreground.kt): `app/native/app/src/main/java/com/studyontv/tv/Foreground.kt`
- [Playback control](https://github.com/chadyi/studyontv/blob/main/app/native/app/src/main/java/com/studyontv/tv/MediaPause.kt): `app/native/app/src/main/java/com/studyontv/tv/MediaPause.kt`
- [Settings protection](https://github.com/chadyi/studyontv/blob/main/app/native/app/src/main/java/com/studyontv/tv/WatchAccessibilityService.kt): `app/native/app/src/main/java/com/studyontv/tv/WatchAccessibilityService.kt`

### Parent management

- [Parent console](https://github.com/chadyi/studyontv/blob/main/parent-ui/src/main.tsx): `parent-ui/src/main.tsx`
- [Console API](https://github.com/chadyi/studyontv/blob/main/parent-ui/src/api.ts): `parent-ui/src/api.ts`
- [Rules and schedules](https://github.com/chadyi/studyontv/blob/main/parent-ui/src/RulesPage.tsx): `parent-ui/src/RulesPage.tsx`
- [Review console](https://github.com/chadyi/studyontv/blob/main/parent-ui/src/GradingPage.tsx): `parent-ui/src/GradingPage.tsx`

### Local platform

- [Device runtime](https://github.com/chadyi/studyontv/blob/main/app/native/app/src/main/java/com/studyontv/tv/DeviceRuntime.kt): `app/native/app/src/main/java/com/studyontv/tv/DeviceRuntime.kt`
- [LAN server](https://github.com/chadyi/studyontv/blob/main/app/native/app/src/main/java/com/studyontv/tv/LanServer.kt): `app/native/app/src/main/java/com/studyontv/tv/LanServer.kt`

### Other components

- **Child**
- **Parent**
- **Configured AI service**

## Connections

- Child → Learning screen: answers on (evidence: `README.md`)
- Learning screen → Learning engine: submits answers
- Learning engine → Study records: reads and writes (evidence: `app/native/app/src/main/java/com/studyontv/tv/LearningEngine.kt`)
- Learning engine → Time rules: uses policy (evidence: `app/native/app/src/main/java/com/studyontv/tv/LearningEngine.kt`)
- Learning engine → Answer grading: queues reviews (evidence: `app/native/app/src/main/java/com/studyontv/tv/GradingService.kt`)
- Answer grading → Study records: reads and writes (evidence: `app/native/app/src/main/java/com/studyontv/tv/GradingService.kt`)
- Answer grading → Configured AI service: sends submissions (evidence: `README.md`)
- Access gate → Learning engine: checks status (evidence: `app/native/app/src/main/java/com/studyontv/tv/GateService.kt`)
- Access gate → Learning screen: shows gate (evidence: `app/native/app/src/main/java/com/studyontv/tv/GateService.kt`)
- Access gate → Playback control: pauses playback (evidence: `app/native/app/src/main/java/com/studyontv/tv/GateService.kt`)
- Access gate → Foreground monitor: checks foreground (evidence: `app/native/app/src/main/java/com/studyontv/tv/GateService.kt`)
- Settings protection → Access gate: ensures service (evidence: `app/native/app/src/main/java/com/studyontv/tv/WatchAccessibilityService.kt`)
- Parent → Parent console: manages device (evidence: `README.md`)
- Parent console → Console API: uses API (evidence: `parent-ui/src/main.tsx`)
- Parent console → Question bank: opens bank (evidence: `parent-ui/src/main.tsx`)
- Parent console → Rules and schedules: opens rules (evidence: `parent-ui/src/main.tsx`)
- Parent console → Review console: opens grading (evidence: `parent-ui/src/main.tsx`)
- Console API → LAN server: calls over LAN (evidence: `README.md`)
- Device runtime → LAN server: starts server (evidence: `app/native/app/src/main/java/com/studyontv/tv/DeviceRuntime.kt`)
- Device runtime → Study records: initializes store (evidence: `app/native/app/src/main/java/com/studyontv/tv/DeviceRuntime.kt`)
- Device runtime → Learning engine: initializes engine (evidence: `app/native/app/src/main/java/com/studyontv/tv/DeviceRuntime.kt`)
