NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #4260 most downloaded on PyPI
The fastest way to create an HTML app
Last release 15 days ago
03 Sep 2026
Ships on a steady schedule
a new release about every 2 weeks
Nearly every release is documented
notes for 59 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
2 years old
142 releases · first in 2024
update _formitem so that it doesn't raise KeyError (#694), thanks to @comhar
Add additional static file types zip tgz gz csv mp3 wav ogg flac aac doc docx xls xlsx ppt pptx epub mobi bmp tiff avi mov wmv mkv json xml yaml yml r
zip tgz gz csv mp3 wav ogg flac aac doc docx xls xlsx ppt pptx epub mobi bmp tiff avi mov wmv mkv json xml yaml yml rar 7z tar bz2 htm xhtml apk dmg exe msi swf iso json (#678)One column per month.
### New Features - Add Google Credentials helpers
Toast container duplication fix (#657), thanks to @curtis-allan
login_link kwargs (#660)Toast container duplication fix (#657), thanks to @curtis-allan
login_link access_type (#660)Handling for query or url params in qp/to (#638), thanks to @Isaac-Flath
This version of fastlite uses apsw, instead of the stdlib's sqlite3.
FT components now stringify as their id if they have one
Update sqlite-minutils to apswutils in fasthtml.common
Adds body_wrap bits to APIRouter (#612), thanks to @ohmeow
body_wrap bits to APIRouter (#612), thanks to @ohmeowAdd Auth0AppClient, thanks to 78wesley
The OAuth API is now simplified to only require chk_auth, and no longer uses login. chk_auth should either return False (meaning not authenticated) or
chk_auth, and no longer uses login. chk_auth should either return False (meaning not authenticated) or a RedirectResponse. After authentication, the auth parameter will be provided to handlers, which will have the oauth ID.The OAuth API is now simplified to only require chk_auth, and no longer uses login. chk_auth should either return False (meaning not authenticated) or
chk_auth, and no longer uses login. chk_auth should either return False (meaning not authenticated) or a RedirectResponse. After authentication, the auth parameter will be provided to handlers, which will have the oauth ID.Add oauth error_path (#570), thanks to @comhar
Support json request key parameters
.rt method to .to (#539)fh_cfg["auto_name"] option (#548)body_wrap attr to FastHTML (#546)FastHTML (#544)hx_target values #544)host param to JupyUvi, defaulting to "0.0.0.0" (#543)APIRouter (#538)WebSocket type annotation in app.ws handlers (#538)nb_hdrs to fast_app (#551), thanks to @Isaac-Flathjupy_app and FastJupy removed; their functionality is now built into fast_app and FastHTML and enabled automatically in notebooks
jupy_app and FastJupy removed; their functionality is now built into fast_app and FastHTML and enabled automatically in notebooksRouteX and RouterX removed; use FastHTML.add_route insteadAPIRouter (#535)ws_hdr and cts_hdr both removed from FastHTML and fast_app; replaced with exts, which takes a list of extension names (e.g. exts='ws')
ws_hdr and cts_hdr both removed from FastHTML and fast_app; replaced with exts, which takes a list of extension names (e.g. exts='ws')ws_hdr and cts_hdr both removed from FastHTML and fast_app; replaced with exts, which takes a list of extension names (e.g. exts='ws')
ws_hdr and cts_hdr both removed from FastHTML and fast_app; replaced with exts, which takes a list of extension names (e.g. exts='ws')Replace experimental Pusher with experimental setup_ws and ws_client
Pusher with experimental setup_ws and ws_client (#522)with_sid() (#521)Allow FastHTML.ws to be used without a function
Add pusher() for real time DOM updates; add fh_cfg.auto_id to automatically add unique IDs
pusher() for real time DOM updates; add fh_cfg.auto_id to automatically add unique IDs (#517)Add pusher() for real time DOM updates; add fh_cfg.auto_id to automatically add unique IDs
pusher() for real time DOM updates; add fh_cfg.auto_id to automatically add unique IDs (#517)### New Features - Document usage with Jupyter
### New Features - Add oauth.redir_url function
oauth.redir_url function (#476)Allow for handler names with same name as an http verb, even if path not provided
### Bugs Squashed - Remove IPython dep
### New Features - Add def_hdrs
def_hdrs (#446)Pass query params to custom class annotated args
### Bugs Squashed - svg.Path not passing d param
svg.Path not passing d param (#438)Include both m (me) and p (prev) in On and Prev handlers, and run after DOM ready
Include both m (me) and p (prev) in On and Prev handlers, and run after DOM ready
date has been renamed to parsed_date
date has been renamed to parsed_datehdrs and ftrs in FastHTML() (#426)datetime.date form field conversion (#415)form_fill (#424), thanks to @rbaveryfill_form (#423)Convert dict children in ft_htmx and ft_hx to kwargs
Add SVG HTMX helpers: svg_sel, SvgOob, and SvgInb
svg_sel, SvgOob, and SvgInb (#408)Client and Nbsp (#403)Redirect() and handle magic __response__ method (#400)HtmxResponseHeaders (#399)session to OAuth.chk_auth (#394)static_routes and static_route_exts methods to FastHTML (#387)Add sse_message, EventStream, and signal_shutdown
sse_message, EventStream, and signal_shutdown (#384)Make hdrs, ftrs, htmlkw, bodykw, etc available to RouterX and RouteX via ._app
RouterX and RouteX via ._app (#381)OAuth class (#381)
PicoBusy() function to display loading spinner during html load (#372)HtmxOn() to allow adding htmx event listeners more easily (#371)Support for web components in html2ft
Replace __call__ with rt in handler functions
__call__ with rt in handler functions (#334)flat_tuple and use it to allow nested tuples in route responsesbody parameter for decoded bodyurl_for (#189)### New Features - Fastlite 0.0.9 dep
CheckboxX also adds a hidden field before the checkbox
Checkbox to CheckboxX (#314)
### Bugs Squashed - post release fix for fill_form
fill_form (#309)__init.py__ now only contains fasthtml.core
__init.py__ now only contains fasthtml.corefasthtml.basics for importing the main fasthtml modulesAdd reload_includes and reload_excludes options to serve (#291), thanks to @pydanny
### Bugs Squashed - postrelease fix markdown js
Make index a special handler name for path "/" get request
dict value in hx_vals (#288)sess_cls param to FastHTML (#284)index a special handler name for path "/" get request (#274)run_in_threadpool for non-async handlers (#270)Experimental new named-based HTMX routing system
uri function to constract url_for path paramsHTTPConnection.url_path_forhx- prefixed versions, and look up values in route names (with link used for href attrs)/{func.__name__}post if func name isn't an http verb() in route decoratorsDefault route name to function name if method provided
generic list annotated params double-wrapped
Alpine regex not constrained to attr start
Do not make session vars available as direct params
Me, Any, On (#238)Signature may not resolve types from str
Add attrs1st formatting to html2ft (#193), thanks to @AndrewRPerkins
attrs1st formatting to html2ft (#193), thanks to @AndrewRPerkinsUpdate flat_xt to handle single FT item
flat_xt to handle single FT item (#190)pep8_app.py (#163)req.hdrs,req.ftrs,req.htmlkw,req.bodykw (#152)Form for multipart form data; initial poetry compatibility for serve (#137)Any or FT as return type of routes (#112)railway deploy did not connect mount point on first use
- Initial launch version
### Breaking changes - Rename run_uv to serve
run_uv to serve (#84)Update for fastcore XT to FT name change
Skip redundent formatting in loose_format
Handle relative paths in Social
New fasthtml.xt namespace for components
Your coding agent can read these notes before it upgrades. Set up the MCP server →