Skip to main content

A modern, state-of-the-art Python GUI framework

This project has been archived.

The maintainers of this project have marked this project as archived. No new releases are expected.

Project description

htag2

htag2 logo

PyPI Test Status Download Latest Build

Here is a full rewrite of htag, using only antigravity and prompts/intentions.

It feels very good. Currently, it's not a replacement, it's just a POC.

It's completely crazy, but it works :

  • For building desktop apps (ChromeApp on linux/windows)
  • For building web apps (WebApp as an asgi app (for starlette/fastapi/...))
  • For building SPA HTML Page (with the PyScript runner)
  • For building android apps (it works, but need to improve)

Get Started

Check the Official Documentation for more information.

Install

uv add htag2

Or using pip:

pip install htag2

Alternatively, you can run from source:

git clone https://github.com/manatlan/htag2.git
cd htag2
uv run examples/main3.py

Skill

With gemini-cli, claude-code, mistral-vibe (or others), you can use this SKILL.md to create a htag2 application.

Antigravity resumes :

htag2 is a Python library for building web applications using HTML, CSS, and JavaScript.

Key Resiliency Features Added

  • Zero-Config Hot-Reload: Passing reload=True to any runner (e.g. ChromeApp(App).run(reload=True)) automatically watches for Python file changes, seamlessly restarts the backend, and gracefully refreshes the frontend without losing your browser window session.
  • F5/Reload Robustness: Refreshing the browser no longer kills the Python backend; the session reconstructs cleanly.
  • HTTP Fallback (SSE + POST): If WebSockets are blocked (e.g. strict proxies) or fail to connect, the client seamlessly falls back to HTTP POST for events and Server-Sent Events (SSE) for receiving UI updates.
  • Production Debug Mode: Easily disable error reporting in the client by setting debug=False on the runner (e.g. WebApp(App, debug=False).app), preventing internal stacktraces from leaking to users.
  • Parano Mode (Payload Obfuscation): By initializing WebApp(App, parano=True), all data exchanged between the frontend and backend is automatically obfuscated using a dynamic XOR cipher and Base64 wrapping, making network traffic unreadable to MITM proxies.

New API Features

  • .root, .parent, and .childs properties: Every GTag exposes its position in the component tree. .root references the main Tag instance, .parent references the direct parent component, and .childs is a list of its children. This allows components to easily navigate the DOM tree and trigger app-level actions.
  • Declarative UI with Context Managers (with): You can now build component trees visually using with blocks (e.g., with Tag.div(): Tag.h1("Hello")), removing the need for self <= ... boilerplate.
  • Dual Attribute Access (Dictionary Style): In addition to self._class = "foo", you can now use self["class"] = "foo". This is the preferred way to handle attributes with dashes (e.g., self["data-id"] = 123).
  • Automatic Attribute Normalization: HTML attributes are normalized to use dashes internally. Setting self._data_id = "123" is strictly equivalent to setting self["data-id"] = "123".
  • Reactive State Management (State): Introducing State(value) for automatic UI reactivity. State acts as a transparent Proxy: you can use comparison/arithmetic operators directly (if self.count > 0: ...), mutate nested structures (including lists, dicts, sets, and tuples), and delegate attribute assignments seamlessly.
  • Iterative & Attribute Reactivity: Iterating over a State now yields proxies, meaning mutations like for item in self.list: item.active = True trigger re-renders. Attribute assignments (e.g. self.user.name = "Bob") are automatically delegated to the underlying object and notified.
  • Reactive & Boolean Attributes: Attributes like _class, _style, or _disabled now support lambdas for dynamic updates. Boolean attributes (e.g. _disabled=True) are correctly rendered as key-only or omitted.
  • Simplified Removal (.remove()): To remove a component from its parent, simply call self.remove() without arguments.
  • Rapid Content Replacement (.text): Use the .text property on any tag to quickly replace its inner text content without needing to manually clear its children first.
  • Recursive Statics & JS: Components created dynamically (via lambdas) now have their statics (CSS) and call_js commands correctly collected and sent to the client.
  • Scoped Styles (styles): Define a styles class attribute on any component to get automatically scoped CSS. The framework prefixes every rule with .htag-ClassName, handles @media, @keyframes, pseudo-selectors, and multi-selectors.
  • CSS Class Helpers: add_class(), remove_class(), toggle_class(), and has_class() for convenient class manipulation without manual string handling.
  • Simple Events & HashChange: Support for passing primitive values or custom objects from JS (via tag["onclick"] = func or tag._onclick = func). Includes built-in support for _onhashchange.
  • Fragments (Tag()): Create virtual components that group children without adding a wrapper tag to the DOM.
  • Advanced Tag Search (.find_tag()): Effortlessly locate any component in the tree by its internal htag ID or its manually assigned HTML id.
  • Custom ID Resilience: Manual HTML id attributes are now supported without breaking htag2's reactive partial updates, thanks to an automatic data-htag-id fallback mechanism.
  • Automatic Attribute Assignment: Non-prefixed keyword arguments passed during component instantiation are automatically assigned as instance attributes, simplifying data passing to custom components.

Project details


Download files

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

Source Distribution

htag2-0.2.4.tar.gz (68.6 kB view details)

Uploaded Source

Built Distribution

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

htag2-0.2.4-py3-none-any.whl (49.7 kB view details)

Uploaded Python 3

File details

Details for the file htag2-0.2.4.tar.gz.

File metadata

  • Download URL: htag2-0.2.4.tar.gz
  • Upload date:
  • Size: 68.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for htag2-0.2.4.tar.gz
Algorithm Hash digest
SHA256 51d63d9ebb5e1f527905065842ea30ec41bf4bbdab00db3c468d55411dc91256
MD5 25441b3a0049b2fe15cc410d6b58b6bb
BLAKE2b-256 c94c8f4b7b7bfc329fa271d2ec368064cf6c7ea183dafda4566f6d8916eb9fc3

See more details on using hashes here.

Provenance

The following attestation bundles were made for htag2-0.2.4.tar.gz:

Publisher: release.yml on manatlan/htag2

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

File details

Details for the file htag2-0.2.4-py3-none-any.whl.

File metadata

  • Download URL: htag2-0.2.4-py3-none-any.whl
  • Upload date:
  • Size: 49.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for htag2-0.2.4-py3-none-any.whl
Algorithm Hash digest
SHA256 826dcbc87df4279c4f9f89a1753ba4d252542ae7be82cd8ff0529f91eef21c7c
MD5 9c4e90cc5c0dab43a77dc260adb21aec
BLAKE2b-256 88ee251abe15af0c36bc55337eb28b0e544511b4ed069f009d20bde9fbfa67a0

See more details on using hashes here.

Provenance

The following attestation bundles were made for htag2-0.2.4-py3-none-any.whl:

Publisher: release.yml on manatlan/htag2

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