Vibe Widget
Make analysis interactive.
Vibe Widget generates interactive notebook interfaces from plain English. Explore data with sliders, linked views, filters, and custom controls without building a front end.
What you can do
-
Create widgets from a prompt
Describe the interface you want and get a working widget immediately. -
Iterate safely
Revise in plain language, use built-in audits, and (optionally) require approval before any generated code runs. -
Share reusable widgets
Commit generated widgets to git, or save them as.vwbundles and load them elsewhere. Loading requires approval by default. -
Run where your data lives
Works in Jupyter/JupyterLab, Colab, VS Code notebooks, marimo, and more (via AnyWidget + React).
Quickstart
pip install vibe-widget
Put any one of these in a .env file next to your notebook:
ANTHROPIC_API_KEY=sk-ant-...
OPENAI_API_KEY=sk-...
OPENROUTER_API_KEY=sk-or-...
import pandas as pd
import vibe_widget as vw
df = pd.read_csv("sales.csv")
widget = vw.create("scatter plot with brush selection and a linked histogram", df)
widget()
That is the whole setup. Vibe Widget finds the .env file, picks the provider that matches the key you supplied, and chooses a default model for it. Exporting the variable in your shell works the same way and takes precedence over the file.
Any OpenAI-compatible endpoint
The key you set decides the endpoint. Point base_url somewhere else to override it, including at a local server.
vw.config(base_url="http://localhost:11434/v1", model="qwen2.5-coder")
vw.config(model="claude-sonnet-5") # keeps the provider your key selected
VIBE_API_KEY with VIBE_BASE_URL covers any endpoint that has no dedicated variable, such as vLLM or Azure OpenAI. vw.config() prints the provider, host, model and where the key came from, never the key itself.
Data privacy
Prompts include a summary of the data you pass in: shape, column names, dtypes, null counts, cardinality, and numeric ranges. By default the summary also carries the first 3 rows so the model can see the shape of real values.
vw.config(data_privacy="schema") # send no cell values at all
vw.config(sample_rows=1) # or send fewer rows
Share widgets with git
Generated widgets are written to .vibewidget/widgets/ as one .js file plus a .json sidecar holding the prompt, model, and input signature. Filenames are deterministic, so regenerating the same widget rewrites the same file instead of piling up copies. Both files are meant to be committed. A .vibewidget/.gitignore is created for you and excludes the derived caches (bundles/, packages/, sandbox/, audits/).
A teammate who clones the repo gets the widget without spending a model call:
widget = vw.load(".vibewidget/widgets/sales_chart__a1b2c3d4e5.js")
For sharing outside a repo, widget.save("sales_chart.vw") writes a single portable bundle, and widget.save(path, include_inputs=True) embeds the current input values with it.
Acknowledgements
This repo was originally created at the Sundai Weird Data Hack. We thank Angela for her feedback and suggestions on early versions!
Special thanks to Trevor Manz and the Anywidget project for providing the specification and foundation that made this project possible. Be sure to check out and star AnyWidget!
Release files for vibe-widget 0.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| vibe_widget-0.3.1.tar.gz | 14.7 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| vibe_widget-0.3.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 15.8 MB
Release files / vibe_widget-0.3.1.tar.gz
| Download URL | vibe_widget-0.3.1.tar.gz |
|---|---|
| Size | 14.7 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
42a2a0b7d9e3c8c6d9a402e89865524f340e31e989ac6c07db7806828e68f017
|
|
BLAKE2b-256 checksum How to use checksums |
6e24135108a41e9fdf566eab1c44caf7f6b3eef2e8a61ac6dfb04fbabdeb13e4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 15, 2026.
Transparency logRelease files / vibe_widget-0.3.1-py3-none-any.whl
| Download URL | vibe_widget-0.3.1-py3-none-any.whl |
|---|---|
| Size | 1.1 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3f54bfc59bb4b6a0e7981576d3c97911829bccdc52860d10f0ec6324f5adf679
|
|
BLAKE2b-256 checksum How to use checksums |
3313d3ccfa27ced63bf7f606aa34320140ed08764f4b34e0555ab8b3234bf3c0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 15, 2026.
Transparency log