Pranjal Sailwal

recovering from log

  1. seq 0000recovering from log

NeuroTract

“Can research software refuse bad input and show how every result was made?”

A diffusion MRI research workstation: tractography, connectomes and provenance in one interface

31

pytest tests

live

job progress streamed to the browser as server-sent events

sha-256

dataset checksums stored with every result

Reel 1 of 9: Now showing

Scroll to watch. Click someone in the audience.

  • In the audience

Now showing

NeuroTract

A diffusion MRI research workstation: tractography, connectomes and provenance in one interface

The case in short.

The problem
Diffusion MRI pipelines fail quietly: a mismatched b-vector file or a merged acquisition produces a plausible-looking result that is wrong. Research software also needs to say clearly what its output is not.
Who it is for
Researchers working with diffusion MRI who need reproducible runs. It is research software, not a clinical tool.
My part
Sole author.

How it was done

  1. Before anything runs, I validate the 4D diffusion NIfTI together with its b-values and b-vectors: file integrity, volume and gradient compatibility, b0 presence, gradient shape.
  2. The pipeline runs preprocessing, DTI fitting, CSD/FOD estimation, probabilistic tractography, surface generation, connectome construction and graph metrics.
  3. Job milestones and telemetry stream to the browser with server-sent events.
  4. I store checksums, parameters, the random seed and software versions beside every result, so a run can be reproduced.
  5. The front end is Next.js and Three.js, for streamlines, orthogonal slices, connectome data and graph metrics, on a FastAPI back end.

What came out

A working end-to-end pipeline and viewer with a pytest suite, a documented architecture and a deployed front end.

What it rests on.

Every figure about this project, and how each one is known. The folder structure, languages and history on the right are read straight from GitHub, so they say what the code is, not what I wish it were.

31pytest tests
livejob progress streamed to the browser as server-sent events
sha-256dataset checksums stored with every result
github.com / sailwalpranjal / Neurotract

17

commits

132

files

35

folders

9.6 MB

on disk

  • Python 65%
  • TypeScript 34%
  • CSS 0.3%
  • JavaScript 0.2%
  • Neurotract/
  • src/106 files
    • frontend/
    • backend/
    • __init__.py
  • tests/7 files
    • __init__.py
    • test_api_endpoints.py
    • test_benchmark_and_sensitivity.py
  • models/2 files
    • brain_hologram.glb
    • brain_point_cloud.glb
  • analysis_and_decisions/1 files
    • decision_log.md
  • ci/1 files
    • test.yml
  • docs/1 files
    • PROJECT_GUIDE.md
  • examples/1 files
    • pathology_detection_example.py
  • logs/1 files
    • .gitkeep
  • output/1 files
    • .gitkeep
  • scripts/1 files
    • download_demo_data.py
  • .env.example
Feb 2026 → Sep 2026.py ×63.tsx ×35.ts ×6.json ×5.glb ×4

Appwrite Migration Guard

A local-first CLI that checks an Appwrite migration did what it should, and says PASS, WARN or BLOCK with a reason

If you want to talk about how this was built, write to me.

  1. seq 0001you arrived
  2. seq 0002write back