# instructure/canvas-android architecture

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

- Interactive diagram: https://gitdiagram.com/instructure/canvas-android
- Repository: https://github.com/instructure/canvas-android

## Overview

This repository contains Canvas Student, Teacher, and Parent Android apps plus shared libraries. The tree and README establish the product breadth, but sampled code is concentrated in shared API/routing behavior and a few Student and Parent components; unsampled app feature flows are therefore represented as capability nodes without asserted internal call chains.

Main entry points: [`apps/parent`](https://github.com/instructure/canvas-android/tree/master/apps/parent) (Parent app), [`libs/canvas-api-2/src/main/java/com/instructure/canvasapi2`](https://github.com/instructure/canvas-android/tree/master/libs/canvas-api-2/src/main/java/com/instructure/canvasapi2) (Canvas API client), [`libs/canvas-api-2/src/main/java/com/instructure/canvasapi2/models/CanvasContext.kt`](https://github.com/instructure/canvas-android/blob/master/libs/canvas-api-2/src/main/java/com/instructure/canvasapi2/models/CanvasContext.kt) (Course context models), [`apps/student/src/main/java/com/instructure/student/widget/NotificationViewWidgetService.kt`](https://github.com/instructure/canvas-android/blob/master/apps/student/src/main/java/com/instructure/student/widget/NotificationViewWidgetService.kt) (Student widgets)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_apps["Canvas Apps"]
  node_student["Student app"]
  node_teacher["Teacher app"]
  node_parent["Parent app"]
  node_parent_login["Parent login"]
  node_parent_students["Student pairing"]
  node_parent_dashboard["Parent dashboard"]
  node_parent_courses["Courses and grades"]
  node_parent_alerts["Alerts and settings"]
  node_parent_calendar["Calendar and to-dos"]
  node_parent_inbox["Parent inbox"]
  node_student_widgets["Student widgets"]
  node_student_router["Student routing"]
end

subgraph group_shared["Shared Platform"]
  node_routing["Shared navigation<br/>[Route.kt]"]
  node_discussion["Discussion routing"]
  node_enrollment_repo["Enrollment repository"]
  node_reminders["Reminders"]
  node_horizon["Career learning"]
  node_annotations["PDF annotations"]
  node_rich_editor["Rich content editor"]
end

subgraph group_api["Canvas API"]
  node_canvas_api["Canvas API client"]
  node_enrollments["Enrollment manager"]
  node_canvas_models["Course context models<br/>[CanvasContext.kt]"]
  node_api_prefs["API preferences<br/>[ApiPrefs.kt]"]
  node_api_status["Request callbacks<br/>[StatusCallback.kt]"]
end

node_user(("App user"))
node_external_canvas{{"Canvas LMS"}}

node_user -->|"uses"| node_student
node_user -->|"uses"| node_teacher
node_user -->|"uses"| node_parent
node_parent -.->|"supports sign-in"| node_parent_login
node_parent -.->|"supports pairing"| node_parent_students
node_parent -.->|"shows overview"| node_parent_dashboard
node_parent -.->|"shows courses"| node_parent_courses
node_parent -.->|"manages alerts"| node_parent_alerts
node_parent -.->|"manages schedule"| node_parent_calendar
node_parent -.->|"supports messaging"| node_parent_inbox
node_student -->|"routes requests"| node_student_router
node_student_router -->|"uses routes"| node_routing
node_student_widgets -->|"fetches activity"| node_canvas_api
node_student_widgets -->|"renders contexts"| node_canvas_models
node_parent -.->|"uses client"| node_canvas_api
node_teacher -.->|"uses client"| node_canvas_api
node_canvas_api -.->|"requests data"| node_external_canvas
node_enrollments -->|"reports results"| node_api_status
node_enrollments -->|"returns enrollments"| node_canvas_models
node_enrollment_repo -->|"queries enrollments"| node_canvas_api
node_discussion -->|"routes discussion"| node_routing
node_api_prefs -.->|"stores user context"| node_canvas_models

click node_student "https://github.com/instructure/canvas-android/tree/master/apps/student"
click node_teacher "https://github.com/instructure/canvas-android/tree/master/apps/teacher"
click node_parent "https://github.com/instructure/canvas-android/tree/master/apps/parent"
click node_parent_login "https://github.com/instructure/canvas-android/tree/master/apps/parent/src/main/java/com/instructure/parentapp/features/login"
click node_parent_students "https://github.com/instructure/canvas-android/tree/master/apps/parent/src/main/java/com/instructure/parentapp/features/addstudent"
click node_parent_dashboard "https://github.com/instructure/canvas-android/tree/master/apps/parent/src/main/java/com/instructure/parentapp/features/dashboard"
click node_parent_courses "https://github.com/instructure/canvas-android/tree/master/apps/parent/src/main/java/com/instructure/parentapp/features/courses"
click node_parent_alerts "https://github.com/instructure/canvas-android/tree/master/apps/parent/src/main/java/com/instructure/parentapp/features/alerts"
click node_parent_calendar "https://github.com/instructure/canvas-android/tree/master/apps/parent/src/main/java/com/instructure/parentapp/features/calendar"
click node_parent_inbox "https://github.com/instructure/canvas-android/tree/master/apps/parent/src/main/java/com/instructure/parentapp/features/inbox"
click node_student_widgets "https://github.com/instructure/canvas-android/blob/master/apps/student/src/main/java/com/instructure/student/widget/NotificationViewWidgetService.kt"
click node_student_router "https://github.com/instructure/canvas-android/blob/master/apps/student/src/main/java/com/instructure/student/activity/BaseRouterActivity.kt"
click node_canvas_api "https://github.com/instructure/canvas-android/tree/master/libs/canvas-api-2/src/main/java/com/instructure/canvasapi2"
click node_enrollments "https://github.com/instructure/canvas-android/blob/master/libs/canvas-api-2/src/main/java/com/instructure/canvasapi2/managers/EnrollmentManager.kt"
click node_canvas_models "https://github.com/instructure/canvas-android/blob/master/libs/canvas-api-2/src/main/java/com/instructure/canvasapi2/models/CanvasContext.kt"
click node_api_prefs "https://github.com/instructure/canvas-android/blob/master/libs/canvas-api-2/src/main/java/com/instructure/canvasapi2/utils/ApiPrefs.kt"
click node_api_status "https://github.com/instructure/canvas-android/blob/master/libs/canvas-api-2/src/main/java/com/instructure/canvasapi2/StatusCallback.kt"
click node_routing "https://github.com/instructure/canvas-android/blob/master/libs/interactions/src/main/java/com/instructure/interactions/router/Route.kt"
click node_discussion "https://github.com/instructure/canvas-android/blob/master/libs/pandautils/src/main/java/com/instructure/pandautils/features/discussion/router/DiscussionRouterFragment.kt"
click node_enrollment_repo "https://github.com/instructure/canvas-android/blob/master/libs/pandautils/src/main/java/com/instructure/pandautils/data/repository/enrollment/EnrollmentRepositoryImpl.kt"
click node_reminders "https://github.com/instructure/canvas-android/tree/master/libs/pandautils/src/main/java/com/instructure/pandautils/features/reminder"
click node_horizon "https://github.com/instructure/canvas-android/tree/master/libs/horizon"
click node_annotations "https://github.com/instructure/canvas-android/tree/master/libs/annotations"
click node_rich_editor "https://github.com/instructure/canvas-android/tree/master/libs/rceditor"

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_student,node_teacher,node_parent,node_parent_login,node_parent_students,node_parent_dashboard,node_parent_courses,node_parent_alerts,node_parent_calendar,node_parent_inbox,node_student_widgets,node_student_router,node_user toneBlue
class node_routing,node_discussion,node_enrollment_repo,node_reminders,node_horizon,node_annotations,node_rich_editor toneAmber
class node_canvas_api,node_enrollments,node_canvas_models,node_api_prefs,node_api_status toneMint
class node_external_canvas toneIndigo
```

## Components

### Canvas Apps

- [Student app](https://github.com/instructure/canvas-android/tree/master/apps/student): `apps/student`
- [Teacher app](https://github.com/instructure/canvas-android/tree/master/apps/teacher): `apps/teacher`
- [Parent app](https://github.com/instructure/canvas-android/tree/master/apps/parent): `apps/parent`
- [Parent login](https://github.com/instructure/canvas-android/tree/master/apps/parent/src/main/java/com/instructure/parentapp/features/login): `apps/parent/src/main/java/com/instructure/parentapp/features/login`
- [Student pairing](https://github.com/instructure/canvas-android/tree/master/apps/parent/src/main/java/com/instructure/parentapp/features/addstudent): `apps/parent/src/main/java/com/instructure/parentapp/features/addstudent`
- [Parent dashboard](https://github.com/instructure/canvas-android/tree/master/apps/parent/src/main/java/com/instructure/parentapp/features/dashboard): `apps/parent/src/main/java/com/instructure/parentapp/features/dashboard`
- [Courses and grades](https://github.com/instructure/canvas-android/tree/master/apps/parent/src/main/java/com/instructure/parentapp/features/courses): `apps/parent/src/main/java/com/instructure/parentapp/features/courses`
- [Alerts and settings](https://github.com/instructure/canvas-android/tree/master/apps/parent/src/main/java/com/instructure/parentapp/features/alerts): `apps/parent/src/main/java/com/instructure/parentapp/features/alerts`
- [Calendar and to-dos](https://github.com/instructure/canvas-android/tree/master/apps/parent/src/main/java/com/instructure/parentapp/features/calendar): `apps/parent/src/main/java/com/instructure/parentapp/features/calendar`
- [Parent inbox](https://github.com/instructure/canvas-android/tree/master/apps/parent/src/main/java/com/instructure/parentapp/features/inbox): `apps/parent/src/main/java/com/instructure/parentapp/features/inbox`
- [Student widgets](https://github.com/instructure/canvas-android/blob/master/apps/student/src/main/java/com/instructure/student/widget/NotificationViewWidgetService.kt): `apps/student/src/main/java/com/instructure/student/widget/NotificationViewWidgetService.kt`
- [Student routing](https://github.com/instructure/canvas-android/blob/master/apps/student/src/main/java/com/instructure/student/activity/BaseRouterActivity.kt): `apps/student/src/main/java/com/instructure/student/activity/BaseRouterActivity.kt`

### Shared Platform

- [Shared navigation](https://github.com/instructure/canvas-android/blob/master/libs/interactions/src/main/java/com/instructure/interactions/router/Route.kt): `libs/interactions/src/main/java/com/instructure/interactions/router/Route.kt`
- [Discussion routing](https://github.com/instructure/canvas-android/blob/master/libs/pandautils/src/main/java/com/instructure/pandautils/features/discussion/router/DiscussionRouterFragment.kt): `libs/pandautils/src/main/java/com/instructure/pandautils/features/discussion/router/DiscussionRouterFragment.kt`
- [Enrollment repository](https://github.com/instructure/canvas-android/blob/master/libs/pandautils/src/main/java/com/instructure/pandautils/data/repository/enrollment/EnrollmentRepositoryImpl.kt): `libs/pandautils/src/main/java/com/instructure/pandautils/data/repository/enrollment/EnrollmentRepositoryImpl.kt`
- [Reminders](https://github.com/instructure/canvas-android/tree/master/libs/pandautils/src/main/java/com/instructure/pandautils/features/reminder): `libs/pandautils/src/main/java/com/instructure/pandautils/features/reminder`
- [Career learning](https://github.com/instructure/canvas-android/tree/master/libs/horizon): `libs/horizon`
- [PDF annotations](https://github.com/instructure/canvas-android/tree/master/libs/annotations): `libs/annotations`
- [Rich content editor](https://github.com/instructure/canvas-android/tree/master/libs/rceditor): `libs/rceditor`

### Canvas API

- [Canvas API client](https://github.com/instructure/canvas-android/tree/master/libs/canvas-api-2/src/main/java/com/instructure/canvasapi2): `libs/canvas-api-2/src/main/java/com/instructure/canvasapi2`
- [Enrollment manager](https://github.com/instructure/canvas-android/blob/master/libs/canvas-api-2/src/main/java/com/instructure/canvasapi2/managers/EnrollmentManager.kt): `libs/canvas-api-2/src/main/java/com/instructure/canvasapi2/managers/EnrollmentManager.kt`
- [Course context models](https://github.com/instructure/canvas-android/blob/master/libs/canvas-api-2/src/main/java/com/instructure/canvasapi2/models/CanvasContext.kt): `libs/canvas-api-2/src/main/java/com/instructure/canvasapi2/models/CanvasContext.kt`
- [API preferences](https://github.com/instructure/canvas-android/blob/master/libs/canvas-api-2/src/main/java/com/instructure/canvasapi2/utils/ApiPrefs.kt): `libs/canvas-api-2/src/main/java/com/instructure/canvasapi2/utils/ApiPrefs.kt`
- [Request callbacks](https://github.com/instructure/canvas-android/blob/master/libs/canvas-api-2/src/main/java/com/instructure/canvasapi2/StatusCallback.kt): `libs/canvas-api-2/src/main/java/com/instructure/canvasapi2/StatusCallback.kt`

### Other components

- **App user**
- **Canvas LMS**

## Connections

- App user → Student app: uses (evidence: `README.md`)
- App user → Teacher app: uses (evidence: `README.md`)
- App user → Parent app: uses (evidence: `README.md`)
- Parent app → Parent login: supports sign-in
- Parent app → Student pairing: supports pairing
- Parent app → Parent dashboard: shows overview
- Parent app → Courses and grades: shows courses
- Parent app → Alerts and settings: manages alerts
- Parent app → Calendar and to-dos: manages schedule
- Parent app → Parent inbox: supports messaging
- Student app → Student routing: routes requests (evidence: `apps/student/src/main/java/com/instructure/student/activity/BaseRouterActivity.kt`)
- Student routing → Shared navigation: uses routes (evidence: `apps/student/src/main/java/com/instructure/student/activity/BaseRouterActivity.kt`)
- Student widgets → Canvas API client: fetches activity (evidence: `apps/student/src/main/java/com/instructure/student/widget/NotificationViewWidgetService.kt`)
- Student widgets → Course context models: renders contexts (evidence: `apps/student/src/main/java/com/instructure/student/widget/NotificationViewWidgetService.kt`)
- Parent app → Canvas API client: uses client (evidence: `apps/parent/src/main/java/com/instructure/parentapp/util/BaseAppManager.kt`)
- Teacher app → Canvas API client: uses client (evidence: `apps/teacher/src/main/java/com/instructure/teacher/features/syllabus/ui/SyllabusRepositoryFragment.kt`)
- Canvas API client → Canvas LMS: requests data
- Enrollment manager → Request callbacks: reports results (evidence: `libs/canvas-api-2/src/main/java/com/instructure/canvasapi2/managers/EnrollmentManager.kt`)
- Enrollment manager → Course context models: returns enrollments (evidence: `libs/canvas-api-2/src/main/java/com/instructure/canvasapi2/managers/EnrollmentManager.kt`)
- Enrollment repository → Canvas API client: queries enrollments (evidence: `libs/pandautils/src/main/java/com/instructure/pandautils/data/repository/enrollment/EnrollmentRepositoryImpl.kt`)
- Discussion routing → Shared navigation: routes discussion (evidence: `libs/pandautils/src/main/java/com/instructure/pandautils/features/discussion/router/DiscussionRouterFragment.kt`)
- API preferences → Course context models: stores user context (evidence: `libs/canvas-api-2/src/main/java/com/instructure/canvasapi2/models/CanvasContext.kt`)
