Open-source Radiology Information System (RIS) — order management, DICOM MWL, structured reporting, FHIR R4, HL7v2
Project description
SautiRIS
Open-source Radiology Information System (RIS) built with FastAPI, SQLAlchemy async, and Python 3.12+.
SautiRIS provides a complete, production-ready RIS backend with order management, DICOM Modality Worklist, structured reporting, peer review QA, radiation dose tracking, FHIR R4/R5 interoperability, HL7v2 messaging, and AI integration hooks. Designed for healthcare facilities in Kenya and across Africa.
Features
- Order Management -- Full radiology order lifecycle (request, schedule, exam, complete, cancel) with accession number generation
- DICOM Integration -- Modality Worklist SCP, MPPS SCP, C-STORE SCP for seamless scanner connectivity
- Structured Reporting -- Draft, finalize, amend, addendum workflow with versioning and templates
- Peer Review & QA -- Radiology peer review with agreement scoring, discrepancy tracking, and radiologist scorecards with trend analysis
- Radiation Dose Tracking -- Dose recording with Kenya NHIF DRL compliance checking and automated alerts
- Critical Alerts -- Critical finding alerting with notification dispatch, auto-escalation, and acknowledgment tracking
- FHIR R4/R5 -- Build and validate ImagingStudy, DiagnosticReport, and ServiceRequest resources
- HL7v2 -- Parse and build ORM^O01 (orders) and ORU^R01 (results) messages with round-trip fidelity
- PACS Connectivity -- Orthanc and DCM4CHEE adapter stubs with DICOMweb query/retrieve
- Viewer Integration -- OHIF viewer URL generation with study-level deep linking
- AI Integration -- CAD overlay hooks, webhook handler for async AI providers, HMAC-SHA256 validation
- Billing -- CPT/procedure code management with order-level billing assignment
- Analytics -- Turnaround time metrics, workload analysis, volume statistics, operational dashboard
- Multi-Tenancy -- Tenant-aware repositories with context-based isolation
- Pluggable Auth -- Keycloak, OAuth2/OIDC, or API key authentication providers
- RBAC -- Fine-grained permission system with role-to-permission mappings
Quickstart
pip install sautiris
Standalone Server
# Set database URL
export SAUTIRIS_DATABASE_URL=postgresql+asyncpg://user:pass@localhost:5432/sautiris
# Run migrations
sautiris db upgrade
# Start the server
sautiris serve --host 0.0.0.0 --port 8080
Mount in an Existing FastAPI App
from fastapi import FastAPI
from sautiris import create_ris_app
app = FastAPI(title="My Hospital App")
# Mount SautiRIS at /ris
ris = create_ris_app(
database_url="postgresql+asyncpg://localhost/hospital",
auth_provider="keycloak",
keycloak_server_url="http://keycloak:8080",
keycloak_realm="hospital",
keycloak_client_id="ris-backend",
keycloak_jwks_url="http://keycloak:8080/realms/hospital/protocol/openid-connect/certs",
)
app.mount("/ris", ris)
SautiCare Integration
SautiRIS is designed to integrate with SautiCare, passing through auth and tenant context:
from sautiris import create_ris_app
from sautiris.config import SautiRISSettings
settings = SautiRISSettings(
database_url=os.getenv("DATABASE_URL"),
auth_provider="keycloak",
keycloak_server_url=os.getenv("KEYCLOAK_URL"),
keycloak_realm="sauticare",
keycloak_client_id="sauticare-backend",
keycloak_jwks_url=os.getenv("KEYCLOAK_JWKS_URL"),
)
ris_app = create_ris_app(settings=settings)
main_app.mount("/api/v1/ris", ris_app)
API Endpoints
| Module | Endpoints | Description |
|---|---|---|
| Orders | 10 | Full order lifecycle management |
| Schedule | 7 | Room/slot scheduling with conflict detection |
| Reports | 10 | Structured reporting with templates |
| Worklist | 6 | DICOM worklist management with MPPS |
| Billing | 5 | CPT code management and assignment |
| Analytics | 5 | TAT, workload, volume statistics |
| Alerts | 5 | Critical finding alerting and escalation |
| Peer Review | 6 | QA workflow with scorecards |
| Dose | 5 | Radiation dose tracking and DRL compliance |
| Health | 1 | System health check |
| Total | 60 |
Development
# Clone and install
git clone https://github.com/iworldafric/sautiris.git
cd sautiris
pip install -e ".[dev]"
# Run tests
pytest tests/ -v --cov=sautiris
# Lint and type check
ruff check src/ tests/
mypy src/sautiris/
# Build
python -m build
Documentation
- Getting Started
- Configuration
- API Reference
- Deployment
- DICOM Setup
- FHIR Interoperability
- SautiCare Integration
Architecture
sautiris/
api/v1/ # FastAPI route handlers
core/ # Auth, tenancy, permissions, events
models/ # SQLAlchemy ORM models
repositories/ # Tenant-aware data access layer
services/ # Business logic layer
integrations/ # DICOM, FHIR, HL7v2, PACS, Viewer, AI
migrations/ # Alembic database migrations
License
Apache License 2.0. See LICENSE for details.
Contributing
Contributions welcome. Please open an issue first to discuss proposed changes.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sautiris-1.0.0a1.tar.gz.
File metadata
- Download URL: sautiris-1.0.0a1.tar.gz
- Upload date:
- Size: 96.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
80ce0d6d99bce3772d0b8a0b9dab1684e88b38c845e3269d4d0a1eb8e9622c7e
|
|
| MD5 |
fc0fa06f798501c1ae20888c81ff8a63
|
|
| BLAKE2b-256 |
5700bf8eec126c748a61570422e1f3da14bcb454091b88b62c5b8913c77fcab7
|
File details
Details for the file sautiris-1.0.0a1-py3-none-any.whl.
File metadata
- Download URL: sautiris-1.0.0a1-py3-none-any.whl
- Upload date:
- Size: 107.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f1993350e2a8775b411289b1e588cca4cf77aac83839a0e58d1b27a7c2f1b027
|
|
| MD5 |
32c54fb167a8c1a7387f31a903b4572f
|
|
| BLAKE2b-256 |
a9f334f579576989a5063ac27913df7d8ce1a6c2a8019575e5782fc37bd05f5e
|