Projects

Internal tools I have built for the radiology department at Turku University Hospital. All self-hosted on a hospital server running Podman, KVM, and PostgreSQL. Built with Claude Code and OpenCode.

All tools follow an agent-first design: AI agents can operate these systems without ever seeing patient data.

Scheduling and HR

rad.siso

Daily scheduling and staff placement for the radiology department. Supervisors assign radiologists to imaging sectors with a drag-and-drop interface. Replaces the old workflow of Excel spreadsheets and email chains. Handles vacation planning, coverage monitoring, and on-call scheduling.

Ruby on Rails, PostgreSQL, Hotwire, Tailwind

rad.hr

HR and staffing management for radiologists. Tracks credentials, employment types, FTE percentages, and contract details. Includes a Kannuste module for incentive and performance metrics. Role-based access for administrators, sector leads, secretaries, and viewers.

Ruby on Rails 8.1, PostgreSQL, Hotwire, Tailwind

Imaging and DICOM

sauhu

Lightning-fast DICOM viewer for Linux, built in Rust. All heavy image math runs on the GPU via wgpu compute shaders: real-time windowing/leveling and volume coregistration with trilinear resampling and NCC metric. Three-tier caching (48 GB RAM, 500-texture VRAM, async I/O) and multi-viewport synchronized scrolling with reference lines across all views, including coregistered volumes. MPR reformatting, measurements, full PACS connectivity. Supports JPEG 2000, JPEG-LS, and all common DICOM transfer syntaxes. Designed for radiologists with a power-user Linux setup, such as Omarchy on Wayland. GitHub

Rust, wgpu, egui

rad.dose

Radiation dose collection and dashboard. Aggregates dose data from CT, fluoroscopy, and other modalities, providing visibility into patient and population-level exposure trends. Tools for tracking diagnostic reference levels and identifying outliers.

Ruby on Rails, PostgreSQL

rad.pacs

PACS administration dashboard. Ingests metadata from the hospital picture archiving system, generates usage statistics, and provides tools for managing DICOM routing and audit logging.

Ruby on Rails 8.1, PostgreSQL

rad.qa-viewer

Blinded MRI quality comparison tool. A hospital physicist uploads original and AI-enhanced MRI sequences. Radiologists review them side by side with synchronized scrolling and window/level controls, then vote on which is better. No login needed for reviewers (token-based access). Patient data never leaves the hospital server.

Ruby on Rails 8.1, PostgreSQL, cornerstone.js

agent-rad-tools

CLI tool for loading anonymized DICOM images from the hospital PACS for research. Acts as a privacy gateway: no patient identifiers ever appear in output. Uses DICOM C-FIND and C-MOVE with allowlist-based anonymization and pseudonymized case IDs. Designed to be safe for AI agent workflows.

Python, pydicom, pynetdicom, SQLite

Pekka 2000 (trauma-ai-laatu)

Quality monitoring dashboard for radiology AI algorithms. Works with any AI system that sends results via HL7 or other standard messaging. Radiologists classify and verify AI findings, and the system generates performance statistics. Tracks sensitivity, specificity, and false positive rates over time. Currently used to validate AI-assisted fracture detection in emergency radiographs, with over 11,000 cases collected.

Python, Flask, PostgreSQL

Knowledge and AI

rad-bot

Radiology knowledge base with semantic search. An MCP server that searches over differential diagnosis and imaging findings using hybrid vector embeddings and keyword matching. Used as a reference tool during clinical work.

Python, SQLite, Fireworks.ai embeddings, MCP protocol

liekki-sysadmin

System administration knowledge base. Another MCP server, this one indexing personal infrastructure documentation: server configs, crash logs, networking notes. Lets me search my own sysadmin knowledge from Claude Code.

Python, SQLite, Fireworks.ai embeddings, MCP protocol

arina

HL7 integration engine for radiology. Receives and processes HL7 messages from hospital information systems, enabling automated workflows between RIS, PACS, and radiology applications.

Go

Infrastructure: Ahjo

All of this runs on a single hospital server we call Ahjo (i9-14900K, 128 GB RAM, RTX 5090). Seven Podman containers behind a Caddy reverse proxy: rad.hr, rad.siso (Kannuste), rad.pacs, rad.qa-viewer, arina (HL7 engine), and PostgreSQL 16 for all databases. Ollama with the RTX 5090 for local LLM inference. Connected to the hospital DICOM network via pynetdicom.

The point of putting everything on one server: all operational radiology data - scheduling, staffing, dose tracking, PACS metadata, HL7 message flows, AI validation results - lives in structured PostgreSQL databases that the applications share. AI agents can query across all of it through PHI-safe interfaces, combining information that used to live in separate silos. A radiologist can ask an agent to cross-reference staffing levels with study volumes, track AI algorithm performance over time, or audit dose trends by modality - all without patient identifiers ever leaving the server.