# sanya-shch/quorvia architecture

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

- Interactive diagram: https://gitdiagram.com/sanya-shch/quorvia
- Repository: https://github.com/sanya-shch/quorvia

## Overview

Quorvia lets form authors create and publish translated, conditional surveys; respondents complete them with autosaved progress; authors then inspect response and flow analytics and request downloadable exports. The React host serves the builder, dashboard, and respondent experience, while analytics are hosted in a Vue micro-frontend. The backend separates form management, attempts, submissions, analytics, and exports, with PostgreSQL and Redis-backed jobs. Some subsystem links below reflect README documentation because their implementation files were not sampled; those links cite the README.

Main entry points: [`backend/src/prisma/prisma.ts`](https://github.com/sanya-shch/quorvia/blob/main/backend/src/prisma/prisma.ts) (PostgreSQL data), [`react-frontend/src/routes.tsx`](https://github.com/sanya-shch/quorvia/blob/main/react-frontend/src/routes.tsx) (Application routes), [`react-frontend/src/pages/viewer/PublicFormPage.tsx`](https://github.com/sanya-shch/quorvia/blob/main/react-frontend/src/pages/viewer/PublicFormPage.tsx) (Public form flow), [`backend/src/modules/form/form.service.ts`](https://github.com/sanya-shch/quorvia/blob/main/backend/src/modules/form/form.service.ts) (Form management)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_frontend["React product experience"]
  node_react_routes["Application routes<br/>[routes.tsx]"]
  node_dashboard["Forms dashboard<br/>[Dashboard.tsx]"]
  node_builder["Form builder<br/>[FormBuilder.tsx]"]
  node_builder_state["Builder state<br/>[useFormBuilder.ts]"]
  node_public_form["Public form flow<br/>[PublicFormPage.tsx]"]
  node_viewer_autosave["Attempt autosave"]
  node_react_analytics["Analytics host"]
end

subgraph group_analytics_ui["Analytics interface"]
  node_vue_host["Vue analytics app<br/>[AnalyticsApp.vue]"]
  node_vue_api["Analytics API client<br/>[client.ts]"]
  node_analytics_views["Analytics views"]
end

subgraph group_api["Backend domain services"]
  node_auth["Authentication<br/>[auth.service.ts]"]
  node_form_service["Form management<br/>[form.service.ts]"]
  node_attempt["Attempt persistence<br/>[attempt.service.ts]"]
  node_attempt_schema["Attempt validation<br/>[attempt.schema.ts]"]
  node_response["Response submission"]
  node_analytics_service["Survey analytics"]
  node_export_service["Export jobs API<br/>[export.service.ts]"]
end

subgraph group_jobs["Async export processing"]
  node_export_worker["Export worker<br/>[export.worker.ts]"]
  node_exporters["Export formats"]
  node_queue["Job queue<br/>[export.queue.ts]"]
end

subgraph group_shared["Shared runtime and data"]
  node_database[("PostgreSQL data<br/>[prisma.ts]")]
  node_condition_engine["Condition engine<br/>[condition.ts]"]
  node_shared_contracts["Shared contracts<br/>[index.ts]"]
  node_middleware["API middleware<br/>[auth.ts]"]
  node_env["Runtime configuration<br/>[env.ts]"]
end

node_author(("Form author"))
node_respondent(("Respondent"))

node_author -->|"opens product"| node_react_routes
node_respondent -->|"opens survey"| node_react_routes
node_react_routes -->|"routes to"| node_dashboard
node_react_routes -->|"routes to"| node_builder
node_react_routes -->|"routes to"| node_public_form
node_react_routes -->|"routes to"| node_react_analytics
node_builder -.->|"uses state"| node_builder_state
node_builder_state -->|"validates conditions"| node_condition_engine
node_public_form -.->|"saves progress"| node_viewer_autosave
node_react_analytics -->|"hosts remote"| node_vue_host
node_vue_host -.->|"uses client"| node_vue_api
node_vue_api -.->|"requests analytics"| node_analytics_service
node_vue_host -.->|"renders views"| node_analytics_views
node_builder -.->|"manages forms"| node_form_service
node_public_form -.->|"loads published form"| node_form_service
node_public_form -->|"autosaves attempt"| node_attempt
node_public_form -.->|"submits answers"| node_response
node_author -->|"authenticates"| node_auth
node_auth -->|"reads and writes"| node_database
node_form_service -.->|"reads and writes"| node_database
node_attempt -->|"reads and writes"| node_database
node_attempt -->|"checks conditions"| node_condition_engine
node_response -.->|"persists responses"| node_database
node_analytics_service -.->|"queries responses"| node_database
node_author -.->|"requests export"| node_export_service
node_export_service -->|"enqueues job"| node_queue
node_export_service -->|"tracks jobs"| node_database
node_export_worker -.->|"consumes jobs"| node_queue
node_export_worker -.->|"generates file"| node_exporters
node_export_worker -.->|"reads response data"| node_database
node_attempt_schema -.->|"validates input"| node_attempt
node_middleware -->|"guards requests"| node_auth
node_form_service -.->|"uses contracts"| node_shared_contracts
node_env -->|"configures connection"| node_database

click node_react_routes "https://github.com/sanya-shch/quorvia/blob/main/react-frontend/src/routes.tsx"
click node_dashboard "https://github.com/sanya-shch/quorvia/blob/main/react-frontend/src/pages/dashboard/Dashboard.tsx"
click node_builder "https://github.com/sanya-shch/quorvia/blob/main/react-frontend/src/pages/builder/FormBuilder.tsx"
click node_builder_state "https://github.com/sanya-shch/quorvia/blob/main/react-frontend/src/pages/builder/hooks/useFormBuilder.ts"
click node_public_form "https://github.com/sanya-shch/quorvia/blob/main/react-frontend/src/pages/viewer/PublicFormPage.tsx"
click node_viewer_autosave "https://github.com/sanya-shch/quorvia/blob/main/react-frontend/src/pages/viewer/hooks/useAttemptAutosave.ts"
click node_react_analytics "https://github.com/sanya-shch/quorvia/blob/main/react-frontend/src/pages/analytics/FormAnalyticsPage.tsx"
click node_vue_host "https://github.com/sanya-shch/quorvia/blob/main/vue-analytics/src/AnalyticsApp.vue"
click node_vue_api "https://github.com/sanya-shch/quorvia/blob/main/vue-analytics/src/api/client.ts"
click node_analytics_views "https://github.com/sanya-shch/quorvia/blob/main/vue-analytics/src/components/QuestionOverviewCard.vue"
click node_auth "https://github.com/sanya-shch/quorvia/blob/main/backend/src/modules/auth/auth.service.ts"
click node_form_service "https://github.com/sanya-shch/quorvia/blob/main/backend/src/modules/form/form.service.ts"
click node_attempt "https://github.com/sanya-shch/quorvia/blob/main/backend/src/modules/attempt/attempt.service.ts"
click node_attempt_schema "https://github.com/sanya-shch/quorvia/blob/main/backend/src/modules/attempt/attempt.schema.ts"
click node_response "https://github.com/sanya-shch/quorvia/blob/main/backend/src/modules/response/response.service.ts"
click node_analytics_service "https://github.com/sanya-shch/quorvia/blob/main/backend/src/modules/analytics/analytics.service.ts"
click node_export_service "https://github.com/sanya-shch/quorvia/blob/main/backend/src/modules/export/export.service.ts"
click node_export_worker "https://github.com/sanya-shch/quorvia/blob/main/backend/src/modules/export/export.worker.ts"
click node_exporters "https://github.com/sanya-shch/quorvia/tree/main/backend/src/modules/export/exporters"
click node_queue "https://github.com/sanya-shch/quorvia/blob/main/backend/src/modules/export/export.queue.ts"
click node_database "https://github.com/sanya-shch/quorvia/blob/main/backend/src/prisma/prisma.ts"
click node_condition_engine "https://github.com/sanya-shch/quorvia/blob/main/packages/condition-engine/src/condition.ts"
click node_shared_contracts "https://github.com/sanya-shch/quorvia/blob/main/packages/shared-types/src/index.ts"
click node_middleware "https://github.com/sanya-shch/quorvia/blob/main/backend/src/shared/middleware/auth.ts"
click node_env "https://github.com/sanya-shch/quorvia/blob/main/backend/src/config/env.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_react_routes,node_dashboard,node_builder,node_builder_state,node_public_form,node_viewer_autosave,node_react_analytics toneBlue
class node_vue_host,node_vue_api,node_analytics_views toneAmber
class node_auth,node_form_service,node_attempt,node_attempt_schema,node_response,node_analytics_service,node_export_service toneMint
class node_export_worker,node_exporters,node_queue toneRose
class node_database,node_condition_engine,node_shared_contracts,node_middleware,node_env,node_author,node_respondent toneIndigo
```

## Components

### React product experience

- [Application routes](https://github.com/sanya-shch/quorvia/blob/main/react-frontend/src/routes.tsx): `react-frontend/src/routes.tsx`
- [Forms dashboard](https://github.com/sanya-shch/quorvia/blob/main/react-frontend/src/pages/dashboard/Dashboard.tsx): `react-frontend/src/pages/dashboard/Dashboard.tsx`
- [Form builder](https://github.com/sanya-shch/quorvia/blob/main/react-frontend/src/pages/builder/FormBuilder.tsx): `react-frontend/src/pages/builder/FormBuilder.tsx`
- [Builder state](https://github.com/sanya-shch/quorvia/blob/main/react-frontend/src/pages/builder/hooks/useFormBuilder.ts): `react-frontend/src/pages/builder/hooks/useFormBuilder.ts`
- [Public form flow](https://github.com/sanya-shch/quorvia/blob/main/react-frontend/src/pages/viewer/PublicFormPage.tsx): `react-frontend/src/pages/viewer/PublicFormPage.tsx`
- [Attempt autosave](https://github.com/sanya-shch/quorvia/blob/main/react-frontend/src/pages/viewer/hooks/useAttemptAutosave.ts): `react-frontend/src/pages/viewer/hooks/useAttemptAutosave.ts`
- [Analytics host](https://github.com/sanya-shch/quorvia/blob/main/react-frontend/src/pages/analytics/FormAnalyticsPage.tsx): `react-frontend/src/pages/analytics/FormAnalyticsPage.tsx`

### Analytics interface

- [Vue analytics app](https://github.com/sanya-shch/quorvia/blob/main/vue-analytics/src/AnalyticsApp.vue): `vue-analytics/src/AnalyticsApp.vue`
- [Analytics API client](https://github.com/sanya-shch/quorvia/blob/main/vue-analytics/src/api/client.ts): `vue-analytics/src/api/client.ts`
- [Analytics views](https://github.com/sanya-shch/quorvia/blob/main/vue-analytics/src/components/QuestionOverviewCard.vue): `vue-analytics/src/components/QuestionOverviewCard.vue`

### Backend domain services

- [Authentication](https://github.com/sanya-shch/quorvia/blob/main/backend/src/modules/auth/auth.service.ts): `backend/src/modules/auth/auth.service.ts`
- [Form management](https://github.com/sanya-shch/quorvia/blob/main/backend/src/modules/form/form.service.ts): `backend/src/modules/form/form.service.ts`
- [Attempt persistence](https://github.com/sanya-shch/quorvia/blob/main/backend/src/modules/attempt/attempt.service.ts): `backend/src/modules/attempt/attempt.service.ts`
- [Attempt validation](https://github.com/sanya-shch/quorvia/blob/main/backend/src/modules/attempt/attempt.schema.ts): `backend/src/modules/attempt/attempt.schema.ts`
- [Response submission](https://github.com/sanya-shch/quorvia/blob/main/backend/src/modules/response/response.service.ts): `backend/src/modules/response/response.service.ts`
- [Survey analytics](https://github.com/sanya-shch/quorvia/blob/main/backend/src/modules/analytics/analytics.service.ts): `backend/src/modules/analytics/analytics.service.ts`
- [Export jobs API](https://github.com/sanya-shch/quorvia/blob/main/backend/src/modules/export/export.service.ts): `backend/src/modules/export/export.service.ts`

### Async export processing

- [Export worker](https://github.com/sanya-shch/quorvia/blob/main/backend/src/modules/export/export.worker.ts): `backend/src/modules/export/export.worker.ts`
- [Export formats](https://github.com/sanya-shch/quorvia/tree/main/backend/src/modules/export/exporters): `backend/src/modules/export/exporters`
- [Job queue](https://github.com/sanya-shch/quorvia/blob/main/backend/src/modules/export/export.queue.ts): `backend/src/modules/export/export.queue.ts`

### Shared runtime and data

- [PostgreSQL data](https://github.com/sanya-shch/quorvia/blob/main/backend/src/prisma/prisma.ts): `backend/src/prisma/prisma.ts`
- [Condition engine](https://github.com/sanya-shch/quorvia/blob/main/packages/condition-engine/src/condition.ts): `packages/condition-engine/src/condition.ts`
- [Shared contracts](https://github.com/sanya-shch/quorvia/blob/main/packages/shared-types/src/index.ts): `packages/shared-types/src/index.ts`
- [API middleware](https://github.com/sanya-shch/quorvia/blob/main/backend/src/shared/middleware/auth.ts): `backend/src/shared/middleware/auth.ts`
- [Runtime configuration](https://github.com/sanya-shch/quorvia/blob/main/backend/src/config/env.ts): `backend/src/config/env.ts`

### Other components

- **Form author**
- **Respondent**

## Connections

- Form author → Application routes: opens product (evidence: `react-frontend/src/routes.tsx`)
- Respondent → Application routes: opens survey (evidence: `react-frontend/src/routes.tsx`)
- Application routes → Forms dashboard: routes to (evidence: `react-frontend/src/routes.tsx`)
- Application routes → Form builder: routes to (evidence: `react-frontend/src/routes.tsx`)
- Application routes → Public form flow: routes to (evidence: `react-frontend/src/routes.tsx`)
- Application routes → Analytics host: routes to (evidence: `react-frontend/src/routes.tsx`)
- Form builder → Builder state: uses state
- Builder state → Condition engine: validates conditions (evidence: `react-frontend/src/pages/builder/hooks/useFormBuilder.ts`)
- Public form flow → Attempt autosave: saves progress
- Analytics host → Vue analytics app: hosts remote (evidence: `README.md`)
- Vue analytics app → Analytics API client: uses client
- Analytics API client → Survey analytics: requests analytics
- Vue analytics app → Analytics views: renders views
- Form builder → Form management: manages forms
- Public form flow → Form management: loads published form
- Public form flow → Attempt persistence: autosaves attempt
- Public form flow → Response submission: submits answers
- Form author → Authentication: authenticates (evidence: `README.md`)
- Authentication → PostgreSQL data: reads and writes (evidence: `backend/src/modules/auth/auth.service.ts`)
- Form management → PostgreSQL data: reads and writes
- Attempt persistence → PostgreSQL data: reads and writes (evidence: `backend/src/modules/attempt/attempt.service.ts`)
- Attempt persistence → Condition engine: checks conditions (evidence: `backend/src/modules/attempt/attempt.service.ts`)
- Response submission → PostgreSQL data: persists responses
- Survey analytics → PostgreSQL data: queries responses
- Form author → Export jobs API: requests export
- Export jobs API → Job queue: enqueues job (evidence: `backend/src/modules/export/export.service.ts`)
- Export jobs API → PostgreSQL data: tracks jobs (evidence: `backend/src/modules/export/export.service.ts`)
- Export worker → Job queue: consumes jobs
- Export worker → Export formats: generates file
- Export worker → PostgreSQL data: reads response data
- Attempt validation → Attempt persistence: validates input
- API middleware → Authentication: guards requests
- Form management → Shared contracts: uses contracts
- Runtime configuration → PostgreSQL data: configures connection (evidence: `backend/src/prisma/prisma.ts`)
