Skip to main content

Open-source Radiology Information System (RIS) — order management, DICOM MWL, structured reporting, FHIR R4, HL7v2

Project description

SautiRIS

PyPI version Python 3.12+ License: Apache 2.0 Tests Coverage

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

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sautiris-1.0.0a1.tar.gz (96.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sautiris-1.0.0a1-py3-none-any.whl (107.2 kB view details)

Uploaded Python 3

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

Hashes for sautiris-1.0.0a1.tar.gz
Algorithm Hash digest
SHA256 80ce0d6d99bce3772d0b8a0b9dab1684e88b38c845e3269d4d0a1eb8e9622c7e
MD5 fc0fa06f798501c1ae20888c81ff8a63
BLAKE2b-256 5700bf8eec126c748a61570422e1f3da14bcb454091b88b62c5b8913c77fcab7

See more details on using hashes here.

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

Hashes for sautiris-1.0.0a1-py3-none-any.whl
Algorithm Hash digest
SHA256 f1993350e2a8775b411289b1e588cca4cf77aac83839a0e58d1b27a7c2f1b027
MD5 32c54fb167a8c1a7387f31a903b4572f
BLAKE2b-256 a9f334f579576989a5063ac27913df7d8ce1a6c2a8019575e5782fc37bd05f5e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page