Publish / publish (push) Successful in 55s
Docs / docs (push) Successful in 53s
Playwright Tests / test-playwright (1, 2) (push) Failing after 39s
Playwright Tests / test-playwright (2, 2) (push) Failing after 13s
pre-commit / pre-commit (push) Failing after 2m24s
Test Backend / test-backend (push) Failing after 49s
Compose Smoke Test / test-compose (push) Failing after 14s
Playwright Tests / merge-reports (push) Failing after 22s
Every other README carries the AGPL line; these two did not, and they are the ones that become pypi.org/project/fluksio and /fluksio-worker — the most public surface the project has, and the place a copyleft licence is least useful to have to go looking for. §13 is named outright for the same reason. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012ue1tkFWB1bcGy3aWhCKpU
84 lines
2.8 KiB
Markdown
84 lines
2.8 KiB
Markdown
# Fluksio
|
|
|
|
A node-based automation engine: flows, dashboards and batch runs, in one
|
|
resident process with no infrastructure behind it.
|
|
|
|
```sh
|
|
pip install fluksio
|
|
fluksio serve
|
|
```
|
|
|
|
That is the whole installation — no Docker, no database server, no ports to
|
|
open. It keeps a SQLite database, a git repository of your flows and an
|
|
artifact store under `~/.fluksio`, and prints an admin password once.
|
|
|
|
## For data science
|
|
|
|
Your functions become nodes where they already live. Install Fluksio into the
|
|
environment you work in and your nodes run on it — the packages are already
|
|
there:
|
|
|
|
```python
|
|
# myresearch/train.py
|
|
import fluksio
|
|
from fluksio import Port, node
|
|
|
|
@node(
|
|
requires=["dataset", Port("lr", "float")],
|
|
provides=[Port("loss", "float", stream=True), Port("weights", "artifact")],
|
|
device="gpu", device_policy="prefer",
|
|
)
|
|
def fit(dataset, lr, epochs=25):
|
|
for epoch in range(epochs):
|
|
loss = step(...)
|
|
yield {"loss": loss} # published as it happens, kept as a series
|
|
return {"weights": fluksio.save_artifact("weights.pt")}
|
|
```
|
|
|
|
```python
|
|
# myresearch/pipeline.py
|
|
from fluksio import Flow, Port
|
|
from myresearch.train import fit
|
|
|
|
train = Flow("train", nodes=[prepare, fit, evaluate],
|
|
inputs=[Port("lr", "float", initial=0.01)], outputs=["score"])
|
|
```
|
|
|
|
```sh
|
|
fluksio login --url http://127.0.0.1:8000
|
|
fluksio sync myresearch
|
|
fluksio run train --lr 0.05 --wait
|
|
```
|
|
|
|
The decorators return your functions untouched, so everything stays callable,
|
|
testable and importable as what it was. A metric leaves through a declared
|
|
port rather than a logging call, which is why there is no `log_metric()`: the
|
|
run keeps the whole series, a chart can bind to it, and a downstream node can
|
|
consume it.
|
|
|
|
## What else it does
|
|
|
|
- **Flows** — typed messages between nodes, wired by name, edited on a canvas
|
|
or declared in code. Every change is a commit in a git repository you own.
|
|
- **Runs** — an experiment and a CI-style job are the same entity. Parameters,
|
|
seed, result, per-node timings, artifacts and the commit it ran at.
|
|
- **Dashboards** — charts and controls bound to the same messages the flows
|
|
carry, with no separate metrics pipeline.
|
|
- **Remote workers** — `pip install fluksio-worker` on the GPU box; it dials
|
|
*out* over one websocket, so nothing there has to be reachable.
|
|
|
|
## Links
|
|
|
|
- Documentation: <https://docs.fluksio.com>
|
|
- Getting started (data science): <https://docs.fluksio.com/getting-started/data-science/>
|
|
- Home: <https://fluksio.com>
|
|
|
|
Python 3.10 or newer, Linux or macOS.
|
|
|
|
## License
|
|
|
|
Copyright (C) 2026 Melvin Strobl — [GNU Affero General Public License v3.0 or
|
|
later](https://www.gnu.org/licenses/agpl-3.0.en.html). Running a modified
|
|
version over a network obliges you to offer its users the corresponding source
|
|
(AGPL §13).
|