# rain946/timan- architecture

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

- Interactive diagram: https://gitdiagram.com/rain946/timan-
- Repository: https://github.com/rain946/timan-

## Overview

TIMAN is a pet identification and care app for owners and veterinary clinics, backed by an Express API and MySQL. The owner workflow covers pet profiles and QR identification, lost-pet reporting, and health records/reminders; clinic workflows include authorization, veterinary records, schedules, and reports. The server mounts these API route modules and starts a reminder scheduler. Most UI-to-endpoint calls are not shown in the supplied excerpts, so those links are omitted; component groupings reflect the file tree, not inspected navigation behavior.

Main entry points: [`backend/server.js`](https://github.com/rain946/timan-/blob/main/backend/server.js) (HTTP server), [`backend/config/db.js`](https://github.com/rain946/timan-/blob/main/backend/config/db.js) (MySQL pool), [`config/api.ts`](https://github.com/rain946/timan-/blob/main/config/api.ts) (API URL config), [`backend/middleware/authMiddleware.js`](https://github.com/rain946/timan-/blob/main/backend/middleware/authMiddleware.js) (JWT authentication)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_mobile["Mobile app"]
  node_login["Sign in / register<br/>[login.tsx]"]
  node_owner_app["Owner dashboard<br/>[dashboard.tsx]"]
  node_clinic_app["Clinic dashboard"]
  node_api_config["API URL config<br/>[api.ts]"]
end

subgraph group_pet["Pet identity"]
  node_pet_profile["Pet profiles<br/>[pet-profile.tsx]"]
  node_lost_pet["Lost pet report<br/>[lost-pet.tsx]"]
  node_qr_scanner["QR scanning<br/>[qr-scanner.tsx]"]
  node_public_pet["Public pet page<br/>[public-pet.tsx]"]
end

subgraph group_clinic["Clinic care"]
  node_clinic_auth["Clinic authorization"]
  node_vet_records["Veterinary records<br/>[vet-records.tsx]"]
  node_schedules["Care schedules<br/>[schedules.tsx]"]
  node_reports["Clinic reports<br/>[clinic-reports.tsx]"]
end

subgraph group_backend["API backend"]
  node_server["HTTP server<br/>[server.js]"]
  node_auth_routes["Authentication routes<br/>[authRoutes.js]"]
  node_pet_routes["Pet routes<br/>[petRoutes.js]"]
  node_public_routes["Public pet routes<br/>[publicRoutes.js]"]
  node_lost_routes["Lost pet routes<br/>[lostPetRoutes.js]"]
  node_authorization_routes["Authorization routes"]
  node_vet_routes["Veterinary routes<br/>[vetRecordRoutes.js]"]
  node_dashboard_routes["Clinic dashboard routes"]
  node_report_routes["Clinic report routes"]
  node_profile_routes["Profile routes<br/>[profileRoutes.js]"]
  node_notification_routes["Notification routes"]
  node_push_routes["Push-token routes<br/>[pushTokenRoutes.js]"]
  node_db[("MySQL pool<br/>[db.js]")]
  node_auth_middleware["JWT authentication<br/>[authMiddleware.js]"]
end

subgraph group_messaging["Notifications"]
  node_notifications_ui["Notifications<br/>[notifications.tsx]"]
  node_reminder_scheduler["Reminder scheduler"]
  node_push_service["Push delivery<br/>[pushService.js]"]
end

node_owner(("Pet owner"))
node_clinic_user(("Clinic user"))
node_expo_push["Expo push service"]
node_device_notifications["Device notifications"]

node_owner -.->|"signs in"| node_login
node_owner -.->|"uses"| node_owner_app
node_clinic_user -.->|"signs in"| node_login
node_clinic_user -.->|"uses"| node_clinic_app
node_server -->|"mounts"| node_auth_routes
node_server -->|"mounts"| node_pet_routes
node_server -->|"mounts"| node_public_routes
node_server -->|"mounts"| node_authorization_routes
node_server -->|"mounts"| node_vet_routes
node_server -->|"mounts"| node_dashboard_routes
node_server -->|"mounts"| node_report_routes
node_server -->|"mounts"| node_lost_routes
node_server -->|"mounts"| node_profile_routes
node_server -->|"mounts"| node_notification_routes
node_server -->|"mounts"| node_push_routes
node_server -->|"starts at launch"| node_reminder_scheduler
node_auth_routes -->|"queries"| node_db
node_pet_routes -->|"queries"| node_db
node_public_routes -->|"queries"| node_db
node_lost_routes -->|"queries"| node_db
node_authorization_routes -->|"queries"| node_db
node_vet_routes -->|"queries"| node_db
node_dashboard_routes -->|"queries"| node_db
node_report_routes -->|"queries"| node_db
node_profile_routes -->|"queries"| node_db
node_notification_routes -->|"queries"| node_db
node_push_routes -->|"queries"| node_db
node_authorization_routes -->|"authenticates requests"| node_auth_middleware
node_vet_routes -->|"authenticates requests"| node_auth_middleware
node_lost_routes -.->|"authenticates requests"| node_auth_middleware
node_notification_routes -.->|"authenticates requests"| node_auth_middleware
node_push_routes -.->|"authenticates requests"| node_auth_middleware
node_reminder_scheduler -->|"queries"| node_db
node_reminder_scheduler -->|"sends reminders"| node_push_service
node_push_service -->|"updates tokens"| node_db
node_push_service -->|"sends push"| node_expo_push
node_api_config -.->|"configures API URL"| node_server
node_pet_profile -->|"uses API config"| node_api_config
node_lost_pet -->|"uses API config"| node_api_config
node_qr_scanner -->|"uses API config"| node_api_config
node_clinic_auth -->|"uses API config"| node_api_config
node_schedules -->|"uses API config"| node_api_config
node_notifications_ui -->|"uses API config"| node_api_config
node_device_notifications -.->|"delivers alerts"| node_expo_push

click node_login "https://github.com/rain946/timan-/blob/main/app/(auth)/login.tsx"
click node_owner_app "https://github.com/rain946/timan-/blob/main/app/(owner)/dashboard.tsx"
click node_clinic_app "https://github.com/rain946/timan-/blob/main/app/(clinic)/(tabs)/clinic-dashboard.tsx"
click node_pet_profile "https://github.com/rain946/timan-/blob/main/app/(pets)/pet-profile.tsx"
click node_lost_pet "https://github.com/rain946/timan-/blob/main/app/(pets)/lost-pet.tsx"
click node_qr_scanner "https://github.com/rain946/timan-/blob/main/app/(scanner)/qr-scanner.tsx"
click node_public_pet "https://github.com/rain946/timan-/blob/main/app/(public)/public-pet.tsx"
click node_clinic_auth "https://github.com/rain946/timan-/blob/main/app/(veterinary)/clinic-authorization.tsx"
click node_vet_records "https://github.com/rain946/timan-/blob/main/app/(clinic)/(tabs)/vet-records.tsx"
click node_schedules "https://github.com/rain946/timan-/blob/main/app/(veterinary)/schedules.tsx"
click node_reports "https://github.com/rain946/timan-/blob/main/app/(clinic)/clinic-reports.tsx"
click node_notifications_ui "https://github.com/rain946/timan-/blob/main/app/(owner)/notifications.tsx"
click node_api_config "https://github.com/rain946/timan-/blob/main/config/api.ts"
click node_server "https://github.com/rain946/timan-/blob/main/backend/server.js"
click node_auth_routes "https://github.com/rain946/timan-/blob/main/backend/routes/authRoutes.js"
click node_pet_routes "https://github.com/rain946/timan-/blob/main/backend/routes/petRoutes.js"
click node_public_routes "https://github.com/rain946/timan-/blob/main/backend/routes/publicRoutes.js"
click node_lost_routes "https://github.com/rain946/timan-/blob/main/backend/routes/lostPetRoutes.js"
click node_authorization_routes "https://github.com/rain946/timan-/blob/main/backend/routes/authorizationRoutes.js"
click node_vet_routes "https://github.com/rain946/timan-/blob/main/backend/routes/vetRecordRoutes.js"
click node_dashboard_routes "https://github.com/rain946/timan-/blob/main/backend/routes/clinicDashboardRoutes.js"
click node_report_routes "https://github.com/rain946/timan-/blob/main/backend/routes/clinicReportRoutes.js"
click node_profile_routes "https://github.com/rain946/timan-/blob/main/backend/routes/profileRoutes.js"
click node_notification_routes "https://github.com/rain946/timan-/blob/main/backend/routes/notificationRoutes.js"
click node_push_routes "https://github.com/rain946/timan-/blob/main/backend/routes/pushTokenRoutes.js"
click node_db "https://github.com/rain946/timan-/blob/main/backend/config/db.js"
click node_auth_middleware "https://github.com/rain946/timan-/blob/main/backend/middleware/authMiddleware.js"
click node_reminder_scheduler "https://github.com/rain946/timan-/blob/main/backend/services/reminderScheduler.js"
click node_push_service "https://github.com/rain946/timan-/blob/main/backend/services/pushService.js"

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_login,node_owner_app,node_clinic_app,node_api_config,node_clinic_user toneBlue
class node_pet_profile,node_lost_pet,node_qr_scanner,node_public_pet toneAmber
class node_clinic_auth,node_vet_records,node_schedules,node_reports toneMint
class node_server,node_auth_routes,node_pet_routes,node_public_routes,node_lost_routes,node_authorization_routes,node_vet_routes,node_dashboard_routes,node_report_routes,node_profile_routes,node_notification_routes,node_push_routes,node_db,node_auth_middleware toneRose
class node_notifications_ui,node_reminder_scheduler,node_push_service,node_owner,node_expo_push,node_device_notifications toneIndigo
```

## Components

### Mobile app

- [Sign in / register](https://github.com/rain946/timan-/blob/main/app/(auth)/login.tsx): `app/(auth)/login.tsx`
- [Owner dashboard](https://github.com/rain946/timan-/blob/main/app/(owner)/dashboard.tsx): `app/(owner)/dashboard.tsx`
- [Clinic dashboard](https://github.com/rain946/timan-/blob/main/app/(clinic)/(tabs)/clinic-dashboard.tsx): `app/(clinic)/(tabs)/clinic-dashboard.tsx`
- [API URL config](https://github.com/rain946/timan-/blob/main/config/api.ts): `config/api.ts`

### Pet identity

- [Pet profiles](https://github.com/rain946/timan-/blob/main/app/(pets)/pet-profile.tsx): `app/(pets)/pet-profile.tsx`
- [Lost pet report](https://github.com/rain946/timan-/blob/main/app/(pets)/lost-pet.tsx): `app/(pets)/lost-pet.tsx`
- [QR scanning](https://github.com/rain946/timan-/blob/main/app/(scanner)/qr-scanner.tsx): `app/(scanner)/qr-scanner.tsx`
- [Public pet page](https://github.com/rain946/timan-/blob/main/app/(public)/public-pet.tsx): `app/(public)/public-pet.tsx`

### Clinic care

- [Clinic authorization](https://github.com/rain946/timan-/blob/main/app/(veterinary)/clinic-authorization.tsx): `app/(veterinary)/clinic-authorization.tsx`
- [Veterinary records](https://github.com/rain946/timan-/blob/main/app/(clinic)/(tabs)/vet-records.tsx): `app/(clinic)/(tabs)/vet-records.tsx`
- [Care schedules](https://github.com/rain946/timan-/blob/main/app/(veterinary)/schedules.tsx): `app/(veterinary)/schedules.tsx`
- [Clinic reports](https://github.com/rain946/timan-/blob/main/app/(clinic)/clinic-reports.tsx): `app/(clinic)/clinic-reports.tsx`

### API backend

- [HTTP server](https://github.com/rain946/timan-/blob/main/backend/server.js): `backend/server.js`
- [Authentication routes](https://github.com/rain946/timan-/blob/main/backend/routes/authRoutes.js): `backend/routes/authRoutes.js`
- [Pet routes](https://github.com/rain946/timan-/blob/main/backend/routes/petRoutes.js): `backend/routes/petRoutes.js`
- [Public pet routes](https://github.com/rain946/timan-/blob/main/backend/routes/publicRoutes.js): `backend/routes/publicRoutes.js`
- [Lost pet routes](https://github.com/rain946/timan-/blob/main/backend/routes/lostPetRoutes.js): `backend/routes/lostPetRoutes.js`
- [Authorization routes](https://github.com/rain946/timan-/blob/main/backend/routes/authorizationRoutes.js): `backend/routes/authorizationRoutes.js`
- [Veterinary routes](https://github.com/rain946/timan-/blob/main/backend/routes/vetRecordRoutes.js): `backend/routes/vetRecordRoutes.js`
- [Clinic dashboard routes](https://github.com/rain946/timan-/blob/main/backend/routes/clinicDashboardRoutes.js): `backend/routes/clinicDashboardRoutes.js`
- [Clinic report routes](https://github.com/rain946/timan-/blob/main/backend/routes/clinicReportRoutes.js): `backend/routes/clinicReportRoutes.js`
- [Profile routes](https://github.com/rain946/timan-/blob/main/backend/routes/profileRoutes.js): `backend/routes/profileRoutes.js`
- [Notification routes](https://github.com/rain946/timan-/blob/main/backend/routes/notificationRoutes.js): `backend/routes/notificationRoutes.js`
- [Push-token routes](https://github.com/rain946/timan-/blob/main/backend/routes/pushTokenRoutes.js): `backend/routes/pushTokenRoutes.js`
- [MySQL pool](https://github.com/rain946/timan-/blob/main/backend/config/db.js): `backend/config/db.js`
- [JWT authentication](https://github.com/rain946/timan-/blob/main/backend/middleware/authMiddleware.js): `backend/middleware/authMiddleware.js`

### Notifications

- [Notifications](https://github.com/rain946/timan-/blob/main/app/(owner)/notifications.tsx): `app/(owner)/notifications.tsx`
- [Reminder scheduler](https://github.com/rain946/timan-/blob/main/backend/services/reminderScheduler.js): `backend/services/reminderScheduler.js`
- [Push delivery](https://github.com/rain946/timan-/blob/main/backend/services/pushService.js): `backend/services/pushService.js`

### Other components

- **Pet owner**
- **Clinic user**
- **Expo push service**
- **Device notifications**

## Connections

- Pet owner → Sign in / register: signs in
- Pet owner → Owner dashboard: uses
- Clinic user → Sign in / register: signs in
- Clinic user → Clinic dashboard: uses
- HTTP server → Authentication routes: mounts (evidence: `backend/server.js`)
- HTTP server → Pet routes: mounts (evidence: `backend/server.js`)
- HTTP server → Public pet routes: mounts (evidence: `backend/server.js`)
- HTTP server → Authorization routes: mounts (evidence: `backend/server.js`)
- HTTP server → Veterinary routes: mounts (evidence: `backend/server.js`)
- HTTP server → Clinic dashboard routes: mounts (evidence: `backend/server.js`)
- HTTP server → Clinic report routes: mounts (evidence: `backend/server.js`)
- HTTP server → Lost pet routes: mounts (evidence: `backend/server.js`)
- HTTP server → Profile routes: mounts (evidence: `backend/server.js`)
- HTTP server → Notification routes: mounts (evidence: `backend/server.js`)
- HTTP server → Push-token routes: mounts (evidence: `backend/server.js`)
- HTTP server → Reminder scheduler: starts at launch (evidence: `backend/server.js`)
- Authentication routes → MySQL pool: queries (evidence: `backend/routes/authRoutes.js`)
- Pet routes → MySQL pool: queries (evidence: `backend/routes/petRoutes.js`)
- Public pet routes → MySQL pool: queries (evidence: `backend/routes/publicRoutes.js`)
- Lost pet routes → MySQL pool: queries (evidence: `backend/routes/lostPetRoutes.js`)
- Authorization routes → MySQL pool: queries (evidence: `backend/routes/authorizationRoutes.js`)
- Veterinary routes → MySQL pool: queries (evidence: `backend/routes/vetRecordRoutes.js`)
- Clinic dashboard routes → MySQL pool: queries (evidence: `backend/routes/clinicDashboardRoutes.js`)
- Clinic report routes → MySQL pool: queries (evidence: `backend/routes/clinicReportRoutes.js`)
- Profile routes → MySQL pool: queries (evidence: `backend/routes/profileRoutes.js`)
- Notification routes → MySQL pool: queries (evidence: `backend/routes/notificationRoutes.js`)
- Push-token routes → MySQL pool: queries (evidence: `backend/routes/pushTokenRoutes.js`)
- Authorization routes → JWT authentication: authenticates requests (evidence: `backend/routes/authorizationRoutes.js`)
- Veterinary routes → JWT authentication: authenticates requests (evidence: `backend/routes/vetRecordRoutes.js`)
- Lost pet routes → JWT authentication: authenticates requests (evidence: `backend/routes/lostPetRoutes.js`)
- Notification routes → JWT authentication: authenticates requests (evidence: `backend/routes/notificationRoutes.js`)
- Push-token routes → JWT authentication: authenticates requests (evidence: `backend/routes/pushTokenRoutes.js`)
- Reminder scheduler → MySQL pool: queries (evidence: `backend/services/reminderScheduler.js`)
- Reminder scheduler → Push delivery: sends reminders (evidence: `backend/services/reminderScheduler.js`)
- Push delivery → MySQL pool: updates tokens (evidence: `backend/services/pushService.js`)
- Push delivery → Expo push service: sends push (evidence: `backend/services/pushService.js`)
- API URL config → HTTP server: configures API URL
- Pet profiles → API URL config: uses API config (evidence: `app/(pets)/pet-profile.tsx`)
- Lost pet report → API URL config: uses API config (evidence: `app/(pets)/lost-pet.tsx`)
- QR scanning → API URL config: uses API config (evidence: `app/(scanner)/qr-scanner.tsx`)
- Clinic authorization → API URL config: uses API config (evidence: `app/(veterinary)/clinic-authorization.tsx`)
- Care schedules → API URL config: uses API config (evidence: `app/(veterinary)/schedules.tsx`)
- Notifications → API URL config: uses API config (evidence: `app/(owner)/notifications.tsx`)
- Device notifications → Expo push service: delivers alerts
