Files
app/backend
stroblmeandClaude Opus 5 989d008d37
Docs / docs (push) Successful in 21s
Playwright Tests / test-playwright (1, 2) (push) Failing after 15m39s
Playwright Tests / test-playwright (2, 2) (push) Successful in 10m17s
pre-commit / pre-commit (push) Failing after 2m28s
Test Backend / test-backend (push) Failing after 2m29s
Compose Smoke Test / test-compose (push) Successful in 30s
Playwright Tests / merge-reports (push) Successful in 5m36s
Merge branch 'main' of git.stroblme.de:Fluksio/app
The two sides both touched `submit_ready`'s readiness check, for unrelated
reasons, so the conflict is textual rather than semantic and both changes
stand:

- `831a537` completes a node that is not ready instead of passing over it,
  so a producer that can never run stops stranding its consumers.
- the audit branch has `_is_node_ready` return the values it read, so the
  node runs on them instead of asking state for the same keys again.

Merged as: read once, keep the values whether or not the answer is yes, and
take the not-ready branch from `831a537`. Its reasoning holds under the
merge — by the time readiness is consulted, `in_degree` is zero and every
in-wave producer has finished, so the answer cannot change later in the
wave.

Also fixes a fixture this branch added: the module-scoped row cleanup in
`tests/conftest.py` assumed a schema, and `tests/flow` overrides `db` with a
no-op because those tests need no database. It only showed when that
directory ran on its own.

746 tests green, and each directory green alone. Engine throughput is
unchanged by the merge (559 msg/s on the memory backend, against 639 before
it and 262 at the start of the audit).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M6hPWS6YEbT1P8LxhhFb2T
2026-08-29 21:22:12 +02:00
..
2026-08-27 08:59:10 +02:00
gc
2026-08-24 19:06:54 +02:00

Fluksio

Fluksio is a node-based automation software that brings trust and reliability to your flow. It just works and looks good. Get started by running

pip install fluksio
fluksio serve

and you're ready to go.

For data science

You can turn your existing data science project into a flow by decorating your functions with @node ...

# 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")}

... and passing them to a Flow:

# myresearch/pipeline.py
from fluksio import Flow, Port
from myresearch.data import prepare
from myresearch.evaluate import evaluate
from myresearch.train import fit

train = Flow("train", nodes=[prepare, fit, evaluate],
             inputs=[Port("lr", "float", initial=0.01)], outputs=["score"])

Fluksio will automatically infer the order of nodes based on the inputs and outputs you defined. When everything is set, you can launch your first run as follows:

fluksio run train --lr 0.05 --wait

Checkout our documentation for more infos.

Some other features

  • 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.

Fluksio can also be used for facility automation. Visit us on fluksio.com or go straight to our documentation.

License

Copyright (C) 2026 Melvin Strobl - GNU Affero General Public License v3.0 or later. Running a modified version over a network obliges you to offer its users the corresponding source (AGPL §13).