Open source · Python · MIT and Apache-2.0

Frameworks and tooling for machine learning, LLM agents and operational decisions.

The layer between a research result and something a team can run: the project structure, the tracking, the interfaces, and the tests that keep a number honest six months after it was measured.

Five libraries, a free course and open reading notes. Since 2026.

Projects

What we build

Each one installs today, carries documentation and is released under a permissive licence. The numbers beside each project come from a script in the repository that produced them.

praxis

Apache-2.0

A legal assistant whose citations are checked, not asserted. Hybrid retrieval with a cross-encoder reranker, and an NLI model that verifies each cited provision supports the claim. The default answer is the text of the law and cannot hallucinate.

$ docker compose up app

mlango

MIT

Django's philosophy applied to machine learning. You declare datasets, models, agents and evaluations; one class body becomes an admin page, a documented endpoint, a migration and a CLI target at once.

$ pip install "mlango[sklearn]"

glia

MIT

An agent loop you can read in an afternoon. Every model call, tool call and state transition is a plain object you can log, snapshot and replay. The core imports nothing outside the standard library.

$ pip install glia-agents

Reinforcement learning for decisions that have a cost function: pricing, inventory, energy, queues, supply chains. Every applied environment ships the classical operations-research baseline beside it.

$ pip install decisionrl

stadion

MIT

A proving ground where an agent is scored against the exact optimum. Six operational decisions, each with the tuned classical method and the computed optimum beside it, and a bootstrap interval on the difference.

$ pip install stadion-rl

Stack

What these are built on, and why

A short list on purpose. Every dependency is something a reader has to install, learn and keep updated, so each one here earns its place in more than one project.

Python

3.9 – 3.13

Typed throughout, checked with mypy and linted with ruff in CI. The version floors are lower bounds on what a user may already have, not the version CI runs — raising them would lock people out without testing anything new.

PyTorch

decisionrl

Every algorithm in decisionrl. CPU is the default target: the applied environments are small enough that a reader without a GPU can still reproduce the numbers in the documentation, which is the point of publishing them.

FastAPI · NumPy

praxis

One API core serves every client. Dense retrieval is a matrix-vector product over vectors held in memory and cached to disk, with a pure standard-library fallback so the offline image and CI run without NumPy at all. A Postgres index with pgvector is designed and not yet wired — the schema is in the repository, the retriever is not.

Docker

praxis

The image installs the API extra, sets offline mode and carries the corpus, so docker compose up app runs with no key, no GPU and no outbound request. A reader who cannot start it has no way to check anything.

GitHub Actions

every repository

Linux, macOS and Windows on every push, with one aggregate check to require in branch protection. Releases publish through Trusted Publishing, and the desktop binaries carry a signed provenance attestation.

MkDocs

documentation

Built with --strict, which fails on a broken internal link or a page missing from the navigation. No webfonts and no analytics on any of the sites, including this one.

Evidence

Numbers with the conditions they were measured under

There are no client logos here and no case studies. What an open-source organisation can show instead is its measurements, and the commands that reproduce them.

Headroom between the tuned classical method and the computed optimum in stadion, with a 95% bootstrap interval on the paired difference. Measured over 40 instances × 20 episodes; reproduce with stadion run <task> --agent classical --instances 40 --episodes 20.
TaskHeadroom95% interval
inventory+0.4%[+0.561, +1.031]
joint-pricing+4.3%[+3.794, +5.656]
pricing+6.2%[+1.265, +1.761]
queueing+16.9%[+3.418, +3.988]
supply-chain+17.3%[+5.505, +7.493]
energy+26.6%[+4.221, +4.690]

The spread is the point. Where the textbook answer is already near-optimal there is almost nothing to win; where it cannot plan ahead, a quarter of the value is still on the table. A benchmark whose tasks all leave generous headroom has selected for problems the standard method happens to be bad at.

Algorithms
32In decisionrl, across 24 environments — nine of them applied rather than synthetic.
Required dependencies
0The glia core imports nothing outside the standard library. Providers and extras are opt-in.
Line coverage
84%decisionrl, measured by pytest-cov on the fast suite in CI. The build fails below 80% rather than reporting the number.
Retrieval recall@5
0.92praxis, on the golden set over the full corpus, tracked run over run. MRR 0.94.

Notes and teaching

Written to be checked

A paper says what it found. A note says what it showed, which is a smaller thing, and marks the distance between them.

·research·draft

Dopamine neurons and the reward prediction error

Midbrain dopamine neurons fire in a pattern that looks like the error term of temporal-difference learning. Close enough that an algorithm from 1988 predicted what an electrode recorded in 1997 — which is why the result gets overstated.

neurosciencereinforcement-learningdopamine

Open collection·CC BY 4.0

research — open reading notes

Machine learning, reinforcement learning, neuroscience and the methods used to check a claim. Every note declares the sources it rests on, and CI rejects one that does not.

Free course·27 modules·Русский·English

lemma — the road into ML, DL and RL

From the arithmetic of a mean to reproducing a recent paper. No sign-up and no first module free. Module one is about baselines and confidence intervals, before any machine learning at all, because the central skill is checking a claim rather than launching a training run.

Method

Five rules every repository is held to

Review criteria, not aspirations. A pull request that breaks one of them gets comments.

01

Errors teach

A message is read at the worst possible moment by someone who does not have the source open. It should say what went wrong and what to do next, and list the alternatives when there are any.

02

Tests are named after the guarantee they protect

test_assignment_is_stable_when_rows_are_added, not test_split. A test whose name does not survive being read aloud is not documenting anything.

03

Verification beats assertion

A green pipeline on one machine is not evidence. Every published claim is measured on the run it describes, and the numbers in a README are pinned by tests, because prose rots quietly and a failing test does not.

04

Comments explain why

The code already says what it does. The comment is for the constraint a reader cannot see.

05

No hidden control flow

If a framework does something on your behalf, it should be possible to find the line where it happens.

Working together

Terms, in one place

Licences
mlango, glia, decisionrl and stadion are MIT. praxis is Apache-2.0. Course and research prose is CC BY 4.0, its code MIT. Commercial use is permitted under all of them.
Commercial enquiries
Integration, a feature your team needs upstream, or work on something adjacent — denidrob138@gmail.com. Say what you are building and what is in the way; that is enough for a first reply.
Contributing
Open an issue describing the change, then a pull request against the default branch. Every repository carries a CONTRIBUTING.md — its own or the organisation-wide default — with the checks CI will run, so there is no unwritten rule to discover afterwards.
Reporting a vulnerability
Use GitHub's private vulnerability reporting on the affected repository. Never a public issue.
Code of conduct
Contributor Covenant, organisation-wide. Reports go privately to the address above.