Cameleer

Cameleer / Use cases / DICOM imaging gateway

Medical imaging · health pack · next release

A DICOM router that is also an integration engine

Receive images from modalities and PACS over DIMSE, route on tags, de-identify with the PS3.15 profile, and forward to a PACS, a DICOMweb store or an AI model. HL7 v2, FHIR and about 230 other components run in the same small binary, so the result of an AI model can go back to the EHR as FHIR in the same route. Apache Camel has no DICOM component; Cameleer's health pack adds one with Camel-style names.

10/10live tests against DCMTK 3.6.7, Orthanc 1.12.2, python-hl7 and HAPI FHIRDIMSE both roles, with and without TLS, and DICOMweb both ways
33public pydicom test files read and written byte for byte
PS3.15Annex E basic profile and options, deterministic under a key, auditedpixel options not included
5DIMSE services as SCU and SCP: C-ECHO, C-STORE, C-FIND, C-MOVE, C-GET

Status: in the next release, as the health pack: the image pmsudhi/cameleer:health or cargo install cameleer-main --features health (not in the default image). Not yet tested against the cloud DICOM services of Azure, Google or AWS. What is not supported.

Modality to cloud, without losing an image

From examples/medical/modality-to-cloud.camel.yaml, which the test suite runs end to end (shortened here). The gateway is a Storage SCP for named modalities, keeps CT and MR, and uploads with STOW-RS. When the store is down, the instance is parked in a folder and a second route uploads it later, so the modality is told "stored" only for an image that was uploaded or parked.

- route:
    id: modality-to-cloud
    from:
      uri: "dicom:GATEWAY@0.0.0.0:{{env:DICOM_PORT:11112}}?acceptedCallingAets={{env:MODALITIES:CT01,MR01}}"
      steps:
        - filter:
            simple: "${dicom.Modality} in 'CT,MR'"
            steps:
              - doTry:
                  steps:
                    - to: "dicomweb:{{env:DICOMWEB_URL}}?operation=stow&bearerToken={{env:DICOMWEB_TOKEN:}}&timeout=120s"
                  doCatch:
                    - exception: [java.lang.Exception]
                      steps:
                        - to: "file:{{env:PARK_DIR:parked}}?fileName=${header.CamelDicomSopInstanceUid}.dcm"
docker run --rm --network host -e DICOMWEB_URL -e DICOMWEB_TOKEN \
  -v "$PWD:/routes:ro" -v "$PWD/parked:/parked" pmsudhi/cameleer:health run /routes/modality-to-cloud.camel.yaml
storescu -aec GATEWAY localhost 11112 *.dcm      # send a study from DCMTK

Three tested examples

Edge imaging gateway

Modality to PACS or to a DICOMweb store, with store-and-forward. modality-to-cloud

AI inference loop

Keep the series a model is for, de-identify it, send it to the inference service, and post the finding as a FHIR DiagnosticReport that points at the original study. The model never sees the identity. ai-inference-loop

De-identification pipeline

A folder in, a folder out, with pseudonyms, shifted dates and an audit record per instance. deid-pipeline

The building blocks

you want touse
receive images from a modality (Storage SCP)from: dicom:MYAE@0.0.0.0:11112
send images to a PACS (Storage SCU)to: dicom:PACS@host:104
store over DICOMweb (STOW-RS)to: dicomweb:https://host/dicom-web?operation=stow
query and retrieve from a PACSdicom:...?operation=find, move, get
answer queries and retrieves yourselfa dicom: consumer route that returns matches or instances
serve DICOMwebfrom: dicomweb:/dicom-web
route on tags${dicom.Modality}, ${dicom.(0018,0015)}, sequence paths
change tagsunmarshal: dicom, edit the value tree, marshal: dicom
de-identifymarshal: {dicomDeidentify: {uidKey: ..., options: ...}}
index metadata as JSONmarshal: dicomJson (PS3.18 Annex F)
send results to the EHRthe fhir component, or HL7 v2 over MLLP

Reference: DICOM guide, dicom and dicomweb components, dicomDeidentify, the DICOM Conformance Statement.

De-identification you can check

The profile

dicomDeidentify applies Table E.1-1 of PS3.15 (edition 2026d) with its options, except the pixel options. Replacement UIDs, pseudonyms and date shifts are HMAC-SHA256 values under one secret key: two gateways with the same key produce the same identifiers, and a study split across batches stays together. Each instance writes a record to the hash-chained audit log: digests of the input and output, the profile and its options, no identity.

In a confidential VM

Run the de-identifier in an Intel TDX or AMD SEV-SNP confidential VM with Cameleer's attestation, and a data owner can ask for hardware evidence of which routes and configuration (including the de-identification options) handle the identifiable images before sending them. How attestation works and what it does not prove yet.

What is supported

areasupported
VerificationSCU and SCP
StorageSCU and SCP for every Storage SOP class of PS3.4 (private SOP classes too)
Query/RetrievePatient Root and Study Root FIND, MOVE and GET as SCU and SCP; Modality Worklist FIND as SCU and SCP
Transfer syntaxesimplicit and explicit VR little endian, deflated, explicit big endian (read, write, convert); compressed syntaxes passed through unchanged
Character setsISO_IR 6, 100, 101, 109, 110, 126, 127, 138, 144, 148, 166, 13 and 192, GB18030, GBK, and their ISO 2022 forms (Japanese, Korean, Chinese)
SecurityTLS 1.2 and 1.3, mutual TLS, User Identity (username, username and passcode); hash-chained audit records
DICOMwebSTOW-RS, QIDO-RS (all levels, limit, offset, includefield), WADO-RS (instances, metadata, bulk data), as client and server

What it is not, and what is not supported yet

  • Not a PACS or a viewer. It routes, filters, transforms and de-identifies; it does not keep an archive or render images.
  • Cloud DICOM services not tested yet: Azure Health Data Services, the Google Cloud Healthcare API, AWS HealthImaging (which also needs SigV4 signing in dicomweb). The DICOMweb tests ran against Orthanc.
  • Not tested with dcm4che or real modalities yet.
  • Not supported: Storage Commitment, MPPS, C-CANCEL during a request, asynchronous operations; WADO frames, rendered and thumbnail retrieval, UPS-RS; transcoding compressed pixel data, and with it the pixel de-identification options.
  • Audit format: hash-chained records, not yet IHE ATNA (PS3.15 A.5) messages. The DICOM Conformance Statement (PS3.2 form) lists every service and policy.
  • Not measured yet: throughput against dcm4che, DCMTK, Orthanc or Mirth.
  • Compliance: Cameleer is software you run; it provides controls (TLS, de-identification, audit), not a HIPAA certification.

Common questions

Does Apache Camel have a DICOM component?

No. Apache Camel has HL7 (mllp, hl7) and FHIR components but no DICOM component. Cameleer's health pack adds dicom (DIMSE), dicomweb (DICOMweb) and the dicom, dicomJson and dicomDeidentify data formats, named to read like Camel.

How do I forward DICOM from a modality to a DICOMweb store?

Start a route from dicom:GATEWAY@0.0.0.0:11112 (a Storage SCP), filter on tags such as ${dicom.Modality}, and send to dicomweb:https://host/dicom-web?operation=stow. The modality-to-cloud example also parks an instance in a folder when the upload fails and retries it later.

Which de-identification profile does Cameleer apply?

The PS3.15 Annex E basic profile (Table E.1-1, edition 2026d) and its options except the pixel options. Replacement UIDs, pseudonyms and date shifts are HMAC-SHA256 values under one key, so the output is deterministic across batches and gateways, and each instance writes a record to a hash-chained audit log.

Has it been tested with real DICOM software?

Yes: the health pack's live tests pass 10 of 10 against DCMTK 3.6.7 (as SCU and SCP, with and without TLS), Orthanc 1.12.2 (as a PACS, and its DICOMweb plugin as server and client), python-hl7 and HAPI FHIR, and 33 public pydicom test files are read and written back byte for byte. The cloud DICOM services of Azure, Google and AWS have not been tested yet.

Which Cameleer build has DICOM?

The health pack, from the next release: the image pmsudhi/cameleer:health, or cargo install cameleer-main --features health. It is not in the default image or the full build; it adds about 2 MB to the binary and also contains HL7 v2, MLLP and FHIR. The health pack.

Is Cameleer a PACS or a viewer?

No. It routes, filters, transforms and de-identifies images between modalities, PACS, cloud stores and AI services. It does not store an archive, render images or transcode compressed pixel data.