# opf/openproject architecture

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

- Interactive diagram: https://gitdiagram.com/opf/openproject
- Repository: https://github.com/opf/openproject

## Overview

OpenProject is a self-hosted project-management and team-collaboration platform. A representative workflow is a user configuring work-package query parameters, which the backend parses and applies to a query; the query layer then supplies results for API representation. The tree and README also identify project/portfolio, agile, scheduling, time/cost, collaboration, and integration capabilities. The sampled sources establish query transformations, Gantt query generation, and selected frontend interactions, but do not show the full request-to-result orchestration or most feature implementations.

Main entry points: [`frontend/src/stimulus/controllers/dynamic/admin/type-form-configuration/main.controller.ts`](https://github.com/opf/openproject/blob/dev/frontend/src/stimulus/controllers/dynamic/admin/type-form-configuration/main.controller.ts) (Query configuration UI), [`app/services/projects/gantt_query_generator_service.rb`](https://github.com/opf/openproject/blob/dev/app/services/projects/gantt_query_generator_service.rb) (Gantt query generation), [`app/services/api/v3/parse_query_params_service.rb`](https://github.com/opf/openproject/blob/dev/app/services/api/v3/parse_query_params_service.rb) (Query parameter parsing), [`app/services/update_query_from_params_service.rb`](https://github.com/opf/openproject/blob/dev/app/services/update_query_from_params_service.rb) (Query updates)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_work["Work management"]
  node_projects["Projects and portfolios"]
  node_workpackages["Work packages"]
  node_agile["Agile workflows"]
  node_timecost["Time and costs"]
end

subgraph group_query["Query and scheduling"]
  node_queryui["Query configuration UI<br/>[main.controller.ts]"]
  node_parse["Query parameter parsing"]
  node_update["Query updates"]
  node_defaults["Default work queries"]
  node_gantt["Gantt query generation"]
  node_api["Work-package API results"]
  node_ganttsettings[("Saved Gantt settings")]
end

subgraph group_collab["Team collaboration"]
  node_collaboration["Team collaboration"]
  node_meetings["Meetings and minutes<br/>[meetings.rb]"]
  node_integrations["External integrations"]
end

subgraph group_ui["Application interface"]
  node_navigation["Main navigation<br/>[main.controller.ts]"]
  node_dragdrop["Drag and drop"]
  node_rails["Turbo request service"]
end

node_user(("Team member"))

node_user -->|"configures query"| node_queryui
node_queryui -->|"sends updates"| node_rails
node_queryui -->|"submits query parameters"| node_parse
node_parse -->|"normalizes parameters"| node_update
node_update -->|"updates query"| node_api
node_api -->|"returns results"| node_user
node_defaults -->|"provides query presets"| node_queryui
node_user -->|"requests project schedule"| node_gantt
node_gantt -->|"reads settings"| node_ganttsettings
node_gantt -->|"generates query properties"| node_api
node_user -->|"manages projects"| node_projects
node_user -->|"manages work"| node_workpackages
node_user -->|"uses agile workflows"| node_agile
node_user -->|"tracks effort and cost"| node_timecost
node_user -->|"collaborates"| node_collaboration
node_user -->|"coordinates meetings"| node_meetings
node_user -->|"configures integrations"| node_integrations
node_user -->|"navigates"| node_navigation
node_user -->|"reorders items"| node_dragdrop
node_dragdrop -->|"sends position update"| node_rails

click node_projects "https://github.com/opf/openproject/tree/dev/app/components/projects"
click node_workpackages "https://github.com/opf/openproject/blob/dev/app/components/open_project/common/work_package_card_component.rb"
click node_agile "https://github.com/opf/openproject/tree/dev/app/components/projects/settings/work_packages/types"
click node_queryui "https://github.com/opf/openproject/blob/dev/frontend/src/stimulus/controllers/dynamic/admin/type-form-configuration/main.controller.ts"
click node_parse "https://github.com/opf/openproject/blob/dev/app/services/api/v3/parse_query_params_service.rb"
click node_update "https://github.com/opf/openproject/blob/dev/app/services/update_query_from_params_service.rb"
click node_defaults "https://github.com/opf/openproject/blob/dev/app/services/work_packages/default_query_generator_service.rb"
click node_gantt "https://github.com/opf/openproject/blob/dev/app/services/projects/gantt_query_generator_service.rb"
click node_collaboration "https://github.com/opf/openproject/tree/dev/app/components/activities"
click node_meetings "https://github.com/opf/openproject/blob/dev/app/components/homescreen/blocks/meetings.rb"
click node_integrations "https://github.com/opf/openproject/blob/dev/modules/storages/app/controllers/storages/admin/storages_controller.rb"
click node_navigation "https://github.com/opf/openproject/blob/dev/frontend/src/stimulus/controllers/dynamic/menus/main.controller.ts"
click node_dragdrop "https://github.com/opf/openproject/blob/dev/frontend/src/stimulus/controllers/dynamic/generic-drag-and-drop.controller.ts"
click node_ganttsettings "https://github.com/opf/openproject/blob/dev/app/services/projects/gantt_query_generator_service.rb"

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_projects,node_workpackages,node_agile,node_timecost toneBlue
class node_queryui,node_parse,node_update,node_defaults,node_gantt,node_api,node_ganttsettings toneAmber
class node_collaboration,node_meetings,node_integrations toneMint
class node_navigation,node_dragdrop,node_rails toneRose
class node_user toneIndigo
```

## Components

### Work management

- [Projects and portfolios](https://github.com/opf/openproject/tree/dev/app/components/projects): `app/components/projects`
- [Work packages](https://github.com/opf/openproject/blob/dev/app/components/open_project/common/work_package_card_component.rb): `app/components/open_project/common/work_package_card_component.rb`
- [Agile workflows](https://github.com/opf/openproject/tree/dev/app/components/projects/settings/work_packages/types): `app/components/projects/settings/work_packages/types`
- **Time and costs**

### Query and scheduling

- [Query configuration UI](https://github.com/opf/openproject/blob/dev/frontend/src/stimulus/controllers/dynamic/admin/type-form-configuration/main.controller.ts): `frontend/src/stimulus/controllers/dynamic/admin/type-form-configuration/main.controller.ts`
- [Query parameter parsing](https://github.com/opf/openproject/blob/dev/app/services/api/v3/parse_query_params_service.rb): `app/services/api/v3/parse_query_params_service.rb`
- [Query updates](https://github.com/opf/openproject/blob/dev/app/services/update_query_from_params_service.rb): `app/services/update_query_from_params_service.rb`
- [Default work queries](https://github.com/opf/openproject/blob/dev/app/services/work_packages/default_query_generator_service.rb): `app/services/work_packages/default_query_generator_service.rb`
- [Gantt query generation](https://github.com/opf/openproject/blob/dev/app/services/projects/gantt_query_generator_service.rb): `app/services/projects/gantt_query_generator_service.rb`
- **Work-package API results**
- [Saved Gantt settings](https://github.com/opf/openproject/blob/dev/app/services/projects/gantt_query_generator_service.rb): `app/services/projects/gantt_query_generator_service.rb`

### Team collaboration

- [Team collaboration](https://github.com/opf/openproject/tree/dev/app/components/activities): `app/components/activities`
- [Meetings and minutes](https://github.com/opf/openproject/blob/dev/app/components/homescreen/blocks/meetings.rb): `app/components/homescreen/blocks/meetings.rb`
- [External integrations](https://github.com/opf/openproject/blob/dev/modules/storages/app/controllers/storages/admin/storages_controller.rb): `modules/storages/app/controllers/storages/admin/storages_controller.rb`

### Application interface

- [Main navigation](https://github.com/opf/openproject/blob/dev/frontend/src/stimulus/controllers/dynamic/menus/main.controller.ts): `frontend/src/stimulus/controllers/dynamic/menus/main.controller.ts`
- [Drag and drop](https://github.com/opf/openproject/blob/dev/frontend/src/stimulus/controllers/dynamic/generic-drag-and-drop.controller.ts): `frontend/src/stimulus/controllers/dynamic/generic-drag-and-drop.controller.ts`
- **Turbo request service**

### Other components

- **Team member**

## Connections

- Team member → Query configuration UI: configures query
- Query configuration UI → Turbo request service: sends updates
- Query configuration UI → Query parameter parsing: submits query parameters
- Query parameter parsing → Query updates: normalizes parameters
- Query updates → Work-package API results: updates query
- Work-package API results → Team member: returns results
- Default work queries → Query configuration UI: provides query presets
- Team member → Gantt query generation: requests project schedule
- Gantt query generation → Saved Gantt settings: reads settings
- Gantt query generation → Work-package API results: generates query properties
- Team member → Projects and portfolios: manages projects
- Team member → Work packages: manages work
- Team member → Agile workflows: uses agile workflows
- Team member → Time and costs: tracks effort and cost
- Team member → Team collaboration: collaborates
- Team member → Meetings and minutes: coordinates meetings
- Team member → External integrations: configures integrations
- Team member → Main navigation: navigates
- Team member → Drag and drop: reorders items
- Drag and drop → Turbo request service: sends position update
