Train machine-learning models across ordinary machines — laptops, spare workstations, whatever is idle — and keep going when one of them disappears.
A machine that vanishes mid-task is the normal case here, not an incident. Work is never pushed to a machine: a machine claims a time-limited lease, proves it is alive with heartbeats, and only the first valid result is accepted. When a lease expires, the task returns to the queue and somebody else picks it up from the last checkpoint.
This repository holds the open parts of FlashML. All of it is Apache-2.0.
| Directory | Package | What it is |
|---|---|---|
flashruntime/ |
flashruntime |
The protocol and the fault-tolerant runtime: strategy planning, leases, checkpointing, and recovery. Depends on neither of the others. |
flashnode/ |
flashnode |
The host agent. Install it on a machine you want to contribute; it registers, claims work, and runs each task in an isolated sandbox with networking disabled. |
examples/federated/ |
— | A PyTorch model trained across several machines by federated averaging. Includes simulate.py, which rehearses the whole loop locally so an encoding mistake fails in seconds instead of after five rounds on other people's laptops. |
flashnode depends on flashruntime. Nothing else crosses that boundary.
- Idle: 21.9 MB of RAM and 0.099% of one core. You cannot feel the agent waiting for work.
- Your files and your network stay yours. A task runs with no network, a read-only filesystem, every capability dropped, and only its own working directory writable.
- 0 of 25 payloads escaped — 24 hostile payloads plus 1 control-verification probe. Path traversal, symlink and hardlink escapes, device members, decompression bombs, network egress, fork bombs, memory bombs, privilege escalation.
- No measurable cost. The cage was -5.4% of wall-clock (p10 -5.99%, p90 1.23%) —
--network noneskips the network-namespace and veth setup a bare container pays for, which offsets what the other flags cost, so the security contract cost the job nothing we could detect.
Measured on macOS-26.5.1-arm64-arm-64bit / Apple M4. The containment result is per-host: the sandbox's --user flag resolves differently for a root or Windows agent, so this number belongs to the machine that produced it.
Measured, not asserted: python -m benchmarks run --scenario node_idle_cost --scenario node_sandbox_overhead --scenario node_containment --repeats 3. Scope: those 24 hostile payloads did not get out, and the 1 control-verification probe confirmed the flag under test is in force — that is not a proof that the sandbox is unescapable. See SECURITY.md.
Measured, not asserted: python -m benchmarks run --scenario node_idle_cost --scenario node_containment --repeats 3 and python -m benchmarks run --scenario node_sandbox_overhead --repeats 11. Scope: those 24 hostile payloads did not get out, and the 1 control-verification probe confirmed the flag under test is in force — that is not a proof that the sandbox is unescapable. See SECURITY.md.
Not yet — the packages are not on PyPI at the time of writing. The install becomes a single command with the first release; until then, use the instructions shown in the FlashML console, which install from this repository directly.
Once released:
python3 -m venv flashml
flashml/bin/python -m pip install flashnode
flashml/bin/flashnode login --coordinator <your-coordinator-url>The virtual environment is not ceremony. macOS ships no pip on PATH, and
Homebrew's Python refuses to install into itself under
PEP 668. A venv sidesteps both and leaves
the system Python untouched — which matters when you are asking someone to run
code on their own machine.
flashruntime is usable on its own, with no account and no cloud service. It
runs on SQLite and a local directory, and the test suite needs no
infrastructure:
cd flashruntime
uv venv .venv && uv pip install -e ".[dev,service]"
.venv/bin/pytest -qThe service extra is required for the test suite, not optional — eight test
modules import the HTTP service.
Zolli Labs runs a hosted control plane that schedules work across contributed machines, handles accounts, and shows you what your jobs are doing. It is a separate, private codebase and is not in this repository. Nothing here depends on it: the runtime and the agent are usable, testable, and deployable without it.
Task code runs inside a sandbox with networking disabled. If you find a way out
of that, or anything else security-relevant, please read
flashruntime/SECURITY.md rather than opening a
public issue.
Apache-2.0. See flashruntime/LICENSE.