Skip to main content
Vibe Widget

Vibe Widget

Notebook widgets generated from a prompt and your data.

Python Version License Provider PyPI - Version PyPI - Downloads

You describe the interface you want in plain English, and a model writes the JavaScript that draws it in your notebook. You get sliders, linked views, filters and custom controls without writing front end code yourself.

Checkout the docs!

What it does

  • Generates a widget from a prompt.
    Describe the interface and the data, and the generated widget renders in the next cell.

  • Revises what already exists.
    Ask for a change in plain language, run an audit to have the code reviewed, and turn on approve mode when you want to read the code before it runs.

  • Stores widgets so they can be shared.
    Generated code is written into your project and can be committed to git, or saved as a single .vw file. Loading a file asks for approval by default.

  • Runs in the common notebook hosts.
    Jupyter and JupyterLab, VS Code notebooks, Positron, Google Colab, Quarto, and JupyterLite, built on AnyWidget and 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()

Nothing else needs to be set. Vibe Widget reads the .env file, picks the provider matching the variable name, and uses that provider's default model. Exporting the variable in your shell works the same way, and an exported value wins 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, and without needing an API key at all, because loading stored code calls no model:

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.

Examples

examples/ holds four notebooks that run from a clone with no API key, because the generated code is committed with them in examples/.vibewidget/.

Notebook What is in it
analysis_spaces.ipynb One sea-ice table read three ways: a brush that states a WHERE clause, a threshold line shared across fourteen facets, and a residual band over a fit computed in numpy.
instruments.ipynb Twelve widgets shaped like the question a domain expert asks, four of them pairs where the second widget takes its inputs from the first.
donut_hunt.ipynb One routing question carried through a chain of edit calls, ending with a second widget that listens to the first.
terrain_erosion.ipynb A painted heightmap that Python erodes and a 3D view that follows it.

The notebooks pass theme="minimal", which resolves to examples/.vibewidget/themes/minimal.json, so regenerating a widget uses the same description it was written under.

Acknowledgements

The repository 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.3

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

Source distribution (sdist)

Source distribution for vibe-widget 0.3.3
File Size Uploaded
vibe_widget-0.3.3.tar.gz 1.1 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for vibe-widget 0.3.3
File Interpreter ABI Platform
vibe_widget-0.3.3-py3-none-any.whl Python 3 none any Details

Total release size: 2.2 MB

Release files / vibe_widget-0.3.3.tar.gz

Download URL vibe_widget-0.3.3.tar.gz
Size 1.1 MB
Tags Source
SHA-256 checksum
How to use checksums
6f83db0d239766f7de762668f9934845b0ef0beada6ef4466a86717505889f94
BLAKE2b-256 checksum
How to use checksums
46dfe0d68b9473295d1a7d1e2add60bd1cd390ffea7fc7aa0fd2a64df618127f
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 16, 2026.

Transparency log

Release files / vibe_widget-0.3.3-py3-none-any.whl

Download URL vibe_widget-0.3.3-py3-none-any.whl
Size 1.1 MB
Tags Python 3
SHA-256 checksum
How to use checksums
70605021f747ca9386d09a626378d51521e2f37d4271d109c8f7c0207ebd54c5
BLAKE2b-256 checksum
How to use checksums
894d4f8214a1835612c9a72ebc185807c2525baad89fa8331ddd71272f2008c5
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 16, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.3.3 This release

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.7

2 release files

0.2.6

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.0

2 release files

0.1.0

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