Skip to content

Releases: rezamotaghi/cbctscope

v1.6.0: the agent-native release

Choose a tag to compare

@rezamotaghi rezamotaghi released this 09 Sep 05:19

The MCP surface grows from 8 to 15 verbs and becomes self-describing, without moving the fence: every verb is still navigation or visualization, none returns a finding, none runs code, nothing leaves the machine.

  • viewer_state: what is on screen, machine-readable, with every slice in the pane count and its direction.
  • pick_scan: the agent asks, you choose in the native dialog; the agent gets the label, never the path.
  • Saved views over MCP (list, restore, save); agent-saved views carry an "agent" badge so a bookmark is never mistaken for yours.
  • set_3d_style, navigate_arch (pano), and slice navigation in grid and pano.
  • Tool annotations and output schemas on every verb; snapshots carry a state caption.
  • Read-only resources and four reading choreographies as prompts (mpr-survey, pano-survey, tmj-read, replay-views), distilled from the reading guides.
  • One-click install for Claude Desktop: the attached cbctscope-1.6.0.mcpb (installs the agent half; the viewer still runs from this repository).
  • Agent Skill in skills/cbctscope-reading/ for any host that reads SKILL.md.

Docs: docs/mcp.md and manual chapter 9.

v1.5.1: one slice count, a window that stays put

Choose a tag to compare

@rezamotaghi rezamotaghi released this 19 Aug 09:46

A patch release with two corrections found in reading, plus real imagery in the README. No new controls; everything in the v1.5.0 manual still applies.

One slice count in every mode. The same physical axial slice used to carry two numbers: the MPR pane said AXIAL 622/801 while the Pano, TMJ, Reslice and Region scouts said AXIAL 180/801, always summing to n+1, because MPR printed the pane index and the scouts printed the voxel index. Every slice ordinal you see or save is now the pane count, 1-based, with its direction printed beside it: AXIAL 622/801 S→I (slice 1 is the most superior), coronal P→A, sagittal R→L. The letters follow the live camera, so an obliqued pane reports the direction it actually scrolls along. Composed snapshots bake the same label, so a figure never has to be re-read against the mode it came from. The slice-stack export keeps the voxel index in its filenames, as the data contract for meta.json and NIfTI, and meta.json now states the mapping. navigate_slice is unchanged (0-based pane index: the pane labelled AXIAL 622/801 S→I is index: 621); the MCP docs now say so, so an agent and a reader mean the same slice by the same number.

The window stays put. Any window you set (a preset, the sliders, the histogram lines, a mouse W/L drag) used to revert to the volume's default about half a second after every return to MPR, written as a plain number so no preset chip lit. The other modes then showed a window you never chose, which is why it was hard to pinpoint. The cause was the v1.5.0 mouse-W/L sidebar sync taking Cornerstone's own volume-attach event for a drag. It now trusts only a real drag (W/L tool active, button held on a pane). Every reset still works as before: double-click on any slider, the histogram default, Reset all, R.

Real imagery in the README. The four interface stills and the demo GIF are now shot on a real CBCT (16×16 cm, 200 µm, full head with dentition), shown with the patient's written consent and de-identified before it was ever opened; every 3D pane is the bone surface style, never a soft-tissue render. The volume itself is not in the repository and never was. The demo GIF is recorded live over the MCP bridge on that scan.

Upgrading: git pull (or download the release) and npm install, then start as usual. No data or sidecar migration; saved annotations and views are unaffected.

Research use only. Not a medical device. CBCTScope visualizes and navigates volumes. It never produces findings, measurements-as-conclusions, or diagnoses, in the UI or over MCP. Do not use it for clinical decision-making.

v1.5.0: the consistency release

Choose a tag to compare

@rezamotaghi rezamotaghi released this 06 Aug 05:56

Every control now answers the same way across all eight reading modes, and on 2D radiographs.

  • One snapshot button in the header, answered by every mode with its own composition. Radiographs save the whole frame at native resolution, with the displayed window, gamma, and invert baked in, so a 2943 px panoramic keeps its detail.
  • Mouse window/level: a new W tool windows any slice by left-drag, the sidebar following live.
  • Honest windowing: gamma applies in every mode, Ceph reads the same sidebar Window section as every other mode, and the histogram is available everywhere at volume load.
  • One slider grammar: every slider resets on double-click (navigation to the volume middle, parameters to defaults); disabled controls stay visible at full contrast with a tooltip that says why.
  • No recoverable state can blank a room: failed auto-arch, saves, and region grows warn inline with everything still on screen, and real volume-load failures get a retry button.
  • The export menu no longer closes while you are typing in it; Escape is the deliberate close.
  • Discoverability: a per-mode gesture legend in the header, a keys button opening the shortcut reference, an About panel on the version chip, and stroke icons replacing the emoji throughout.

The user manual is synced with all of it, and the README interface stills are re-shot on this version.

v1.4.0: native file dialogs on every OS, double-click start

Choose a tag to compare

@rezamotaghi rezamotaghi released this 05 Aug 08:16

CBCTScope now installs and opens scans the same way on macOS, Windows, and Linux.

  • Native file dialog on every OS: Finder on macOS, the built-in PowerShell dialog on Windows, zenity or kdialog on Linux. The one-line path command remains as a fallback for desktops without a dialog helper.
  • Double-click start: "Start CBCTScope.command" (macOS) and "Start CBCTScope.bat" (Windows) install on first run, start the viewer, and open the browser. After installing Node.js once, no terminal is needed.
  • "npm run demo" now works on Windows, so demo mode's privacy guarantee (never restores a previously opened scan) holds on every OS.
  • The README states system requirements up front; manual chapters 2, 4, and 11 match the new flow.

The Windows and Linux dialog paths are new in this release. If a dialog does not open on your system, please report it on the issue tracker, and never attach patient imaging.

v1.3.1

Choose a tag to compare

@rezamotaghi rezamotaghi released this 29 Jul 16:53

Patch release: a platform migration and the one regression fix it required. No new reading features.

  • Cornerstone3D 4.22.13 to 5.6.12. The viewer now runs on the v5 rendering core, which brings vtk.js 36.
  • Fixes a v5 regression that crashed volume mounting. v5 probes a default window by force-reloading a slice through the image-loader registry; CBCTScope now registers a cbctlocal local-slice image loader, so that probe resolves and volumes mount cleanly.
  • Dependency hygiene: vtk.js 36 retires the js-yaml and xmlbuilder2 audit advisories.

Verified on the synthetic phantom in all eight reading modes, in 2D radiograph mode, and over an agent-bus round trip, with the four gates green.

v1.3.0: a cleaner 3D render, and a full interaction set for the reformat modes

Choose a tag to compare

@rezamotaghi rezamotaghi released this 29 Jul 13:40

3D render

  • Shaded styles light off the render's opacity cloud with local ambient occlusion, so sockets and interproximal gaps self-shadow instead of flattening out.
  • The 3D pane renders from a lightly denoised copy of the volume (on by default). Slice views, measurements, and exports always keep the original voxels.
  • New cinematic light option: light scatters inside the volume for soft studio shadows.
  • Style set reworked: Shaded, Shiny, Surface, Soft tissue, MIP, X-ray, X-ray shaded, B&W X-ray. Surface, a bone-toned isosurface, is the new default.
  • Orbiting stays responsive: sampling coarsens while the camera moves and sharpens again on idle.

Pano, Reslice, TMJ

  • Vertical crop moved to handles on the right edge of the reformat: a real cut of the sampled range, with the kept band scaled into the pane.
  • The arch, path, and axis lines now have a placing and finished phase. Double-click finishes; after that, drag a dot to refine or drag the line to move the whole thing. Reset arch, Reset path, and Reset lines return to the drawn position.
  • The axial scout outlines the band the reformat actually samples, in green.
  • Right-drag rotates the sections, the same sweep gesture as MPR and Grid. The tilt drives the whole frame: the pano re-cuts with the same leaning vertical, the scout goes oblique, and the arch and canal traces stay visible as dashed projections. TMJ rotates each side's fan independently against one upright scout.
  • reset position returns tilt and crop to neutral without touching your drawn geometry.

Docs

Per-mode reading guides and the user manual updated for all of the above.

Research use only. Not a medical device.

v1.2.1 — click-to-place crosshair, drag-to-pan, and per-pane view reset

Choose a tag to compare

@rezamotaghi rezamotaghi released this 24 Jul 17:15

Two MPR interactions

  • Left-click places the crosshair, left-drag pans. In crosshairs mode a left tap spots the crosshair center on the clicked point, and a left drag pans the view. Right-drag rotates the section, the right+left chord zooms, and middle-drag also pans.
  • Per-pane view reset. Each MPR pane has a ↺ button that re-fits that pane's zoom and pan (orientation and window untouched). The global R squares up all panes.

Full changelog: v1.2.0...v1.2.1

v1.2.0 — reading feel, two bug fixes, and a client-side export menu

Choose a tag to compare

@rezamotaghi rezamotaghi released this 24 Jul 16:32

Highlights

Reading feel. MPR section rotation is now a steering-wheel gesture (grab the image and turn it; it reads correctly in every quadrant), and zoom moved onto a right+left chord drag. The 3D pane slices with a plain right-drag as one live, resume-able cut, and its resets square the volume back up. Window sliders span the image's full value range on a log scale, with double-click to snap back to the Auto window. The grid view gained in-plane tile spin, a reset button, and a PNG snapshot. Pane dividers are now draggable (an MPR quadrant knob and a grid scout/stack line), and they persist.

Export. A new export menu on the volume header writes three formats, all computed in the browser and saved to your Downloads (nothing is uploaded): a PNG slice stack, a NIfTI volume (.nii.gz) for Slicer / ITK-SNAP / nibabel / MONAI, and an STL surface mesh (marching cubes at a chosen HU threshold, honoring the 3D crop).

Fixed

  • Grid scout rotation read backwards on sagittal and coronal modes.
  • Canvas backing could stay stale after a maximize or layout change, misplacing overlay projections.

Full changelog: v1.1.0...v1.2.0

v1.1.0: 2D radiographs + single-viewer agent bus

Choose a tag to compare

@rezamotaghi rezamotaghi released this 19 Jul 09:07

2D radiograph support

CBCTScope now opens single 2D radiographs (DICOM modality PX, DX, CR, IO: panoramic, digital and computed radiography, intraoral) alongside CBCT volumes. Uncompressed 16-bit files, the same constraint as volumes.

  • Dedicated single-image view: window, gamma, invert, cursor-centered zoom, pan, fit
  • Gray values are display-normalized to a 12-bit scale at load (radiographs carry no HU calibration); MONOCHROME1 files are flipped so bright is always radiopaque
  • Over MCP, the volumetric verbs answer with clear errors on a radiograph; window by center/width, snapshot, and reset work unchanged
  • Built so multi-reader studies can read volumes and radiographs in one instrument under identical display settings

Single-viewer agent bus

The newest open viewer tab holds the agent connection. Opening a second tab evicts the first, which shows a banner and keeps working by hand. Agent commands go to exactly one tab and never race between two.


Research use only. Not a medical device.

CBCTScope 1.0.0

Choose a tag to compare

@rezamotaghi rezamotaghi released this 18 Jul 16:26

First public release.

A local-first CBCT viewer with native AI-agent control over MCP.

  • Eight reading modes: MPR, multi-slice grid, curved panoramic, TMJ, freehand reslice, virtual cephalogram, region growing with airway analysis, two-volume stitching
  • Agent surface of eight navigation-only MCP verbs; no code execution, no tool returns an interpretation
  • Local-only by construction: loopback-bound server, Host and Origin rejection, no uploads, no hosted instance
  • Demo mode with a procedurally generated synthetic phantom; recordings can never surface a real case
  • Per-mode reading guides in docs/reading-modes/

Research use only. Not a medical device.