History
Release 0.6.5
0.6.5 (2026-07-16)
Closes the agent loop: an auto-built chat assistant can now see what its own run produced, not just trigger it.
Changed
run_appreports its result to the assistant (RFC #135). The auto-agent'srun_apptool used to emit a run and return a canned "outputs are updating" — so the model could trigger a run but was blind to what it produced, unable to react to (say) an empty chart or an error. It now runs the callback, returns a summary of each output slot's new value (a figure's traces + title, a table's shape, a text preview), and carries those outputs on its frame so the browser renders them without running the callback a second time (exactly one execution perrun_app). A callback error is reported back to the model so it can correct the inputs and retry. The raw-frame / langstage drive path (yield {"type": "run_app"}) is unchanged — it still runs on dispatch.- Secret guarantee preserved. The sidecar already keeps a
PasswordInputvalue out of the model's context. Because a callback can derive an output from that secret, the run summary reports shape/type only (trace count, table dimensions, text length — never a value, title, or preview) whenever the app has a secret input; apps without one keep full output fidelity.
- Secret guarantee preserved. The sidecar already keeps a
Release 0.6.4
0.6.4 (2026-07-15)
A follow-up to the 0.6.3 agent-contract work: two discoverability gaps the nightly dogfood found in the parts of it that didn't cover every path.
Fixed
describe_app()reportedoutputs: []for everyDynamicDashapp (#160). The 0.6.3 output contract (#152) read the publicoutputs_with_ids, butDynamicDashkeeps its prepared outputs under_outputs_with_ids, so a headless agent driving aDynamicDashwas pushed right back into discovering outputs by running the app — the exact thing the output contract exists to prevent. It now reports the real outputs (matching the idsinvokeproduces), the same private-name fallback_enumerate_outputsalready used.describe_app()still reportedtag: "Text"for a dropdown (#158). The #147 widget-tag fix covered theColorInputandTextAreabranches but left the siblingSelectbranch and the numeric / boolean / date /Literalbranches reporting the hint name — so astr-with-list-default dropdown was indistinguishable from a plain text box (the very #147 failure mode), andint/bool/date/Literalreported internal names ("Numeric","Boolean","Date","Literal") absent fromlist_component_types(). Every static input'stagnow names the widget it actually became —Select,NumberInput,Slider,Switch,DateInput,MultiSelect,UploadImage— and is guaranteed to be a member oflist_component_types().
Release 0.6.3
0.6.3 (2026-07-13)
An agent-contract release: the MCP surface now describes what an app really is, and refuses what its UI could never produce. Every open bug at the time of writing is fixed.
Fixed
Tuple[int, str]return hints silently dropped outputs (#156). Only the bare parenthesized spelling-> (int, str)produced two outputs; the idiomaticTuple[int, str]/tuple[int, str]are generic aliases, not tuple objects, so they collapsed to a single output and every return value after the first was discarded. Both spellings now expand, including underfrom __future__ import annotations(where the hint arrives as a string), and a variadictuple[int, ...]correctly stays a single output.- Apps shared one
run_kwargsdict (#153).run_kwargs=dict()was a mutable default that the constructor then mutated with its own port, so building a second app silently rewrote the first app's port (and any otherrun_kwargs, including the security-relevanthost) —app.run()bound the wrong port.run_kwargsis now copied, never aliased, and the caller's dict is left untouched. PasswordInputvalues leaked over the no-auth MCP route (#151). The chat surface redacted secrets; the MCP surface handed them out in plain text viadescribe_app, theset_inputecho, andget_invocation. A password's value now goes in (an agent can still fill the field) but never comes back out: the contract marks the input"secret": trueand every value it reports is masked — including a secret carried in a spec'sprops, and one whose form has since been replaced (its value is dropped from the mirror with it).- Value validation was type-blind (#150). The range check only fired for
numbers, so a string sailed straight past a Slider's
min/max—"9999"is not anint, so nothing compared it to the maximum — and reached the callback as a value no drag of the slider could produce. Numeric and boolean inputs now reject values of the wrong JSON type. DynamicDashforms skipped all validation (#144). Every guard keyed off the static input list, which aDynamicDashdoesn't have, so unknown ids, out-of-options values and out-of-range slider values were all accepted in silence. The specs of the form currently on screen are now the contract thatset_input/set_inputs/invokeenforce against — whether that form came frominitial_specs, aparent_controlcascade, or an agent'sset_form(including[{"label": ..., "value": ...}]styleSelectoptions). The parent control is part of the contract too: the UI passes it to the callback, so an agent can discover and drive it.- The MCP no-auth warning watched the wrong knob (#149). It warned on
mcp_host, which stopped binding anything when MCP moved onto the app's own port, and stayed silent on the setting that actually exposes an unauthenticated tool endpoint: serving on0.0.0.0. It now fires atrun(), keyed off the host the server really binds. - All
strwidgets reported the same tag (#147). A colour picker, a textarea and a text box all described themselves as"Text", so a headless agent readingdescribe_appcouldn't tell them apart. Each now reports the widget it actually became (ColorInput/TextArea/Text).
Added
- Output contract in
describe_app(#152). It reported inputs only, so the one way for a headless agent to learn what an app returns was to call it — discovery by side effect.describe_appnow also lists each output'sid, the componenttagit renders into (Graph/Table/Markdown/ …), its JSONtypeandlabel, plus a summary of the value currently on screen once something has run.
Release 0.6.2
0.6.2 (2026-07-12)
Chat sidebars get a collapsible input accordion, so a long list of settings (or, in a sidecar, the app's own inputs) can tuck to a header instead of crowding the conversation.
Added
- Collapsible "Settings" / "Inputs" accordion in chat sidebars. The sidebar
inputs are wrapped in a fully-collapsible
dmc.Accordion— a single-mode item that closes completely on click — scoped to chat surfaces; a normal (non-chat) form app is unchanged.- Full-page chat (
chat=True): the inputs are secondary settings, shown as a "Settings (N)" panel that defaults collapsed when there are several (and open when there are only a few), keeping the transcript roomy. - Sidecar (
chat=<agent>): the app's own inputs are the primary interface, shown as an "Inputs (N)" panel that defaults open; it only adds a way to tuck them so the chat panel can reclaim the space. The accordion stays inside the input container and never touches the chat panel — collapsing the chat panel still lifts the height cap so the inputs show in full.
- Full-page chat (
Release 0.6.1
0.6.1 (2026-07-07)
LangGraph chat agents now render their typed agent events as first-class
cards by default. When an agent calls a common tool, Fast Dash's langstage
bridge extracts a structured object from the tool result and shows a purpose-built
card in the transcript instead of a raw tool blob -- a reflection collapses into a
thinking block, a write_todos result becomes a task list with status icons, and
display_inline renders figures / tables / markdown inline.
Added
- Typed agent-event rendering, on by default. The langstage bridge now passes
the seven built-in extractors to
iter_event_frames, so a LangGraph agent's tool results stream asextractionframes that render as typed cards. No opt-in is required; a plain(query, ctx)chat callable is unaffected.
| Tool | extracted_type |
Rendered as |
|---|---|---|
think_tool |
reflection |
a collapsible "Reflection" thinking block |
write_todos |
todos |
a task list; per-item status icon, completed struck through |
memory |
memory_updated |
a compact "Memory updated" callout |
skill_view |
skill_loaded |
a "Skill loaded" callout |
skill_manage |
skill_event |
a skill create / update / delete callout |
__compression__ |
compression_summary |
a subtle "Context compressed" divider callout |
display_inline |
display_inline |
the flagship: figures / tables / markdown rendered inline (the same renderer artifacts use) |
An unknown extracted_type falls back to a compact collapsible JSON card, so a
typed event is never dropped.
chat_extractors=(newFastDash/fastdashparameter): an iterable of extractor objects (each with atool_name, anextracted_type, and a callableextract(content)) appended to the built-in defaults, deduped bytool_namewith your extractor winning on a collision -- so you can override how any built-in tool renders. Entries are duck-type validated at construction with a friendly ASCII error. Only used for a LangGraph agent; a plain chat callable ignores it silently.
Fixed
- Inline artifact tables render as a real
DataTableagain (aclassNamekwarg unsupported bydash_table.DataTableon dash 4.3 had been silently falling back to markdown text); the class now rides a wrapper div.
Release 0.6.0
0.6.0 (2026-07-07)
A single unified chat= argument replaces the family of chat_* knobs, and the
in-app assistant gains a real tool surface: it can read the app, drive its
inputs, set individual outputs, rearrange the output layout, and run Python
(with human-in-the-loop approval). This is a clean break — the old canvas /
drawer / chat_agent_* API is removed outright (no deprecation aliases).
Breaking changes
- Six parameters removed (no aliases):
canvas,chat_drawer,chat_agent,chat_agent_title,chat_agent_drive,chat_agent_position. Everything an agent-on-an-app used to configure now flows throughchat=and its companions. - The canvas surface is gone. The canvas component registry
(
CANVAS_COMPONENT_REGISTRYapp plumbing), the drawer layout branches, the floating right-hand aside, and its toggle button are all removed. A chat assistant now lives in the left sidebar (stacked under the inputs), the only placement. Thecanvas/set_propschat frames are no longer part of the app grammar — an unrecognized frame warns and is skipped rather than building a canvas. (The provider-neutralcanvas_tool_specson-ramp helper stays for code that opts into a canvas explicitly.) chat=is now polymorphic. One argument accepts several kinds of value, and the mode is resolved from it together with the shape ofcallback_fn:
chat= value |
callback_fn |
Result |
|---|---|---|
False / None |
any | a normal app, no chat |
True |
chat-shaped (first param query) |
full-page chat; the callback is the handler |
True |
app-shaped | the app plus an auto-built assistant sidecar (needs the [agent] + [langstage] extras and a chat_model= / FASTDASH_MODEL) |
| a model instance | app-shaped / None |
an assistant auto-built around that model (sidecar, or full-page if no app callback) |
a (query, ctx) callable |
app-shaped / None |
your agent as supplied, as a sidecar or full-page chat |
| a compiled LangGraph graph | app-shaped / None |
driven through the langstage bridge |
chat_tools=replaceschat_agent_drive=. It is the server-side allowlist of what the assistant may do:None-> the default full toolkit (read_app,set_input,run_app,set_output,set_layout, andrun_pythonwith approval); a tuple of tool-name strings and/orRunPython(...)configs to narrow it;()for a read-nothing/do-nothing chat. A frame whose verb is not in the allowlist appends a legible refusal note to the transcript instead of acting. The old auto-trim rules survive as allowlist trims (with warnings):update_live=Truedrops every app-driving verb (the app recomputes on change, so driving would double-run or be overwritten); a multi-function / steps app trims toread_apponly.- Placement is inferred, not configured. The rule keys on whether an app callback exists: an app-shaped callback -> a collapsible chat panel in the left sidebar (even with zero inputs); no app callback (or a chat-shaped one) -> full-page chat.
Added
- A chat-agent toolkit (
fast_dash.agent_toolkit(app)) — the list of LangChain@toolfunctions the assistant uses, trimmed to the app'schat_toolsallowlist:read_app,set_input,run_app,set_output,set_layout,run_python(+push_result). Wire it into your own agent yourself, or attachFastDashMiddleware(app)to acreate_agent, or letchat=Truebuild one for you. set_outputandset_layoutframes/tools.set_output(slot, value)renders a value into one output slot through the same transform pipeline the Run button uses (addressed by mosaic letter, e.g."A").set_layout(mosaic)rearranges/resizes the existing slots by re-parenting their leaf components (leaf ids stay stable, so registered callbacks keep working). A user's Run always wins: it restores the default output layout before the response lands.run_python— the assistant can execute Python in the app process against a per-conversation namespace, with human-in-the-loop approval by default (approve / edit / reject). Produced figures / DataFrames show inline and can be placed into an output slot withpush_result. A sandboxed variant (run_python_sandboxed) runs code in a scrubbed, network-blocked subprocess.- The
[agent]extra (pip install "fast-dash[agent]") — LangChain 1.x + LangGraph. Auto-building an assistant withchat=Truealso uses[langstage]to stream it as chat frames. - New top-level exports:
agent_toolkit,FastDashMiddleware,app_prompt(lazy — importingfast_dashnever drags in the optional extra), alongside the existingRunPython. chat_model=accepts a model instance or a"provider:model"string (resolved vialangchain.chat_models.init_chat_model); env fallbackFASTDASH_MODEL.chat_title=sets the sidebar panel header.
Migrating from 0.5.x
| 0.5.x | 0.6.0 |
|---|---|
chat_agent=my_agent |
chat=my_agent |
chat_agent_drive=False |
chat_tools=("read_app",) (read-only) |
chat_agent_title="Helper" |
chat_title="Helper" |
chat_agent_position="sidebar" / "aside" |
removed — the sidebar is the placement |
canvas=True |
chat= an agent (or chat=True) with the set_layout / set_output tools |
Release 0.5.5
0.5.5 (2026-07-05)
Fixed
chat_agent_position="sidebar"layout. The wider (420px) sidebar wasn't reaching Mantine's AppShell: thetoggle_sidebarcallback reset the navbar towidth: 300on load, so the main content offset and the collapse animation were computed from the wrong width. The result was the output area sliding under the sidebar (right panel clipped off-screen) and the sidebar refusing to fully close (a ~120px strip stayed visible). The callback now returns the sidebar-chat width, matching the layout, so the offset and collapse-transform are consistent — the output fills the space beside the sidebar, and toggling the inputs closes it completely. Removed the--app-shell-navbar-widthCSS override that was papering over the mismatch.
Release 0.5.4
0.5.4 (2026-07-05)
Added
chat_agent_position="sidebar"places the chat sidecar inside the left inputs sidebar — stacked under the inputs, always visible — instead of the default floating right aside ("aside"). The inputs take their natural height and the chat fills the rest; the navbar is widened to give it (and its charts) room. Good for putting a conversational assistant right next to the controls it complements.
Release 0.5.3
0.5.3 (2026-07-05)
Changed
- The empty-chat hint fits the app and the mode. The transcript's
placeholder was hardcoded to "Ask the assistant to change the output." — which
reads oddly for a pure
chat=Trueapp (there is no output to change). It now defaults per mode (a conversation forchat=True, "change the output" for a canvas / sidecar) and is overridable with a newchat_placeholder=argument. The text is rendered from adata-placeholderattribute so it can differ per app.
Release 0.5.2
0.5.2 (2026-07-05)
Bug fixes
- Chat sidecar
run_appnow renders the outputs, not just the inputs. When achat_agentdrove the app (set_input+run_app), it correctly updated the input controls and computed the new outputs — but the outputs stayed hidden behind the pre-run "Run to see results" placeholder, so the charts never refreshed until the user clicked Run manually. The placeholder (fd-not-runon#output-group-col) was only cleared by a real Run (submit_inputs.n_clicks), which the sidecar never fires. The drive path now clears it on arun_app(both the Flask drive reducer and the ASGIset_propspath), so an agent's run refreshes the view — the "anything you can do, the agent can do" promise holds for outputs too.
Release 0.5.1
0.5.1 (2026-07-04)
Bug fixes
describe_app()reports a JSONtypeconsistently across app kinds. A static app derived each input'stypefrom the callback annotation (a JSON type like"integer"), but aDynamicDashform reported the component name ("Slider") in the same field — so a headless agent readingtypegot two different vocabularies.DynamicDashnow reports the JSON type too, with the component name always intag(as on a static app). (#131)Optional[T]inputs reportT's type, not"string". AnOptional[int]/int | Noneparameter collapsed totype: "string"because the rawUnionwrapper isn't in the type map. The wrapper is now unwrapped to its single non-Nonemember, so an optional input advertises the type it actually accepts (integer/number/boolean). (#132)- Date/datetime input defaults are surfaced, not dropped. A
DateInput/ timestamp built from adatetime.date/datetime.datetimedefault reporteddefault: null(the default-handling branch didn't match a date object). It now surfaces the ISO string the DatePicker emits, keeping the time component for adatetime. (#134) - Docs: MCP tool examples use keyword arguments. The flagship
invoke/set_formsnippets in the README and the AI-agents guide showedinvoke({...})/set_form([...]), omitting the requiredinputs=/specs=keyword the tools expect. (#137)
Same contract-correctness class as #110 / #116 / #120 / #126.
Release 0.5.0
0.5.0 (2026-07-03)
Features
- Native chat mode (
chat=True): turn a callback into a streaming chat app — a bottom-anchored composer, a scrolling transcript, per-session history, and a provider-neutral frame grammar (content/reasoning/tool_start/tool_end/artifact/interrupt/error). No LLM SDK is bundled. - LangGraph agents:
chat=Truealso accepts a compiled LangGraph graph or a"module:attr"spec string (viafast-dash[langstage]), with multi-turn memory on the graph's checkpointer and human-in-the-loop interrupts. - The canvas (
canvas=True): a live, assistant-built output region beside the transcript — a conversational DynamicDash the model builds and mutates withcanvas/set_propsframes.chat_drawer=Truegives an app-first layout. - Chat sidecar (
chat_agent=): mount an independent chat agent on a normal Fast Dash app. The agent reads the app's live inputs (ctx.inputs,ctx.input_specs) and drives it (set_input/run_appframes, or theapp_tool_specs()/apply_tool_call()LLM on-ramp) — anything a user can do, the agent can do.chat_agent_drive=Falsemakes it read-only. - Driving chat over MCP:
mcp_server=Trueexposes a chat app'sdescribe_app/invokecontract so a headless agent sees and drives it like a browser user. - UI refresh: a first-class
accent=colour, an enriched Mantine theme, docstring-derived input help captions, skeleton loaders, a pre-run empty state, a sidecar drive affordance (agent-set inputs flash, the output pulses), streaming caret, code-copy buttons, mobile sheet + a11y (aria-labels, focus, reduced-motion). Dropped the unused FontAwesome stylesheet.
Security
- Password inputs are never exposed to a sidecar agent: a
PasswordInput's value is redacted fromctx.inputs, omitted from the contract, andset_inputon it is refused — while the app still runs with the real value.
Release 0.2.14
0.2.14 (2025-09-22)
Bug Fixes
- Automatic updates with no arguments: Fixes behavior of callback execution when it has no arguments.
Release 0.2.13
0.2.13 (2025-07-01)
Bug Fixes
- Disable websockets: Default behavior is disabled websockets so server deployments are faster.
Release 0.2.12
0.2.12 (2025-06-29)
Improvements
- Dependencies:
fastdashCLI can also be configured with a port number - Testing: Modify text streaming test to use
updatefunction correctly
Bug Fixes
- Stream handler: Fix stream handler to use notification=False by default
Release 0.2.11
0.2.11 (2025-06-26)
Features
- CLI: Add CLI project creation functionality and register script entry point
- Notifications: Add notify function and integrate notification handling in FastDash class
- Callbacks: Refactor component selection and enhance FastDash class with callback attribute for easier app interactions
- Branding: Add option to disable FastDash branding in the app
- Streaming: Add streaming functionality with socket.io support and loader support to FastDash components
- Chat: Enhance Chat component with streaming support, partial updates, and artifacts (Plotly figures, images, matplotlib, pandas, text)
Improvements
- Dependencies: Update dependencies and improve component configurations for compatibility
- Components: Replace dcc.Dropdown with dmc.Select and dmc.MultiSelect for improved component handling
- Testing: Implement polling mechanism and improve synchronization in streaming tests
Bug Fixes
- Component Data: Fix component data handling in _get_component_from_input and update tests
- Dependencies: Remove unused default properties for DateRangePicker and Prism components
Release 0.2.10
0.2.10 (2025-02-16)
Fixes
- Upgrade Poetry to 0.2.10
- Fix: Solve issue when building apps directly from the terminal. @https://github.com/dkedar7/fast_dash/issues/58
Release 0.2.9
0.2.9 (2024-02-24)
Fixes
- Fix: In case of no input arguments, sidebar either freezes or becomes unresponsive.
- Fix: When
update_liveis set toTrue, the app fails to reload dynamically.
Release 0.2.8
0.2.8 (2023-12-10)
Features
- On mobile layouts, automatically close sidebars when submit is clicked. Thank you @seanbearden for the issue.
- New examples in the documentation.
- Added some new examples to README.
Fixes
- Set image component width to 100%.
- Fix: If input is None, it's not automatically transformed.
0.2.7 (2023-10-18)
Features
- New component:
Table -
- Fast components are callable to update attributes. For example, to update the
page_sizeattribute ofTable, doTable(page_size=20). At the same time, Fast Components can also be used as non-callable objects.
- Fast components are callable to update attributes. For example, to update the
- Pandas DataFrame is rendered as a
Table. - "About" button displays the function docstring in parse markdown. New utility function to extract function docstring has been incorporated for this feature. This is, however, still experimental.
- Documentation upates, new "Usage Patterns" page.
- New tests.
- Fast Dash now supports Python 3.11.
Deprecations
- Support for Python 3.7 has been deprecated.
0.2.6 (2023-09-04)
Features
- New chat component! Setting the output data type to
Chatand returning a dictionary displays a chat component. - Introduced a transformation step before passing inputs to the callback. This allows converting non-native inputs to native data types. For example, passing a PIL.Image as input data tyoe hint doesn't need converting it to a base64 string.
- Errors are displayed as notifications.
- Updated documentation and tests.
0.2.5 (2023-08-13)
Improvements
- Fix:
update_liveis automatically set toTrueif the callback function doesn't require any inputs.
0.2.4 (2023-08-12)
Improvements
- Improve responsiveness on mobile views.
outputsargument overrides callback function output hints.- Improve pytest coverage.
0.2.3 (2023-08-01)
Features
- Dash components can be used as type hints directly. They are converted to Fast components during app initialization.
- Added a mosaic layout example to README.
dashcan be imported fromfast_dashlike this:from fast_dash import dash.
0.2.2 (2023-07-26)
Features
- New example: Chat over docs with Embedchain.
Improvements
- Squashed a bug that was preventing the submit and reset buttons to sync with each other. The result is a more stable deploy using callback context.
0.2.1 (2023-07-23)
Features
- Infer output labels from the callback function or specify the `output_labels`` argument
- Show overlay when loading outputs
- Use dmc.Burger icon instead of open, close icons. Allows for a clearner sidebar open/close UX
- New examples
Improvements
- [Bug] Components are now initialized with the desired height
- Sidebar collapse burger is not supported in minimal layout
- Replace branding text with icon
- New pytests to improve coverage
0.2.0 (2023-07-02)
Features
- Enable sidebar layout.
- Mosaic to build custom layouts.
- Collapsible sidebar.
Improvements
- Sidebar layout improvements to allow flex sizing of components.
- Unit test updates to support the latest tox and poetry versions.
0.1.7 (2022-08-21)
- Introduce Fast Dash decorator (
fastdash) for automatic and quick deployment. - Autoinfer input and output components from type hints and default values.
- Autoinfer title and subheader by inspecting the callback function.
- New test cases.
- Modified documentation layout and content.
- New GitHub Actions workflow to publish documentation only.
0.1.6 (2022-05-09)
- Navbar and footer are not thinner than before, which makes them less distracting ;)
- They no longer stick to the top and bottom respectively. Scrolling on the page makes the navbar dissappear!
- Update live: New live update option! Setting the argument
update_live=TrueremovesSubmitandClearbuttons. Any action updates the app right away. - New spinners: Finally, Fast Dash now has loading spinners to indicate loading outputs. This comes in handy when executing long running scripts.
0.1.5 (2022-04-02)
- Add examples: Object detection, molecule 3D viewer and UI updates to the existing examples.
- Easier fastification: Fastify now allows using a complete Dash component as the first argument.
- Tests: Increase pytest coverage to 95%.
0.1.4 (2022-03-21)
- New component property allows setting "acknowledgment" component!
- Default app title is 'Prototype'.
- New UploadImage component uses another html.Img component as acknowledgment.
- Added a new Neural Style Transfer example.
- Added examples to pytest cases.
0.1.3 (2022-03-11)
- Added 3 new examples.
- Make
navbarandfooterremovable from the app UI. - Updated documentation structure.
- Added Google Cloud Run deployment docs.
0.1.2 (2022-03-06)
- Supports usage of the same FastComponent multiple times via deepcopy.
- Correct documentation typos and examples.
- Added text-to-text examples.
- Modifications to the Fastify component.
0.1.1 (2022-02-28)
- First wide release.
- Adding input, output image functionality.
- Added mkdocs documentation.
0.1.0 (2022-01-29)
- First release on PyPI.