Skip to main content

Tailwind CSS integration for Starlette apps

Project description

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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

starlette_tailwindcss-0.3.0.tar.gz (7.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

starlette_tailwindcss-0.3.0-py3-none-any.whl (9.8 kB view details)

Uploaded Python 3

File details

Details for the file starlette_tailwindcss-0.3.0.tar.gz.

File metadata

  • Download URL: starlette_tailwindcss-0.3.0.tar.gz
  • Upload date:
  • Size: 7.9 kB
  • Tags: Source
  • Uploaded using 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}

File hashes

Hashes for starlette_tailwindcss-0.3.0.tar.gz
Algorithm Hash digest
SHA256 125c54c3404062789397567c35ac49f0d91de3ef439549174fce374f6a0fe99d
MD5 6520cf3be187bcd9a47d615389c6be58
BLAKE2b-256 c5259638155f1bbe17621e4f392657e15af51436c867e5c170e4cf94821f0181

See more details on using hashes here.

File details

Details for the file starlette_tailwindcss-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: starlette_tailwindcss-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 9.8 kB
  • Tags: Python 3
  • Uploaded using 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}

File hashes

Hashes for starlette_tailwindcss-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e948b0d4155de7b2fe62070500915278ad2cb5c1ecb94c40374175c2f7f3c4f8
MD5 d92755bc7fe006af800312d5ff97934d
BLAKE2b-256 7b2fde4516f7dd3f39151f8027bb4f01e52858805f1ddf38c4774faa8d84085c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page