# openslides/openslides-backend architecture

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

- Interactive diagram: https://gitdiagram.com/openslides/openslides-backend
- Repository: https://github.com/openslides/openslides-backend

## Overview

OpenSlides Backend accepts requests to mutate meeting and organization data, validates and applies actions, and serves permission-restricted presenter results without autoupdate. The main paths are HTTP request → action or presenter view → handler/presenter → datastore. Actions span meeting setup, motions, speakers, polls, users, and projection; presenters query data for responses. The tree and README establish these capabilities, while sampled excerpts show request handling, relation updates, database access, and service wiring. Some domain-action and presenter internals were not sampled, so their detailed connections are omitted.

Main entry points: [`openslides_backend/action/actions`](https://github.com/openslides/openslides-backend/tree/main/openslides_backend/action/actions) (Action modules), [`openslides_backend/services/database/extended_database.py`](https://github.com/openslides/openslides-backend/blob/main/openslides_backend/services/database/extended_database.py) (Datastore adapter), [`openslides_backend/action/action_handler.py`](https://github.com/openslides/openslides-backend/blob/main/openslides_backend/action/action_handler.py) (Action handler), [`openslides_backend/http/application.py`](https://github.com/openslides/openslides-backend/blob/main/openslides_backend/http/application.py) (WSGI application)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_api["HTTP API"]
  node_http["WSGI application<br/>[application.py]"]
  node_action_view["Action view<br/>[action_view.py]"]
  node_presenter_view["Presenter view<br/>[presenter_view.py]"]
  node_presenters["Presenter modules"]
end

subgraph group_actions["Action processing"]
  node_action_handler["Action handler<br/>[action_handler.py]"]
  node_permissions["Permission checks"]
  node_relations["Relation manager"]
end

subgraph group_domains["Meeting domains"]
  node_action_modules["Action modules"]
  node_meeting["Meetings and agenda"]
  node_motions["Motions and workflows"]
  node_speakers["Speakers and lists"]
  node_polls["Polls and votes"]
  node_users["Users and groups"]
  node_projection["Projector control"]
  node_files["Media files"]
  node_chat["Chat"]
end

subgraph group_data["Data and services"]
  node_models["Model definitions<br/>[models.py]"]
  node_extended_db["Datastore adapter"]
  node_query_helper["SQL query builder<br/>[query_helper.py]"]
end

node_client(("API client"))
node_postgres[("PostgreSQL")]
node_auth["Auth service"]
node_media["Media service"]
node_vote["Vote service"]

node_client -->|"sends request"| node_http
node_http -->|"dispatches action"| node_action_view
node_http -->|"dispatches query"| node_presenter_view
node_action_view -->|"handles actions"| node_action_handler
node_presenter_view -->|"fetches results"| node_presenters
node_action_handler -->|"invokes actions"| node_action_modules
node_action_handler -->|"checks access"| node_permissions
node_action_handler -->|"applies writes"| node_extended_db
node_relations -->|"applies relations"| node_extended_db
node_presenters -->|"queries data"| node_extended_db
node_extended_db -->|"builds queries"| node_query_helper
node_query_helper -->|"queries"| node_postgres
node_extended_db -->|"reads and writes"| node_postgres
node_action_modules -->|"includes"| node_meeting
node_action_modules -->|"includes"| node_motions
node_action_modules -->|"includes"| node_speakers
node_action_modules -->|"includes"| node_polls
node_action_modules -->|"includes"| node_users
node_action_modules -->|"includes"| node_projection
node_action_modules -->|"includes"| node_files
node_action_modules -->|"includes"| node_chat
node_models -->|"defines stored models"| node_extended_db

click node_http "https://github.com/openslides/openslides-backend/blob/main/openslides_backend/http/application.py"
click node_action_view "https://github.com/openslides/openslides-backend/blob/main/openslides_backend/http/views/action_view.py"
click node_presenter_view "https://github.com/openslides/openslides-backend/blob/main/openslides_backend/http/views/presenter_view.py"
click node_action_handler "https://github.com/openslides/openslides-backend/blob/main/openslides_backend/action/action_handler.py"
click node_action_modules "https://github.com/openslides/openslides-backend/tree/main/openslides_backend/action/actions"
click node_presenters "https://github.com/openslides/openslides-backend/tree/main/openslides_backend/presenter"
click node_permissions "https://github.com/openslides/openslides-backend/tree/main/openslides_backend/permissions"
click node_relations "https://github.com/openslides/openslides-backend/blob/main/openslides_backend/action/relations/relation_manager.py"
click node_models "https://github.com/openslides/openslides-backend/blob/main/openslides_backend/models/models.py"
click node_extended_db "https://github.com/openslides/openslides-backend/blob/main/openslides_backend/services/database/extended_database.py"
click node_query_helper "https://github.com/openslides/openslides-backend/blob/main/openslides_backend/services/database/query_helper.py"
click node_meeting "https://github.com/openslides/openslides-backend/tree/main/openslides_backend/action/actions/agenda_item"
click node_motions "https://github.com/openslides/openslides-backend/tree/main/openslides_backend/action/actions/motion"
click node_speakers "https://github.com/openslides/openslides-backend/tree/main/openslides_backend/action/actions/speaker"
click node_polls "https://github.com/openslides/openslides-backend/tree/main/openslides_backend/action/actions/poll"
click node_users "https://github.com/openslides/openslides-backend/tree/main/openslides_backend/action/actions/user"
click node_projection "https://github.com/openslides/openslides-backend/tree/main/openslides_backend/action/actions/projector"
click node_files "https://github.com/openslides/openslides-backend/tree/main/openslides_backend/action/actions/mediafile"
click node_chat "https://github.com/openslides/openslides-backend/tree/main/openslides_backend/action/actions/chat_message"

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_http,node_action_view,node_presenter_view,node_presenters,node_client toneBlue
class node_action_handler,node_permissions,node_relations,node_postgres toneAmber
class node_action_modules,node_meeting,node_motions,node_speakers,node_polls,node_users,node_projection,node_files,node_chat toneMint
class node_models,node_extended_db,node_query_helper toneRose
class node_auth,node_media,node_vote toneIndigo
```

## Components

### HTTP API

- [WSGI application](https://github.com/openslides/openslides-backend/blob/main/openslides_backend/http/application.py): `openslides_backend/http/application.py`
- [Action view](https://github.com/openslides/openslides-backend/blob/main/openslides_backend/http/views/action_view.py): `openslides_backend/http/views/action_view.py`
- [Presenter view](https://github.com/openslides/openslides-backend/blob/main/openslides_backend/http/views/presenter_view.py): `openslides_backend/http/views/presenter_view.py`
- [Presenter modules](https://github.com/openslides/openslides-backend/tree/main/openslides_backend/presenter): `openslides_backend/presenter`

### Action processing

- [Action handler](https://github.com/openslides/openslides-backend/blob/main/openslides_backend/action/action_handler.py): `openslides_backend/action/action_handler.py`
- [Permission checks](https://github.com/openslides/openslides-backend/tree/main/openslides_backend/permissions): `openslides_backend/permissions`
- [Relation manager](https://github.com/openslides/openslides-backend/blob/main/openslides_backend/action/relations/relation_manager.py): `openslides_backend/action/relations/relation_manager.py`

### Meeting domains

- [Action modules](https://github.com/openslides/openslides-backend/tree/main/openslides_backend/action/actions): `openslides_backend/action/actions`
- [Meetings and agenda](https://github.com/openslides/openslides-backend/tree/main/openslides_backend/action/actions/agenda_item): `openslides_backend/action/actions/agenda_item`
- [Motions and workflows](https://github.com/openslides/openslides-backend/tree/main/openslides_backend/action/actions/motion): `openslides_backend/action/actions/motion`
- [Speakers and lists](https://github.com/openslides/openslides-backend/tree/main/openslides_backend/action/actions/speaker): `openslides_backend/action/actions/speaker`
- [Polls and votes](https://github.com/openslides/openslides-backend/tree/main/openslides_backend/action/actions/poll): `openslides_backend/action/actions/poll`
- [Users and groups](https://github.com/openslides/openslides-backend/tree/main/openslides_backend/action/actions/user): `openslides_backend/action/actions/user`
- [Projector control](https://github.com/openslides/openslides-backend/tree/main/openslides_backend/action/actions/projector): `openslides_backend/action/actions/projector`
- [Media files](https://github.com/openslides/openslides-backend/tree/main/openslides_backend/action/actions/mediafile): `openslides_backend/action/actions/mediafile`
- [Chat](https://github.com/openslides/openslides-backend/tree/main/openslides_backend/action/actions/chat_message): `openslides_backend/action/actions/chat_message`

### Data and services

- [Model definitions](https://github.com/openslides/openslides-backend/blob/main/openslides_backend/models/models.py): `openslides_backend/models/models.py`
- [Datastore adapter](https://github.com/openslides/openslides-backend/blob/main/openslides_backend/services/database/extended_database.py): `openslides_backend/services/database/extended_database.py`
- [SQL query builder](https://github.com/openslides/openslides-backend/blob/main/openslides_backend/services/database/query_helper.py): `openslides_backend/services/database/query_helper.py`

### Other components

- **API client**
- **PostgreSQL**
- **Auth service**
- **Media service**
- **Vote service**

## Connections

- API client → WSGI application: sends request
- WSGI application → Action view: dispatches action
- WSGI application → Presenter view: dispatches query
- Action view → Action handler: handles actions
- Presenter view → Presenter modules: fetches results
- Action handler → Action modules: invokes actions
- Action handler → Permission checks: checks access
- Action handler → Datastore adapter: applies writes
- Relation manager → Datastore adapter: applies relations
- Presenter modules → Datastore adapter: queries data
- Datastore adapter → SQL query builder: builds queries
- SQL query builder → PostgreSQL: queries
- Datastore adapter → PostgreSQL: reads and writes
- Action modules → Meetings and agenda: includes
- Action modules → Motions and workflows: includes
- Action modules → Speakers and lists: includes
- Action modules → Polls and votes: includes
- Action modules → Users and groups: includes
- Action modules → Projector control: includes
- Action modules → Media files: includes
- Action modules → Chat: includes
- Model definitions → Datastore adapter: defines stored models
