# aamir-azeez/after-you architecture

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

- Interactive diagram: https://gitdiagram.com/aamir-azeez/after-you
- Repository: https://github.com/aamir-azeez/after-you

## Overview

After You is an asynchronous cooperative Android puzzle game: players record and save turns, and a partner later plays alongside the saved recording. Its online backend also supports rooms and campaigns, friends, optional photo memories and transfer, safety controls, access entitlements, and turn notifications. The tree and excerpts identify backend and Android bridge modules, but not the Godot client source paths; client-side steps are therefore represented as an external app actor. Some backend subsystem wiring is documented by the README but not shown in sampled source, so uncertain call paths are omitted.

Main entry points: [`backend/src/v2/routes.ts`](https://github.com/aamir-azeez/after-you/blob/main/backend/src/v2/routes.ts) (V2 room routes), [`backend/src/index.ts`](https://github.com/aamir-azeez/after-you/blob/main/backend/src/index.ts) (Worker API), [`backend/src/v2/campaign-routes.ts`](https://github.com/aamir-azeez/after-you/blob/main/backend/src/v2/campaign-routes.ts) (Campaign routes), [`backend/src/friends-routes.ts`](https://github.com/aamir-azeez/after-you/blob/main/backend/src/friends-routes.ts) (Friend routes)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_gameplay["Online gameplay"]
  node_api["Worker API<br/>[index.ts]"]
  node_legacy["Room play<br/>[room.ts]"]
  node_player_state["Player state<br/>[player.ts]"]
  node_v2_routes["V2 room routes<br/>[routes.ts]"]
  node_v2_room["V2 room play<br/>[room.ts]"]
  node_campaign_routes["Campaign routes<br/>[campaign-routes.ts]"]
  node_campaign_room["Campaign rooms"]
  node_storage[("Room persistence<br/>[storage-schema.ts]")]
end

subgraph group_social["Friends and safety"]
  node_friends_routes["Friend routes<br/>[friends-routes.ts]"]
  node_friends["Friend links<br/>[friends.ts]"]
  node_safety_routes["Safety routes<br/>[safety-routes.ts]"]
  node_safety["Safety checks<br/>[safety.ts]"]
end

subgraph group_memories["Photo memories"]
  node_photo_routes["Room photo routes<br/>[routes.ts]"]
  node_photos["Photo delivery<br/>[photo-delivery.ts]"]
  node_transfer_routes["Transfer routes"]
  node_transfer["Transfer service<br/>[photo-transfer.ts]"]
end

subgraph group_platform["Access and notifications"]
  node_entitlement["Entitlements<br/>[entitlement.ts]"]
  node_tester["Tester access<br/>[tester-access.ts]"]
  node_notification["Notification service<br/>[notifications.ts]"]
  node_notification_store[("Notification storage")]
  node_messaging["Android messaging"]
end

node_player(("Player"))
node_app["Android game"]
node_firebase["Firebase messaging"]
node_play_billing["Play billing"]

node_player -->|"plays turns"| node_app
node_app -->|"sends requests"| node_api
node_api -->|"dispatches"| node_legacy
node_api -->|"dispatches"| node_v2_routes
node_v2_routes -->|"reads or updates"| node_player_state
node_v2_routes -->|"calls room"| node_v2_room
node_v2_routes -->|"checks access"| node_entitlement
node_v2_routes -->|"persists room state"| node_storage
node_api -->|"dispatches"| node_campaign_routes
node_campaign_routes -->|"gets room context"| node_campaign_room
node_campaign_routes -->|"calls room"| node_v2_room
node_friends_routes -->|"checks friend links"| node_friends
node_safety_routes -->|"checks interactions"| node_safety
node_app -->|"manages friends"| node_friends_routes
node_app -->|"manages safety"| node_safety_routes
node_v2_routes -->|"handles photo delivery"| node_photos
node_app -->|"transfers photos"| node_transfer_routes
node_transfer_routes -->|"calls transfer"| node_transfer
node_app -->|"redeems code"| node_tester
node_app -.->|"checks purchase access"| node_entitlement
node_play_billing -.->|"reports purchases"| node_app
node_notification -->|"stores delivery state"| node_notification_store
node_firebase -->|"delivers push"| node_messaging
node_messaging -->|"notifies player"| node_app

click node_api "https://github.com/aamir-azeez/after-you/blob/main/backend/src/index.ts"
click node_legacy "https://github.com/aamir-azeez/after-you/blob/main/backend/src/room.ts"
click node_player_state "https://github.com/aamir-azeez/after-you/blob/main/backend/src/player.ts"
click node_v2_routes "https://github.com/aamir-azeez/after-you/blob/main/backend/src/v2/routes.ts"
click node_v2_room "https://github.com/aamir-azeez/after-you/blob/main/backend/src/v2/room.ts"
click node_campaign_routes "https://github.com/aamir-azeez/after-you/blob/main/backend/src/v2/campaign-routes.ts"
click node_campaign_room "https://github.com/aamir-azeez/after-you/blob/main/backend/src/v2/campaign-room-access.ts"
click node_storage "https://github.com/aamir-azeez/after-you/blob/main/backend/src/storage-schema.ts"
click node_friends_routes "https://github.com/aamir-azeez/after-you/blob/main/backend/src/friends-routes.ts"
click node_friends "https://github.com/aamir-azeez/after-you/blob/main/backend/src/friends.ts"
click node_safety_routes "https://github.com/aamir-azeez/after-you/blob/main/backend/src/safety-routes.ts"
click node_safety "https://github.com/aamir-azeez/after-you/blob/main/backend/src/safety.ts"
click node_photo_routes "https://github.com/aamir-azeez/after-you/blob/main/backend/src/v2/routes.ts"
click node_photos "https://github.com/aamir-azeez/after-you/blob/main/backend/src/v2/photo-delivery.ts"
click node_transfer_routes "https://github.com/aamir-azeez/after-you/blob/main/backend/src/photo-transfer-routes.ts"
click node_transfer "https://github.com/aamir-azeez/after-you/blob/main/backend/src/photo-transfer.ts"
click node_entitlement "https://github.com/aamir-azeez/after-you/blob/main/backend/src/entitlement.ts"
click node_tester "https://github.com/aamir-azeez/after-you/blob/main/backend/src/tester-access.ts"
click node_notification "https://github.com/aamir-azeez/after-you/blob/main/backend/src/notifications.ts"
click node_notification_store "https://github.com/aamir-azeez/after-you/blob/main/backend/src/notification-storage.ts"
click node_messaging "https://github.com/aamir-azeez/after-you/blob/main/native/plugin/src/main/java/com/aamirazeez/afteryou/nativebridge/AfterYouMessagingService.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_api,node_legacy,node_player_state,node_v2_routes,node_v2_room,node_campaign_routes,node_campaign_room,node_storage toneBlue
class node_friends_routes,node_friends,node_safety_routes,node_safety toneAmber
class node_photo_routes,node_photos,node_transfer_routes,node_transfer toneMint
class node_entitlement,node_tester,node_notification,node_notification_store,node_messaging toneRose
class node_player,node_app,node_firebase,node_play_billing toneIndigo
```

## Components

### Online gameplay

- [Worker API](https://github.com/aamir-azeez/after-you/blob/main/backend/src/index.ts): `backend/src/index.ts`
- [Room play](https://github.com/aamir-azeez/after-you/blob/main/backend/src/room.ts): `backend/src/room.ts`
- [Player state](https://github.com/aamir-azeez/after-you/blob/main/backend/src/player.ts): `backend/src/player.ts`
- [V2 room routes](https://github.com/aamir-azeez/after-you/blob/main/backend/src/v2/routes.ts): `backend/src/v2/routes.ts`
- [V2 room play](https://github.com/aamir-azeez/after-you/blob/main/backend/src/v2/room.ts): `backend/src/v2/room.ts`
- [Campaign routes](https://github.com/aamir-azeez/after-you/blob/main/backend/src/v2/campaign-routes.ts): `backend/src/v2/campaign-routes.ts`
- [Campaign rooms](https://github.com/aamir-azeez/after-you/blob/main/backend/src/v2/campaign-room-access.ts): `backend/src/v2/campaign-room-access.ts`
- [Room persistence](https://github.com/aamir-azeez/after-you/blob/main/backend/src/storage-schema.ts): `backend/src/storage-schema.ts`

### Friends and safety

- [Friend routes](https://github.com/aamir-azeez/after-you/blob/main/backend/src/friends-routes.ts): `backend/src/friends-routes.ts`
- [Friend links](https://github.com/aamir-azeez/after-you/blob/main/backend/src/friends.ts): `backend/src/friends.ts`
- [Safety routes](https://github.com/aamir-azeez/after-you/blob/main/backend/src/safety-routes.ts): `backend/src/safety-routes.ts`
- [Safety checks](https://github.com/aamir-azeez/after-you/blob/main/backend/src/safety.ts): `backend/src/safety.ts`

### Photo memories

- [Room photo routes](https://github.com/aamir-azeez/after-you/blob/main/backend/src/v2/routes.ts): `backend/src/v2/routes.ts`
- [Photo delivery](https://github.com/aamir-azeez/after-you/blob/main/backend/src/v2/photo-delivery.ts): `backend/src/v2/photo-delivery.ts`
- [Transfer routes](https://github.com/aamir-azeez/after-you/blob/main/backend/src/photo-transfer-routes.ts): `backend/src/photo-transfer-routes.ts`
- [Transfer service](https://github.com/aamir-azeez/after-you/blob/main/backend/src/photo-transfer.ts): `backend/src/photo-transfer.ts`

### Access and notifications

- [Entitlements](https://github.com/aamir-azeez/after-you/blob/main/backend/src/entitlement.ts): `backend/src/entitlement.ts`
- [Tester access](https://github.com/aamir-azeez/after-you/blob/main/backend/src/tester-access.ts): `backend/src/tester-access.ts`
- [Notification service](https://github.com/aamir-azeez/after-you/blob/main/backend/src/notifications.ts): `backend/src/notifications.ts`
- [Notification storage](https://github.com/aamir-azeez/after-you/blob/main/backend/src/notification-storage.ts): `backend/src/notification-storage.ts`
- [Android messaging](https://github.com/aamir-azeez/after-you/blob/main/native/plugin/src/main/java/com/aamirazeez/afteryou/nativebridge/AfterYouMessagingService.kt): `native/plugin/src/main/java/com/aamirazeez/afteryou/nativebridge/AfterYouMessagingService.kt`

### Other components

- **Player**
- **Android game**
- **Firebase messaging**
- **Play billing**

## Connections

- Player → Android game: plays turns
- Android game → Worker API: sends requests
- Worker API → Room play: dispatches
- Worker API → V2 room routes: dispatches
- V2 room routes → Player state: reads or updates
- V2 room routes → V2 room play: calls room
- V2 room routes → Entitlements: checks access
- V2 room routes → Room persistence: persists room state
- Worker API → Campaign routes: dispatches
- Campaign routes → Campaign rooms: gets room context
- Campaign routes → V2 room play: calls room
- Friend routes → Friend links: checks friend links
- Safety routes → Safety checks: checks interactions
- Android game → Friend routes: manages friends
- Android game → Safety routes: manages safety
- V2 room routes → Photo delivery: handles photo delivery
- Android game → Transfer routes: transfers photos
- Transfer routes → Transfer service: calls transfer
- Android game → Tester access: redeems code
- Android game → Entitlements: checks purchase access
- Play billing → Android game: reports purchases
- Notification service → Notification storage: stores delivery state
- Firebase messaging → Android messaging: delivers push
- Android messaging → Android game: notifies player
