pylier
See the data moving through your Python pipeline.
Decorate the functions you already have. pylier infers the data handoffs and renders the pipeline that actually ran—no graph DSL or manual edge wiring.
Why pylier?
|
Decorate, don't rebuild
Mark ordinary sync or async functions with |
Follow real data
Edges are inferred from the values passed between stages, so the graph reflects execution instead of a hand-maintained diagram. |
Inspect it anywhere
Write a self-contained HTML graph for sharing, or open a live in-process viewer while the pipeline runs. |
Try demos
Quick start: document ingestion
The ingestion example is the fastest way to see pylier's value: a document branches into text and image paths, then concurrently embeds both branches before they converge at an indexing stage.
git clone https://github.com/theMladyPan/pylier.git
cd pylier
uv sync
uv run python -m examples.ingest html
Open pylier-ingest.html in a browser. It is a self-contained file—no server
required. To watch the graph grow as work happens instead:
uv run python -m examples.ingest serve
# viewer: http://localhost:8765
The whole API in one flow
import pylier
@pylier.node
def load_document(path: str) -> dict: ...
@pylier.node(_tags=["document", "text"])
def extract_text(document: dict) -> list[str]: ...
@pylier.node
def embed(chunks: list[str]) -> list[dict]: ...
with pylier.trace("document-ingest"):
document = load_document("report.pdf")
vectors = embed(extract_text(document))
pylier.render("document-ingest.html") # interactive, standalone HTML
Notes
For a plain-Python transformation or join that loses value provenance, preserve its sources explicitly:
vectors = pylier.derive(text_vectors + image_vectors, from_=[text_vectors, image_vectors])
derive() returns the original value unchanged; its only job is to keep the
branch lineage visible in the next decorated stage. See
docs/records/derive-lineage.md for its exact behavior.
Built for useful traces
- Signal over noise — use
core,info,debug, andtracecapture levels to control both captured nodes and metadata detail. - Useful inspection — filter by node tags; click graph nodes and edges for
payload type, size, preview, and optional captured values. Full values require
PYLIER_CAPTURE_VALUES=1and remain bounded FIFO by count and bytes. To make an intentionally shareable debug bundle, usepylier.render("debug.html", embed_payloads=True); the bundled data is readable by anyone with the HTML file, so the default static render remains metadata-only. The published examples use this opt-in only because their data is synthetic. - Share or stream —
pylier.render()creates a portable HTML file;pylier.serve()streams updates to a local viewer with SSE. - Keep an audit trail —
pylier.trace(..., sidecar="trace.jsonl")writes already-resolved events to JSONL for offline consumers.
Coexistence with other tracers
pylier has no OpenTelemetry, Logfire, FastAPI, or cloud dependency. It records its own local decorator traces and does not mutate ambient tracing context, so another tracer can instrument the same process independently.
Development
uv run pytest
uv run ruff format src tests examples
uv run ruff check src tests examples
Contributing
Issues and pull requests are welcome at theMladyPan/pylier.
Release files for pylier 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pylier-0.1.0.tar.gz | 1.0 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pylier-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.1 MB
Release files / pylier-0.1.0.tar.gz
| Download URL | pylier-0.1.0.tar.gz |
|---|---|
| Size | 1.0 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a936021837eaebd80189d5891e1e13104ee7e95abd9c3bdc976f0fae8a6201d6
|
|
BLAKE2b-256 checksum How to use checksums |
02f7ca3717a5687e92bed5d574ce3bba6f9ed8fa48eff4c93c602bd84102f738
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / pylier-0.1.0-py3-none-any.whl
| Download URL | pylier-0.1.0-py3-none-any.whl |
|---|---|
| Size | 47.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
fd6ebcef55682947ab154955f33f59d37836cee92d99e783c3f845e7560fefc9
|
|
BLAKE2b-256 checksum How to use checksums |
d0eb4d2173d6f1207c896a708126574cf4acffb16b5e653d0b25ef648fd1846b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|