npx claudepluginhub dkedar7/fast_dash --plugin fast-dashThis skill uses the workspace's default tool permissions.
Fast Dash turns a Python function into a Plotly Dash web app. The `@fastdash` decorator reads the function's signature, maps each parameter's type hint to a UI component, maps the return type to an output component, and serves the result. No frontend, no callbacks, no boilerplate.
Builds data apps, dashboards, and interactive reports using React + Vite or Streamlit, with optional Gemini Data Analytics integration for GCP data visualization and chat-with-data.
Build interactive web UIs and ML demos with Gradio in Python using Interfaces, Blocks, event listeners, layouts, components, and chatbots.
Builds or edits Gradio apps, layouts, components, and chat interfaces in Python for ML demos, UI prototypes, and interactive web UIs.
Share bugs, ideas, or general feedback.
Fast Dash turns a Python function into a Plotly Dash web app. The @fastdash decorator reads the function's signature, maps each parameter's type hint to a UI component, maps the return type to an output component, and serves the result. No frontend, no callbacks, no boilerplate.
Use this skill when the user:
Do not use this for: production apps with complex routing, custom auth, or non-Python frontends — Fast Dash is opinionated for the single-file-Python-function use case.
pip install fast-dash
from fast_dash import fastdash
@fastdash
def greet(name: str = "world") -> str:
return f"Hello, {name}!"
# Serving on http://127.0.0.1:8080
That is the whole app. Open the URL, type a name, click Run.
int → number input, bool → checkbox, str with a list default → dropdown, etc. See references/components.md for the full table.@fastdash. For more control (tabbed multi-function apps, multi-step pipelines), use the FastDash(...) class directly.mode="inline".| Pattern | Syntax | When |
|---|---|---|
| Single function | @fastdash | One tool, one form |
| Multiple outputs | -> (Graph, Graph) + mosaic="AB" | Dashboard with several plots |
| Cascading inputs | state=depends_on("country", resolver) | Dependent dropdowns |
| Multiple tools, one app | FastDash([fn_a, fn_b], tab_titles=[...]) | Tabbed "apps" under one URL |
| Multi-step wizard | FastDash(steps=[fn_a, fn_b, fn_c]) + from_step(prev_fn) | Pipeline UX, one panel at a time |
| Streaming outputs | update("output_x", chunk) inside the fn + stream=True | LLM / token-by-token / progress |
| Notebook rendering | @fastdash(mode="inline") | Jupyter |
| Wrap a custom component | Fastify(dcc.Slider(...), "value") | Any Dash component |
Full examples for each: references/patterns.md.
| Hint | Component |
|---|---|
str | Textarea |
int, float | Number input |
bool | Checkbox |
Literal["a", "b"] | Dropdown |
Annotated[int, range(0, 100)] | Slider |
list | Multi-select |
datetime.date | Date picker |
pd.DataFrame (return) | Table |
plotly.graph_objects.Figure (return) | Plotly chart |
PIL.Image.Image | Image upload / display |
Full table with every supported hint: references/components.md.
Pass these directly as inputs= or outputs= when you want to override inference:
from fast_dash import (
# Inputs
Text, TextArea, PasswordInput,
NumberInput, Slider,
Switch, MultiSelect,
DateInput, DateRange, ColorInput,
Upload, UploadImage,
# Outputs
Graph, Image, Table, Markdown, Chat, Download,
)
For streaming and building custom UIs, also available:
from fast_dash import (
Fastify, # wrap any Dash component as a Fast Dash component
depends_on, # cascading input default
from_step, # multi-step pipeline data threading
update, notify, # push partial results / toasts during streaming
dcc, dbc, dmc, html, # re-exported: dash.dcc, dash_bootstrap_components, dash_mantine_components, dash.html
)
@fastdash starts the server on import. Put it in a if __name__ == "__main__": guard if the file is imported elsewhere, or skip the decorator and use FastDash(...).run().theme= does not restyle Mantine chrome (v0.2.x). Only dark/light flips for known dark themes (CYBORG, DARKLY, SLATE, ...).inputs=Text) not an instance. Mutation surprises.return line of the source. REPL / exec contexts fall back to OUTPUT_1, OUTPUT_2. Pass output_labels=[...] to override.Full list with reproducers: references/gotchas.md.
@fastdash on the function, done.@fastdash(mosaic="AB\nAC"), return a tuple of components.FastDash([fn_a, fn_b], tab_titles=[...]).run().FastDash(steps=[fn_a, fn_b, ...]).run() with from_step(prev_fn) defaults.depends_on("parent_name", resolver) as a default value.update(component_id, data) inside the function + stream=True on the app.mode="inline".FastDash(...) class, skip .run().Run the app and verify it loads. If you can't open a browser:
8080) is freemode="inline" was setIf the user has dash[testing] installed, a headless smoke test is worthwhile. Otherwise, ask the user to verify the UI themselves.