Octofitter is a large set of packages I created with the goal of advancing the current state of orbit fitting. Octofitter is built from the ground-up for extremely high performance and differentiable computing. Using Octofitter, challenging orbit models which previously would require hours or days, can now be sampled in seconds or minutes.
This speed enables researchers to approach their modelling tasks with a new level of rigour, and following a full Bayesian workflow. One can—in less than the time it used to take to run a single model—compare how different individual data points impact a fit, compare how priors affect the results, or even run full suites of simulated fits to anticipate how new data would impact findings.
Octofitter supports an ever-growing list of kinds of exoplanet data. At present, these include:
Exopost is a public website for exploring companion posteriors from Octofitter and G23H. For more than 100,000 stars you can browse orbits and masses, view detection limits, filter the catalogue, and download the posterior samples for your own analysis. Queries run directly in your browser using DuckDB.
The calibrated Gaia DR2 catalog for 18 million stars that underlies G23H is described in Thompson et al. 2026.
PairPlots is a Julia and Python package for generating pair plots, also known as corner plots. Inspired by the very popular Python package corner.py, this package produces highly customizable visualizations to compare high-dimensional data e.g. Markov-chain monte carlo posteriors.
PlanetOrbits.jl is the calculation backend for Octofitter. It provides an easy interface to a large suite of different orbit calculations, and is fully auto-differentiable.
PlanetOrbits.jl supports many different kepler solvers with varying accuracies and number types (e.g. Float-16, Float-32, Float-64, and arbitrary precision). Bound and unbound (hyperbolic) orbits are supported.
AstroImages.jl is a package for loading and displaying FITS files, complete with support for world coordinate systems. It's very simple to use:
img = load("myfile.fits",1)
img["HEADER1"] = 1.0
img["HEADER1",/] = "comment 1"
imview(img, stretch=logstretch)
For the SPIDERS instrument, I developed a Julia-based real-time computing framework. It is based around the ultra-low-latency aeron messaging framework developed for high-frequency trading.
Our Julia RTC framework is competitive with hand-written C, but far easier to use.
You can read more about the framework in our SPIE proceeding: https://arxiv.org/abs/2407.07207.
Last updated October 2026
🐙