
Science and software are inseparable.
Computer engineering, machine learning, and astrophysics, from space telescopes and planetary defense to radio interferometry.
World-class observatories




Moriarty Engineering LLC contracts
Triggered and Automated Observing
Designing the automation of an interferometer's observing, starting with rapid response to gamma-ray bursts: on target within minutes of an alert, with operator approval.
Wrote the use cases with operators, PIs, and staff scientists, then the requirements and system architecture for a phased build. The two prototyping experiments behind the design ran on coding agents: spec-first proposals, changes on task branches, lint and unit tests in CI on every push, and a human review of every merge.
Virtualization and Disaster Recovery
Designed and deployed the primary virtualization system, XCP-ng and Xen Orchestra over a high-speed SAN, to move operations off aging infrastructure, with monitoring throughout.
Migrated the core science database onto the new system, and built out a second physical site for backup and disaster recovery.
Twelve years building observatory software, from Hubble and Webb to planetary defense
Staff engineering at the Smithsonian Astrophysical Observatory and the Space Telescope Science Institute, 2012 to 2024.
NASA's planetary defense clearinghouse
Led engineering for the clearinghouse of asteroid and comet observations, reporting regularly to NASA and the MPC Users Group. Designed a parallel orbit-fitting pipeline: RabbitMQ and containerized OrbFit workers on Docker Swarm. Built public visualization apps and Flask APIs on a replicated PostgreSQL cluster.
Architected the on-prem infrastructure underneath: an iSCSI SAN on Dell PowerVault arrays, XCP-ng virtualization, Prometheus and Grafana monitoring with alerting, and a remote backup site.
Also: hired and managed a team of engineers, and mentored an intern who built a near-Earth-object classifier in TensorFlow.Eight telescopes on Maunakea, and the Event Horizon Telescope
Led software for the interferometer: networking and software for the FPGA-based SWARM correlator, and the VLBI software used in Event Horizon Telescope campaigns, fixed and automated. Maintained and extended the array's C control software on LynxOS and Linux, and created smax-python, the client for the array's Redis-based real-time messaging layer, which the SMA team still maintains.
Reworked the observatory's meetings and project management, and taught Python, testing, and version control in Cambridge and Hilo. That discipline carried SWARM's expansion to all six quadrants through a government shutdown, the Maunakea protests, and COVID.
And: founded and chaired the CfA Software Engineering Steering Committee.Hubble, Webb, and a coronagraph testbed
Led new features for APT, the Java tool scientists use to design and submit Hubble and JWST observing programs, including the JWST instrument templates. NASA recognized the work twice: bright-object checking for Hubble's moving targets, and JWST coordinated parallel observations.
Then lead software engineer for the Makidon Optics Lab: the Python control library for HiCAT, with the environmental sensing and safe shutdown that made remote operation possible, released as catkit, and the real-time pipeline that wrote every exposure to FITS.
Co-investigator on a funded NASA TDEM proposal, and first author of the testbed's software paper.Before astronomy
AI for a Navy battle-management SBIR
Led a Navy Phase II SBIR building AI-driven software that drew on command-and-control systems to recommend resource plans, and won a follow-on contract to turn the code into an SDK. Also applied neural networks to predict traffic at a simulated intersection.
Device software for network test equipment
C and C++ for IPTV and network test devices, from RS-232 control of a femtocell antenna to jitter measurement and a customer-facing XML API, plus the JBoss monitoring and alarm system that showed their live data.
M.S. in Intelligent Systems and B.S. in Computer Engineering
Master's thesis: teaching non-player characters in Quake II to behave like the people playing them, by watching them play, with time-delay neural networks.
Read the thesis →What I do
Scientific software and data infrastructure
Pipelines, instrument control, and the data systems that carry an instrument's output through to published results, the part of the work I enjoy most.
Local AI
Open-weight models on hardware you own, including building the GPU servers, tuned for the work, and coding agents that run spec-first under human review.
On-prem infrastructure and disaster recovery
Compute, storage, and virtualization on an open source hypervisor in your own building, monitored, with backups that have actually been restored, handed to your own staff.
A self-hosted platform for agentic coding
I build and run my own infrastructure: a GPU server for open-weight models, a virtualized homelab with CI, monitoring, and identity, and a coding agent that takes an issue to a reviewed pull request. Everything here runs on hardware I own.

| GPUs | 4 × Quadro RTX 5000, Turing |
|---|---|
| VRAM | 64 GB, two NVLink pairs |
| Memory | 376 GB DDR4 |
| Engines | vLLM, llama.cpp |
| Daily model | Qwen3.8-27B, fp8 KV cache, 512k context |
Trogdor, a GPU server for coding agents
Built from secondhand parts: four Quadro RTX 5000s in a used PowerEdge, quiet enough to sit beside a desk. It serves the open-weight models my coding agents run on, up to six streams at once.
vLLM disables its FlashInfer attention backend on GPUs older than Ampere. Lowering that gate in a local build cut a cold 21k-token agent turn from 42 to 13 seconds. With tuning since, decode runs at 61 tokens a second at 20k context.
| Experiment | Outcome |
|---|---|
| FlashInfer on Turing | Decode at 20k context from 28.9 to 49.0 tok/s, then 61; fp8 KV cache doubled to 972k tokens |
| 125B mixture-of-experts on llama.cpp | vLLM can't run it on Turing; 94 GB quantized, experts partly in system RAM, 25 tok/s |
| Multi-token prediction | 2.5× slower on vLLM here, 49% faster on llama.cpp on an RTX A4500 |

Braid, a coding agent from issue to pull request
A graph of spec-driven steps runs the agent. Each step has to pass a scripted check on the repository, and a person approves the proposal and the merge. OpenSpec and Gitflow, written as graph workflows, and extensively tested.

Strongbad and the homelab
Strongbad is a Dell PowerEdge running XCP-ng, the open source hypervisor, and it hosts the rest of the lab: Forgejo with CI runners, git-driven Portainer deployments, Prometheus, Grafana, and Loki monitoring, identity management, and backups. Alongside it, the services I run for my household and friends: Jellyfin, Navidrome, and Audiobookshelf for media, Immich for photos, Vaultwarden for passwords, Mealie for recipes, RomM for games, OpenProject, Home Assistant, Pi-hole, and Sharkord, Snikket, and Matrix with Element for chat. Trogdor, the GPU server above, runs the models. Open source throughout.

My Stop, a departure board for one stop
A 64×32 LED matrix driven by an Adafruit Matrix Portal S3, whose ESP32-S3 brings Wi-Fi and Bluetooth, running CircuitPython. A small API of my own sits between the sign and the MBTA's predictions, with a registered API key for a higher request rate, and hands the board text already fit to sixteen characters a line. The case is my own design in OpenSCAD, 3D-printed.

Soundcheck
Gathers listings from dozens of Boston-area venues, with playable tracks for each artist, so you can hear a band before you buy the ticket.

JP Porchfest
An offline festival companion for Jamaica Plain's Porchfest, with on-device walking routes. Built in a day, and used by hundreds of attendees.

Freedoku
An offline-first sudoku app with no account and no server. Every puzzle has a unique solution and never needs a guess. Built with opencode on self-hosted models served through llama.cpp and vLLM, with self-hosted MCP servers for tools.

Absolutely Derivative
A nerdy web comic from life around observatories and astrophysics, hand-drawn, with an archive, random, and direct links to every strip. Still a work in progress, with new strips on the way.