# ganesh714/arc architecture

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

- Interactive diagram: https://gitdiagram.com/ganesh714/arc
- Repository: https://github.com/ganesh714/arc

## Overview

Arqulat Arc is a collaborative diagramming workspace. Users create or open projects and diagram files, edit diagrams on a canvas, and save versioned work; they can also collaborate live, use AI-assisted design, and import or export diagrams. The frontend and Spring backend divide editing/UI from project, file, AI, and collaboration services. The tree and README establish major capabilities; sampled code confirms file version handling, JWT checks, export rendering, and AI provider fallback, but not every frontend-to-API call.

Main entry points: [`frontend/src/App.tsx`](https://github.com/ganesh714/arc/blob/main/frontend/src/App.tsx) (App shell), [`backend/src/main/java/com/arqulat/loom_backend/service/FileService.java`](https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/service/FileService.java) (File and version service), [`frontend/src/features/dashboard/Dashboard.tsx`](https://github.com/ganesh714/arc/blob/main/frontend/src/features/dashboard/Dashboard.tsx) (Project dashboard), [`frontend/src/features/diagram/components/Canvas.tsx`](https://github.com/ganesh714/arc/blob/main/frontend/src/features/diagram/components/Canvas.tsx) (Diagram canvas)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_frontend["Workspace frontend"]
  node_app["App shell<br/>[App.tsx]"]
  node_dashboard["Project dashboard<br/>[Dashboard.tsx]"]
  node_diagramctx["Diagram state<br/>[DiagramContext.tsx]"]
  node_canvas["Diagram canvas<br/>[Canvas.tsx]"]
  node_authctx["Session state<br/>[AuthContext.tsx]"]
  node_collabctx["Collaboration client"]
  node_import["Diagram import<br/>[ImportModal.tsx]"]
  node_export["Diagram export<br/>[exportEngine.ts]"]
  node_svgexport["SVG export<br/>[svgExportEngine.ts]"]
end

subgraph group_projects["Projects and files"]
  node_projectapi["Project API"]
  node_projectservice["Project service"]
  node_fileapi["Diagram file API"]
  node_fileservice["File and version service<br/>[FileService.java]"]
  node_projectrepo["Project repository"]
  node_filerepo["File repositories"]
  node_versionrepo["Version repository"]
  node_database[("Persistent data<br/>[DiagramFile.java]")]
end

subgraph group_collaboration["Live collaboration"]
  node_collabapi["Collaboration endpoint"]
  node_wsconfig["WebSocket broker"]
end

subgraph group_ai["AI design"]
  node_aiapi["AI endpoint<br/>[AIController.java]"]
  node_aiservice["AI service<br/>[AIService.java]"]
  node_fallback["Provider fallback"]
  node_orchestrator["Agent orchestration"]
  node_providers["AI providers<br/>[AIProvider.java]"]
end

subgraph group_platform["Backend platform"]
  node_jwt["JWT validation<br/>[JwtService.java]"]
  node_redis[("Redis blacklist")]
  node_authdb[("Token blacklist data")]
end

node_user(("Workspace user"))
node_aihost(("AI provider services"))

node_user -->|"uses workspace"| node_app
node_app -->|"loads session"| node_authctx
node_app -->|"opens dashboard"| node_dashboard
node_app -->|"opens editor"| node_canvas
node_canvas -->|"reads and updates"| node_diagramctx
node_user -->|"organizes projects"| node_dashboard
node_dashboard -->|"manages projects"| node_projectapi
node_projectapi -->|"delegates"| node_projectservice
node_projectservice -->|"reads and writes"| node_projectrepo
node_user -->|"edits diagram"| node_canvas
node_user -->|"imports diagram"| node_import
node_user -->|"exports diagram"| node_export
node_export -.->|"uses SVG renderer"| node_svgexport
node_export -->|"renders shapes"| node_canvas
node_dashboard -->|"manages files"| node_fileapi
node_fileapi -->|"delegates"| node_fileservice
node_fileservice -->|"checks ownership"| node_projectservice
node_fileservice -->|"reads and writes"| node_filerepo
node_fileservice -->|"reads and writes versions"| node_versionrepo
node_filerepo -->|"persists files"| node_database
node_versionrepo -->|"persists snapshots"| node_database
node_user -->|"joins collaboration"| node_collabctx
node_collabctx -->|"sends shared actions"| node_collabapi
node_collabapi -->|"dispatches messages"| node_wsconfig
node_wsconfig -->|"broadcasts updates"| node_collabctx
node_user -->|"requests AI design"| node_aiapi
node_aiapi -->|"delegates generation"| node_aiservice
node_aiservice -->|"selects provider"| node_fallback
node_fallback -->|"tries providers"| node_providers
node_providers -.->|"requests generation"| node_aihost
node_aiapi -->|"starts agent run"| node_orchestrator
node_orchestrator -->|"requests agent passes"| node_fallback
node_authctx -->|"authenticates requests"| node_jwt
node_jwt -->|"checks blacklist"| node_redis
node_jwt -->|"falls back to blacklist"| node_authdb

click node_app "https://github.com/ganesh714/arc/blob/main/frontend/src/App.tsx"
click node_dashboard "https://github.com/ganesh714/arc/blob/main/frontend/src/features/dashboard/Dashboard.tsx"
click node_diagramctx "https://github.com/ganesh714/arc/blob/main/frontend/src/context/DiagramContext.tsx"
click node_canvas "https://github.com/ganesh714/arc/blob/main/frontend/src/features/diagram/components/Canvas.tsx"
click node_authctx "https://github.com/ganesh714/arc/blob/main/frontend/src/context/AuthContext.tsx"
click node_collabctx "https://github.com/ganesh714/arc/blob/main/frontend/src/context/CollaborationContext.tsx"
click node_import "https://github.com/ganesh714/arc/blob/main/frontend/src/components/ui/ImportModal.tsx"
click node_export "https://github.com/ganesh714/arc/blob/main/frontend/src/utils/exportEngine.ts"
click node_svgexport "https://github.com/ganesh714/arc/blob/main/frontend/src/utils/svgExportEngine.ts"
click node_projectapi "https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/controller/ProjectController.java"
click node_projectservice "https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/service/ProjectService.java"
click node_fileapi "https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/controller/FileController.java"
click node_fileservice "https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/service/FileService.java"
click node_projectrepo "https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/repository/ProjectRepository.java"
click node_filerepo "https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/repository/DiagramFileRepository.java"
click node_versionrepo "https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/repository/DiagramFileVersionRepository.java"
click node_database "https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/model/DiagramFile.java"
click node_collabapi "https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/controller/CollaborationController.java"
click node_wsconfig "https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/config/WebSocketConfig.java"
click node_aiapi "https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/controller/AIController.java"
click node_aiservice "https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/service/AIService.java"
click node_fallback "https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/service/ai/AIFallbackRingManager.java"
click node_orchestrator "https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/service/ai/AgentOrchestrator.java"
click node_providers "https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/service/ai/providers/AIProvider.java"
click node_jwt "https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/security/JwtService.java"

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_app,node_dashboard,node_diagramctx,node_canvas,node_authctx,node_collabctx,node_import,node_export,node_svgexport,node_user toneBlue
class node_projectapi,node_projectservice,node_fileapi,node_fileservice,node_projectrepo,node_filerepo,node_versionrepo,node_database toneAmber
class node_collabapi,node_wsconfig toneMint
class node_aiapi,node_aiservice,node_fallback,node_orchestrator,node_providers toneRose
class node_jwt,node_redis,node_authdb,node_aihost toneIndigo
```

## Components

### Workspace frontend

- [App shell](https://github.com/ganesh714/arc/blob/main/frontend/src/App.tsx): `frontend/src/App.tsx`
- [Project dashboard](https://github.com/ganesh714/arc/blob/main/frontend/src/features/dashboard/Dashboard.tsx): `frontend/src/features/dashboard/Dashboard.tsx`
- [Diagram state](https://github.com/ganesh714/arc/blob/main/frontend/src/context/DiagramContext.tsx): `frontend/src/context/DiagramContext.tsx`
- [Diagram canvas](https://github.com/ganesh714/arc/blob/main/frontend/src/features/diagram/components/Canvas.tsx): `frontend/src/features/diagram/components/Canvas.tsx`
- [Session state](https://github.com/ganesh714/arc/blob/main/frontend/src/context/AuthContext.tsx): `frontend/src/context/AuthContext.tsx`
- [Collaboration client](https://github.com/ganesh714/arc/blob/main/frontend/src/context/CollaborationContext.tsx): `frontend/src/context/CollaborationContext.tsx`
- [Diagram import](https://github.com/ganesh714/arc/blob/main/frontend/src/components/ui/ImportModal.tsx): `frontend/src/components/ui/ImportModal.tsx`
- [Diagram export](https://github.com/ganesh714/arc/blob/main/frontend/src/utils/exportEngine.ts): `frontend/src/utils/exportEngine.ts`
- [SVG export](https://github.com/ganesh714/arc/blob/main/frontend/src/utils/svgExportEngine.ts): `frontend/src/utils/svgExportEngine.ts`

### Projects and files

- [Project API](https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/controller/ProjectController.java): `backend/src/main/java/com/arqulat/loom_backend/controller/ProjectController.java`
- [Project service](https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/service/ProjectService.java): `backend/src/main/java/com/arqulat/loom_backend/service/ProjectService.java`
- [Diagram file API](https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/controller/FileController.java): `backend/src/main/java/com/arqulat/loom_backend/controller/FileController.java`
- [File and version service](https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/service/FileService.java): `backend/src/main/java/com/arqulat/loom_backend/service/FileService.java`
- [Project repository](https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/repository/ProjectRepository.java): `backend/src/main/java/com/arqulat/loom_backend/repository/ProjectRepository.java`
- [File repositories](https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/repository/DiagramFileRepository.java): `backend/src/main/java/com/arqulat/loom_backend/repository/DiagramFileRepository.java`
- [Version repository](https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/repository/DiagramFileVersionRepository.java): `backend/src/main/java/com/arqulat/loom_backend/repository/DiagramFileVersionRepository.java`
- [Persistent data](https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/model/DiagramFile.java): `backend/src/main/java/com/arqulat/loom_backend/model/DiagramFile.java`

### Live collaboration

- [Collaboration endpoint](https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/controller/CollaborationController.java): `backend/src/main/java/com/arqulat/loom_backend/controller/CollaborationController.java`
- [WebSocket broker](https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/config/WebSocketConfig.java): `backend/src/main/java/com/arqulat/loom_backend/config/WebSocketConfig.java`

### AI design

- [AI endpoint](https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/controller/AIController.java): `backend/src/main/java/com/arqulat/loom_backend/controller/AIController.java`
- [AI service](https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/service/AIService.java): `backend/src/main/java/com/arqulat/loom_backend/service/AIService.java`
- [Provider fallback](https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/service/ai/AIFallbackRingManager.java): `backend/src/main/java/com/arqulat/loom_backend/service/ai/AIFallbackRingManager.java`
- [Agent orchestration](https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/service/ai/AgentOrchestrator.java): `backend/src/main/java/com/arqulat/loom_backend/service/ai/AgentOrchestrator.java`
- [AI providers](https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/service/ai/providers/AIProvider.java): `backend/src/main/java/com/arqulat/loom_backend/service/ai/providers/AIProvider.java`

### Backend platform

- [JWT validation](https://github.com/ganesh714/arc/blob/main/backend/src/main/java/com/arqulat/loom_backend/security/JwtService.java): `backend/src/main/java/com/arqulat/loom_backend/security/JwtService.java`
- **Redis blacklist**
- **Token blacklist data**

### Other components

- **Workspace user**
- **AI provider services**

## Connections

- Workspace user → App shell: uses workspace
- App shell → Session state: loads session
- App shell → Project dashboard: opens dashboard
- App shell → Diagram canvas: opens editor
- Diagram canvas → Diagram state: reads and updates
- Workspace user → Project dashboard: organizes projects
- Project dashboard → Project API: manages projects
- Project API → Project service: delegates
- Project service → Project repository: reads and writes
- Workspace user → Diagram canvas: edits diagram
- Workspace user → Diagram import: imports diagram
- Workspace user → Diagram export: exports diagram
- Diagram export → SVG export: uses SVG renderer
- Diagram export → Diagram canvas: renders shapes
- Project dashboard → Diagram file API: manages files
- Diagram file API → File and version service: delegates
- File and version service → Project service: checks ownership
- File and version service → File repositories: reads and writes
- File and version service → Version repository: reads and writes versions
- File repositories → Persistent data: persists files
- Version repository → Persistent data: persists snapshots
- Workspace user → Collaboration client: joins collaboration
- Collaboration client → Collaboration endpoint: sends shared actions
- Collaboration endpoint → WebSocket broker: dispatches messages
- WebSocket broker → Collaboration client: broadcasts updates
- Workspace user → AI endpoint: requests AI design
- AI endpoint → AI service: delegates generation
- AI service → Provider fallback: selects provider
- Provider fallback → AI providers: tries providers
- AI providers → AI provider services: requests generation
- AI endpoint → Agent orchestration: starts agent run
- Agent orchestration → Provider fallback: requests agent passes
- Session state → JWT validation: authenticates requests
- JWT validation → Redis blacklist: checks blacklist
- JWT validation → Token blacklist data: falls back to blacklist
