Skip to main content

starlette-tailwindcss

Tailwind CSS for Starlette

PyPI - Version PyPI - Python Version PyPI - License

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 tailwindcss CLI 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)

Source distribution for starlette-tailwindcss 0.3.0
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)

Table of built distributions (wheels) for starlette-tailwindcss 0.3.0
File Interpreter ABI Platform Actions
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.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page