Observed since 20 Oct, 18:12 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Embeddable NiceGUI flow-graph editor and runtime workbench that compiles graphs into Python

Acherion is an embeddable flow-graph editor and runtime workbench for Python. It provides a NiceGUI-based visual designer, a typed graph/runtime API, and a standalone host that compiles graphs into executable Python code.
acherion or python -m acherionInstall the published package:
pip install acherion
Install from source for local development:
pip install -e ".[dev]"
Python 3.11 or newer is required.
Run the packaged standalone workbench:
acherion
Equivalent entry points:
python -m acherion
from acherion.app import main
main(host='127.0.0.1', port=8081, reload=False)
The standalone app mounts a full-screen Acherion workbench with:
run event
The core API lives in acherion. The NiceGUI embedding layer lives in
acherion.embed.
from nicegui import ui
from acherion import StandaloneAcherionHost
from acherion.embed import AcherionWorkbench
persisted_graph: dict[str, object] = {}
@ui.page('/')
def index() -> None:
workbench: AcherionWorkbench | None = None
def handle_change() -> None:
if workbench is None:
return
persisted_graph.clear()
persisted_graph.update(workbench.designer.to_dict())
workbench = AcherionWorkbench(
host=StandaloneAcherionHost(),
on_change=handle_change,
refresh_code_after_build=True,
theme_overrides={
'surface': '#111827',
'text': '#f9fafb',
'primary': '#22c55e',
'sidebar_panel_bg': 'rgba(255,255,255,0.05)',
},
)
workbench.build()
workbench.designer.set_graph_from_dict(persisted_graph)
ui.run()
This uses the generic standalone host, but the workbench can also run against
your own host implementation through AcherionHost or compose_acherion_host.
Passing theme_overrides opts the embedded workbench into Acherion's scoped
theme CSS without restyling the rest of the host application. Keys can be the
semantic aliases shown above or raw CSS variable names like --oe-bg and
--ach-sidebar-panel-bg. Pass an empty dict if you want the default Acherion
embedded theme with no overrides.
You can also switch themes after build():
workbench.set_theme_overrides({
'surface': '#ffffff',
'text': '#0f172a',
'primary': '#2563eb',
})
workbench.set_theme_overrides({
'surface': '#0f172a',
'text': '#e2e8f0',
'primary': '#38bdf8',
})
workbench.clear_theme_overrides()
clear_theme_overrides() disables the scoped embedded Acherion theme and lets
the surrounding host application styling take over again.
AcherionGraph is the serializable top-level graph object.AcherionNode stores one node's kind, title, id, and params.AcherionDesigner.to_dict() returns a JSON-safe representation.AcherionDesigner.set_graph_from_dict() restores persisted state.AcherionWorkbench wraps AcherionDesigner with code-view and validation
behavior.AcherionWorkbench.generated_user_code() returns the current compiled code.AcherionWorkbench supports callbacks for change handling, validation,
preview execution, and custom code views.An AcherionHost is responsible for integrating the designer with your app.
Hosts provide:
The standalone runtime helpers in acherion are useful even outside the UI:
from acherion import compile_acherion_graph, execute_acherion_graph
They compile a graph into Python source and execute the generated event handler with optional scoped bindings.
Acherion exposes several host-facing registration hooks:
register_catalog_module_specs to expose Python modules in the function catalogregister_preview_value_adapter to customize preview summaries/type tagsregister_acherion_validation_extension to extend validation globalsregister_acherion_node_definition to add or replace node metadataCustom node definitions are only part of the story: if you introduce a new node kind, your host/compiler also needs to know how to emit runtime code for it.
Repository documentation is split into focused guides:
docs/overview.md for architecture and feature overviewdocs/standalone.md for standalone usage and persistence patternsdocs/embedding.md for NiceGUI embedding and host compositiondocs/extending.md for catalogs, validation, preview, and node extension hooksdocs/releasing.md for local packaging checks and GitHub/PyPI release flowContributions are welcome, especially changes that improve the public runtime API, embedded workbench behavior, packaging flow, and documentation.
For local development:
pip install -e ".[dev]"
python -m pytest
python -m build --sdist --wheel
python -m twine check dist/*
When adding regression coverage, prefer behavior-focused tests over brittle UI snapshots. The most useful tests in this repository usually validate:
This repository uses conventional commits and semantic versioning. Pull request titles and merge commits should follow the same convention, for example:
feat: add preview regression coveragefix: preserve theme override aliasesdocs: clarify embedded host setupIn general:
feat: for user-visible capabilities or meaningful public API expansionfix: or perf: for patch-level runtime changesBuild distributions locally with:
python -m build --sdist --wheel
python -m twine check dist/*
This repository includes GitHub Actions workflows for CI, conventional-commit
enforcement, semantic versioned GitHub releases, and trusted publisher releases
to PyPI. See docs/releasing.md for the operational flow.
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.9.3 | 15 Oct 2026 | 10 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 18:12 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:643c905552fa0dc72b4b563dc4919f3176c3d5143c580e9c8c95fe67aa096b18