v0.0.20 released

Where else the record is.

FerroFED is an openEHR federation gateway, in pure Rust. A client sends it an ordinary AQL query with no federation syntax: the gateway resolves the patient outside the query, sends standard AQL to each CDR scoped to that node's own EHR id, and merges the answers with each node's provenance into one ordinary result set. It holds no clinical data of its own.

A gateway image and an operator console image on GHCR, a Kubernetes package and the ferrofed binary for x86_64 and aarch64 Linux, built at SLSA Build Level 3.

What it does

One query in, one answer out, every node named

FerroFED follows the openEHR Federation Working Group's Federation Tier with AQL specification and reaches every node over openEHR ITS-REST 1.1.0. The conformance statement names the test that holds each conformance point.

Federation Tier with AQL 1.0.1

Transparent to the client

/v1/query/aql takes a conformant openEHR query and answers one ordinary ITS-REST result set. Ordering, paging, DISTINCT and the aggregates apply across nodes, and what cannot be exact is refused with a reason.

IHE PIXm, PDQm and XCPD

No identifier in what a node receives

The patient resolves to each node's local EHR id outside AQL, through a patient index such as FerroPIX. The rewrite refuses a query that would leak an identifier, and an outbound gate checks every request again.

Federation metadata

Never a silent partial answer

Every node in scope is reported with its status. A node that does not answer in its time budget fails the query, unless the client asks for flagged partial rows with every missing node named.

Follow-ups and writes

Every request reaches its owner

A request under an EHR goes to the one node that holds it, a versioned write only to the CDR that created the version, and a stored query lives at the gateway as an immutable version it distributes to the members.

EHDS and MyHealth@EU

The European exchange format on FHIR

The patient summary, prescriptions and dispensations, laboratory, imaging and discharge reports in the HL7 Europe profiles, from a member's openEHR record or its own FHIR endpoint, and served to a national contact point.

OAuth 2.0, DPoP and EHDS logging

Every caller verified, every access recorded

Each caller is authenticated at the gateway and each node reached with its own credential. Consent can be checked first, and every access to patient data is recorded with the verified caller and the categories of the data.

The operator console

The federation as the gateway sees it

The console shows the members, their reachability, the incidents and the stored queries, runs a federated query with every node's status, and keeps the configuration as revisions an operator saves, applies and rolls back.

The console's dashboard: the organisations, the nodes reachable, the open incidents and the running configuration revision, with the nodes that need attention and the topology.
The dashboard, drawn with synthetic data. Every page of the console, and configuration revisions.
In the family

The product that connects records across organisations

The FerroHEALTH products reach each other only over published protocols. FerroFED sits in front of the CDRs and asks the patient index where a patient's records are.

FerroEHR

The openEHR CDR each member runs. The gateway reaches it over ITS-REST 1.1.0 like any other client, and the node profile is checked against FerroEHR and EHRbase.

FerroPIX

The patient index the gateway resolves through. FerroFED keeps no table of patients: it asks a PIXm Manager as a client, and the quickstart runs FerroPIX.

FerroBRIDGE

The eehrxf crate builds the European exchange documents the FHIR face serves from a member's openEHR record.

The documentation

Four questions, four parts of the book