Skip to main content

gistwidget

Labs — This is an experimental project. And not recommended for production use.

Share anywidgets via GitHub Gists. Two functions, zero config.

Build a widget in a notebook, publish it to a gist, and anyone can load it back — JS, CSS, Python traitlets and all.

Install

uv add gistwidget
# or
pip install gistwidget

Quickstart

Load a widget someone already published:

import gistwidget

Widget = gistwidget.load("4de49e3627f06804c53d235f004d41c0")
Widget()

Publish your own:

import os
import anywidget
import traitlets
import gistwidget

class CounterWidget(anywidget.AnyWidget):
    _esm = """
    export default {
      render({ model, el }) {
        let btn = document.createElement("button");
        btn.innerText = `Count: ${model.get("count")}`;
        btn.addEventListener("click", () => {
          model.set("count", model.get("count") + 1);
          model.save_changes();
        });
        model.on("change:count", () => {
          btn.innerText = `Count: ${model.get("count")}`;
        });
        el.appendChild(btn);
      }
    };
    """
    count = traitlets.Int(0).tag(sync=True)

result = gistwidget.publish(
    CounterWidget,
    description="Counter widget",
    token=os.getenv("GITHUB_TOKEN"),
)
print(result.html_url)

API

gistwidget.load(gist_id, *, token=None)

Load a widget class from a GitHub Gist.

Parameter Type Description
gist_id str Gist ID, user/id, or full URL
token str | None GitHub token (only needed for private gists)

Returns a type[anywidget.AnyWidget] — the widget class, not an instance. Call it to create one.

gistwidget.publish(widget, *, gist_id=None, description="", public=False, token=None)

Publish a widget to a GitHub Gist.

Parameter Type Description
widget type | instance An AnyWidget class or instance
gist_id str | None Update an existing gist (omit to create new)
description str Gist description
public bool Public or secret gist
token str GitHub token (required)

Returns a GistResult with .gist_id and .html_url.

GistResult

@dataclass
class GistResult:
    gist_id: str
    html_url: str

GistError

Raised on API errors or invalid input. Has an optional .status_code attribute for HTTP errors.

What gets stored in the gist

File Contents When
widget.js Your _esm JavaScript Always
widget.css Your _css stylesheet If _css is set
widget.py Traitlet definitions If the widget has custom traitlets

When loading, all three are reassembled into a working widget class.

Notebooks

The notebooks/ directory contains marimo notebooks:

  • load_widget.py — Interactive loader: paste a gist ID, get a live widget
  • publish_widget.py — Defines a drawing-canvas widget and publishes it

Development

uv pip install -e ".[dev]"
pytest tests/

Metadata

Release files for gistwidget 0.1.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for gistwidget 0.1.2
File Size Uploaded
gistwidget-0.1.2.tar.gz 9.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for gistwidget 0.1.2
File Interpreter ABI Platform
gistwidget-0.1.2-py3-none-any.whl Python 3 none any Details

Total release size: 15.9 kB

Release files / gistwidget-0.1.2.tar.gz

Download URL gistwidget-0.1.2.tar.gz
Size 9.1 kB
Tags Source
SHA-256 checksum
How to use checksums
21a7cc6a6b476d6828204804567adfd2abb44603bf4ce31abf5df24448df3308
BLAKE2b-256 checksum
How to use checksums
fa7e0a2e4ff7f471b89e7a845e39f9241327b91bf526d9ebfb3b08f8bcff285d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.10.8 {"installer":{"name":"uv","version":"0.10.8","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 / gistwidget-0.1.2-py3-none-any.whl

Download URL gistwidget-0.1.2-py3-none-any.whl
Size 6.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6cc9f670e1b9ca558ba9f8dec4a206c0b4c0ff0cec3195a4e4f04e079e3b9d30
BLAKE2b-256 checksum
How to use checksums
5fbcbe58955e17f70095abb7d3851852c3ea4f6aa19c90fc2539ff5c3c8025d4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.10.8 {"installer":{"name":"uv","version":"0.10.8","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 history Release notifications | RSS feed

This release

0.1.2 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page