Changed v1Entries and v1Entry to return category names ('genome', 'upload')
instead of keys ('category004', 'category005'). This makes the API consistent
and prevents MCP from passing back the wrong format.
Removed category004 format parsing since API no longer returns it.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
||
|---|---|---|
| .claude | ||
| Jonathan/1.3.12.2.1107.5.2.18.41605.30000026020412200633600001217 | ||
| api | ||
| app | ||
| claude-edit | ||
| cmd | ||
| design | ||
| doc-processor | ||
| docs | ||
| find_dossiers | ||
| fonts | ||
| import-dicom | ||
| import-genome | ||
| lib | ||
| mcp-bridge-node | ||
| mcp-client | ||
| mcpb | ||
| migrate | ||
| migrations | ||
| portal | ||
| scrape_mychart | ||
| scripts | ||
| test | ||
| test-prompts | ||
| tools | ||
| viewer | ||
| web | ||
| ._.DS_Store | ||
| ._inou.db | ||
| ._start.sh | ||
| ._status.sh | ||
| ._stop.sh | ||
| .gitignore | ||
| .mcp.json | ||
| CLAUDE.md | ||
| Makefile | ||
| PROMPT-FUNCTION-BRIEF.md | ||
| README.md | ||
| TODO.md | ||
| Z_AI_CLAUDE_CODE.md | ||
| aitmpl-submission.json | ||
| anthropic.env | ||
| backup.sh | ||
| build-mac.sh | ||
| caliper_reference_intervals.json | ||
| caliper_with_loinc.json | ||
| convert_linux | ||
| demo-genome.txt | ||
| deploy.sh | ||
| doc-processor-bin | ||
| go.mod | ||
| go.sum | ||
| import_all.sh | ||
| inou.db | ||
| inou.mcpb | ||
| journal.md | ||
| main.go | ||
| restart.sh | ||
| smtp.env | ||
| start.sh | ||
| status.sh | ||
| stop.sh | ||
| test-api.sh | ||
| test-prompt.sh | ||
README.md
Inou - Medical Imaging Second Opinion Platform
Vision
Patient-facing medical data platform with AI-powered second opinions. Upload your scans, connect to AI, get peace of mind.
Target user: Non-technical parent/spouse/caregiver who knows nothing about medical imaging but wants answers.
Brand: inou.com ("eye-now" - vision/seeing + immediate second opinion)
Scope: Human + veterinary imaging. Not just imaging - labs, vitals, supplements, genome, photos, observations.
Quick Reference
| Service | URL |
|---|---|
| Portal | https://inou.com |
| Viewer | https://inou.com:8767 |
| API | https://inou.com/api/* |
| Machine | IP | Role |
|---|---|---|
| Ubuntu Server | 192.168.1.253 | Source, Linux builds, Production |
| Mac | local | macOS bridge builds |
| Windows | 192.168.1.9 | Windows bridge builds |
Architecture
┌─────────────────────────────────────────────────────────────────┐
│ User │
└───────────────────────────┬─────────────────────────────────────┘
│
┌───────────────────┼───────────────────┐
│ │ │
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ Portal (443) │ │ Viewer (8767) │ │ Claude Desktop│
│ Web UI, Auth │ │ DICOM viewer │ │ + Bridge │
└───────┬───────┘ └───────┬───────┘ └───────┬───────┘
│ │ │
│ │ │
└───────────────────┼───────────────────┘
│
┌───────▼───────┐
│ REST API │
│ (viewer) │
└───────┬───────┘
│
┌───────▼───────┐
│ SQLite DB │
│ + Objects │
└───────────────┘
Services (2 total):
- Portal (443) - Web UI, authentication, proxies /api/* to viewer
- Viewer (8767) - DICOM viewer, REST API, image serving
Components
| Component | Binary | Purpose |
|---|---|---|
| Portal | inou-portal | Web UI, auth, profile management, proxies API |
| Viewer | inou-viewer | DICOM viewer, REST API, image serving |
| Bridge | inou_bridge_* | Connects Claude Desktop to REST API (per-platform) |
| Lab Scrape | inou-lab-scrape | MyChart lab results scraper |
| Lab Import | inou-lab-import | Lab results importer |
| DICOM Import | import-dicom | DICOM to PNG importer |
Bridge
The bridge connects Claude Desktop (stdio/MCP protocol) to the Inou REST API:
Claude Desktop → inou_bridge (stdio) → HTTPS → inou.com/api/*
Configuration (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"inou": {
"command": "/Users/USERNAME/bin/inou_bridge_darwin_arm64",
"args": ["--server=https://inou.com", "--account=ACCOUNT-GUID"]
}
}
}
The bridge translates MCP tool calls from Claude Desktop into REST API requests. There is no separate MCP server - the viewer's REST API serves all data.
API Tools
Tools available via the bridge (prefixed with inou:):
| Tool | Description |
|---|---|
list_profiles |
Show patient profiles accessible to account |
list_studies |
Show all studies for selected profile |
list_series |
Show series in a study (filter by T1, T2, AX, etc.) |
list_slices |
Show slices with position info |
fetch_image |
Get image as base64 with metadata |
list_lab_tests |
List available lab test names |
get_lab_results |
Get lab results with date range/latest filters |
get_version |
Check bridge/server versions |
Database Schema
-- Core tables
patients (id, guid, name, dob, sex, created_at)
studies (id, patient_id, study_date, study_desc, folder_path)
series (id, study_id, series_number, series_desc, modality, orientation_type)
slices (id, series_id, instance_number, slice_location, orientation_type,
tr, te, png_path, rows, cols, pixel_spacing_row, pixel_spacing_col,
image_position_x/y/z, image_orientation)
-- Auth tables
accounts (id GUID, email, email_hash, name, last_login, created_at)
account_profiles (account_id, profile_id, role, email, created_at)
sessions (token, account_id, profile_id, created_at, expires_at)
auth_codes (email, code, created_at, expires_at)
-- Lab tables
lab_results (id, profile_id, test_name, value, units, ref_range_low,
ref_range_high, collected_at, source)
Build System
All binaries built with FIPS 140-3 cryptographic compliance (requires Go 1.24+).
Build Flow
Source (.253) ──sync──► Mac ──build──► darwin binaries ──deploy──► .253
│ ▲
└────────sync──────► Win (.9) ──build──► win binaries ──deploy────┘
Binaries
| Binary | Platform | Build Location |
|---|---|---|
| inou-portal | Linux | .253 |
| inou-viewer | Linux | .253 |
| import-dicom | Linux | .253 |
| inou-lab-scrape | Linux | .253 |
| inou-lab-import | Linux | .253 |
| inou_bridge_darwin_arm64 | macOS ARM | Mac |
| inou_bridge_darwin_amd64 | macOS Intel | Mac |
| inou_bridge_win_amd64.exe | Windows x64 | .9 |
| inou_bridge_win_arm64.exe | Windows ARM | .9 |
| inou_bridge_win_386.exe | Windows x86 | .9 |
Build Commands
Linux (on .253):
cd ~/dev/inou
make deploy
Mac bridges:
~/dev/inou/build-mac.sh
Windows bridges (from Mac):
sshpass -p 'Helder06' ssh johan@192.168.1.9 "C:\dev\inou\build.bat"
sshpass -p 'Helder06' scp johan@192.168.1.9:'C:/dev/inou/bin/inou_bridge_win_*.exe' /tmp/
scp /tmp/inou_bridge_win_*.exe johan@192.168.1.253:/tank/inou/bin/
Verify FIPS:
ssh johan@192.168.1.253 "/tank/inou/status.sh"
Service Management
ssh johan@192.168.1.253
/tank/inou/start.sh # Start all services
/tank/inou/stop.sh # Stop all services
/tank/inou/status.sh # Check status and FIPS compliance
Logs
tail -f /tank/inou/logs/portal.log
tail -f /tank/inou/logs/viewer.log
Directory Structure
Source (.253)
~/dev/inou/
├── portal/ # Web portal + auth
├── viewer/ # DICOM viewer + REST API
├── import_dicom/ # DICOM importer
├── mcp-client/ # Bridge client source
├── scrape_mychart/ # Lab scraper + importer
├── lib/ # Shared crypto library
├── go.mod, go.sum
├── Makefile
├── README.md
├── journal.md
└── build-mac.sh
Production (.253)
/tank/inou/
├── bin/ # All compiled binaries
├── data/inou.db # SQLite database
├── uploads/ # User uploads by GUID
├── objects/ # Converted images (GUID-based paths)
├── logs/ # Service logs
├── lang/ # Translation files
├── templates/ # Portal HTML templates
├── static/ # CSS, assets
├── static/robots.txt # Search engine rules
├── master.key # Encryption key
├── start.sh, stop.sh, status.sh
Security
Encryption
- FIPS 140-3 compliant (Go 1.24+ native module)
- AES-256-GCM encryption at rest
- TLS 1.3 for transport
- Deterministic encryption for searchable fields
Authentication
- Passwordless: email + one-time code (10 min expiry)
- Session cookies with configurable expiry
- Account GUID isolation (no cross-account access)
Data Isolation
- All queries filtered by profile_id derived from session
- SQL injection protection (parameterized queries)
- Access validation on all endpoints
Product Design
Terminology
| Term | Meaning |
|---|---|
| Account | Human with email who logs in |
| Profile | A person whose data is stored (patient) |
| Exam/Study | One imaging session |
| Series | One sequence within an exam (T1, T2, FLAIR) |
User Flow
- Landing page → Create account (email + code)
- Dashboard → Add profile (name, DOB, sex)
- Profile → Upload exam (DICOM zip)
- Connect Claude Desktop → "Analyze my inou"
- AI reviews images, answers questions
Design
- Modern, warm, not clinical
- IBM Plex Sans font
- Desert color palette: warm beige (#F5EDE4), dark brown (#4A3728), terracotta (#C4704B)
Privacy (prominent)
- Images NEVER used to train AI
- Data NEVER shared
- Always encrypted
- You own your data - delete anytime
i18n
Languages: English, Русский, Nederlands, Español, Français, Deutsch
Detection priority: URL param → Cookie → Accept-Language → English
Data Types
Implemented
- Medical imaging (DICOM)
- Lab results
Planned
- Medical records / clinical notes (PDF)
- Medications / prescriptions
- Genetic data (VCF files)
- Vitals (BP, HR, SpO2, weight, glucose)
- Supplements
- Symptoms / pain journal
Roadmap
High Priority
- Position-based cross-series fetch
- find_slice_at_position tool
- Window/level controls (presets for T1, T2, FLAIR, DWI)
- Better error messages (SESSION_EXPIRED)
Medium Priority
- Batch montage fetch
- Measurement tools (distance, area)
- Series grouping/filtering
- Report system (save markdown, PDF export)
Lower Priority
- Expanded anatomical regions
- Report templates
- Persistent findings/annotations
Infrastructure
- Dedicated Inou server (separate from home lab)
- Encrypted ZFS pool for PHI
- Audit logging
Troubleshooting
FIPS Build Fails
- Ensure Go 1.24+ installed
- Use
GOFIPS140=v1.0.0environment variable - FIPS requires native builds (no cross-compilation)
Bridge Connection Issues
- Check Claude Desktop config JSON syntax
- Verify account GUID is correct
- Test API:
curl https://inou.com/api/version
Service Issues
# Check if running
pgrep -a inou
# Check logs
tail -100 /tank/inou/logs/portal.log
# Restart
/tank/inou/stop.sh && /tank/inou/start.sh
Session Log
See journal.md for detailed session history.
Future: Unified Data Model
See docs/DATA_MODEL_V2.md for planned schema migration to single observations table.