PyWry is a cross-platform app factory, rendering engine and UI toolkit for Python that produces native desktop, web, and notebook experiences from a single API.
FAQ
pywry is a Claude Code plugin with 18 hand-picked skills for development work, indexed on Flowy. Install it with the command on its page. It includes pywry-orientation, authentication, autonomous_building. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
$ npx -y skills add deeleeramone/PyWry --agent claude-code
Repo: deeleeramone/PyWry
PyWry is a cross-platform rendering engine and desktop UI toolkit for Python. One API, three output targets:
Build Once, Render Anywhere: Prototype interactive data apps in a Jupyter Notebook, easily deploy them as web apps, and seamlessly compile them into secure, lightweight standalone desktop executables via pywry[freeze].

Python 3.10โ3.14, virtual environment recommended.
pip install pywry
Core extras:
| Extra | When to use |
|---|---|
pip install 'pywry[notebook]' | Jupyter / anywidget integration |
pip install 'pywry[auth]' | OAuth2 and keyring-backed auth support |
pip install 'pywry[freeze]' | PyInstaller hook for standalone executables |
pip install 'pywry[mcp]' | Model Context Protocol server support |
pip install 'pywry[sqlite]' | Encrypted SQLite state backend (SQLCipher) |
pip install 'pywry[all]' | Everything above |
Chat provider extras:
| Extra | When to use |
|---|---|
pip install 'pywry[openai]' | OpenAIProvider (OpenAI SDK) |
pip install 'pywry[anthropic]' | AnthropicProvider (Anthropic SDK) |
pip install 'pywry[magentic]' | MagenticProvider (any magentic-supported LLM) |
pip install 'pywry[acp]' | StdioProvider (Agent Client Protocol subprocess) |
pip install 'pywry[deepagent]' | DeepagentProvider (LangChain Deep Agents โ includes MCP adapters and ACP) |
The chat UI itself is included in the base package. Provider extras only install the matching third-party SDK.
Linux only โ install system webview dependencies first:
sudo apt-get install libwebkit2gtk-4.1-dev libgtk-3-dev libglib2.0-dev \
libxkbcommon-x11-0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 \
libxcb-randr0 libxcb-render-util0 libxcb-xinerama0 libxcb-xfixes0 \
libxcb-shape0 libgl1 libegl1
from pywry import PyWry
app = PyWry()
app.show("Hello World!")
app.block()
from pywry import PyWry, Toolbar, Button
app = PyWry()
def on_click(data, event_type, label):
app.emit("pywry:set-content", {"selector": "h1", "text": "Clicked!"}, label)
app.show(
"<h1>Hello</h1>",
toolbars=[Toolbar(position="top", items=[Button(label="Click me", event="app:click")])],
callbacks={"app:click": on_click},
)
app.block()
from pywry import PyWry
import pandas as pd
app = PyWry()
df = pd.DataFrame({"name": ["Alice", "Bob", "Carol"], "age": [30, 25, 35]})
def on_select(data, event_type, label):
names = ", ".join(row["name"] for row in data["rows"])
app.emit("pywry:alert", {"message": f"Selected: {names}"}, label)
app.show_dataframe(df, callbacks={"grid:row-selected": on_select})
app.block()
from pywry import PyWry
import plotly.express as px
app = PyWry(theme="light")
fig = px.scatter(px.data.iris(), x="sepal_width", y="sepal_length", color="species")
app.show_plotly(fig)
app.block()
Button, Select, MultiSelect, TextInput, SecretInput, SliderInput, RangeInput, Toggle, Checkbox, RadioGroup, TabGroup, Marquee, Modal, and more. All Pydantic models; position them around the content edges or inside the chart area.app.emit() and app.on() bridge Python and JavaScript in both directions. Pre-wired Plotly and AgGrid events included.OpenAIProvider, AnthropicProvider, MagenticProvider, CallbackProvider, StdioProvider (ACP subprocess), and DeepagentProvider (LangChain Deep Agents).--pywry-* CSS variables, hot reload during development.SecuritySettings.strict() / .permissive() / .localhost() presets. SecretInput stores values server-side, never in HTML.pywry[freeze]. No .spec edits or --hidden-import flags required.pip install 'pywry[mcp]'
pywry mcp --transport stdio
Widget-creating tools โ create_widget, show_plotly, show_dataframe, show_tvchart, create_chat_widget โ return an AppArtifact: a self-contained HTML snapshot delivered as an MCP EmbeddedResource with mimeType: text/html and URI pywry-app://<widget_id>/<revision>. Clients that render HTML resources (Claude Desktop's artifact pane, mcp-ui clients, PyWry's own chat widget) show the app inline.
Each render bumps a per-widget revision. The latest revision keeps a live WebSocket bridge to Python; older revisions freeze at their last known state. Call get_widget_app(widget_id) to re-snapshot after a mutation.
See the MCP docs for tool reference and client setup.
Installable under claude/plugins/pywry/ as one /plugin install unit. Ships:
pywry-orientation skill โ teaches the agent when to reach for PyWry tools/pywry:doctor, /pywry:scaffold, /pywry:examplespywry-builder subagent โ for multi-step widget constructionruff format on touched .py filesInstall:
/plugin marketplace add deeleeramone/PyWry --path claude/.claude-plugin/marketplace.json
/plugin install pywry@pywry
Prerequisite: pip install 'pywry[dev]' (or pywry[all]). Then /pywry:doctor to verify.
PyPI-bundled install (skips the GitHub round-trip once pywry is already installed):
pywry plugin-path # prints the bundled plugin root
/plugin marketplace add $(pywry plugin-path)
/plugin install pywry@pywry
See claude/README.md for the full install-path matrix, mono-repo layout, and versioning policy.
pip install 'pywry[freeze]'
pyinstaller --windowed --name MyApp my_app.py
The output in dist/MyApp/ is fully self-contained. Target machines need no Python installation โ only the OS webview (WebView2 on Windows 10 1803+, WKWebView on macOS, libwebkit2gtk on Linux).
main and develop.CI Required and Docs Required.main.sbom.xml and sbom.json are produced during release workflows and bundled with release artifacts, not tracked at repository root.Apache 2.0 โ see LICENSE.
.github/
dependabot.yml
FUNDING.yml
workflows/
docs.yml
plugin-manifest.yml
publish-pywry.yml
release-claude-artifacts.yml
sbom.yml
sync-main-to-develop.yml
test-pywry.yml
update-lockfiles.yml
version-bump-check.yml
.gitignore
claude/
.claude-plugin/
marketplace.json
CONTRIBUTING.md
desktop-extension/
manifest.json
pyproject.toml
README.md
src/
server.py
plugins/
pywry/
.claude-plugin/
marketplace.json
plugin.json
.mcp.json
agents/
pywry-builder.md
CHANGELOG.md
commands/
doctor.md
examples.md
scaffold.md
hooks/
hooks.json
PRIVACY.md
README.md
RELEASING.md
skills/
pywry-orientation/
SKILL.md
README.md
scripts/
build_distributions.py
SUBMISSIONS.md
LICENSE
pywry/
pywry_tv_chat_screencap_lg.gif
.python-version
AGENTS.md
build_assets.py
docs/
docs/
assets/
modal_demo.gif
PyWry-dark.svg
PyWry-icon.png
PyWry-light.svg
changelog.md
components/
chat/
index.md
htmlcontent/
content-assembly.md
index.md
index.md
modal/
index.md
theming.md
toasts/
index.md
toolbar/
button.md
checkbox.md
dateinput.md
div.md
index.md
marquee.md
multiselect.md
numberinput.md
option.md
radiogroup.md
rangeinput.md
searchinput.md
secretinput.md
select.md
sliderinput.md
tabgroup.md
textarea.md
textinput.md
tickeritem.md
toggle.md
toolbar.md
toolbaritem.md
examples/
index.md
features.md
getting-started/
index.md
installation.md
quickstart.md
rendering-paths.md
why-pywry.md
guides/
app-show.md
browser-mode.md
builder-options.md
configuration.md
deploy-mode.md
events.md
hot-reload.md
javascript-bridge.md
menus.md
multi-widget.md
oauth2.md
standalone-executable.md
state-and-auth.md
tray.md
window-management.md
index.md
integrations/
aggrid/
grid.md
index.md
anywidget.md
chat/
chat-providers.md
index.md
index.md
inline-widget/
index.md
plotly/
index.md
plotly-config.md
pytauri/
index.md
tauri-plugins.md
tradingview/
index.md
tvchart-chart-kinds.md
tvchart-config.md
tvchart-datafeed.md
tvchart-indicators.md
tvchart-mixin.md
tvchart-models.md
tvchart-udf.md
javascripts/
component-previews.js
mcp/
examples.md
index.md
plugin.md
setup.md
skills.md
tools.md
overrides/
home.html
partials/
header.html
reference/
asset-loader.md
assets.md
auth-callback-server.md
auth-deploy-routes.md
auth-flow.md
auth-pkce.md
auth-providers.md
auth-session.md
auth-token-store.md
auth.md
callbacks.md
chat-manager.md
chat.md
cli.md
commands.md
config.md
css/
chat.md
core.md
index.md
toast.md
tvchart.md
events/
auth.md
chat.md
grid.md
index.md
javascript-api.md
menu.md
modal.md
plotly.md
system.md
toolbar.md
tray.md
tvchart.md
exceptions.md
hot-reload.md
index.md
inline-widget.md
log.md
mcp-api.md
menu-proxy.md
modal.md
models.md
notebook.md
pywry.md
runtime.md
scripts.md
state-auth.md
state-mixins.md
state-redis.md
state.md
templates.md
toolbar-functions.md
tray-proxy.md
types.md
utils.md
watcher.md
widget-protocol.md
widget.md
window-dispatch.md
window-manager.md
window-proxy.md
stylesheets/
component-previews.css
extra.css
mkdocs.yml
requirements.txt
site/
.gitkeep
examples/
pywry_demo_aggrid.ipynb
pywry_demo_chat_artifacts.py
pywry_demo_chat_magentic.py
pywry_demo_chat.py
pywry_demo_deepagent_nvidia.py
pywry_demo_deploy.py
pywry_demo_freeze.py
pywry_demo_modal.py
pywry_demo_multi_widget.py
pywry_demo_oauth2.py
pywry_demo_plotly.ipynb
pywry_demo_rendering.ipynb
pywry_demo_toolbar.ipynb
pywry_demo_tvchart_yfinance.py
pywry_demo_tvchart.ipynb
pywry_demo_tvchart.py
pywry_demo_udf_tvchart.py
SPY_15m.csv
SPY_1d.csv
SPY_1m.csv
SPY_30m.csv
SPY_5m.csv
SPY_60m.csv
hatch_build.py
package-lock.json
package.json
pyproject.toml
pytest.ini
pywry/
__init__.py
__main__.py
_freeze.py
_pyinstaller_hook/
__init__.py
hook-pywry.py
_vendor/
__init__.py
app.py
asset_loader.py
assets.py
auth/
__init__.py
callback_server.py
deploy_routes.py
flow.py
login_page.py
pkce.py
providers.py
session.py
token_store.py
callbacks.py
capabilities/
default.toml
chat/
__init__.py
artifacts.py
html.py
manager.py
models.py
permissions.py
providers/
__init__.py
anthropic.py
callback.py
deepagent.py
magentic.py
openai.py
stdio.py
session.py
updates.py
cli.py
commands/
__init__.py
window_commands.py
config.py
exceptions.py
frontend/
assets/
icon.icns
icon.ico
icon.png
PyWry-dark.svg
PyWry-icon.svg
PyWry-light.svg
PyWry.png
tauri-icons/
128x128.png
128x128@2x.png
32x32.png
64x64.png
android/
mipmap-anydpi-v26/
ic_launcher.xml
mipmap-hdpi/
ic_launcher_foreground.png
ic_launcher_round.png
ic_launcher.png
mipmap-mdpi/
ic_launcher_foreground.png
ic_launcher_round.png
ic_launcher.png
mipmap-xhdpi/
ic_launcher_foreground.png
ic_launcher_round.png
ic_launcher.png
mipmap-xxhdpi/
ic_launcher_foreground.png
ic_launcher_round.png
ic_launcher.png
mipmap-xxxhdpi/
ic_launcher_foreground.png
ic_launcher_round.png
ic_launcher.png
values/
ic_launcher_background.xml
icon.icns
icon.ico
icon.png
ios/
AppIcon-20x20@1x.png
AppIcon-20x20@2x-1.png
AppIcon-20x20@2x.png
AppIcon-20x20@3x.png
AppIcon-29x29@1x.png
AppIcon-29x29@2x-1.png
AppIcon-29x29@2x.png
AppIcon-29x29@3x.png
AppIcon-40x40@1x.png
AppIcon-40x40@2x-1.png
AppIcon-40x40@2x.png
AppIcon-40x40@3x.png
AppIcon-512@2x.png
AppIcon-60x60@2x.png
AppIcon-60x60@3x.png
AppIcon-76x76@1x.png
AppIcon-76x76@2x.png
AppIcon-83.5x83.5@2x.png
Square107x107Logo.png
Square142x142Logo.png
Square150x150Logo.png
Square284x284Logo.png
Square30x30Logo.png
Square310x310Logo.png
Square44x44Logo.png
Square71x71Logo.png
Square89x89Logo.png
StoreLogo.png
index.html
src/
aggrid-defaults.js
auth-helpers.js
bridge.js
chat-handlers.js
cleanup.js
event-bridge.js
hot-reload.js
main.js
modal-handlers.js
plotly-defaults.js
plotly-templates.js
plotly-widget.js
scrollbar.js
system-events.js
theme-manager.js
toast-notifications.js
... 281 moreยฉ 2026 Flowy ยท Free and open source
Built for Claude Code ยท Not affiliated with Anthropic