# navy-cod/univote-mobile-voting-app architecture

> Architecture diagram of the GitHub repository navy-cod/univote-mobile-voting-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/navy-cod/univote-mobile-voting-app
- Repository: https://github.com/navy-cod/univote-mobile-voting-app

## Overview

UniVote is a local-first Android voting app: users sign in or register, then role-based screens lead voters through election selection, ballot submission and receipt, while staff configure elections and publish reconciled results. Its other major product branches cover turnout statistics, tamper-evident audit records, notifications, and support reports. The documented architecture places Compose screens and ViewModels above repositories, Room storage, and pure-Kotlin domain rules. Several subsystems are represented by their exact enclosing directories because their implementation was not sampled; edges are limited to relationships shown in the README or excerpts.

Main entry points: [`app/src/main/java/com/univote/evoting/data/repository/ResultsRepository.kt`](https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/data/repository/ResultsRepository.kt) (Counting and results), [`app/src/main/java/com/univote/evoting/data/local/UniVoteDatabase.kt`](https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/data/local/UniVoteDatabase.kt) (Room database), [`app/src/main/java/com/univote/evoting/data/repository/ElectionRepository.kt`](https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/data/repository/ElectionRepository.kt) (Election setup), [`app/src/main/java/com/univote/evoting/ui/admin`](https://github.com/navy-cod/univote-mobile-voting-app/tree/main/app/src/main/java/com/univote/evoting/ui/admin) (Election administration)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_presentation["App and screens"]
  node_app["Android app<br/>[MainActivity.kt]"]
  node_navigation["Role navigation"]
  node_auth["Sign-in and registration"]
  node_admin["Election administration"]
  node_ballot["Ballot experience"]
end

subgraph group_election["Election workflow"]
  node_election_repo["Election setup"]
  node_vote_repo["Vote casting"]
  node_result_repo["Counting and results"]
  node_election_rules["Election lifecycle"]
  node_result_rules["Results calculation"]
end

subgraph group_oversight["Oversight services"]
  node_stats["Turnout statistics"]
  node_audit_ui["Audit review<br/>[AuditLogScreen.kt]"]
  node_audit_repo["Audit records<br/>[AuditRepository.kt]"]
  node_audit_logger["Hash-chain logger<br/>[AuditLogger.kt]"]
  node_support["Support reports"]
  node_notifications["Notifications"]
end

subgraph group_data["Data and domain"]
  node_auth_repo["Local authentication"]
  node_session["User session<br/>[SessionManager.kt]"]
  node_database[("Room database<br/>[UniVoteDatabase.kt]")]
  node_seed["Demo data seeding<br/>[DatabaseSeeder.kt]"]
  node_domain["Domain rules"]
end

node_user(("User"))

node_user -->|"opens"| node_app
node_app -.->|"starts navigation"| node_navigation
node_user -->|"signs in"| node_auth
node_auth -->|"authenticates"| node_auth_repo
node_auth_repo -->|"reads and writes"| node_database
node_auth_repo -.->|"establishes session"| node_session
node_navigation -->|"routes staff"| node_admin
node_navigation -->|"routes voters"| node_ballot
node_admin -->|"manages elections"| node_election_repo
node_election_repo -->|"checks lifecycle"| node_election_rules
node_election_repo -->|"stores setup"| node_database
node_ballot -->|"submits ballot"| node_vote_repo
node_vote_repo -->|"records vote"| node_database
node_admin -->|"approves results"| node_result_repo
node_result_repo -->|"calculates tally"| node_result_rules
node_result_repo -->|"stores snapshot"| node_database
node_admin -->|"views turnout"| node_stats
node_audit_ui -->|"loads records"| node_audit_repo
node_audit_repo -.->|"reads audit log"| node_database
node_election_repo -->|"logs changes"| node_audit_logger
node_vote_repo -->|"logs vote event"| node_audit_logger
node_result_repo -->|"logs publication"| node_audit_logger
node_audit_logger -->|"appends hash chain"| node_database
node_user -->|"files report"| node_support
node_result_repo -->|"announces publication"| node_notifications
node_app -->|"initializes data"| node_seed
node_seed -->|"populates"| node_database
node_election_repo -->|"applies domain rules"| node_domain
node_result_repo -->|"uses domain rules"| node_domain

click node_app "https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/MainActivity.kt"
click node_navigation "https://github.com/navy-cod/univote-mobile-voting-app/tree/main/app/src/main/java/com/univote/evoting/ui/navigation"
click node_auth "https://github.com/navy-cod/univote-mobile-voting-app/tree/main/app/src/main/java/com/univote/evoting/ui/auth"
click node_admin "https://github.com/navy-cod/univote-mobile-voting-app/tree/main/app/src/main/java/com/univote/evoting/ui/admin"
click node_ballot "https://github.com/navy-cod/univote-mobile-voting-app/tree/main/app/src/main/java/com/univote/evoting/ui/voter"
click node_election_repo "https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/data/repository/ElectionRepository.kt"
click node_vote_repo "https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/data/repository/VotingRepository.kt"
click node_result_repo "https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/data/repository/ResultsRepository.kt"
click node_election_rules "https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/domain/ElectionStateMachine.kt"
click node_result_rules "https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/domain/ResultsCalculator.kt"
click node_stats "https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/data/repository/StatisticsRepository.kt"
click node_audit_ui "https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/ui/audit/AuditLogScreen.kt"
click node_audit_repo "https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/data/repository/AuditRepository.kt"
click node_audit_logger "https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/data/audit/AuditLogger.kt"
click node_support "https://github.com/navy-cod/univote-mobile-voting-app/tree/main/app/src/main/java/com/univote/evoting/ui/support"
click node_notifications "https://github.com/navy-cod/univote-mobile-voting-app/tree/main/app/src/main/java/com/univote/evoting/core/notify"
click node_auth_repo "https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/data/repository/LocalAuthRepository.kt"
click node_session "https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/core/session/SessionManager.kt"
click node_database "https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/data/local/UniVoteDatabase.kt"
click node_seed "https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/data/local/DatabaseSeeder.kt"
click node_domain "https://github.com/navy-cod/univote-mobile-voting-app/tree/main/app/src/main/java/com/univote/evoting/domain"

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_navigation,node_auth,node_admin,node_ballot,node_user toneBlue
class node_election_repo,node_vote_repo,node_result_repo,node_election_rules,node_result_rules toneAmber
class node_stats,node_audit_ui,node_audit_repo,node_audit_logger,node_support,node_notifications toneMint
class node_auth_repo,node_session,node_database,node_seed,node_domain toneRose
```

## Components

### App and screens

- [Android app](https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/MainActivity.kt): `app/src/main/java/com/univote/evoting/MainActivity.kt`
- [Role navigation](https://github.com/navy-cod/univote-mobile-voting-app/tree/main/app/src/main/java/com/univote/evoting/ui/navigation): `app/src/main/java/com/univote/evoting/ui/navigation`
- [Sign-in and registration](https://github.com/navy-cod/univote-mobile-voting-app/tree/main/app/src/main/java/com/univote/evoting/ui/auth): `app/src/main/java/com/univote/evoting/ui/auth`
- [Election administration](https://github.com/navy-cod/univote-mobile-voting-app/tree/main/app/src/main/java/com/univote/evoting/ui/admin): `app/src/main/java/com/univote/evoting/ui/admin`
- [Ballot experience](https://github.com/navy-cod/univote-mobile-voting-app/tree/main/app/src/main/java/com/univote/evoting/ui/voter): `app/src/main/java/com/univote/evoting/ui/voter`

### Election workflow

- [Election setup](https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/data/repository/ElectionRepository.kt): `app/src/main/java/com/univote/evoting/data/repository/ElectionRepository.kt`
- [Vote casting](https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/data/repository/VotingRepository.kt): `app/src/main/java/com/univote/evoting/data/repository/VotingRepository.kt`
- [Counting and results](https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/data/repository/ResultsRepository.kt): `app/src/main/java/com/univote/evoting/data/repository/ResultsRepository.kt`
- [Election lifecycle](https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/domain/ElectionStateMachine.kt): `app/src/main/java/com/univote/evoting/domain/ElectionStateMachine.kt`
- [Results calculation](https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/domain/ResultsCalculator.kt): `app/src/main/java/com/univote/evoting/domain/ResultsCalculator.kt`

### Oversight services

- [Turnout statistics](https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/data/repository/StatisticsRepository.kt): `app/src/main/java/com/univote/evoting/data/repository/StatisticsRepository.kt`
- [Audit review](https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/ui/audit/AuditLogScreen.kt): `app/src/main/java/com/univote/evoting/ui/audit/AuditLogScreen.kt`
- [Audit records](https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/data/repository/AuditRepository.kt): `app/src/main/java/com/univote/evoting/data/repository/AuditRepository.kt`
- [Hash-chain logger](https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/data/audit/AuditLogger.kt): `app/src/main/java/com/univote/evoting/data/audit/AuditLogger.kt`
- [Support reports](https://github.com/navy-cod/univote-mobile-voting-app/tree/main/app/src/main/java/com/univote/evoting/ui/support): `app/src/main/java/com/univote/evoting/ui/support`
- [Notifications](https://github.com/navy-cod/univote-mobile-voting-app/tree/main/app/src/main/java/com/univote/evoting/core/notify): `app/src/main/java/com/univote/evoting/core/notify`

### Data and domain

- [Local authentication](https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/data/repository/LocalAuthRepository.kt): `app/src/main/java/com/univote/evoting/data/repository/LocalAuthRepository.kt`
- [User session](https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/core/session/SessionManager.kt): `app/src/main/java/com/univote/evoting/core/session/SessionManager.kt`
- [Room database](https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/data/local/UniVoteDatabase.kt): `app/src/main/java/com/univote/evoting/data/local/UniVoteDatabase.kt`
- [Demo data seeding](https://github.com/navy-cod/univote-mobile-voting-app/blob/main/app/src/main/java/com/univote/evoting/data/local/DatabaseSeeder.kt): `app/src/main/java/com/univote/evoting/data/local/DatabaseSeeder.kt`
- [Domain rules](https://github.com/navy-cod/univote-mobile-voting-app/tree/main/app/src/main/java/com/univote/evoting/domain): `app/src/main/java/com/univote/evoting/domain`

### Other components

- **User**

## Connections

- User → Android app: opens
- Android app → Role navigation: starts navigation (evidence: `app/src/main/java/com/univote/evoting/MainActivity.kt`)
- User → Sign-in and registration: signs in
- Sign-in and registration → Local authentication: authenticates
- Local authentication → Room database: reads and writes (evidence: `app/src/main/java/com/univote/evoting/data/repository/LocalAuthRepository.kt`)
- Local authentication → User session: establishes session
- Role navigation → Election administration: routes staff (evidence: `app/src/main/java/com/univote/evoting/ui/navigation/AppNavHost.kt`)
- Role navigation → Ballot experience: routes voters (evidence: `app/src/main/java/com/univote/evoting/ui/navigation/AppNavHost.kt`)
- Election administration → Election setup: manages elections (evidence: `app/src/main/java/com/univote/evoting/ui/admin/ElectionDetailScreen.kt`)
- Election setup → Election lifecycle: checks lifecycle (evidence: `app/src/main/java/com/univote/evoting/data/repository/ElectionRepository.kt`)
- Election setup → Room database: stores setup (evidence: `app/src/main/java/com/univote/evoting/data/repository/ElectionRepository.kt`)
- Ballot experience → Vote casting: submits ballot
- Vote casting → Room database: records vote (evidence: `app/src/main/java/com/univote/evoting/data/repository/VotingRepository.kt`)
- Election administration → Counting and results: approves results
- Counting and results → Results calculation: calculates tally (evidence: `app/src/main/java/com/univote/evoting/data/repository/ResultsRepository.kt`)
- Counting and results → Room database: stores snapshot (evidence: `app/src/main/java/com/univote/evoting/data/repository/ResultsRepository.kt`)
- Election administration → Turnout statistics: views turnout
- Audit review → Audit records: loads records (evidence: `app/src/main/java/com/univote/evoting/ui/audit/AuditLogScreen.kt`)
- Audit records → Room database: reads audit log (evidence: `app/src/main/java/com/univote/evoting/data/repository/AuditRepository.kt`)
- Election setup → Hash-chain logger: logs changes (evidence: `app/src/main/java/com/univote/evoting/data/repository/ElectionRepository.kt`)
- Vote casting → Hash-chain logger: logs vote event (evidence: `app/src/main/java/com/univote/evoting/data/repository/VotingRepository.kt`)
- Counting and results → Hash-chain logger: logs publication (evidence: `app/src/main/java/com/univote/evoting/data/repository/ResultsRepository.kt`)
- Hash-chain logger → Room database: appends hash chain (evidence: `app/src/main/java/com/univote/evoting/data/audit/AuditLogger.kt`)
- User → Support reports: files report
- Counting and results → Notifications: announces publication (evidence: `app/src/main/java/com/univote/evoting/data/repository/ResultsRepository.kt`)
- Android app → Demo data seeding: initializes data
- Demo data seeding → Room database: populates (evidence: `app/src/main/java/com/univote/evoting/data/local/DatabaseSeeder.kt`)
- Election setup → Domain rules: applies domain rules (evidence: `app/src/main/java/com/univote/evoting/data/repository/ElectionRepository.kt`)
- Counting and results → Domain rules: uses domain rules (evidence: `app/src/main/java/com/univote/evoting/data/repository/ResultsRepository.kt`)
