# craizes/cirvisafun architecture

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

- Interactive diagram: https://gitdiagram.com/craizes/cirvisafun
- Repository: https://github.com/craizes/cirvisafun

## Overview

This is a Next.js portal for a fictional civic role-play community: users authenticate with Telegram, then access profiles and activities such as banking, jobs, shopping, taxes, visas, and referrals; administrators manage those systems. The graph groups user-facing areas, operational domains, admin tools, and shared services. Evidence is limited to the supplied excerpts and SOURCE INDEX; paths for unsampled features are supported by the tree, but their internal wiring is not asserted.

Main entry points: [`lib/supabase.ts`](https://github.com/craizes/cirvisafun/blob/main/lib/supabase.ts) (Supabase client), [`app/api/verify-code/route.ts`](https://github.com/craizes/cirvisafun/blob/main/app/api/verify-code/route.ts) (Verify auth code), [`app/user/[id]/page.tsx`](https://github.com/craizes/cirvisafun/blob/main/app/user/%5Bid%5D/page.tsx) (User profile), [`app/login/LoginForm.tsx`](https://github.com/craizes/cirvisafun/blob/main/app/login/LoginForm.tsx) (Login form)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["Portal and access"]
  node_home["Home<br/>[page.tsx]"]
  node_hero["Hero slider<br/>[HeroSlider.tsx]"]
  node_login["Login form<br/>[LoginForm.tsx]"]
  node_code_send["Send auth code<br/>[route.ts]"]
  node_code_verify["Verify auth code<br/>[route.ts]"]
  node_user_profile["User profile<br/>[page.tsx]"]
  node_user_data["Profile data API<br/>[route.ts]"]
  node_avatar["Avatar<br/>[Avatar.tsx]"]
  node_role_badge["Role badge<br/>[RoleBadge.tsx]"]
end

subgraph group_civic["Civic services"]
  node_taxes["Taxes<br/>[page.tsx]"]
  node_visa["Visa services<br/>[page.tsx]"]
  node_citizenship["Citizenship exam<br/>[page.tsx]"]
  node_referral["Referrals<br/>[referral.ts]"]
end

subgraph group_economy["Community economy"]
  node_bank["Banking<br/>[BankClient.tsx]"]
  node_promo_client["Promo codes UI<br/>[PromoClient.tsx]"]
  node_jobs["Jobs<br/>[page.tsx]"]
  node_shop["Shop<br/>[CategoryClient.tsx]"]
  node_farm_api["Daily farming<br/>[route.ts]"]
end

subgraph group_admin["Administration"]
  node_admin_dashboard["Admin dashboard"]
  node_admin_tax_api["Admin tax API<br/>[route.ts]"]
end

subgraph group_shared["Shared services"]
  node_promo_logic["Promo services<br/>[promo.ts]"]
  node_supabase[("Supabase client<br/>[supabase.ts]")]
  node_telegram_utils["Telegram utilities<br/>[utils.ts]"]
  node_visa_charge["Visa charging<br/>[visa-charge.ts]"]
end

node_visitor(("Visitor or citizen"))

node_visitor -->|"opens"| node_home
node_home -->|"renders"| node_hero
node_visitor -->|"signs in"| node_login
node_login -.->|"requests code"| node_code_send
node_login -.->|"submits code"| node_code_verify
node_code_send -->|"stores code"| node_supabase
node_code_send -->|"sends message"| node_telegram_utils
node_code_verify -->|"checks session data"| node_supabase
node_code_verify -->|"loads Telegram info"| node_telegram_utils
node_code_verify -->|"activates code"| node_referral
node_visitor -->|"views profile"| node_user_profile
node_user_profile -->|"renders"| node_avatar
node_user_profile -->|"renders"| node_role_badge
node_user_profile -->|"starts farming"| node_farm_api
node_user_data -->|"reads profile"| node_supabase
node_user_data -->|"charges visa"| node_visa_charge
node_promo_client -->|"uses status types"| node_promo_logic
node_farm_api -->|"updates balance"| node_supabase
node_admin_tax_api -->|"reads and writes"| node_supabase
node_admin_dashboard -.->|"manages taxes"| node_admin_tax_api
node_taxes -.->|"administers"| node_admin_tax_api
node_promo_logic -->|"uses database"| node_supabase
node_referral -->|"uses database"| node_supabase

click node_home "https://github.com/craizes/cirvisafun/blob/main/app/page.tsx"
click node_hero "https://github.com/craizes/cirvisafun/blob/main/components/HeroSlider.tsx"
click node_login "https://github.com/craizes/cirvisafun/blob/main/app/login/LoginForm.tsx"
click node_code_send "https://github.com/craizes/cirvisafun/blob/main/app/api/send-code/route.ts"
click node_code_verify "https://github.com/craizes/cirvisafun/blob/main/app/api/verify-code/route.ts"
click node_user_profile "https://github.com/craizes/cirvisafun/blob/main/app/user/%5Bid%5D/page.tsx"
click node_user_data "https://github.com/craizes/cirvisafun/blob/main/app/api/user/data/route.ts"
click node_avatar "https://github.com/craizes/cirvisafun/blob/main/components/Avatar.tsx"
click node_role_badge "https://github.com/craizes/cirvisafun/blob/main/components/RoleBadge.tsx"
click node_bank "https://github.com/craizes/cirvisafun/blob/main/app/bank/BankClient.tsx"
click node_promo_client "https://github.com/craizes/cirvisafun/blob/main/app/bank/promo/PromoClient.tsx"
click node_promo_logic "https://github.com/craizes/cirvisafun/blob/main/lib/promo.ts"
click node_jobs "https://github.com/craizes/cirvisafun/blob/main/app/jobs/page.tsx"
click node_shop "https://github.com/craizes/cirvisafun/blob/main/app/shop/%5BcategoryId%5D/CategoryClient.tsx"
click node_farm_api "https://github.com/craizes/cirvisafun/blob/main/app/api/farm/route.ts"
click node_taxes "https://github.com/craizes/cirvisafun/blob/main/app/bank/taxes/page.tsx"
click node_visa "https://github.com/craizes/cirvisafun/blob/main/app/visa/page.tsx"
click node_citizenship "https://github.com/craizes/cirvisafun/blob/main/app/citizenship/exam/page.tsx"
click node_referral "https://github.com/craizes/cirvisafun/blob/main/lib/referral.ts"
click node_admin_dashboard "https://github.com/craizes/cirvisafun/blob/main/app/admin/AdminDashboardClient.tsx"
click node_admin_tax_api "https://github.com/craizes/cirvisafun/blob/main/app/api/admin/taxes/route.ts"
click node_supabase "https://github.com/craizes/cirvisafun/blob/main/lib/supabase.ts"
click node_telegram_utils "https://github.com/craizes/cirvisafun/blob/main/lib/utils.ts"
click node_visa_charge "https://github.com/craizes/cirvisafun/blob/main/lib/visa-charge.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_home,node_hero,node_login,node_code_send,node_code_verify,node_user_profile,node_user_data,node_avatar,node_role_badge toneBlue
class node_taxes,node_visa,node_citizenship,node_referral toneAmber
class node_bank,node_promo_client,node_jobs,node_shop,node_farm_api toneMint
class node_admin_dashboard,node_admin_tax_api toneRose
class node_promo_logic,node_supabase,node_telegram_utils,node_visa_charge,node_visitor toneIndigo
```

## Components

### Portal and access

- [Home](https://github.com/craizes/cirvisafun/blob/main/app/page.tsx): `app/page.tsx`
- [Hero slider](https://github.com/craizes/cirvisafun/blob/main/components/HeroSlider.tsx): `components/HeroSlider.tsx`
- [Login form](https://github.com/craizes/cirvisafun/blob/main/app/login/LoginForm.tsx): `app/login/LoginForm.tsx`
- [Send auth code](https://github.com/craizes/cirvisafun/blob/main/app/api/send-code/route.ts): `app/api/send-code/route.ts`
- [Verify auth code](https://github.com/craizes/cirvisafun/blob/main/app/api/verify-code/route.ts): `app/api/verify-code/route.ts`
- [User profile](https://github.com/craizes/cirvisafun/blob/main/app/user/%5Bid%5D/page.tsx): `app/user/[id]/page.tsx`
- [Profile data API](https://github.com/craizes/cirvisafun/blob/main/app/api/user/data/route.ts): `app/api/user/data/route.ts`
- [Avatar](https://github.com/craizes/cirvisafun/blob/main/components/Avatar.tsx): `components/Avatar.tsx`
- [Role badge](https://github.com/craizes/cirvisafun/blob/main/components/RoleBadge.tsx): `components/RoleBadge.tsx`

### Civic services

- [Taxes](https://github.com/craizes/cirvisafun/blob/main/app/bank/taxes/page.tsx): `app/bank/taxes/page.tsx`
- [Visa services](https://github.com/craizes/cirvisafun/blob/main/app/visa/page.tsx): `app/visa/page.tsx`
- [Citizenship exam](https://github.com/craizes/cirvisafun/blob/main/app/citizenship/exam/page.tsx): `app/citizenship/exam/page.tsx`
- [Referrals](https://github.com/craizes/cirvisafun/blob/main/lib/referral.ts): `lib/referral.ts`

### Community economy

- [Banking](https://github.com/craizes/cirvisafun/blob/main/app/bank/BankClient.tsx): `app/bank/BankClient.tsx`
- [Promo codes UI](https://github.com/craizes/cirvisafun/blob/main/app/bank/promo/PromoClient.tsx): `app/bank/promo/PromoClient.tsx`
- [Jobs](https://github.com/craizes/cirvisafun/blob/main/app/jobs/page.tsx): `app/jobs/page.tsx`
- [Shop](https://github.com/craizes/cirvisafun/blob/main/app/shop/%5BcategoryId%5D/CategoryClient.tsx): `app/shop/[categoryId]/CategoryClient.tsx`
- [Daily farming](https://github.com/craizes/cirvisafun/blob/main/app/api/farm/route.ts): `app/api/farm/route.ts`

### Administration

- [Admin dashboard](https://github.com/craizes/cirvisafun/blob/main/app/admin/AdminDashboardClient.tsx): `app/admin/AdminDashboardClient.tsx`
- [Admin tax API](https://github.com/craizes/cirvisafun/blob/main/app/api/admin/taxes/route.ts): `app/api/admin/taxes/route.ts`

### Shared services

- [Promo services](https://github.com/craizes/cirvisafun/blob/main/lib/promo.ts): `lib/promo.ts`
- [Supabase client](https://github.com/craizes/cirvisafun/blob/main/lib/supabase.ts): `lib/supabase.ts`
- [Telegram utilities](https://github.com/craizes/cirvisafun/blob/main/lib/utils.ts): `lib/utils.ts`
- [Visa charging](https://github.com/craizes/cirvisafun/blob/main/lib/visa-charge.ts): `lib/visa-charge.ts`

### Other components

- **Visitor or citizen**

## Connections

- Visitor or citizen → Home: opens
- Home → Hero slider: renders (evidence: `app/page.tsx`)
- Visitor or citizen → Login form: signs in
- Login form → Send auth code: requests code
- Login form → Verify auth code: submits code
- Send auth code → Supabase client: stores code (evidence: `app/api/send-code/route.ts`)
- Send auth code → Telegram utilities: sends message (evidence: `app/api/send-code/route.ts`)
- Verify auth code → Supabase client: checks session data (evidence: `app/api/verify-code/route.ts`)
- Verify auth code → Telegram utilities: loads Telegram info (evidence: `app/api/verify-code/route.ts`)
- Verify auth code → Referrals: activates code (evidence: `app/api/verify-code/route.ts`)
- Visitor or citizen → User profile: views profile
- User profile → Avatar: renders (evidence: `app/user/[id]/page.tsx`)
- User profile → Role badge: renders (evidence: `app/user/[id]/page.tsx`)
- User profile → Daily farming: starts farming (evidence: `app/user/[id]/page.tsx`)
- Profile data API → Supabase client: reads profile (evidence: `app/api/user/data/route.ts`)
- Profile data API → Visa charging: charges visa (evidence: `app/api/user/data/route.ts`)
- Promo codes UI → Promo services: uses status types (evidence: `app/bank/promo/PromoClient.tsx`)
- Daily farming → Supabase client: updates balance (evidence: `app/api/farm/route.ts`)
- Admin tax API → Supabase client: reads and writes (evidence: `app/api/admin/taxes/route.ts`)
- Admin dashboard → Admin tax API: manages taxes
- Taxes → Admin tax API: administers
- Promo services → Supabase client: uses database (evidence: `lib/promo.ts`)
- Referrals → Supabase client: uses database (evidence: `lib/referral.ts`)
