pywry-orientation
When to reach for PyWry MCP tools (native webview rendering, Plotly, TradingView, AgGrid, chat) instead of writing Flask/Streamlit/Dash/Electron code. Use at…
**STOP. READ THIS ENTIRE FILE BEFORE CREATING ANY WIDGET.**
$ npx -y skills add deeleeramone/PyWry --skill interactive_buttons --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/interactive_buttonsContext preview
The summary Claude sees to decide when to auto-load this skill.
**STOP. READ THIS ENTIRE FILE BEFORE CREATING ANY WIDGET.**
> **STOP. READ THIS ENTIRE FILE BEFORE CREATING ANY WIDGET.**
Copy this EXACTLY. Do not deviate.
{
"html": "<div id=\"counter\" style=\"font-size:48px;text-align:center;padding:50px\">0</div>",
"title": "Counter",
"height": 400,
"toolbars": [{
"position": "top",
"items": [
{"type": "button", "label": "+1", "event": "counter:increment", "variant": "primary"},
{"type": "button", "label": "-1", "event": "counter:decrement", "variant": "neutral"},
{"type": "button", "label": "Reset", "event": "counter:reset", "variant": "danger"}
]
}]
}**THAT'S IT.** No callbacks needed. Buttons work automatically.
The event name `counter:increment` is parsed as:
When you click "+1", PyWry: 1. Finds the element with `id="counter"` 2. Parses its current text as a number 3. Adds 1 to it 4. Updates the display
| Event Pattern | What It Does | |--------------|--------------| | `myId:increment` | Adds 1 to element's text | | `myId:decrement` | Subtracts 1 from element's text | | `myId:reset` | Sets element's text to 0 | | `myId:toggle` | Toggles between true/false |
create_widget(
html='<div id="status" style="font-size:24px;text-align:center">false</div>',
toolbars=[{
"position": "top",
"items": [
{"type": "button", "label": "Toggle Status", "event": "status:toggle"}
]
}]
)create_widget(
html='''
<div style="display:flex;justify-content:space-around;padding:20px">
<div>Home: <span id="home" style="font-size:48px">0</span></div>
<div>Away: <span id="away" style="font-size:48px">0</span></div>
</div>
''',
toolbars=[{
"position": "top",
"items": [
{"type": "button", "label": "Home +1", "event": "home:increment"},
{"type": "button", "label": "Away +1", "event": "away:increment"},
{"type": "button", "label": "Reset All", "event": "home:reset"},
]
}]
)1. **Element id must exist** - The HTML must have an element with the matching id 2. **Event format is `id:action`** - Colon separates the target from the action 3. **Actions are lowercase** - `increment`, `decrement`, `reset`, `toggle` 4. **Initial value matters** - For increment/decrement, start with a number like "0"
❌ Wrong: `event: "increment"` (no target id) ❌ Wrong: `event: "counter-increment"` (hyphen instead of colon) ❌ Wrong: HTML has `id="Counter"` but event is `counter:increment` (case mismatch)
✅ Correct: `event: "counter:increment"` with `id="counter"` in HTML
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.
Repo: deeleeramone/PyWry
When to reach for PyWry MCP tools (native webview rendering, Plotly, TradingView, AgGrid, chat) instead of writing Flask/Streamlit/Dash/Electron code. Use at…
Add OAuth2 authentication to PyWry apps — Google, GitHub, Microsoft, or any OIDC provider.
Autonomous PyWry application building using LLM sampling, elicitation, and progress reporting.
How an agent operates inside a PyWry chat widget — reading user messages, attachments, @-context, tool-call result cards, edit/resend, settings changes.
**STOP. THIS IS THE AUTHORITATIVE REFERENCE FOR ALL COMPONENTS.** **YOU MUST USE THE EXACT EVENT SIGNATURES DOCUMENTED HERE.** **THERE ARE NO EXCEPTIONS. NO…