stroblme 5a831ba758 Flow canvas: second value restarts the edge pulse, dock uses the phone's width, search arrives on an input's label popover
- LiveEdge: a value inside a running pulse restarts the animation by hand, since the class is already on and would show nothing.
- Dock, FlowDock: the bar is centred on left-1/2, where a shrink-wrapped box gets only the half of the screen to the right and wrapped into a 195px pill. w-max with the viewport cap keeps one row whenever the buttons fit. The dashboard editor's dock had the same squeeze.
- FlowEditor: arriving on an input drawn on the canvas centres its label and opens the label popover once the view is fit, as clicking it does. An input the canvas does not draw still opens the flow settings.
- Tests: the phone dock may not be confined to half the screen; the search spec reads the popover first and reaches the settings through its pencil.
2026-10-27 21:50:18 +01:00
2026-02-03 21:43:09 +01:00
2026-10-15 17:18:12 +02:00

Fluksio App

Connect a few nodes, give their messages names, and let Fluksio handle the running. Use live flows for automation and batch runs for experiments, with dashboards to see what happened.

This repository holds the FastAPI backend, flow engine and dashboard SPA. The Docker image serves all three on one port.

Layout

backend/        FastAPI + SQLModel + Alembic + SQLite
  fluksio/flow/ the flow engine (nodes, pipeline, state backends, controller)
  fluksio/cli.py  `fluksio serve` / `enroll` / `worker`
worker/         the `fluksio-worker` distribution: the agent and the node runner
frontend/       React 19 + TanStack Router + Tailwind 4 + shadcn/ui
docs/           the public documentation site (zensical), served on docs.${DOMAIN}
compose.yml     the single container, as the getting-started guide runs it
docker/         the operator stack: compose.yml → compose.dev.yml → compose.local.yml (+ compose.traefik.yml)
scripts/        generate-client.sh, test.sh

Install without Docker

Start an engine with Python 3.12 or newer on Linux or macOS:

pip install fluksio
fluksio serve

For the optional browser portal, sign up at fluksio.com and add an instance. Use the code it gives you:

fluksio enroll <code>

Your engine also works without enrollment. A machine that only runs nodes for another engine needs just the worker package:

pip install fluksio-worker
FLUKSIO_WORKER_TOKEN='<worker-token>' fluksio-worker \
  --url wss://fluksio.example.com/api/v1/workers/attach --labels gpu

Replace the example address with your engine's URL and create a token as described in Remote workers.

Getting started

Needs Docker with Compose v2, on x86-64 or arm64 such as a Raspberry Pi 4 or 5.

docker compose up -d           # http://localhost:8080
docker compose logs fluksio    # the admin password, printed once

Optional features (MQTT, InfluxDB, mail, …) are build-time extras; see EXTRAS in compose.yml.

For development, with hot reload behind Traefik on port 80 (also needs make and openssl):

make init          # once: .env with generated secrets, `proxy` network, prints the admin login
make dev-local     # full stack at http://app.localhost
make down          # stop it

Without Docker:

make install       # uv sync + bun install
make dev-utils     # proxy and mailcatcher only
make dev-backend   # FastAPI on :8000, hot reload
make dev-frontend  # Vite on :5173
make test           # pytest + Playwright (the e2e half on its own stack, behind make dev's Traefik)
make lint           # ruff + mypy + biome
make generate-client  # regenerate the frontend SDK from the OpenAPI schema

make help lists every target. See Development for stack options and checks.

Documentation

The public site lives in docs/ and is built with zensical:

make docs-serve   # live preview on :8000
make docs         # static build into ./site

It is served at docs.${DOMAIN} by the docs service in docker/compose.yml, and .gitea/workflows/docs.yml builds it with --strict on every push.

License

Copyright (C) 2026 Melvin Strobl - GNU Affero General Public License v3.0 or later. See LICENSE.

S
Description
No description provided
Readme AGPL-3.0
9.4 MiB
Languages
Python 58.6%
TypeScript 38.7%
CSS 1.5%
JavaScript 0.4%
HTML 0.3%
Other 0.4%