Spaces:
Sleeping
Sleeping
# FastHTML | |
<!-- WARNING: THIS FILE WAS AUTOGENERATED! DO NOT EDIT! --> | |
Welcome to the official FastHTML documentation. | |
FastHTML is a new next-generation web framework for fast, scalable web | |
applications with minimal, compact code. It’s designed to be: | |
- Powerful and expressive enough to build the most advanced, interactive | |
web apps you can imagine. | |
- Fast and lightweight, so you can write less code and get more done. | |
- Easy to learn and use, with a simple, intuitive syntax that makes it | |
easy to build complex apps quickly. | |
FastHTML apps are just Python code, so you can use FastHTML with the | |
full power of the Python language and ecosystem. FastHTML’s | |
functionality maps 1:1 directly to HTML and HTTP, but allows them to be | |
encapsulated using good software engineering practices—so you’ll need to | |
understand these foundations to use this library fully. To understand | |
how and why this works, please read this first: | |
[fastht.ml/about](https://fastht.ml/about). | |
## Installation | |
Since `fasthtml` is a Python library, you can install it with: | |
``` sh | |
pip install python-fasthtml | |
``` | |
In the near future, we hope to add component libraries that can likewise | |
be installed via `pip`. | |
## Usage | |
For a minimal app, create a file “main.py” as follows: | |
<div class="code-with-filename"> | |
**main.py** | |
``` python | |
from fasthtml.common import * | |
app,rt = fast_app() | |
@rt('/') | |
def get(): return Div(P('Hello World!'), hx_get="/change") | |
serve() | |
``` | |
</div> | |
Running the app with `python main.py` prints out a link to your running | |
app: `http://localhost:5001`. Visit that link in your browser and you | |
should see a page with the text “Hello World!”. Congratulations, you’ve | |
just created your first FastHTML app! | |
Adding interactivity is surprisingly easy, thanks to HTMX. Modify the | |
file to add this function: | |
<div class="code-with-filename"> | |
**main.py** | |
``` python | |
@rt('/change') | |
def get(): return P('Nice to be here!') | |
``` | |
</div> | |
You now have a page with a clickable element that changes the text when | |
clicked. When clicking on this link, the server will respond with an | |
“HTML partial”—that is, just a snippet of HTML which will be inserted | |
into the existing page. In this case, the returned element will replace | |
the original P element (since that’s the default behavior of HTMX) with | |
the new version returned by the second route. | |
This “hypermedia-based” approach to web development is a powerful way to | |
build web applications. | |
### Getting help from AI | |
Because FastHTML is newer than most LLMs, AI systems like Cursor, | |
ChatGPT, Claude, and Copilot won’t give useful answers about it. To fix | |
that problem, we’ve provided an LLM-friendly guide that teaches them how | |
to use FastHTML. To use it, add this link for your AI helper to use: | |
- [/llms-ctx.txt](https://www.fastht.ml/docs/llms-ctx.txt) | |
This example is in a format based on recommendations from Anthropic for | |
use with [Claude | |
Projects](https://support.anthropic.com/en/articles/9517075-what-are-projects). | |
This works so well that we’ve actually found that Claude can provide | |
even better information than our own documentation! For instance, read | |
through [this annotated Claude | |
chat](https://gist.github.com/jph00/9559b0a563f6a370029bec1d1cc97b74) | |
for some great getting-started information, entirely generated from a | |
project using the above text file as context. | |
If you use Cursor, type `@doc` then choose “*Add new doc*”, and use the | |
/llms-ctx.txt link above. The context file is auto-generated from our | |
[`llms.txt`](https://llmstxt.org/) (our proposed standard for providing | |
AI-friendly information)—you can generate alternative versions suitable | |
for other models as needed. | |
## Next Steps | |
Start with the official sources to learn more about FastHTML: | |
- [About](https://fastht.ml/about): Learn about the core ideas behind | |
FastHTML | |
- [Documentation](https://www.fastht.ml/docs): Learn from examples how | |
to write FastHTML code | |
- [Idiomatic | |
app](https://github.com/AnswerDotAI/fasthtml/blob/main/examples/adv_app.py): | |
Heavily commented source code walking through a complete application, | |
including custom authentication, JS library connections, and database | |
use. | |
We also have a 1-hour intro video: | |
<https://www.youtube.com/embed/Auqrm7WFc0I> | |
The capabilities of FastHTML are vast and growing, and not all the | |
features and patterns have been documented yet. Be prepared to invest | |
time into studying and modifying source code, such as the main FastHTML | |
repo’s notebooks and the official FastHTML examples repo: | |
- [FastHTML Examples Repo on | |
GitHub](https://github.com/AnswerDotAI/fasthtml-example) | |
- [FastHTML Repo on GitHub](https://github.com/AnswerDotAI/fasthtml) | |
Then explore the small but growing third-party ecosystem of FastHTML | |
tutorials, notebooks, libraries, and components: | |
- [FastHTML Gallery](https://fastht.ml/gallery): Learn from minimal | |
examples of components (ie chat bubbles, click-to-edit, infinite | |
scroll, etc) | |
- [Creating Custom FastHTML Tags for Markdown | |
Rendering](https://isaac-flath.github.io/website/posts/boots/FasthtmlTutorial.html) | |
by Isaac Flath | |
- [How to Build a Simple Login System in | |
FastHTML](https://blog.mariusvach.com/posts/login-fasthtml) by Marius | |
Vach | |
- Your tutorial here! | |
Finally, join the FastHTML community to ask questions, share your work, | |
and learn from others: | |
- [Discord](https://discord.gg/qcXvcxMhdP) | |
## Other languages and related projects | |
If you’re not a Python user, or are keen to try out a new language, | |
we’ll list here other projects that have a similar approach to FastHTML. | |
(Please reach out if you know of any other projects that you’d like to | |
see added.) | |
- [htmgo](https://htmgo.dev/) (Go): “*htmgo is a lightweight pure go way | |
to build interactive websites / web applications using go & htmx. By | |
combining the speed & simplicity of go + hypermedia attributes (htmx) | |
to add interactivity to websites, all conveniently wrapped in pure go, | |
you can build simple, fast, interactive websites without touching | |
javascript. All compiled to a single deployable binary*” | |
If you’re just interested in functional HTML components, rather than a | |
full HTMX server solution, consider: | |
- [fastcore.xml.FT](https://fastcore.fast.ai/xml.html): This is actually | |
what FastHTML uses behind the scenes | |
- [htpy](https://htpy.dev/): Similar to | |
[`fastcore.xml.FT`](https://fastcore.fast.ai/xml.html#ft), but with a | |
somewhat different syntax | |
- [elm-html](https://package.elm-lang.org/packages/elm/html/latest/): | |
Elm’s built-in HTML library with a type-safe functional approach | |
- [hiccup](https://github.com/weavejester/hiccup): Popular library for | |
representing HTML in Clojure using vectors | |
- [hiccl](https://github.com/garlic0x1/hiccl): HTML generation library | |
for Common Lisp inspired by Clojure’s Hiccup | |
- [Falco.Markup](https://github.com/pimbrouwers/Falco): F# HTML DSL and | |
web framework with type-safe HTML generation | |
- [Lucid](https://github.com/chrisdone/lucid): Type-safe HTML generation | |
for Haskell using monad transformers | |
- [dream-html](https://github.com/aantron/dream): Part of the Dream web | |
framework for OCaml, provides type-safe HTML templating | |
For other hypermedia application platforms, not based on HTMX, take a | |
look at: | |
- [Hotwire/Turbo](https://turbo.hotwired.dev/): Rails-oriented framework | |
that similarly uses HTML-over-the-wire | |
- [LiveView](https://hexdocs.pm/phoenix_live_view/Phoenix.LiveView.html): | |
Phoenix framework’s solution for building interactive web apps with | |
minimal JavaScript | |
- [Unpoly](https://unpoly.com/): Another HTML-over-the-wire framework | |
with progressive enhancement | |
- [Livewire](https://laravel-livewire.com/): Laravel’s take on building | |
dynamic interfaces with minimal JavaScript | |