starlette-tailwindcss
Tailwind CSS for Starlette
Overview
starlette-tailwindcss is a lightweight utility for
Starlette that builds Tailwind CSS on startup with
optional watch mode during development.
It integrates directly with your Starlette app and provides:
- Builds CSS on startup.
- Automatically rebuilds on changes in watch mode.
- Optional
tailwindcssCLI binary auto-installation.
Installation
uv add starlette-tailwindcss
# or
pip install starlette-tailwindcss
Example
from contextlib import asynccontextmanager
from pathlib import Path
from starlette.applications import Starlette
from starlette.routing import Mount
from starlette.staticfiles import StaticFiles
from starlette_tailwindcss import tailwind
static_dir = Path(__file__).parent / "static"
@asynccontextmanager
async def lifespan(app: Starlette):
async with tailwind(
watch=app.debug,
version="v4.2.2",
input="src/acme/web/style.css",
output=static_dir / "css" / "output.{build_id}.css",
) as assets:
app.state.tailwind = assets
yield
routes = [
Mount("/static", app=StaticFiles(directory=static_dir), name="static"),
]
app = Starlette(
debug=True,
routes=routes,
lifespan=lifespan,
)
Use the generated CSS file in your templates:
<link
rel="stylesheet"
href="{{ url_for('static', path='css/' ~ request.app.state.tailwind.file_name) }}"
/>
How it works
starlette-tailwindcss runs the Tailwind CLI alongside your app.
- Builds CSS when the app starts.
- Rebuilds CSS in watch mode during development.
- Stops the process when the app shuts down.
Usage
Use an existing Tailwind CSS CLI binary:
async with tailwind(
watch=app.debug,
bin_path="/usr/local/bin/tailwindcss",
input="src/acme/web/style.css",
output=static_dir / "css" / "output.css",
):
...
Or let the package download a release automatically:
async with tailwind(
watch=app.debug,
version="v4.2.2",
input="src/acme/web/style.css",
output=static_dir / "css" / "output.css",
):
...
bin_path and version are mutually exclusive.
For a one-time build step, use build(...) instead of tailwind(...):
import asyncio
from pathlib import Path
from starlette_tailwindcss import build
static_dir = Path(__file__).parent / "static"
assets = asyncio.run(
build(
version="v4.2.2",
input="src/acme/web/style.css",
output=static_dir / "css" / "output.css",
),
)
If output includes {build_id}, the startup build writes a unique file name
on each app start. That makes cache pruning straightforward in production:
async with tailwind(
watch=app.debug,
version="v4.2.2",
input="src/acme/web/style.css",
output=static_dir / "css" / "output.{build_id}.css",
):
...
Debug logging
To see Tailwind CSS CLI output:
import logging
logging.basicConfig(level=logging.INFO)
License
MIT
Metadata
Release files for starlette-tailwindcss 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| starlette_tailwindcss-0.3.0.tar.gz | 7.9 kB | Without provenance | Details for starlette_tailwindcss-0.3.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| starlette_tailwindcss-0.3.0-py3-none-any.whl | Python 3 | none | any | Details for starlette_tailwindcss-0.3.0-py3-none-any.whl |
Total release size: 17.7 kB
Release files / starlette_tailwindcss-0.3.0.tar.gz
| Download URL | starlette_tailwindcss-0.3.0.tar.gz |
|---|---|
| Size | 7.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
125c54c3404062789397567c35ac49f0d91de3ef439549174fce374f6a0fe99d
|
|
BLAKE2b-256 checksum How to use checksums |
c5259638155f1bbe17621e4f392657e15af51436c867e5c170e4cf94821f0181
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.4 {"installer":{"name":"uv","version":"0.11.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / starlette_tailwindcss-0.3.0-py3-none-any.whl
| Download URL | starlette_tailwindcss-0.3.0-py3-none-any.whl |
|---|---|
| Size | 9.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e948b0d4155de7b2fe62070500915278ad2cb5c1ecb94c40374175c2f7f3c4f8
|
|
BLAKE2b-256 checksum How to use checksums |
7b2fde4516f7dd3f39151f8027bb4f01e52858805f1ddf38c4774faa8d84085c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.4 {"installer":{"name":"uv","version":"0.11.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for starlette-tailwindcss 0.3.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.