# noma-foundation/solvi architecture

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

- Interactive diagram: https://gitdiagram.com/noma-foundation/solvi
- Repository: https://github.com/noma-foundation/solvi

## Overview

Solvi is an internal desktop CRM for service teams. The visible workflow starts at employee login, then opens the home view; the navigation context registers customer, calendar, notification, and movement/inbox views. Customer management splits into client-list/add and selected-client detail/edit/delete flows, with components exchanging events and calling a desktop API bridge. The README also documents appointment validation, budgets, and financial entries, but their implementations are not present in the supplied tree. Backend internals are likewise unavailable, so those connections are shown only where documented or visibly invoked.

Main entry points: [`frontend/framework/event-bus.js`](https://github.com/noma-foundation/solvi/blob/main/frontend/framework/event-bus.js) (Event bus), [`frontend/src/utils/context-manager.js`](https://github.com/noma-foundation/solvi/blob/main/frontend/src/utils/context-manager.js) (View context), [`frontend/src/components/customer-control-panel/customer-control-panel.js`](https://github.com/noma-foundation/solvi/blob/main/frontend/src/components/customer-control-panel/customer-control-panel.js) (Client list), [`frontend/src/components/customer-detail-panel/customer-detail-panel.js`](https://github.com/noma-foundation/solvi/blob/main/frontend/src/components/customer-detail-panel/customer-detail-panel.js) (Client details)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["Application shell"]
  node_main["App startup<br/>[main.js]"]
  node_login["Login page<br/>[login-page.js]"]
  node_context["View context<br/>[context-manager.js]"]
  node_menu["Menu bar<br/>[menu-bar.js]"]
  node_home["Dashboard<br/>[dashboard.js]"]
end

subgraph group_customer["Customer management"]
  node_customers["Customer page<br/>[customer.js]"]
  node_customerlist["Client list"]
  node_customerdetail["Client details"]
  node_record["Client records<br/>[customer-record.js]"]
  node_loading["Loading states<br/>[loading-state.js]"]
end

subgraph group_framework["UI framework"]
  node_events["Event bus<br/>[event-bus.js]"]
  node_eventlist["Event list<br/>[event-list.js]"]
  node_history["Event history<br/>[history.js]"]
  node_componentmodel["Component model<br/>[component-model.js]"]
end

subgraph group_operations["Service operations"]
  node_calendar["Activity calendar<br/>[calendar-page.js]"]
  node_notifications["Notifications"]
  node_inbox["Inbox / movement<br/>[movement-page.js]"]
  node_backend["Backend API"]
  node_budgets["Budget approval"]
  node_finance["Financial entries"]
end

node_employee(("Employee"))
node_database[("PostgreSQL")]
node_desktopapi["Desktop API bridge"]

node_employee -->|"enters credentials"| node_login
node_main -->|"creates"| node_login
node_login -->|"authenticates"| node_backend
node_login -->|"publishes success"| node_events
node_main -->|"subscribes"| node_events
node_main -->|"opens home"| node_context
node_context -->|"renders view"| node_home
node_context -->|"registers view"| node_customers
node_context -->|"registers view"| node_calendar
node_context -->|"registers view"| node_notifications
node_context -->|"registers view"| node_inbox
node_context -->|"creates layout"| node_menu
node_customers -->|"creates panel"| node_customerlist
node_customers -->|"creates panel"| node_customerdetail
node_customerlist -->|"loads and adds"| node_desktopapi
node_customerdetail -->|"edits and deletes"| node_desktopapi
node_customerlist -->|"normalizes clients"| node_record
node_customerdetail -->|"normalizes client"| node_record
node_customerlist -->|"shows loading"| node_loading
node_customerdetail -->|"shows loading"| node_loading
node_customerlist -->|"publishes selection"| node_events
node_customerdetail -->|"publishes updates"| node_events
node_events -->|"notifies changes"| node_customerlist
node_events -->|"notifies selection"| node_customerdetail
node_events -->|"stores listeners"| node_eventlist
node_events -->|"records subscriptions"| node_history
node_componentmodel -.->|"provides base"| node_customers
node_backend -.->|"uses PostgreSQL"| node_database
node_backend -.->|"supports approval"| node_budgets
node_backend -.->|"supports entries"| node_finance

click node_main "https://github.com/noma-foundation/solvi/blob/main/frontend/src/main.js"
click node_login "https://github.com/noma-foundation/solvi/blob/main/frontend/src/components/login-page/login-page.js"
click node_context "https://github.com/noma-foundation/solvi/blob/main/frontend/src/utils/context-manager.js"
click node_menu "https://github.com/noma-foundation/solvi/blob/main/frontend/src/components/menu-bar/menu-bar.js"
click node_home "https://github.com/noma-foundation/solvi/blob/main/frontend/src/components/dashboard/dashboard.js"
click node_customers "https://github.com/noma-foundation/solvi/blob/main/frontend/src/components/customer/customer.js"
click node_customerlist "https://github.com/noma-foundation/solvi/blob/main/frontend/src/components/customer-control-panel/customer-control-panel.js"
click node_customerdetail "https://github.com/noma-foundation/solvi/blob/main/frontend/src/components/customer-detail-panel/customer-detail-panel.js"
click node_record "https://github.com/noma-foundation/solvi/blob/main/frontend/src/utils/customer-record.js"
click node_loading "https://github.com/noma-foundation/solvi/blob/main/frontend/src/utils/loading-state.js"
click node_events "https://github.com/noma-foundation/solvi/blob/main/frontend/framework/event-bus.js"
click node_eventlist "https://github.com/noma-foundation/solvi/blob/main/frontend/framework/collections/event-list.js"
click node_history "https://github.com/noma-foundation/solvi/blob/main/frontend/framework/collections/history.js"
click node_componentmodel "https://github.com/noma-foundation/solvi/blob/main/frontend/framework/interfaces/component-model.js"
click node_calendar "https://github.com/noma-foundation/solvi/blob/main/frontend/src/views/calendar-page.js"
click node_notifications "https://github.com/noma-foundation/solvi/blob/main/frontend/src/views/notification-page.js"
click node_inbox "https://github.com/noma-foundation/solvi/blob/main/frontend/src/views/movement-page.js"
click node_backend "https://github.com/noma-foundation/solvi/tree/main/backend"
click node_budgets "https://github.com/noma-foundation/solvi/tree/main/backend"
click node_finance "https://github.com/noma-foundation/solvi/tree/main/backend"

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_main,node_login,node_context,node_menu,node_home toneBlue
class node_customers,node_customerlist,node_customerdetail,node_record,node_loading,node_database toneAmber
class node_events,node_eventlist,node_history,node_componentmodel,node_desktopapi toneMint
class node_calendar,node_notifications,node_inbox,node_backend,node_budgets,node_finance toneRose
class node_employee toneIndigo
```

## Components

### Application shell

- [App startup](https://github.com/noma-foundation/solvi/blob/main/frontend/src/main.js): `frontend/src/main.js`
- [Login page](https://github.com/noma-foundation/solvi/blob/main/frontend/src/components/login-page/login-page.js): `frontend/src/components/login-page/login-page.js`
- [View context](https://github.com/noma-foundation/solvi/blob/main/frontend/src/utils/context-manager.js): `frontend/src/utils/context-manager.js`
- [Menu bar](https://github.com/noma-foundation/solvi/blob/main/frontend/src/components/menu-bar/menu-bar.js): `frontend/src/components/menu-bar/menu-bar.js`
- [Dashboard](https://github.com/noma-foundation/solvi/blob/main/frontend/src/components/dashboard/dashboard.js): `frontend/src/components/dashboard/dashboard.js`

### Customer management

- [Customer page](https://github.com/noma-foundation/solvi/blob/main/frontend/src/components/customer/customer.js): `frontend/src/components/customer/customer.js`
- [Client list](https://github.com/noma-foundation/solvi/blob/main/frontend/src/components/customer-control-panel/customer-control-panel.js): `frontend/src/components/customer-control-panel/customer-control-panel.js`
- [Client details](https://github.com/noma-foundation/solvi/blob/main/frontend/src/components/customer-detail-panel/customer-detail-panel.js): `frontend/src/components/customer-detail-panel/customer-detail-panel.js`
- [Client records](https://github.com/noma-foundation/solvi/blob/main/frontend/src/utils/customer-record.js): `frontend/src/utils/customer-record.js`
- [Loading states](https://github.com/noma-foundation/solvi/blob/main/frontend/src/utils/loading-state.js): `frontend/src/utils/loading-state.js`

### UI framework

- [Event bus](https://github.com/noma-foundation/solvi/blob/main/frontend/framework/event-bus.js): `frontend/framework/event-bus.js`
- [Event list](https://github.com/noma-foundation/solvi/blob/main/frontend/framework/collections/event-list.js): `frontend/framework/collections/event-list.js`
- [Event history](https://github.com/noma-foundation/solvi/blob/main/frontend/framework/collections/history.js): `frontend/framework/collections/history.js`
- [Component model](https://github.com/noma-foundation/solvi/blob/main/frontend/framework/interfaces/component-model.js): `frontend/framework/interfaces/component-model.js`

### Service operations

- [Activity calendar](https://github.com/noma-foundation/solvi/blob/main/frontend/src/views/calendar-page.js): `frontend/src/views/calendar-page.js`
- [Notifications](https://github.com/noma-foundation/solvi/blob/main/frontend/src/views/notification-page.js): `frontend/src/views/notification-page.js`
- [Inbox / movement](https://github.com/noma-foundation/solvi/blob/main/frontend/src/views/movement-page.js): `frontend/src/views/movement-page.js`
- [Backend API](https://github.com/noma-foundation/solvi/tree/main/backend): `backend`
- [Budget approval](https://github.com/noma-foundation/solvi/tree/main/backend): `backend`
- [Financial entries](https://github.com/noma-foundation/solvi/tree/main/backend): `backend`

### Other components

- **Employee**
- **PostgreSQL**
- **Desktop API bridge**

## Connections

- Employee → Login page: enters credentials (evidence: `frontend/src/components/login-page/login-page.js`)
- App startup → Login page: creates (evidence: `frontend/src/main.js`)
- Login page → Backend API: authenticates (evidence: `frontend/src/components/login-page/login-page.js`)
- Login page → Event bus: publishes success (evidence: `frontend/src/components/login-page/login-page.js`)
- App startup → Event bus: subscribes (evidence: `frontend/src/main.js`)
- App startup → View context: opens home (evidence: `frontend/src/main.js`)
- View context → Dashboard: renders view (evidence: `frontend/src/utils/context-manager.js`)
- View context → Customer page: registers view (evidence: `frontend/src/utils/context-manager.js`)
- View context → Activity calendar: registers view (evidence: `frontend/src/utils/context-manager.js`)
- View context → Notifications: registers view (evidence: `frontend/src/utils/context-manager.js`)
- View context → Inbox / movement: registers view (evidence: `frontend/src/utils/context-manager.js`)
- View context → Menu bar: creates layout (evidence: `frontend/src/utils/context-manager.js`)
- Customer page → Client list: creates panel (evidence: `frontend/src/components/customer/customer.js`)
- Customer page → Client details: creates panel (evidence: `frontend/src/components/customer/customer.js`)
- Client list → Desktop API bridge: loads and adds (evidence: `frontend/src/components/customer-control-panel/customer-control-panel.js`)
- Client details → Desktop API bridge: edits and deletes (evidence: `frontend/src/components/customer-detail-panel/customer-detail-panel.js`)
- Client list → Client records: normalizes clients (evidence: `frontend/src/components/customer-control-panel/customer-control-panel.js`)
- Client details → Client records: normalizes client (evidence: `frontend/src/components/customer-detail-panel/customer-detail-panel.js`)
- Client list → Loading states: shows loading (evidence: `frontend/src/components/customer-control-panel/customer-control-panel.js`)
- Client details → Loading states: shows loading (evidence: `frontend/src/components/customer-detail-panel/customer-detail-panel.js`)
- Client list → Event bus: publishes selection (evidence: `frontend/src/components/customer-control-panel/customer-control-panel.js`)
- Client details → Event bus: publishes updates (evidence: `frontend/src/components/customer-detail-panel/customer-detail-panel.js`)
- Event bus → Client list: notifies changes (evidence: `frontend/src/components/customer-control-panel/customer-control-panel.js`)
- Event bus → Client details: notifies selection (evidence: `frontend/src/components/customer-detail-panel/customer-detail-panel.js`)
- Event bus → Event list: stores listeners (evidence: `frontend/framework/event-bus.js`)
- Event bus → Event history: records subscriptions (evidence: `frontend/framework/event-bus.js`)
- Component model → Customer page: provides base (evidence: `frontend/src/components/customer/customer.js`)
- Backend API → PostgreSQL: uses PostgreSQL (evidence: `README.md`)
- Backend API → Budget approval: supports approval (evidence: `README.md`)
- Backend API → Financial entries: supports entries (evidence: `README.md`)
