An application translating incoming DICOM DIMSE messages to a DICOMWeb Client or providing a DICOMWeb Server forwarding messsages to a DIMSE Client. Use it as a Windows or a Linux systemd service.
  • Rust 93.4%
  • JavaScript 3.5%
  • CSS 1.4%
  • PowerShell 0.8%
  • HTML 0.7%
  • Other 0.2%
Find a file
christof.schadt 59adcd2a31
Some checks failed
CI / build-and-test (push) Failing after 10m3s
Release / build-release (push) Successful in 5m6s
Merge pull request 'add-browser-ui' (#62) from add-browser-ui into main
Reviewed-on: #62
2026-09-13 20:11:15 +02:00
.forgejo/workflows chore: rename from dicom-broker to dicom-gateway 2026-07-09 20:41:43 +02:00
.vscode chore: rename from dicom-broker to dicom-gateway 2026-07-09 20:41:43 +02:00
architecture/arc42 fix: distribute load between clients 2026-08-31 17:51:38 +02:00
doc chore: update manual 2026-09-13 14:29:05 +02:00
hap chore: test HAPI FHIR server via docker 2026-07-13 20:05:37 +02:00
src fix: delay per instance 2026-09-13 17:02:03 +02:00
.gitignore feat: tray application 2026-07-31 22:36:33 +02:00
build_all.sh chore: rename from dicom-broker to dicom-gateway 2026-07-09 20:41:43 +02:00
Cargo.lock feat: performance measurements and browser UI 2026-09-13 11:45:33 +02:00
Cargo.toml feat: performance measurements and browser UI 2026-09-13 11:45:33 +02:00
config.toml feat: initial UI 2026-09-12 23:05:50 +02:00
install-service.ps1 feat: tray application 2026-07-31 22:36:33 +02:00
install-service.sh feat: tray application 2026-07-31 22:36:33 +02:00
INSTALL.md fix: slow config tray UI startup on Windows 2026-09-11 12:30:01 +02:00
LICENSE chore: rename from dicom-broker to dicom-gateway 2026-07-09 20:41:43 +02:00
README.md feat: inject tokens 2026-09-09 17:30:45 +02:00
rust-toolchain.toml chore: update everything but gui 2026-07-03 13:26:25 +02:00
uninstall-services.ps1 fix: observe services 2026-08-31 15:03:46 +02:00

dicom-gateway

CI

Release Build

A configurable DICOM gateway written in Rust, bridging DIMSE and DICOMWeb transports, including TLS handling. Designed to run as a Windows Service or a Linux systemd service.

DICOM Gateway TUI

Features

Frontends (inbound)

Frontend Protocol TLS
DIMSE SCP C-FIND, C-GET, C-MOVE, C-STORE, C-ECHO DICOM-TLS (PS3.15)
DICOMWeb HTTP QIDO-RS, WADO-RS, STOW-RS HTTPS

Additional Frontend

Frontend Protocol TLS
FHIR R4 HTTP Patient, ImagingStudy (read + search) HTTPS (shared with DICOMWeb)

The FHIR R4 frontend is only available with the Local Archive backend. It mounts alongside the DICOMWeb HTTP server (same port, same TLS) and allows querying DICOM information via FHIR. Retrieval can then be performed via DICOM (DIMSE or DICOMweb). The ImagingStudy.endpoint parameter points to the DICOMweb endpoint.

Backends (outbound)

Backend Protocol TLS
DICOMWeb QIDO-RS, WADO-RS, STOW-RS HTTPS via URL scheme
DIMSE SCU C-FIND, C-GET, C-STORE DICOM-TLS (PS3.15)

Additional Backend

Backend Protocol TLS
Local Archive SQLite + filesystem
FHIR Patient, ImagingStudy (search, create, update) HTTPS

The local archive allows the DICOM gateway to work as a DICOM archive which can be access via DICOM DIMSE, DICOMweb and FHIR (for querying only).

For the "Local Archive" backend, the DIMSE SCP and DICOMWeb/FHIR (http) frontends can all run simultaneously (frontend.mode = "both") and share the same TLS certificate. See "Operation mapping" below.

Operation mapping

Inbound Outbound
C-FIND QIDO-RS query / Local Archive lookup
C-GET WADO-RS retrieve / Local Archive read
C-MOVE SEND-RS or WADO-RS / Local Archive read → C-STORE SCU to move destination
C-STORE STOW-RS store / Local Archive write
C-ECHO Check /health endpoint (fallback: make HEAD request)
QIDO-RS C-FIND / Local Archive lookup
WADO-RS C-GET or C-MOVE / Local Archive read
STOW-RS C-STORE / Local Archive write
SEND-RS C-MOVE
DELETE (non-standard) Local Archive delete (archive backend only, [archive] allow_delete)

Documentation


Authentication

What the gateway does with a client credential depends on the configured backend.

Archive backend — access control. Optional JWT Bearer token authentication can be enabled via the [auth] config section. When present, it is enforced on the DICOMWeb and FHIR HTTP frontends (Authorization: Bearer) and on the DIMSE SCP frontend (PS3.7 User Identity Negotiation, type 5); unrecognized or missing tokens are rejected. Tokens are generated by the dicom-gateway-config GUI; only their SHA-256 hash is stored.

Gateway backends (DICOMWeb, DIMSE SCU) — transparent relay. The gateway validates nothing of its own. Whatever credential a client presents is forwarded byte-for-byte to the backend target, which decides whether to trust it; clients presenting no credential are not rejected. This is unconditional — [auth] is not required and has no effect in this mode. Restrict access at transport level (mTLS) or by network controls instead.

For clients that cannot authenticate at all (e.g. an older DIMSE SCU without User Identity Negotiation) reaching a backend that requires a credential, a fallback token can be configured on the backend connection (dicomweb.auth_token / dimse_client.auth_token). It is used only when the client presented nothing; a client-presented token is always relayed instead. See Authentication.


FHIR Server / Integration

When the archive backend is active, a small FHIR server frontend can expose stored DICOM data via Patient and ImagingStudy resources. It is possible to subscribe to these resources for updates via a rest-hook.

The archive backend can also connect to a FHIR server and create/update Patient and ImagingStudy resources there, along with an optional OAuth authentication.


Configuration

The gateway is configured via a TOML file (default: config.toml). Run with --config /path/to/config.toml.

See doc/manual/03_configuration_reference.md for the full key reference, TLS options, and C-MOVE destination setup.


Building & Installation

See INSTALL.md for build instructions, systemd and Windows Service setup, and how to run interactively.

Authors

Original Author:

Christof Schadt (christof dot schadt at mailbox dot org)

Icon

Icon by Freepik - Flaticon