Skip to main content

Rust-backed framework for building websites in pure Python

Project description

ztml

A Rust-backed framework for building websites in pure Python. ZTML allows you to define HTML/CSS/JS using only Python expressions with as much autocompletion support as I could reasonably add. Inspired by FastHTML.

Install

pip install ztml

HTML

Every HTML element has a corresponding constructor function. Attributes are set via chained builder methods. Call render() to get an HTML string.

from ztml import *

page = render(
    Html(
        Head(Meta().charset("utf-8"), Title("My App")),
        Body(
            H1("Hello, ztml!"),
            P("Build websites with Python.").cls("intro"),
            A("GitHub").href("https://github.com").target("_blank"),
        ),
    )
)

Attributes chain naturally:

Div(
    Input().type("text").name("q").placeholder("Search...").autofocus(),
    Button("Go").type("submit"),
).cls("search-box").id("search")

Use Fragment to group elements without a wrapper tag, and Raw to inject unescaped HTML:

Fragment(
    H1("Title"),
    P("Paragraph"),
    Raw("<hr/>"),
)

Style

Build CSS with Rule, Media, Keyframes, and Frame. Wrap them in Style() to render a <style> block.

Style(
    Rule("body").margin("0").font_family("system-ui, sans-serif"),
    Rule(".container").display("flex").gap("1rem").padding("2rem"),
    Rule(".container > .sidebar").width("250px").flex_shrink("0"),
    Rule(".container > .main").flex("1"),

    Media("max-width: 768px",
        Rule(".container").flex_direction("column"),
        Rule(".container > .sidebar").width("100%"),
    ),

    Keyframes("fadeIn",
        Frame("from").opacity("0").transform("translateY(-10px)"),
        Frame("to").opacity("1").transform("translateY(0)"),
    ),

    Rule(".card").animation("fadeIn 0.3s ease-out"),
)

CSS property methods are generated from W3C specs — every standard property is available with autocompletion. Use .prop("custom-property", "value") for anything not covered.

Inline styles work too:

Div("styled").style(InlineStyle().color("red").font_weight("bold"))

Script

Build JavaScript with On event handlers and RawJs. Wrap them in Script() to render a <script> block.

Script(
    On.click("#increment", """
        let count = document.getElementById('count');
        count.textContent = parseInt(count.textContent) + 1;
    """),

    On.document_ready("console.log('page loaded')"),

    On.submit("#my-form", """
        event.preventDefault();
        alert('submitted!');
    """),

    RawJs("function greet(name) { alert('Hello, ' + name); }"),
)

Available event helpers: On.click, On.submit, On.change, On.input, On.keydown, On.keyup, On.mouseover, On.mouseout, On.focus, On.blur, On.document_ready, and On.event for custom events.

Custom Components

Any Python object with a __ztml_render__ method can be used as a renderable component. The method should return a ztml element.

class Card:
    def __init__(self, title, body):
        self.title = title
        self.body = body

    def __ztml_render__(self):
        return Div(
            H2(self.title),
            P(self.body),
        ).cls("card")

# Use directly in render()
print(render(Card("Hello", "World")))

# Or nest inside other elements
page = Div(
    Card("First", "Some content"),
    Card("Second", "More content"),
).cls("cards")

Jupyter & Jinja2 Compatibility

All built-in ztml elements implement _repr_html_() (for Jupyter notebook display) and __html__() (for Jinja2/MarkupSafe auto-escaping). Evaluating an element at the end of a Jupyter cell will render it as HTML automatically.

For custom components, add these methods using render():

class Card:
    def __init__(self, title, body):
        self.title = title
        self.body = body

    def __ztml_render__(self):
        return Div(H2(self.title), P(self.body)).cls("card")

    def __html__(self):
        return render(self)

    def _repr_html_(self):
        return render(self)

Putting It Together

A complete page with HTML, CSS, and JS:

from ztml import *

def page():
    return Html(
        Head(
            Meta().charset("utf-8"),
            Title("Counter"),
            Style(
                Rule("body").font_family("system-ui").display("flex")
                    .justify_content("center").padding("4rem"),
                Rule("button").padding("0.5rem 1rem").font_size("1.2rem")
                    .cursor("pointer").border_radius("4px"),
                Rule("#count").font_size("3rem").margin("1rem 0"),
            ),
        ),
        Body(
            H1("Counter"),
            P("0").id("count"),
            Button("Increment").id("increment"),
            Script(
                On.click("#increment", """
                    let el = document.getElementById('count');
                    el.textContent = parseInt(el.textContent) + 1;
                """),
            ),
        ),
    )

print(render(page()))

Server

ztml includes a built-in server for HTMX-powered apps, built on Starlette and Uvicorn.

from ztml import *
from ztml.server import rt, serve

@rt('/')
def get():
    return Html(
        Head(Title("Counter")),
        Body(
            H1("Counter"),
            P("0").id("count"),
            Button("Increment").hx_post("/increment").hx_target("#count"),
        ),
    )

count = 0

@rt('/increment')
def post():
    global count
    count += 1
    return P(str(count)).id("count")

serve()  # localhost:5001

Key features:

  • Method inference — HTTP method inferred from function name (get, post, put, delete, etc.)
  • Auto HTMX — full-page responses get the HTMX script auto-injected
  • Path parameters@rt('/greet/{name}') extracts name as a function argument
  • Request access — add request to access the Starlette Request object
  • Element rendering — return ztml elements, automatically rendered to HTML

Form Data & File Uploads

Name a parameter form_data or files and it's automatically parsed:

@rt('/submit', methods=['POST'])
async def submit(form_data):
    name = form_data['name']
    return Div(f"Hello, {name}")

Sessions

Pass session_secret to enable cookie-backed sessions. Add session to any handler signature:

from ztml.server import ZTMLApp, serve

app = ZTMLApp(session_secret="your-secret-key")

@app.route('/login', methods=['POST'])
def login(session, form_data):
    session['user'] = form_data['username']
    return Div("Logged in")

@app.route('/profile')
def profile(session):
    return Div(f"Hello, {session.get('user', 'guest')}")

serve(target=app)

For raw cookies (outside of sessions), use Starlette's built-in response.set_cookie() and request.cookies.get().

Before Hooks

Run checks before a route handler executes. Return a Response to short-circuit:

from starlette.responses import RedirectResponse

def require_auth(session):
    if not session.get('user'):
        return RedirectResponse('/login', status_code=303)

@app.route('/dashboard', before=[require_auth])
def dashboard(session):
    return Div(f"Welcome, {session['user']}")

Live Reload

Set dev=True to enable uvicorn file-watching and automatic browser refresh on save:

app = ZTMLApp(dev=True)
# serve() automatically passes reload=True to uvicorn in dev mode

WebSockets & SSE

from ztml.server import ZTMLApp, EventStream

app = ZTMLApp()

@app.ws('/echo')
async def echo(websocket):
    await websocket.accept()
    data = await websocket.receive_text()
    await websocket.send_text(f"echo: {data}")
    await websocket.close()

@app.route('/stream')
async def get():
    async def updates():
        yield Div("first update")
        yield Div("second update")
    return EventStream(updates()).response()

Building from Source

Prerequisites: Rust toolchain, Python 3.12+, uv.

# Install dependencies and build the Rust extension
uv sync

# For iterative development (faster rebuilds)
uv run maturin develop

# Generate .pyi type stubs for autocompletion
cargo run --bin gen_stubs --no-default-features

To build a distributable wheel:

maturin build --release
# Output in target/wheels/

Examples

# Generate a static HTML page to stdout 
uv run examples/static_page.py > page.html # (open page.html in your browser!)

# HTMX counter app (localhost:5001)
uv run examples/counter_server.py

# Custom components demo
uv run examples/components.py > components.html

# HTMX todo app (localhost:5001)
uv run examples/todo_server.py

# Auth demo with sessions & before hooks (localhost:5001)
uv run examples/auth_app.py

# WebSocket chat room (localhost:5001)
uv run examples/ws_chat.py

# SSE live clock (localhost:5001)
uv run examples/sse_clock.py

Benchmarks

Compared against FastHTML building and rendering nested HTML element trees:

Scenario         Library      Elements   Build (ms)   Render (ms)   Total (ms)
---------------------------------------------------------------------------
10x50            ztml             1040         1.44          0.09         1.54
10x50            fasthtml         1040        14.72          2.62        17.35
                             speedup: build 10.2x, render 28.5x, total 11.3x

50x100           ztml            10200        14.65          0.90        15.55
50x100           fasthtml        10200       151.36         26.12       177.61
                             speedup: build 10.3x, render 28.9x, total 11.4x

100x200          ztml            40400        58.04          3.63        61.69
100x200          fasthtml        40400       710.79        106.00       816.57
                             speedup: build 12.2x, render 29.2x, total 13.2x

^ M3 Pro MacBook Pro

Run the benchmark yourself:

uv pip install python-fasthtml
uv run benchmarks/bench.py

Running Tests

uv run python -m pytest

# Rust unit tests
cargo test -p ztml-core

How codegen works

build.rs reads HTML element definitions from webtags and CSS property specs from w3c/webref, stored in specs/. From these it generates:

  • Element constructors — one Python function per HTML tag
  • CSS property methods — on Rule, InlineStyle, and Frame
  • Enum classes — for CSS keyword values and HTML attribute values

Releasing

CI runs on every push to main and on tags matching v*.

Regular push (tests only):

git push

Publishing a new version (build + publish to PyPI):

  1. Bump the version in crates/ztml-core/Cargo.toml and crates/ztml-python/Cargo.toml
  2. Commit, tag, and push:
git add -A && git commit -m "bump version to 0.x.y"
git tag v0.x.y
git push && git push origin v0.x.y

The v* tag triggers the full build matrix (Linux, macOS, Windows) and publishes wheels to PyPI via trusted publishing.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

ztml-0.2.0-cp314-cp314-win_amd64.whl (1.2 MB view details)

Uploaded CPython 3.14Windows x86-64

ztml-0.2.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

ztml-0.2.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64

ztml-0.2.0-cp314-cp314-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

ztml-0.2.0-cp314-cp314-macosx_10_12_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.14macOS 10.12+ x86-64

ztml-0.2.0-cp313-cp313-win_amd64.whl (1.2 MB view details)

Uploaded CPython 3.13Windows x86-64

ztml-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

ztml-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

ztml-0.2.0-cp313-cp313-macosx_11_0_arm64.whl (1.5 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

ztml-0.2.0-cp313-cp313-macosx_10_12_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

ztml-0.2.0-cp312-cp312-win_amd64.whl (1.2 MB view details)

Uploaded CPython 3.12Windows x86-64

ztml-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

ztml-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

ztml-0.2.0-cp312-cp312-macosx_11_0_arm64.whl (1.5 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

ztml-0.2.0-cp312-cp312-macosx_10_12_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

File details

Details for the file ztml-0.2.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: ztml-0.2.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ztml-0.2.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 944b0bdb0a7f74a6a8aa7d84b3d4940a4d6aad46c95f64f367ac4bc2f85d7302
MD5 abb4001e38b7ed60611c6e3c3ef1a12a
BLAKE2b-256 7ee4a9d7b398af57ac45b6d4de680c9156667500fc8ef711ef512c2c30bceb16

See more details on using hashes here.

Provenance

The following attestation bundles were made for ztml-0.2.0-cp314-cp314-win_amd64.whl:

Publisher: ci.yml on bleemesser/ztml

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ztml-0.2.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ztml-0.2.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b88a8f3d9428a5006d042fca64426f96f2b6238e2f7cacedfd5c16718e500c53
MD5 09bf97252fa35619b9323bca6f3e66fd
BLAKE2b-256 985ed2343b7da0ca2c0dd7d46c1b84475cf3f3f1f90aa18067da029be0c7fc6f

See more details on using hashes here.

Provenance

The following attestation bundles were made for ztml-0.2.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: ci.yml on bleemesser/ztml

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ztml-0.2.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for ztml-0.2.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 13b7b2fe64160e2d6c4cb107c4623fd7481d8ed7272b0744424f7f1d1a73fc7a
MD5 6ba762765bd00b81672a3ddaf812b77a
BLAKE2b-256 90a2000c21e707b521ff02515081c182c0ba7e308ecf4412e9ab3f0203a8296f

See more details on using hashes here.

Provenance

The following attestation bundles were made for ztml-0.2.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: ci.yml on bleemesser/ztml

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ztml-0.2.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ztml-0.2.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 20a0ae8f72ffcf2508d5936a0b46044ac5d8d73dff8eac19cea0ca77ada9501d
MD5 6660b4f23f73e61e7332da76aa8f50a6
BLAKE2b-256 8d83c152b332deef230a600be2c28c0cd96829ea49e694d8a1f610aa0e4fbe13

See more details on using hashes here.

Provenance

The following attestation bundles were made for ztml-0.2.0-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: ci.yml on bleemesser/ztml

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ztml-0.2.0-cp314-cp314-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for ztml-0.2.0-cp314-cp314-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 41bf32c1ec860cefc72626533a146c468ba4cb3ff1fd1816f795454c262b9d68
MD5 899545105de98a828230fd8f2ad91b77
BLAKE2b-256 0da46b9f40f5e4b5010c38b2d7a82ff3d0809608f3ce0f6e419b469dfc83ab19

See more details on using hashes here.

Provenance

The following attestation bundles were made for ztml-0.2.0-cp314-cp314-macosx_10_12_x86_64.whl:

Publisher: ci.yml on bleemesser/ztml

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ztml-0.2.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: ztml-0.2.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ztml-0.2.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 d31ef847b8cd6bb3f838d06e29dd978fe1984413e6f5700a3051cfb3246ff639
MD5 4fc6fc6f05a65ad51ef4c3ecac315378
BLAKE2b-256 68df696a5ccf6a623c551110b05bf27bfd5b4ee325afce7558c4367bb758ddae

See more details on using hashes here.

Provenance

The following attestation bundles were made for ztml-0.2.0-cp313-cp313-win_amd64.whl:

Publisher: ci.yml on bleemesser/ztml

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ztml-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ztml-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 207e8481f3080fd6063669b9973e4e5789d0088af17a4c25075024f16ec08233
MD5 438258b9d17f370de644b9c2204d6f2b
BLAKE2b-256 f8e0575b26e4bf69e1f003a1f5ce0b3ec8f05c71a940f54179246e45ad950872

See more details on using hashes here.

Provenance

The following attestation bundles were made for ztml-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: ci.yml on bleemesser/ztml

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ztml-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for ztml-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 197f434782acb7b0c8b44c4bae00b6801597e7b4c3a24e9a9ea9c79c7bfaf463
MD5 422baa5e471342a161ce57f00594383b
BLAKE2b-256 fced1dab91806845cdfe9609a6e21dd1cfb1124faf4cde7fe2175edf1f6aad46

See more details on using hashes here.

Provenance

The following attestation bundles were made for ztml-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: ci.yml on bleemesser/ztml

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ztml-0.2.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ztml-0.2.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 35ad518b606de62c7f21bc9734acebc3ea6197d1dd0b7bec74028a1b989d55e2
MD5 d4e5498260143c13b5140e83e2e5a9cd
BLAKE2b-256 6d53457b4243be806c8b9dfe1414f4c4e06b67319b7e3d1c1a047103d49cb428

See more details on using hashes here.

Provenance

The following attestation bundles were made for ztml-0.2.0-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: ci.yml on bleemesser/ztml

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ztml-0.2.0-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for ztml-0.2.0-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 4f65a38a8701a5f76aedb9e66cddd69496bf445aa6e89510319b01a9353c0cda
MD5 b54ae8f898f1e1d2e4e5d5e75488bdec
BLAKE2b-256 a6e9eba5dab6f0a651ce295a0686fd999c214279d1feef1878b2b2349bba5cf4

See more details on using hashes here.

Provenance

The following attestation bundles were made for ztml-0.2.0-cp313-cp313-macosx_10_12_x86_64.whl:

Publisher: ci.yml on bleemesser/ztml

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ztml-0.2.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: ztml-0.2.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ztml-0.2.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 3fdecdb4109cd24cc183b4aedc6a106bfbb2d5eb8763f614d5e64c2adf2e25fd
MD5 b0d7ecc3b71d5ee5c4616bf65869929f
BLAKE2b-256 603586f3d72e27acb7817549a21f41f9c4d8979ec21eb576773c55ad1831d6af

See more details on using hashes here.

Provenance

The following attestation bundles were made for ztml-0.2.0-cp312-cp312-win_amd64.whl:

Publisher: ci.yml on bleemesser/ztml

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ztml-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ztml-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 66b5f9091542257a9608b11d8885d11ffda9014c1a098efe96d3589b3f6c3f31
MD5 a0bebc4b2044d6f1017d7c7a63cf65c9
BLAKE2b-256 73b93b1e13eddff01aa55b8cfa6ca59a9b1f81b5b5c0609ac991a76980815b36

See more details on using hashes here.

Provenance

The following attestation bundles were made for ztml-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: ci.yml on bleemesser/ztml

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ztml-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for ztml-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ae586cf313a65ccf1f293aa17f9b43be1c72eacd53452295e078b453602b7d6d
MD5 5f9a18d03f0608f1b286169d2b2cab8c
BLAKE2b-256 6857796690ba4ed51ab84372be8de163f90491be83c28eb6b20874b90b1ffae5

See more details on using hashes here.

Provenance

The following attestation bundles were made for ztml-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: ci.yml on bleemesser/ztml

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ztml-0.2.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ztml-0.2.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 44dd5498db4590c154e48cb9ac7b9ab31983e103cd90c6424e119b368d01b388
MD5 9af36337808e73786b69c20f6cbe6af0
BLAKE2b-256 c6651523cf5525155b7a2da021fe42b49e38a8a3411362a81fa4b329ff465295

See more details on using hashes here.

Provenance

The following attestation bundles were made for ztml-0.2.0-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: ci.yml on bleemesser/ztml

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ztml-0.2.0-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for ztml-0.2.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 cd3de0aa010e9f2efe05412f2ed77399f4bd85fd69d39037a35e918a4d5889a5
MD5 ccbe00e079a14b96811fc0218aeebe5c
BLAKE2b-256 8ba0b61567339dc14522945c3ac3bbb1d8fb7db2b81694bf90cd0c80fdb579fb

See more details on using hashes here.

Provenance

The following attestation bundles were made for ztml-0.2.0-cp312-cp312-macosx_10_12_x86_64.whl:

Publisher: ci.yml on bleemesser/ztml

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page