Shane Poole · Software & data engineer

Learning, tinkering, exploring, and trying to leave the world a little better.

By day I turn messy health data, from wearables and clinic video to millions of clinical notes, into answers people can trust. After hours I'm usually chasing a dark sky with a camera, tinkering with our home solar setup, or building something for friends to play.

Currently classifying clinical text at scale, validating gait measures from video, and waiting on the next new moon.

Selected work

$2814,888 MRI reports in 4 hours2025First author

Whether an MRI showed new lesions was written into narrative reports, not stored as anything you could count. One prompt turned every report in our health record into data we could analyze, and that analysis became my first-author paper in Annals of Neurology.

  1. Reports14,888 MRI reports from 2000 to 2022, with new T2 and contrast-enhancing lesions described only in prose.
  2. PromptOne prompt reads each report and returns discrete fields.
  3. FieldsNew T2 lesions, how many, and whether any enhance: things you can finally count.
  4. Check97% accurate against manual annotation. Every report classified in about four hours, for $28.
  5. AnalysisWith those labels we identified neighborhood poverty as a predictor of new inflammatory activity on B-cell depleting therapy.
Illustration: a narrative MRI report goes through an LLM prompt and comes out as discrete fields for new T2 lesions, lesion count, and enhancement, checked at 97% against manual annotation, then used in a treatment-response analysis. MRI REPORT ILLUSTRATIVE FINDINGS: Compared with the prior study, two new T2 hyperintense lesions are seen in the periventricular white matter. No abnormal enhancement is identified. LLM prompt LESION FIELDS new_t2yes new_t2_count2 enhancingno 97% VS. MANUAL ANNOTATION 4 HOURS · $28 NEW ACTIVITY ON THERAPY ILLUSTRATIVE LOWER POVERTY HIGHER POVERTY 1 2 3 4 5
AWSDeployed inside UCSFInception to deploymentBackend, AWS, Flutter

Recording assessments at home

Project lead

An app that lets study participants record standardized videos on their own phones, so assessments no longer wait on a clinic visit. I've led it from the first conversation: the whole backend, parts of the Flutter app, and its deployment to AWS inside UCSF's secure enterprise cloud, where every subnet, certificate, and route goes through the institution's security and network teams.

  1. RecordParticipants record standardized videos at home in the Flutter app.
  2. UploadVideos go up in parts. A dropped home connection picks up where it left off instead of costing someone their recording.
  3. Private networkAn internal HTTPS load balancer across two availability zones is the only way in. No public IP, no internet gateway, TLS at every hop.
  4. APIFastAPI in Docker behind nginx, with JWT and Argon2 auth, streams each part on to storage.
  5. StorageKMS-encrypted S3, reached through a private endpoint, holds the video. PostgreSQL tracks each upload's metadata and status.

Coming soon to the App Store and Google Play, for iOS and Android.

Illustration: a participant records a video on their phone and it uploads in chunks that resume after a dropped connection. Inside UCSF's private AWS network, a load balancer passes it to a FastAPI service, which records metadata in PostgreSQL and writes the video to encrypted S3 storage. REC RESUMABLE UPLOAD chunk 5 of 6 connection dropped, picks up where it left off UCSF · AWS load balancer TLS AT EVERY HOP NO PUBLIC IP · NO INTERNET GATEWAY FastAPI NGINX · DOCKER PostgreSQL METADATA S3 · video MULTIPART · KMS 1 2 3 4 5
500 GBGait and assessment video2023 to presentPipeline author

Measuring gait and expression from video

Clinic video, turned into measures researchers can analyze: how someone walks, how their face moves, and what was said. Calculating features is the easy part. Earning the confidence to use them is the work.

  1. PoseTracked frame by frame across 500 GB of gait and assessment video, with the ankle path turned into gait measures.
  2. FaceFacial landmarks turned into action units, examined for patterns of expression.
  3. AudioTranscribed, then structured with an LLM into fields researchers can query.
  4. CheckGait measures compared against an instrumented gait mat, the gold standard they have to agree with.
Illustration: a walking figure tracked across three frames with its ankle path traced, a face drawn as landmark points, and an audio waveform turned into a transcript, giving gait measures, action units, and transcript fields, with gait checked against a gait mat. POSE · FRAME 0412 ANKLE PATH gait measures FACE action units AUDIO transcript LLM transcript fields vs. gait mat OUT 1 2 3 4
Illustration: a hand of ace, king, and ten of hearts, which adds up to 31. A♥ ♥ K♥ ♥ 10♥ ♥
31Card game, onlineSide project

A real-time multiplayer take on the card game 31, built from scratch so my friends and I could play online. I own the game logic, the live-play experience, and the infrastructure. A side project with real users, real uptime, and a real AWS bill.

  1. Full-stack
  2. Real-time
  3. AWS App Runner
  4. Route 53

Off the clock, with a Nikon D610More photography ↓

About

Shane Poole, smiling, in glasses and a tan sweater

Nobody wants a pipeline. They want the answer at the end of it.

I'm a bioinformatics engineer on the data and development team at the Bove Lab(opens in a new tab) in UCSF's Department of Neurology, where we study multiple sclerosis through wearables, phones, and remote assessments. I build the systems underneath, turning device streams, clinical records, and research data into datasets and tools the team can trust.

I like following data from where it's measured to the decision it informs. Sometimes that's an analysis. Sometimes it's the dashboard a neurologist opens mid-visit to see how a patient's movement has changed over years. When the person behind the data may be in the room, quality stops being abstract, so I write the glossary, the runbook, and the decision record too. A system nobody else can operate isn't finished.

  1. Before Chemist, US EPA(opens in a new tab) Freshwater toxicology in Duluth, MN. Almost no code, until one VBA macro turned an afternoon in Excel into a keystroke.
  2. Then 42 Silicon Valley Software engineering. Left the bench and never went back.
  3. Now UCSF Neurology Data and development at the Bove Lab since 2021.
  4. So far 28 papers(opens in a new tab) Peer-reviewed, including a first-author paper in Annals of Neurology. Cited 470+ times.

More work

<1sTypical query, from 20+ seconds

The lab's shared data layer

A Python toolkit that grew into our shared data layer: warehouse queries, LLM extraction from clinical notes, and geographic and socioeconomic context behind one interface. Five years and 30+ downstream notebooks later, it's the first import in nearly every analysis we run.

  1. SQL Server
  2. Parquet
  3. DuckDB
  4. one Python import

2021 to present · Author & maintainer

43MClinical documents

Clinical text classification

Too many records for manual review. Structured signals (demographics, surgical history, diagnostic codes, medications) are paired with rules-based NLP over free-text notes, and a temporal pass settles whatever stays ambiguous. Sharded, checkpointed, resumable jobs make a full run practical.

  1. codes + meds
  2. NLP on notes
  3. temporal pass
  4. classified record

2026 · Author & maintainer

5 yrsIn service and counting

Mobility data, clinic to dataset

Clinic instruments and a recording app send video and metrics to an async service that validates, transcodes, and catalogs each file. A scheduled ETL reconciles identifiers across sources, so researchers get one dependable layout instead of four conventions and a naming argument.

  1. instruments
  2. ingest
  3. transcode
  4. storage
  5. ETL
  6. one layout

2021 to present · Primary developer

Side project

Home solar, panels to wall screen(opens in a new tab)

I built our home solar setup, then the data system to go with it. Readings from the Victron charge controller, the battery monitor, and the Bluetti power stations flow into InfluxDB on a Raspberry Pi, with Grafana for the long view. The everyday screen is a jailbroken Kindle on the wall: solar, battery, and the car in 16 shades of gray, remotes for the plugs and TV, and a health page that says what's broken.

  1. panels
  2. Victron + Bluetti
  3. InfluxDB
  4. Grafana + Kindle

Side project · Dashboard code on GitHub

Also

Multi-site imaging infrastructure
Reconciled imaging manifests from seven sources behind a deterministic, de-identified ID service for a multi-site study.
Wearables and device data
Sync services for consumer health APIs, VR cognitive assessments, and gait instruments.
Analysis on request
50+ cohort builds, statistical models, and publication figures for collaborators across several labs.
Environmental modeling (EPA)
Endocrine-disruption dose-response models, fish transcriptomics, and adverse outcome pathway networks for chemical-mixture risk.

Toolbox

Languages
PythonSQL (T-SQL)RDart and FlutterBash
Data
DuckDB and ParquetSQL ServerPostgreSQLsharded ETLschema designstatistical modeling
Services
FastAPIFlaskRedis and RQ workersDocker and ComposeREST APIs
Platform
AWS: EC2, S3, RDS, ALB, KMS, ECRobject storagenginxCI and deploymentpytest

Photography

Some data I collect for fun.

Mostly landscapes and night skies on a Nikon D610, plus the occasional patient bird. A few have ended up on friends' wedding invitations. Each frame lists its exposure, because I couldn't resist.

Contact

Tell me what you're working on.

Especially if it involves research data, clinical text, video as a measurement, or a properly dark sky. Email reaches me fastest.