# yhkimslv/gagyebu architecture

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

## Overview

Gagyebu is a pair of offline-first finance trackers: Our Ledger handles shared and personal spending with settlement, while My Ledger handles an individual’s finances, payment balances, and imports from Our Ledger. Users record and review transactions in each app; data is stored locally and can optionally sync through their own Supabase project. The renderers also provide bilingual interfaces and installable web apps, with Electron providing desktop access. The graph follows documented capabilities, but unsampled renderer and sync internals limit the detail of some relationships.

Main entry points: [`personal/renderer/app.js`](https://github.com/yhkimslv/gagyebu/blob/main/personal/renderer/app.js) (Personal finance), [`couple/renderer/app.js`](https://github.com/yhkimslv/gagyebu/blob/main/couple/renderer/app.js) (Shared ledger), [`notify/send.js`](https://github.com/yhkimslv/gagyebu/blob/main/notify/send.js) (Push sender), [`couple/renderer/storage.js`](https://github.com/yhkimslv/gagyebu/blob/main/couple/renderer/storage.js) (Local storage)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_couple["Our Ledger"]
  node_couple_ui["Shared ledger<br/>[app.js]"]
  node_couple_locale["English Korean UI<br/>[i18n.js]"]
end

subgraph group_personal["My Ledger"]
  node_personal_ui["Personal finance<br/>[app.js]"]
  node_personal_locale["English Korean UI<br/>[i18n.js]"]
  node_personal_import["Shared ledger import<br/>[link.js]"]
end

subgraph group_platform["Local And Sync"]
  node_couple_storage[("Local storage<br/>[storage.js]")]
  node_couple_sync["Device sync<br/>[sync.js]"]
  node_couple_electron["Desktop host<br/>[main.js]"]
  node_couple_bridge["Desktop bridge<br/>[preload.js]"]
  node_couple_pwa["Installable web app<br/>[sw.js]"]
  node_personal_storage[("Local storage<br/>[storage.js]")]
  node_personal_sync["Device sync<br/>[sync.js]"]
  node_personal_electron["Desktop host<br/>[main.js]"]
  node_personal_bridge["Desktop bridge<br/>[preload.js]"]
  node_personal_pwa["Installable web app<br/>[sw.js]"]
end

subgraph group_notify["Notifications"]
  node_push_sender["Push sender<br/>[send.js]"]
end

node_couple_user(("Ledger user"))
node_personal_user(("Personal ledger user"))
node_supabase[("User Supabase project")]
node_push_service["Web push service"]

node_couple_user -->|"records spending"| node_couple_ui
node_couple_ui -->|"saves locally"| node_couple_storage
node_couple_ui -->|"schedules sync"| node_couple_sync
node_couple_sync -.->|"syncs optionally"| node_supabase
node_couple_ui -.->|"uses translations"| node_couple_locale
node_couple_ui -.->|"runs as PWA"| node_couple_pwa
node_couple_ui -.->|"runs on desktop"| node_couple_electron
node_couple_storage -->|"uses IPC"| node_couple_bridge
node_couple_bridge -->|"invokes data handlers"| node_couple_electron
node_couple_user -->|"records finances"| node_personal_ui
node_personal_ui -->|"saves locally"| node_personal_storage
node_personal_ui -.->|"syncs optionally"| node_personal_sync
node_personal_sync -.->|"syncs optionally"| node_supabase
node_personal_ui -.->|"imports shared ledger"| node_personal_import
node_personal_ui -.->|"uses translations"| node_personal_locale
node_personal_ui -.->|"runs as PWA"| node_personal_pwa
node_personal_ui -.->|"runs on desktop"| node_personal_electron
node_personal_storage -->|"uses IPC"| node_personal_bridge
node_personal_bridge -->|"invokes data handlers"| node_personal_electron
node_push_sender -.->|"reads ledger metadata"| node_supabase
node_push_sender -->|"sends notifications"| node_push_service

click node_couple_ui "https://github.com/yhkimslv/gagyebu/blob/main/couple/renderer/app.js"
click node_couple_locale "https://github.com/yhkimslv/gagyebu/blob/main/couple/renderer/i18n.js"
click node_couple_storage "https://github.com/yhkimslv/gagyebu/blob/main/couple/renderer/storage.js"
click node_couple_sync "https://github.com/yhkimslv/gagyebu/blob/main/couple/renderer/sync.js"
click node_couple_electron "https://github.com/yhkimslv/gagyebu/blob/main/couple/main.js"
click node_couple_bridge "https://github.com/yhkimslv/gagyebu/blob/main/couple/preload.js"
click node_couple_pwa "https://github.com/yhkimslv/gagyebu/blob/main/couple/renderer/sw.js"
click node_personal_ui "https://github.com/yhkimslv/gagyebu/blob/main/personal/renderer/app.js"
click node_personal_locale "https://github.com/yhkimslv/gagyebu/blob/main/personal/renderer/i18n.js"
click node_personal_import "https://github.com/yhkimslv/gagyebu/blob/main/personal/renderer/link.js"
click node_personal_storage "https://github.com/yhkimslv/gagyebu/blob/main/personal/renderer/storage.js"
click node_personal_sync "https://github.com/yhkimslv/gagyebu/blob/main/personal/renderer/sync.js"
click node_personal_electron "https://github.com/yhkimslv/gagyebu/blob/main/personal/main.js"
click node_personal_bridge "https://github.com/yhkimslv/gagyebu/blob/main/personal/preload.js"
click node_personal_pwa "https://github.com/yhkimslv/gagyebu/blob/main/personal/renderer/sw.js"
click node_push_sender "https://github.com/yhkimslv/gagyebu/blob/main/notify/send.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_couple_ui,node_couple_locale,node_couple_user,node_personal_user toneBlue
class node_personal_ui,node_personal_locale,node_personal_import,node_supabase toneAmber
class node_couple_storage,node_couple_sync,node_couple_electron,node_couple_bridge,node_couple_pwa,node_personal_storage,node_personal_sync,node_personal_electron,node_personal_bridge,node_personal_pwa toneMint
class node_push_sender toneRose
class node_push_service toneIndigo
```

## Components

### Our Ledger

- [Shared ledger](https://github.com/yhkimslv/gagyebu/blob/main/couple/renderer/app.js): `couple/renderer/app.js`
- [English Korean UI](https://github.com/yhkimslv/gagyebu/blob/main/couple/renderer/i18n.js): `couple/renderer/i18n.js`

### My Ledger

- [Personal finance](https://github.com/yhkimslv/gagyebu/blob/main/personal/renderer/app.js): `personal/renderer/app.js`
- [English Korean UI](https://github.com/yhkimslv/gagyebu/blob/main/personal/renderer/i18n.js): `personal/renderer/i18n.js`
- [Shared ledger import](https://github.com/yhkimslv/gagyebu/blob/main/personal/renderer/link.js): `personal/renderer/link.js`

### Local And Sync

- [Local storage](https://github.com/yhkimslv/gagyebu/blob/main/couple/renderer/storage.js): `couple/renderer/storage.js`
- [Device sync](https://github.com/yhkimslv/gagyebu/blob/main/couple/renderer/sync.js): `couple/renderer/sync.js`
- [Desktop host](https://github.com/yhkimslv/gagyebu/blob/main/couple/main.js): `couple/main.js`
- [Desktop bridge](https://github.com/yhkimslv/gagyebu/blob/main/couple/preload.js): `couple/preload.js`
- [Installable web app](https://github.com/yhkimslv/gagyebu/blob/main/couple/renderer/sw.js): `couple/renderer/sw.js`
- [Local storage](https://github.com/yhkimslv/gagyebu/blob/main/personal/renderer/storage.js): `personal/renderer/storage.js`
- [Device sync](https://github.com/yhkimslv/gagyebu/blob/main/personal/renderer/sync.js): `personal/renderer/sync.js`
- [Desktop host](https://github.com/yhkimslv/gagyebu/blob/main/personal/main.js): `personal/main.js`
- [Desktop bridge](https://github.com/yhkimslv/gagyebu/blob/main/personal/preload.js): `personal/preload.js`
- [Installable web app](https://github.com/yhkimslv/gagyebu/blob/main/personal/renderer/sw.js): `personal/renderer/sw.js`

### Notifications

- [Push sender](https://github.com/yhkimslv/gagyebu/blob/main/notify/send.js): `notify/send.js`

### Other components

- **Ledger user**
- **Personal ledger user**
- **User Supabase project**
- **Web push service**

## Connections

- Ledger user → Shared ledger: records spending (evidence: `README.md`)
- Shared ledger → Local storage: saves locally (evidence: `couple/renderer/app.js`)
- Shared ledger → Device sync: schedules sync (evidence: `couple/renderer/app.js`)
- Device sync → User Supabase project: syncs optionally (evidence: `README.md`)
- Shared ledger → English Korean UI: uses translations (evidence: `README.md`)
- Shared ledger → Installable web app: runs as PWA (evidence: `README.md`)
- Shared ledger → Desktop host: runs on desktop (evidence: `README.md`)
- Local storage → Desktop bridge: uses IPC (evidence: `couple/renderer/storage.js`)
- Desktop bridge → Desktop host: invokes data handlers (evidence: `couple/preload.js`)
- Ledger user → Personal finance: records finances (evidence: `README.md`)
- Personal finance → Local storage: saves locally (evidence: `personal/renderer/storage.js`)
- Personal finance → Device sync: syncs optionally (evidence: `README.md`)
- Device sync → User Supabase project: syncs optionally (evidence: `README.md`)
- Personal finance → Shared ledger import: imports shared ledger (evidence: `README.md`)
- Personal finance → English Korean UI: uses translations (evidence: `README.md`)
- Personal finance → Installable web app: runs as PWA (evidence: `README.md`)
- Personal finance → Desktop host: runs on desktop (evidence: `README.md`)
- Local storage → Desktop bridge: uses IPC (evidence: `personal/renderer/storage.js`)
- Desktop bridge → Desktop host: invokes data handlers (evidence: `personal/preload.js`)
- Push sender → User Supabase project: reads ledger metadata (evidence: `README.md`)
- Push sender → Web push service: sends notifications (evidence: `notify/send.js`)
