# relakeinc/chink architecture

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

- Interactive diagram: https://gitdiagram.com/relakeinc/chink
- Repository: https://github.com/relakeinc/chink

## Overview

Chink is a multi-warehouse inventory SaaS with workspace-scoped roles, traceable stock movements, payments, and reports. The principal workflow is a user managing inventory and warehouse activity through the web app; protected Fastify routes apply workspace scope and permissions, persist domain records, and publish realtime changes. The README also documents team, notifications, and reporting capabilities, represented here alongside inventory. Frontend-to-API wiring was not shown in the excerpts, so those links are dashed; unsampled capabilities use paths supported by the repository tree and index.

Main entry points: [`apps/api/src/app.ts`](https://github.com/relakeinc/chink/blob/main/apps/api/src/app.ts) (Fastify application), [`packages/db/src/index.ts`](https://github.com/relakeinc/chink/blob/main/packages/db/src/index.ts) (Prisma client), [`apps/web/src/lib/api.ts`](https://github.com/relakeinc/chink/blob/main/apps/web/src/lib/api.ts) (API client), [`apps/api/src/routes/inventory.ts`](https://github.com/relakeinc/chink/blob/main/apps/api/src/routes/inventory.ts) (Inventory routes)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web application"]
  node_web_inventory["Inventory<br/>[Inventario.tsx]"]
  node_web_movements["Stock movements<br/>[Movimientos.tsx]"]
  node_web_warehouses["Warehouses<br/>[Almacenes.tsx]"]
  node_web_payments["Payments<br/>[Pagos.tsx]"]
  node_web_reports["Reports<br/>[Reportes.tsx]"]
  node_web_team["Team management<br/>[Equipo.tsx]"]
  node_web_home["Dashboard<br/>[Inicio.tsx]"]
  node_web_api["API client<br/>[api.ts]"]
end

subgraph group_api["API domain"]
  node_api_app["Fastify application<br/>[app.ts]"]
  node_auth["Authentication and roles<br/>[auth.ts]"]
  node_inventory["Inventory routes<br/>[inventory.ts]"]
  node_movements["Movement routes<br/>[movements.ts]"]
  node_warehouses["Warehouse routes<br/>[warehouses.ts]"]
  node_payments["Payment routes<br/>[pagos.ts]"]
  node_reports["Report routes<br/>[reports.ts]"]
  node_team["Team routes<br/>[team.ts]"]
  node_customers["Customer routes<br/>[clientes.ts]"]
  node_notifications["Notifications<br/>[notifications.ts]"]
  node_telegram_routes["Telegram routes<br/>[telegram.ts]"]
end

subgraph group_services["Shared services"]
  node_workspace_scope["Workspace scope<br/>[workspace-scope.ts]"]
  node_realtime["Realtime hub<br/>[realtime-hub.ts]"]
  node_email["Transactional email<br/>[email.ts]"]
  node_bank_receipts["Receipt analysis<br/>[bancos.ts]"]
  node_gemini["Gemini analysis<br/>[gemini.ts]"]
  node_r2["Product image storage<br/>[r2.ts]"]
  node_telegram_service["Telegram integration<br/>[telegram.ts]"]
  node_report_pdf["PDF generation<br/>[report-pdf.ts]"]
end

subgraph group_data["Data and integrations"]
  node_db_client["Prisma client<br/>[index.ts]"]
  node_postgres[("PostgreSQL")]
  node_smtp{{"SMTP mail service"}}
  node_cloud_storage{{"R2 storage"}}
  node_gemini_service{{"Gemini API"}}
  node_telegram_service_external{{"Telegram"}}
end

node_user(("Workspace user"))

node_user -.->|"manages stock"| node_web_inventory
node_web_inventory -.->|"requests data"| node_web_api
node_web_movements -.->|"requests data"| node_web_api
node_web_warehouses -.->|"requests data"| node_web_api
node_web_payments -.->|"requests data"| node_web_api
node_web_reports -.->|"requests data"| node_web_api
node_web_team -.->|"requests data"| node_web_api
node_web_home -.->|"requests data"| node_web_api
node_web_api -.->|"calls API"| node_api_app
node_api_app -->|"registers"| node_auth
node_api_app -->|"registers"| node_inventory
node_api_app -->|"registers"| node_movements
node_api_app -->|"registers"| node_warehouses
node_api_app -->|"registers"| node_payments
node_api_app -->|"registers"| node_reports
node_api_app -->|"registers"| node_team
node_api_app -->|"registers"| node_customers
node_api_app -->|"registers"| node_notifications
node_api_app -->|"registers"| node_telegram_routes
node_inventory -->|"reads and writes"| node_db_client
node_movements -->|"reads and writes"| node_db_client
node_warehouses -->|"reads and writes"| node_db_client
node_payments -->|"reads and writes"| node_db_client
node_reports -->|"queries"| node_db_client
node_team -->|"reads and writes"| node_db_client
node_customers -->|"reads and writes"| node_db_client
node_notifications -->|"reads and writes"| node_db_client
node_db_client -.->|"persists records"| node_postgres
node_inventory -->|"resolves workspace"| node_workspace_scope
node_movements -->|"resolves workspace"| node_workspace_scope
node_payments -->|"resolves workspace"| node_workspace_scope
node_reports -->|"resolves workspace"| node_workspace_scope
node_inventory -->|"publishes changes"| node_realtime
node_movements -->|"publishes changes"| node_realtime
node_customers -->|"publishes changes"| node_realtime
node_auth -->|"checks permissions"| node_db_client
node_team -->|"sends invitations"| node_email
node_auth -->|"sends account mail"| node_email
node_email -.->|"sends mail"| node_smtp
node_payments -->|"analyzes receipts"| node_bank_receipts
node_bank_receipts -->|"runs prompts"| node_gemini
node_gemini -.->|"analyzes images"| node_gemini_service
node_inventory -->|"manages images"| node_r2
node_r2 -.->|"stores images"| node_cloud_storage
node_reports -->|"generates PDFs"| node_report_pdf
node_telegram_routes -->|"uses integration"| node_telegram_service
node_telegram_routes -->|"accesses media"| node_r2
node_telegram_service -.->|"connects to"| node_telegram_service_external

click node_web_inventory "https://github.com/relakeinc/chink/blob/main/apps/web/src/pages/Inventario.tsx"
click node_web_movements "https://github.com/relakeinc/chink/blob/main/apps/web/src/pages/Movimientos.tsx"
click node_web_warehouses "https://github.com/relakeinc/chink/blob/main/apps/web/src/pages/Almacenes.tsx"
click node_web_payments "https://github.com/relakeinc/chink/blob/main/apps/web/src/pages/Pagos.tsx"
click node_web_reports "https://github.com/relakeinc/chink/blob/main/apps/web/src/pages/Reportes.tsx"
click node_web_team "https://github.com/relakeinc/chink/blob/main/apps/web/src/pages/Equipo.tsx"
click node_web_home "https://github.com/relakeinc/chink/blob/main/apps/web/src/pages/Inicio.tsx"
click node_web_api "https://github.com/relakeinc/chink/blob/main/apps/web/src/lib/api.ts"
click node_api_app "https://github.com/relakeinc/chink/blob/main/apps/api/src/app.ts"
click node_auth "https://github.com/relakeinc/chink/blob/main/apps/api/src/plugins/auth.ts"
click node_inventory "https://github.com/relakeinc/chink/blob/main/apps/api/src/routes/inventory.ts"
click node_movements "https://github.com/relakeinc/chink/blob/main/apps/api/src/routes/movements.ts"
click node_warehouses "https://github.com/relakeinc/chink/blob/main/apps/api/src/routes/warehouses.ts"
click node_payments "https://github.com/relakeinc/chink/blob/main/apps/api/src/routes/pagos.ts"
click node_reports "https://github.com/relakeinc/chink/blob/main/apps/api/src/routes/reports.ts"
click node_team "https://github.com/relakeinc/chink/blob/main/apps/api/src/routes/team.ts"
click node_customers "https://github.com/relakeinc/chink/blob/main/apps/api/src/routes/clientes.ts"
click node_notifications "https://github.com/relakeinc/chink/blob/main/apps/api/src/routes/notifications.ts"
click node_telegram_routes "https://github.com/relakeinc/chink/blob/main/apps/api/src/routes/telegram.ts"
click node_workspace_scope "https://github.com/relakeinc/chink/blob/main/apps/api/src/lib/workspace-scope.ts"
click node_realtime "https://github.com/relakeinc/chink/blob/main/apps/api/src/lib/realtime-hub.ts"
click node_email "https://github.com/relakeinc/chink/blob/main/apps/api/src/lib/email.ts"
click node_bank_receipts "https://github.com/relakeinc/chink/blob/main/apps/api/src/lib/bancos.ts"
click node_gemini "https://github.com/relakeinc/chink/blob/main/apps/api/src/lib/gemini.ts"
click node_r2 "https://github.com/relakeinc/chink/blob/main/apps/api/src/lib/r2.ts"
click node_telegram_service "https://github.com/relakeinc/chink/blob/main/apps/api/src/lib/telegram.ts"
click node_report_pdf "https://github.com/relakeinc/chink/blob/main/apps/api/src/lib/report-pdf.ts"
click node_db_client "https://github.com/relakeinc/chink/blob/main/packages/db/src/index.ts"

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_web_inventory,node_web_movements,node_web_warehouses,node_web_payments,node_web_reports,node_web_team,node_web_home,node_web_api,node_user toneBlue
class node_api_app,node_auth,node_inventory,node_movements,node_warehouses,node_payments,node_reports,node_team,node_customers,node_notifications,node_telegram_routes toneAmber
class node_workspace_scope,node_realtime,node_email,node_bank_receipts,node_gemini,node_r2,node_telegram_service,node_report_pdf toneMint
class node_db_client,node_postgres,node_smtp,node_cloud_storage,node_gemini_service,node_telegram_service_external toneRose
```

## Components

### Web application

- [Inventory](https://github.com/relakeinc/chink/blob/main/apps/web/src/pages/Inventario.tsx): `apps/web/src/pages/Inventario.tsx`
- [Stock movements](https://github.com/relakeinc/chink/blob/main/apps/web/src/pages/Movimientos.tsx): `apps/web/src/pages/Movimientos.tsx`
- [Warehouses](https://github.com/relakeinc/chink/blob/main/apps/web/src/pages/Almacenes.tsx): `apps/web/src/pages/Almacenes.tsx`
- [Payments](https://github.com/relakeinc/chink/blob/main/apps/web/src/pages/Pagos.tsx): `apps/web/src/pages/Pagos.tsx`
- [Reports](https://github.com/relakeinc/chink/blob/main/apps/web/src/pages/Reportes.tsx): `apps/web/src/pages/Reportes.tsx`
- [Team management](https://github.com/relakeinc/chink/blob/main/apps/web/src/pages/Equipo.tsx): `apps/web/src/pages/Equipo.tsx`
- [Dashboard](https://github.com/relakeinc/chink/blob/main/apps/web/src/pages/Inicio.tsx): `apps/web/src/pages/Inicio.tsx`
- [API client](https://github.com/relakeinc/chink/blob/main/apps/web/src/lib/api.ts): `apps/web/src/lib/api.ts`

### API domain

- [Fastify application](https://github.com/relakeinc/chink/blob/main/apps/api/src/app.ts): `apps/api/src/app.ts`
- [Authentication and roles](https://github.com/relakeinc/chink/blob/main/apps/api/src/plugins/auth.ts): `apps/api/src/plugins/auth.ts`
- [Inventory routes](https://github.com/relakeinc/chink/blob/main/apps/api/src/routes/inventory.ts): `apps/api/src/routes/inventory.ts`
- [Movement routes](https://github.com/relakeinc/chink/blob/main/apps/api/src/routes/movements.ts): `apps/api/src/routes/movements.ts`
- [Warehouse routes](https://github.com/relakeinc/chink/blob/main/apps/api/src/routes/warehouses.ts): `apps/api/src/routes/warehouses.ts`
- [Payment routes](https://github.com/relakeinc/chink/blob/main/apps/api/src/routes/pagos.ts): `apps/api/src/routes/pagos.ts`
- [Report routes](https://github.com/relakeinc/chink/blob/main/apps/api/src/routes/reports.ts): `apps/api/src/routes/reports.ts`
- [Team routes](https://github.com/relakeinc/chink/blob/main/apps/api/src/routes/team.ts): `apps/api/src/routes/team.ts`
- [Customer routes](https://github.com/relakeinc/chink/blob/main/apps/api/src/routes/clientes.ts): `apps/api/src/routes/clientes.ts`
- [Notifications](https://github.com/relakeinc/chink/blob/main/apps/api/src/routes/notifications.ts): `apps/api/src/routes/notifications.ts`
- [Telegram routes](https://github.com/relakeinc/chink/blob/main/apps/api/src/routes/telegram.ts): `apps/api/src/routes/telegram.ts`

### Shared services

- [Workspace scope](https://github.com/relakeinc/chink/blob/main/apps/api/src/lib/workspace-scope.ts): `apps/api/src/lib/workspace-scope.ts`
- [Realtime hub](https://github.com/relakeinc/chink/blob/main/apps/api/src/lib/realtime-hub.ts): `apps/api/src/lib/realtime-hub.ts`
- [Transactional email](https://github.com/relakeinc/chink/blob/main/apps/api/src/lib/email.ts): `apps/api/src/lib/email.ts`
- [Receipt analysis](https://github.com/relakeinc/chink/blob/main/apps/api/src/lib/bancos.ts): `apps/api/src/lib/bancos.ts`
- [Gemini analysis](https://github.com/relakeinc/chink/blob/main/apps/api/src/lib/gemini.ts): `apps/api/src/lib/gemini.ts`
- [Product image storage](https://github.com/relakeinc/chink/blob/main/apps/api/src/lib/r2.ts): `apps/api/src/lib/r2.ts`
- [Telegram integration](https://github.com/relakeinc/chink/blob/main/apps/api/src/lib/telegram.ts): `apps/api/src/lib/telegram.ts`
- [PDF generation](https://github.com/relakeinc/chink/blob/main/apps/api/src/lib/report-pdf.ts): `apps/api/src/lib/report-pdf.ts`

### Data and integrations

- [Prisma client](https://github.com/relakeinc/chink/blob/main/packages/db/src/index.ts): `packages/db/src/index.ts`
- **PostgreSQL**
- **SMTP mail service**
- **R2 storage**
- **Gemini API**
- **Telegram**

### Other components

- **Workspace user**

## Connections

- Workspace user → Inventory: manages stock
- Inventory → API client: requests data
- Stock movements → API client: requests data
- Warehouses → API client: requests data
- Payments → API client: requests data
- Reports → API client: requests data
- Team management → API client: requests data
- Dashboard → API client: requests data
- API client → Fastify application: calls API
- Fastify application → Authentication and roles: registers (evidence: `apps/api/src/app.ts`)
- Fastify application → Inventory routes: registers (evidence: `apps/api/src/app.ts`)
- Fastify application → Movement routes: registers (evidence: `apps/api/src/app.ts`)
- Fastify application → Warehouse routes: registers (evidence: `apps/api/src/app.ts`)
- Fastify application → Payment routes: registers (evidence: `apps/api/src/app.ts`)
- Fastify application → Report routes: registers (evidence: `apps/api/src/app.ts`)
- Fastify application → Team routes: registers (evidence: `apps/api/src/app.ts`)
- Fastify application → Customer routes: registers (evidence: `apps/api/src/app.ts`)
- Fastify application → Notifications: registers (evidence: `apps/api/src/app.ts`)
- Fastify application → Telegram routes: registers (evidence: `apps/api/src/app.ts`)
- Inventory routes → Prisma client: reads and writes (evidence: `apps/api/src/routes/inventory.ts`)
- Movement routes → Prisma client: reads and writes (evidence: `apps/api/src/routes/movements.ts`)
- Warehouse routes → Prisma client: reads and writes (evidence: `apps/api/src/routes/warehouses.ts`)
- Payment routes → Prisma client: reads and writes (evidence: `apps/api/src/routes/pagos.ts`)
- Report routes → Prisma client: queries (evidence: `apps/api/src/routes/reports.ts`)
- Team routes → Prisma client: reads and writes (evidence: `apps/api/src/routes/team.ts`)
- Customer routes → Prisma client: reads and writes (evidence: `apps/api/src/routes/clientes.ts`)
- Notifications → Prisma client: reads and writes (evidence: `apps/api/src/routes/notifications.ts`)
- Prisma client → PostgreSQL: persists records
- Inventory routes → Workspace scope: resolves workspace (evidence: `apps/api/src/routes/inventory.ts`)
- Movement routes → Workspace scope: resolves workspace (evidence: `apps/api/src/routes/movements.ts`)
- Payment routes → Workspace scope: resolves workspace (evidence: `apps/api/src/routes/pagos.ts`)
- Report routes → Workspace scope: resolves workspace (evidence: `apps/api/src/routes/reports.ts`)
- Inventory routes → Realtime hub: publishes changes (evidence: `apps/api/src/routes/inventory.ts`)
- Movement routes → Realtime hub: publishes changes (evidence: `apps/api/src/routes/movements.ts`)
- Customer routes → Realtime hub: publishes changes (evidence: `apps/api/src/routes/clientes.ts`)
- Authentication and roles → Prisma client: checks permissions (evidence: `apps/api/src/plugins/auth.ts`)
- Team routes → Transactional email: sends invitations (evidence: `apps/api/src/routes/team.ts`)
- Authentication and roles → Transactional email: sends account mail
- Transactional email → SMTP mail service: sends mail
- Payment routes → Receipt analysis: analyzes receipts (evidence: `apps/api/src/routes/pagos.ts`)
- Receipt analysis → Gemini analysis: runs prompts (evidence: `apps/api/src/lib/bancos.ts`)
- Gemini analysis → Gemini API: analyzes images
- Inventory routes → Product image storage: manages images (evidence: `apps/api/src/routes/inventory.ts`)
- Product image storage → R2 storage: stores images
- Report routes → PDF generation: generates PDFs (evidence: `apps/api/src/routes/reports.ts`)
- Telegram routes → Telegram integration: uses integration (evidence: `apps/api/src/routes/telegram.ts`)
- Telegram routes → Product image storage: accesses media (evidence: `apps/api/src/routes/telegram.ts`)
- Telegram integration → Telegram: connects to
