My Projects
Flagship project
Inferogenesis
Open-source software for continuous active inference, and the research that tests it.
The home for cpomdp, warrantlib and the research behind them, at inferogenesis.com. Built with Astro and TypeScript, self-funded and maintained by me. In plain terms, it:
- Gives each library a project page that opens with the install command and a short example.
- Lists the research the software rests on, starting with the preprint on state-dependent observation noise.
- Sets out p*, a programme on certifiable active inference: hold the agent's model and the world apart, then ask what being wrong costs in free energy and how tightly that cost can be certified.
- Collects technical writing on active inference, including the posts on this blog, with an RSS feed.
- Keeps everything open: code under MIT, content under CC BY 4.0.
Source on GitHub · Visit inferogenesis.com
cpomdp — continuous active inference
Continuous active inference for Python — the continuous-state sibling of pymdp.
pymdp is brilliant for discrete models but has nothing for continuous ones. cpomdp fills that gap: describe how the world moves and what you can see of it, and you get an agent that works out where things are and what to do about it, through the same infer_states / sample_action loop pymdp users already know. v0.4.4, pre-alpha and solo-built. In plain terms, it can:
- Track continuous things. Positions, velocities, temperatures - quantities that don't come in neat categories.
- Perceive exactly. Observations are folded in with a Kalman filter, so there is no sampling and no approximation to tune.
- Reach a goal. Give it a target and it steers there with the provably best action for a linear-Gaussian world (LQR).
- Be curious. Sensors and dynamics whose noise depends on where you are, so the agent is drawn towards places it can see more clearly - something the textbook linear-Gaussian model rules out.
- Plan ahead. Expected free energy over multi-step horizons, plus an exhaustive search over every plan that hands back a certificate saying it checked them all.
- Just watch. Leave out the controls and it becomes a pure tracker.
- Handle branching worlds. Coupling graphs for hidden contexts that a single flat filter can't represent.
- Check itself. Probe whether a sensor actually earns its keep, and confirm a rollout stayed numerically well conditioned.
- Swap engines. A fast JAX backend by default, and an optional Julia (RxInfer) backend used as an independent oracle to check the maths.
- Feel like pymdp. Same Agent, qs, infer_states and sample_action names, so existing code translates almost line for line.
- Be trusted. Fully typed, documented with guides and an examples gallery, tested on Python 3.11 to 3.14 in CI, Zenodo DOI, MIT licensed.
Source on GitHub · cpomdp on PyPI · Read the docs
warrantlib
A vocabulary for how well a claim is warranted, kept separate from whether it held.
A column of green ticks cannot tell you how anything was settled. A grid of samples over a continuous range and an exhaustive enumeration over a finite set both come back clean, but only the second decided the question. warrantlib is a small vocabulary for keeping that difference in a check suite's output instead of losing it there, plus a pytest plugin that reports it. Built for cpomdp's check suites and published on its own. v0.3.0, standard library only. In plain terms, it:
- Says how a claim was settled, not just that a check passed: proved on paper, proved symbolically, enumerated exhaustively with a certificate, certified numerics, or merely sampled.
- Plugs into pytest with no configuration. Each check becomes a test with its own outcome, and a fired check fails like any other test, reason included.
- Declares every check a suite is registered to report in a manifest, so a check that quietly disappears or gets renamed fails by name instead of shrinking a count nobody notices.
- Needs nothing beyond the Python standard library. The pytest extra adds pytest and nothing else.
- Lives in the cpomdp repository and ships separately on PyPI, so any project can use the vocabulary without pulling in cpomdp.
Source on GitHub · warrantlib on PyPI · Project page
dj-elliott.com (this very site)
The personal site you are currently looking at.
Mostly an excuse to crack on with Three.js properly. The hero is a black hole largely because I wrote my dissertation on solving Einstein's field equations to calculate black hole orbits, the tech wheel rotates because it felt like a good idea, and the rest is held together with TypeScript, React, Vite and Tailwind. CI deploys it to GitHub Pages with per-route prerendering for SEO. Still very much a WIP - bits get reworked when I get bored.
Source on GitHub
Discord bot (archived prototype)
An LLM-powered Discord bot for tabletop groups, built in Rust in 2025.
A prototype that connected Gemini and GPT to a Discord server through their APIs, so a tabletop group could ask for a quick image from a description or pull out the key points of a long conversation. A few friends joined as collaborators. It showed what it set out to show, and it is now shelved while my time goes into active inference.
Dev logs