π¦ Deploy Β Β·Β π Auto-update setup Β Β·Β πΊοΈ Roadmap Β Β·Β π Changelog
π macOS Intel (.dmg) Β· Windows .msi Β· Debian/Ubuntu .deb Β· Fedora/RHEL .rpm Β· all assets β
curl -fsSL https://raw.githubusercontent.com/ArioMoniri/semikap/main/install.sh | shClones the repo into ./tamias, runs npm ci && npm run build, starts the static server. Look for TAMIAS_PORT=<port> in the output and point your reverse proxy at that port.
β No manual edits required. Every override has a runtime knob (
PORT,HOST, Helm values,.env). The literal stringplaceholderappears nowhere in source β only insidepackage-lock.jsonas part of an upstream Babel package's name, which is a transitive dependency of the React build toolchain and is not editable.
A clinician opens a link, picks a local image, picks a local ONNX model, and gets an AI segmentation overlay rendered on a 3-plane MPR + 3D viewer. Bytes never leave the device. Inference runs in the browser via WebGPU (Metal / D3D12 / Vulkan), with WebNN and a multi-threaded WASM-SIMD fallback.
flowchart LR
A[π Local file<br/>DICOM Β· NIfTI Β· NRRD] --> B[π§ ONNX model<br/>+ manifest.json]
B --> C[π οΈ Worker<br/>resample Β· normalize Β· tile]
C --> D{π Backend?}
D -- WebGPU --> E[π¦ GPU<br/>Metal / D3D12 / Vulkan]
D -- WebNN --> EN[πͺ NPU / ANE / DirectML]
D -- fallback --> F[π« WASM-SIMD<br/>multi-threaded]
E --> G[π©» Segmentation overlay<br/>MPR + 3D Β· brush correction]
EN --> G
F --> G
G --> H[πΎ Local save<br/>NIfTI Β· DICOM-SEG Β· repro JSON]
| π‘οΈ Strict CSP β no upload | π PWA install | π₯οΈ Tauri desktop builds | π Sparkle-style auto-updater |
| π WebGPU + WebNN + WASM | π«οΈ Gaussian-blended tiling | π§± 3D sliding-window inference | ποΈ WW/WL CT presets |
| π οΈ Radiology toolbar (W-L Β· Pan Β· Distance) | π©» Outline mode for masks | π Zoom in / out Β· πΈ PNG screenshot | πΌοΈ Layout: MPR / single-plane / 3D / grid |
| π¨ 6-colour brush + per-colour mask export | ποΈ Brush strokes visible in 3D | π©» Multi-series overlay | π¬ Cursor probe (vox Β· mm Β· value) |
| π©» Sidebar volume preview (mid-axial thumb) | π Cached-models search | π Light / Dark / System theme | πͺͺ Modality toggle (Radiology Β· Pathology) |
| π¬ Pathology mode (OpenSeadragon + OME-TIFF) | π§ Tile-based ONNX inference | π Distance ruler in microns | π€ Result PNG + sidecar JSON |
| πͺ SAM (Radiology + Pathology) | π§ Smart-brush single-click mask | π§ Cross-slice propagation (Β±5 / Β±15) | πΎ Auto-save folder (IDB-persisted) |
| πΎ NIfTI mask export | π©» DICOM-SEG export (PACS) | π§Ύ Reproducibility bundle | π Local audit log (NDJSON) |
| π½ OPFS warm cache | π SHA-256 model verification | β€οΈ /healthz for K8s probes |
πͺͺ RUO stamp on every export |
π¬ Pathology mode lands in v0.6.0. Whole-slide image viewer (OpenSeadragon-based pyramidal viewer Β· OME-TIFF Β· Aperio SVS Β· Hamamatsu NDPI Β· TIFF Β· PNG Β· JPEG), tile-based ONNX inference (segmentation / classification / heatmap / detection), MPP-aware distance ruler, six-colour brush + eraser with per-colour PNG export. Bundled CC0 synthetic H&E sample for end-to-end testing. Full reference:
docs/PATHOLOGY.md. Roadmap:docs/ROADMAP.md#v060--pathology-mode.πͺ SAM (Segment Anything) ships in v0.7.0 β click + box + text prompts β mask, in both Radiology and Pathology modes. One-click HuggingFace download (SAM 2 Tiny ~30 MB, SAM 2 Base+ ~80 MB, MedSAM ~360 MB) or bring your own ONNX export. Encoder runs once per slice / ROI on WebGPU; decoder is sub-100 ms per prompt revision so refinement is interactive. Smart-brush in the radiology Annotation panel (single click β mask straight into the brush layer, no Encode/Generate/Commit roundtrip). Cross-slice propagation (Β±5 / Β±15 slices) walks neighbours using each previous mask's bbox as a prompt. Auto-save folder for screenshots persisted across sessions via IndexedDB. No upload, weights cached in OPFS, SAM 3 BYO URL slot ready for when a stable export ships. Full plan + status table:
docs/SAM.md.π« TotalSegmentator (whole-body anatomical segmentation) lands in v0.7.4 β v0.7.7 under the On-Prem AI sidebar section. Three runtime paths: (a) native Python sidecar β Tauri desktop spawns your local
totalsegmentatorinstall (Mac MPS / CPU / Linux CUDA β whatever your PyTorch resolves to), streams stdout/stderr live, captures the per-class NIfTI masks; (b) BYO ONNX URL β community-converted exports run via the same browser ORT stack as SAM; (c) Pyodide (experimental) β wired end-to-end, today blocked at SimpleITK in the Python WASM ecosystem. Full setup + task list + troubleshooting:docs/TOTALSEGMENTATOR.md.π Persistent measurements + per-pane slice chips ship in v0.7.8. Multi-distance + multi-color angle (yellow vertex / red arm 1 / blue arm 2), each with a click-to-delete handle. Per-pane slice number chips (e.g.
A 47/154) overlay the top-left of each MPR viewport, plus a3Dlabel on the render tile. SVG overlay re-projects on every animation frame so pan / zoom / slice scroll all keep the markers anchored to source-mm coordinates.
| Path | Command | When to pick |
|---|---|---|
| Node only | npm run setup |
Single-machine, simplest |
| Docker | docker compose up -d --build |
Single host, containerised |
| Helm | helm install tamias deploy/helm/tamias |
Departmental K8s |
| systemd | systemctl enable --now tamias |
Long-running on a box |
| Tauri desktop | npm run desktop:build |
Native app per workstation |
β Full setup, reverse-proxy snippets, and configuration table: docs/DEPLOY.md
Desktop installs self-update from a signed latest.json manifest published with each release. Sparkle-style on macOS / Windows / Linux via Tauri's official updater plugin.
Brand new machine? Step-by-step from cloning to first release: docs/UPDATER.md β "From zero on a brand-new machine"
TL;DR for an existing checkout:
node scripts/init-updater.mjs # one-time keypair generation (maintainer)
node scripts/release.mjs minor # cut + push v0.3.0; CI signs + publishes installersβ Full setup + signing-key flow: docs/UPDATER.md
TAMIAS ships no model weights. The user supplies an .onnx (or .ort) plus a sidecar .json manifest:
{
"name": "MyLiverSeg",
"version": "1.0.0",
"license": "Apache-2.0",
"modality": "CT",
"spacing": [1.5, 1.5, 1.5],
"orientation": "RAS",
"normalization": { "type": "window", "level": 50, "width": 400 },
"inference": { "type": "sliding_window", "patch": [128, 128, 128], "overlap": 0.25 },
"output": {
"type": "segmentation",
"labels": { "0": "background", "1": "liver" },
"colors": { "1": "#22c55e" }
},
"preferredEP": "webgpu",
"tta": { "flips": { "x": true } },
"sha256": "<optional hex hash of the .onnx file>"
}If sha256 is present it's verified against the loaded ONNX bytes before the session is created.
The diagram below regenerates on every push to main (repo-visualizer by GitHub Next). A schematic placeholder is committed to the repo so this image always renders, even before the workflow has run.
- examples/ β drop-in 3-file test kit (CT NIfTI + tiny ONNX + manifest, ~470 KB) for an end-to-end smoke test
- ROADMAP β phased delivery & what's next
- DEPLOY β every supported deploy mode + reverse-proxy + configuration
- UPDATER β auto-update setup, signing keys, release flow, from-zero new-machine guide
- SIGNING β Apple Developer code-signing + notarisation (fix the "DMG is damaged" warning), Windows Authenticode
- CHANGELOG β release notes
- CONTRIBUTING β what we accept and the dev loop
- SECURITY β threat model and reporting
Apache-2.0 Β© 2026 Ariorad Moniri and TAMIAS contributors.


