Changelog

4.8.0 (2026-08-30)

💥 Dependencies

  • django-typer replaced by django-click, which drops typer from the dependency tree entirely. django-typer caps typer<0.26.0, click<8.5 and django<6.2; django-click requires only click>=7.1 with no upper bound, so those caps no longer reach into your environment. The nine subcommands, their options and the runserver passthrough are unchanged, call_command still accepts options both as keywords and as strings, and CommandError still reaches a programmatic caller. Help text is now rendered by click rather than by typer’s markdown mode, so backticks in --help appear literally.

  • call_command("tailwind", ..., verbosity=0) no longer raises TypeError. Django’s own command options were rejected by the command group, which made the command unusable from a script that passes them — as deploy scripts and other packages’ test suites routinely do. stdout and stderr are honoured rather than merely accepted, so a caller can capture the output.

  • An option meant for another subcommand is refused instead of ignored. call_command("tailwind", "config", verbose=True) used to run and do nothing with verbose; it now raises TypeError, as Django does for an option a command does not have.

  • --skip-checks and --force-color work again, on the group and on every subcommand, as they do for any other Django management command.

  • manage.py tailwind with no subcommand exits 2 rather than 1, click’s code for a usage error. It still prints the help text.

  • manage.py tailwind --version reports this package’s version, not Django’s.

🎯 New Features

  • A source CSS inside STATICFILES_DIRS is reported by the system check django_tailwind_cli.W001 instead of failing on deploy. Such a file is collected by collectstatic, and a manifest storage backend then cannot resolve the @import "tailwindcss"; it contains. It stays a warning, not an error — without a manifest backend the file is merely published alongside the build output — and SILENCED_SYSTEM_CHECKS turns it off.

  • Hand edits to the managed source.css no longer vanish silently: the command says what it is about to replace, keeps your version as source.css.bak, and points at TAILWIND_CLI_SRC_CSS as the way to own the file. Toggling DaisyUI or a changed set of auto-@sourced apps does not trip it — only content this library could not have written does.

🐛 Bug Fixes

  • TAILWIND_CLI_CSS_MAP works end to end: the source CSS was written for the first entry only and tailwind setup built only that one, so a multi-entry project came out of setup with one stylesheet and the next build failed on the missing second input. Both iterate every entry now.

  • Two TAILWIND_CLI_CSS_MAP entries writing one output file are rejected instead of quietly building only one of them: the first build wrote the file, the freshness check then found the second entry up to date, and it was reported as built without ever having run. Different spellings of the same path (./out.css next to out.css) count as the same destination.

  • A missing setting reads as a configuration error, not an unexpected one: get_config raises ConfigurationError now, so STATICFILES_DIRS is empty arrives with the STATICFILES_DIRS = [BASE_DIR / 'assets'] hint and one line of output instead of Unexpected error and a traceback. It subclasses ValueError, so code calling get_config() directly and catching one is unaffected. Through a management command it arrives as a CommandError, as every other command failure does.

  • tailwind setup uses the same code as tailwind build: it wrote the source CSS and ran the first build with its own copies, so it ignored TAILWIND_CLI_AUTO_SOURCE_EXTERNAL_APPS and TAILWIND_CLI_AUTOMATIC_MINIFY, never wrote the managed directory’s .gitignore, ran the build from the shell’s working directory rather than BASE_DIR, and exited 0 after reporting that the build had failed. In exchange it now brings an existing source.css to the state a build expects rather than leaving it alone — announced, and with a .css.bak.

  • An @source line you added yourself is no longer deleted in silence: the check for “did we write this file” accepted any @source directive as its own, so widening template discovery by hand in the managed source.css lost the line on the next build, with no warning and no backup. Position decides now — the library only ever writes @source below its own generated comment.

  • Command errors are reported the way they were meant to be: the error decorator sat above @app.command, so typer registered the undecorated function and none of it ever ran. A failing command showed a bare traceback instead of the message and the suggested fix. It now prints the hint to stderr and lets the failure continue: a user error as a CommandError, which Django renders and a caller using call_command can catch, and a bug with its traceback intact. A failing Tailwind build called sys.exit and bypassed all of this; it raises now too.

  • A TAILWIND_CLI_PATH pointing straight at a binary no longer ignores TAILWIND_CLI_VERSION: that filename carries no version, so a bump used to reuse the old binary in silence. build, watch and runserver read the version from the binary now and warn on a mismatch rather than replacing a file you placed there. A managed download is unaffected: its version is in its filename. download_cli still replaces a binary you supplied — that is what it was asked to do — but names the file first.

  • A CLI binary that appears mid-process is seen again: an existence check was cached for five seconds behind a module-level dict, so with TAILWIND_CLI_AUTOMATIC_DOWNLOAD = False a build right after placing the binary still reported it missing. The cache served one call site and is gone.

  • tailwind runserver says when there is no manage.py at BASE_DIR instead of starting both subprocesses and reporting that the server is up, only for it to die a moment later with a bare exit code. Layouts that keep manage.py elsewhere are pointed at running the two halves separately.

  • TAILWIND_CLI_SRC_CSS expands a leading ~, as TAILWIND_CLI_PATH already did. It used to become a directory named ~ below BASE_DIR. TAILWIND_CLI_CSS_MAP sources go through the same resolution now.

  • A prefixed STATICFILES_DIRS entry may be a list, not only a tuple. Django’s own FileSystemFinder accepts both; STATICFILES_DIRS[0] in list form raised a TypeError before reaching any Tailwind code.

  • The HTTP layer closes the error it catches. urllib’s HTTPError is the response object and owns an open file handle — one it allocates itself when the server sent no body. All three places that wrapped it kept it alive through the exception chain without closing it, which Python 3.14 reports as ResourceWarning: Implicitly cleaning up <HTTPError ...> on a failed download or version lookup.

🛠️ Developer Experience

  • CI builds the docs with warnings as errors: Sphinx reports a missing reference or an unresolvable include as a warning and publishes anyway, so a plain build would pass on exactly the failures worth catching. mise run build-docs runs the same check locally.

  • One download stub for the whole suite: tests/helpers.py holds write_fake_cli, replacing 29 copies of the same fixture across four test modules. Net −290 lines.

  • Coverage has a floor: the suite fails below 90%, and branch coverage is on, so both sides of a condition count. A coverage job in CI enforces it — the tox matrix runs pytest without --cov, so the floor would otherwise have been a local convention.

  • TestPyPI is a gate for the PyPI release again: publish-to-pypi waits for publish-to-testpypi instead of running beside it, so a broken artifact fails somewhere reversible first. The TestPyPI step already sets skip-existing, so a re-run does not block on an already-published version.

  • Shared test fixtures moved into tests/conftest.py: bypass_autoreload and fake_project_settings replace four copies of the autoreload bypass and three copies of the settings setup. Modules opt in with @pytest.mark.usefixtures(...).

  • The linters run in CI again: a lint job runs the full pre-commit suite (ruff, basedpyright, uv-secure, the upgrade hooks) on every pull request. It had been dropped in 2022 because pyright could not resolve imports without the project venv, which mise run bootstrap now provides.

🔧 Technical Improvements

  • No subprocess during template rendering: with TAILWIND_CLI_USE_SYSTEM_BINARY and a pinned version, the version check ran inside get_config(), which {% tailwind_css %} calls on every render — so the first request of every worker process executed tailwindcss --help. It runs on the command path now.

  • License metadata uses the SPDX form: license = "MIT" plus license-files, so PyPI shows MIT instead of the whole licence text pasted into the metadata field. The License :: OSI Approved classifier is gone, which PyPI rejects alongside an SPDX expression.

  • _validate_css_settings reads settings the way the rest of config.py does, through getattr(..., None) rather than hasattr plus a second read. No behaviour change; the two idioms were verified to agree for an unset, None, empty and populated setting alike.

  • The test suite no longer reaches the network: tests/conftest.py fails any test that resolves a hostname, isolates the version cache per test, and answers the release lookup from a fixture. Until now the suite overwrote the machine-wide version cache that manage.py tailwind itself reads, and one setup test downloaded a real Tailwind binary into the source tree on every new version.

📚 Documentation

  • docs/development.md is docs/workflow.md, titled “Daily Workflow”. It documents using the package day to day, not contributing to it, and sat next to “Contributing” in the sidebar saying otherwise.

  • The base template page shows the shipped file, included rather than transcribed. The hand-copied version had drifted from tailwind_cli/base.html.

  • The README command table lists all nine subcommands: optimize, download_cli and remove_cli were missing, although the table reads as the full list and troubleshoot points users at download_cli.

  • CONTRIBUTING.md: development setup, test commands, commit and changelog conventions, and what makes an issue or pull request easy to act on. Linked from the README and published in the docs.

  • AGENTS.md is tracked: the repository conventions coding agents need live in the repo now instead of an ignored local file. CLAUDE.md is a one-line pointer at it.

  • WhiteNoise page: a sample configuration and the two traps that only show up on deploy — a collectstatic that runs before tailwind build fails at render time, not at build time, and a source CSS inside STATICFILES_DIRS breaks collectstatic outright.

  • troubleshoot covers the deployment failure: a collectstatic that runs before tailwind build leaves the manifest without an entry, and the guide now carries that error string and the fix. setup spells out the ordering too.

  • DaisyUI is explained once: the “Configuration Patterns” section pointed at the setting entry’s explanation instead of repeating it, keeping only the manual-configuration and theme examples that the entry does not cover.

  • template_tags.md showed /static/css/styles.css, a path no configuration produces. It is css/tailwind.css.

  • Cross-references to settings resolve again: myst_heading_anchors was never enabled, so every settings.md#tailwind_cli_… link in the docs pointed at a fragment that does not exist. Three links had been broken since they were written.

4.7.0 (2026-08-15)

🎯 New Features

  • Django 6.1 support: added to the test matrix and the trove classifiers.

🛠️ Developer Experience

  • Switch dev tooling from just to mise: Python 3.10–3.15, uv, and pre-commit are now pinned in mise.toml. Local tasks run via mise run ; CI uses jdx/mise-action.

📚 Documentation

  • Plainer README: dropped the emoji headings and marketing register, and merged the overlapping feature sections into one. Same coverage, ~20% shorter.

  • Accurate tailwind setup help: --help no longer calls the command interactive. It lists the eight checks it actually runs and notes that it prompts for nothing.

🔧 Technical Improvements

  • Dependency refresh: clears the advisories uv-secure flagged in the old lock. pytest-django 4.14 renamed SettingsWrapper to Settings, so the dev floor moved to 4.14.

4.6.2 (2026-05-14)

🛠️ Developer Experience

  • Python 3.15 support: Added py315 to the tox matrix (Django 6.0) and to the PyPI classifiers.

4.6.1 (2026-05-10)

🐛 Bug Fixes

  • tailwind watch crash with TAILWIND_CLI_CSS_MAP: MultiWatchProcessManager installed signal.signal handlers that fail with ValueError: signal only works in main thread of the main interpreter under Django’s autoreloader (the watch loop runs in a worker thread). Cleanup now relies on KeyboardInterrupt propagation, matching the single-entry path. Fixes #201.

  • SIGTERM-graceful shutdown for both watch managers: ProcessManager and MultiWatchProcessManager now install a SIGTERM handler only when running on the main thread, so kill -TERM cleans up child watchers in tailwind watch --noreload and tailwind runserver without re-introducing the autoreloader crash. SIGINT keeps using Python’s default handler (which raises KeyboardInterrupt).

  • Sidestepped a Bun DLOPEN race in multi-entry watch: MultiWatchProcessManager now staggers successive watcher subprocess spawns by 300 ms. The Bun-built tailwindcss standalone binary extracts its embedded @parcel/watcher native module to /$bunfs/ on first use; two parallel processes raced on that path and the loser crashed with ERR_DLOPEN_FAILED. The 300 ms gap is below noticeable in interactive use.

🛠️ Developer Experience

  • Filtered Bun native-runtime noise from watcher stderr: MultiWatchProcessManager captures each tailwindcss subprocess’ stderr and drops upstream Bun stack traces (EIO: i/o error on shutdown, ERR_DLOPEN_FAILED on the rare DLOPEN race) while forwarding Tailwind’s own diagnostics verbatim. Cleanup output stays clean even when the user kill -TERMs the runserver.

🔧 Technical Improvements

  • Hardened GitHub Actions workflows: pinned all actions to commit SHAs, scoped top-level permissions, added concurrency groups, moved github.ref_name / github.repository out of shell interpolation into env: vars, and added a zizmor audit job to keep workflow security regressions out of CI.

4.6.0 (2026-04-11)

💥 Breaking Changes

  • Removed list_templates command: Tailwind CSS 4.x handles template discovery via @source directives in your CSS source file, making this command redundant. If you need to enumerate templates programmatically, use Django’s django.template.utils.get_app_template_dirs() directly.

🎯 New Features

  • Configurable minification: New TAILWIND_CLI_AUTOMATIC_MINIFY setting and --minify / --no-minify flag on tailwind build for projects whose asset pipelines already minify CSS. Defaults preserve existing behavior.

  • System binary support: New TAILWIND_CLI_USE_SYSTEM_BINARY setting lets django-tailwind-cli use a Tailwind CSS CLI that is already installed on PATH (e.g. via Homebrew), skipping the auto-download. Pairs with optional TAILWIND_CLI_SYSTEM_BINARY_NAME override. Emits a warning if the installed binary’s version differs from an explicitly pinned TAILWIND_CLI_VERSION.

  • Auto @source for editable external apps (opt-in): New TAILWIND_CLI_AUTO_SOURCE_EXTERNAL_APPS setting (default False). When enabled, the auto-generated default source CSS receives one @source directive per installed Django app whose path lives outside both BASE_DIR and site-packages — typically editable-installed packages that ship their own templates. This removes the need for fragile @source "../../../../../..." workarounds. Addresses #187.

  • Watch mode auto-reload: python manage.py tailwind watch now runs under Django’s own auto-reloader (the same machinery runserver uses). Changing settings.py or any Python file restarts the watch process, regenerates the source CSS (picking up new INSTALLED_APPS), and restarts the Tailwind CLI subprocess. Pass --noreload to disable.

🛠️ Developer Experience

  • Gitignore cleanup: Trimmed .gitignore to project-relevant entries only

  • Managed .django_tailwind_cli/ is now git-ignored by default: On first use the directory gets a .gitignore containing *, so the downloaded CLI binary and the auto-generated source.css are silently skipped by git add . without any project-level .gitignore tweak from the user. Existing .gitignore files in that directory are preserved. No-op when TAILWIND_CLI_PATH points at a custom location.

🐛 Bug Fixes

  • Tox matrix: Django 4.2/5.2/6.0 factors in tox.ini were ignored because uv sync --locked reinstalled Django from uv.lock after tox’s deps. The matrix now excludes Django from the sync and installs the factor-specific version via commands_pre, so just test-all actually covers all supported Django versions.

  • HTTP error reporting: download_with_progress and get_content_sync now surface HTTPError for 4xx/5xx responses as intended. Previously the internal HTTPError was caught by the generic fallback handler and re-wrapped as a RequestError("Unexpected error: …"), hiding the real status code from callers.

  • runserver shutdown message newline: ProcessManager._signal_handler printed a literal \n instead of a real newline, so the Ctrl+C shutdown message got stapled onto the previous terminal output.

  • runserver watch subprocess deadlock: ProcessManager and MultiWatchProcessManager spawned the Tailwind CLI watch subprocess with a captured stdout pipe that was never read. Once the OS pipe buffer filled up (~64 KB on Linux), the watcher blocked on its next write and silently stopped rebuilding. Watch subprocesses now inherit the parent’s stdout/stderr, which also means you can see rebuild progress live during tailwind runserver.

🔧 Technical Improvements

  • Type checking: Switched from pyright to basedpyright in pre-commit, added django-stubs as a dev dependency, and resolved a latent pre-existing baseline so the type checker runs clean on all files.

  • Pre-commit hooks: Bumped all hooks to their latest releases (pre-commit-hooks 6.0.0, ruff 0.15.10, pyupgrade 3.21.2, django-upgrade 1.30.0, djade 1.9.0, uv-secure 0.17.1).

  • Test coverage: Raised config.py to 100% and http.py from 67% to 100%, covering the previously-untested download body (chunked writes with progress callbacks), 200/redirect responses, HTTP 4xx/5xx paths, generic URLError branches, and the NoRedirectHandler redirect methods.

  • tailwind runserver is now a transparent passthrough wrapper. Instead of declaring every runserver / runserver_plus flag by hand, the command forwards all unknown options to the underlying Django command. This removes ~120 lines of duplication, fixes the silent gap where several runserver_plus flags (--extra-file, --reloader-interval, --browser, …) were not exposed, and stays in sync with future upstream changes automatically. Existing invocations keep working unchanged; the reduced output of tailwind runserver --help now points users at runserver --help for the full flag list.

4.5.1 (2025-12-29)

🐛 Bug Fixes

  • Help output: Fixed crash when running tailwind or tailwind --help due to typer/rich markup conflict

4.5.0 (2025-12-29)

🎯 New Features

  • Multiple CSS entry points: Added TAILWIND_CLI_CSS_MAP setting for compiling multiple CSS files in a single project (e.g., separate admin and frontend styles)

  • Template tag enhancement: {% tailwind_css %} now supports optional name parameter for multi-file mode: {% tailwind_css "admin" %}

🔧 Technical Improvements

  • Django support: Dropped support for Django 5.1 (now supporting Django 4.2 LTS, 5.2, and 6.0 only)

  • Pre-commit hooks: Updated uv-secure (0.15.4) and pyright (1.1.407)

  • Security: Updated Django and Werkzeug to fix security vulnerabilities

  • Documentation: Migrated from MkDocs to Sphinx with myst-parser and Furo theme

  • Template tag consistency: Template tag now uses Config class for consistent validation

  • Test coverage: Added integration tests for multi-file build and watch commands

🛠️ Developer Experience

  • Cleanup command: Added just clean target to remove temporary files and build artifacts

4.4.2 (2025-09-23)

🐛 Bug Fixes

  • Test isolation: Fixed cache interference in DaisyUI tests causing failures in Django 4.1 with Python 3.10

4.4.1 (2025-09-23)

🐛 Bug Fixes

  • DaisyUI version detection: Fixed incorrect version fetching when TAILWIND_CLI_USE_DAISY_UI = True enabled

4.4.0 (2025-09-21)

🔧 Technical Improvements

  • Type safety: Fixed all pyright typing errors for better code quality and maintainability

  • Code cleanup: Removed unused functions and improved type annotations throughout codebase

  • Dependencies: Removed requests dependency, replaced with custom HTTP implementation

  • Exception handling: Fixed exception naming to follow Python conventions and avoid builtin shadowing

  • Test coverage: Added comprehensive HTTP module tests, improving coverage from 82% to 85%

  • Error handling: Complete test coverage for network timeouts, connection errors, and edge cases

  • VS Code integration: Added PyLance ignore comments for test files accessing private methods

  • Django 6.0 support: Added Django 6.0 to testing matrix and version compatibility

4.3.0 (2025-07-12)

🎯 New Features

  • Interactive setup command: python manage.py tailwind setup for guided configuration

  • Configuration viewer: python manage.py tailwind config to inspect current settings

  • Troubleshooting guide: python manage.py tailwind troubleshoot for common issues

  • Performance tips: python manage.py tailwind optimize for optimization guidance

  • Enhanced verbose mode: --verbose flag for detailed build and watch diagnostics

⚡ Performance Improvements

  • Smart rebuilds: File modification checks prevent unnecessary CSS rebuilds

  • Version caching: 1-hour cache reduces GitHub API requests

  • Process optimization: Improved tailwind runserver with better signal handling

  • File operations: Optimized I/O with caching and content comparison

🛠️ Developer Experience

  • Better error messages: Actionable solutions for configuration and system issues

  • Colorized output: Visual feedback with emojis and progress indicators

  • Help text improvements: Detailed examples and use cases for all commands

  • Template scanning: Enhanced discovery with error handling and performance metrics

📚 Documentation & Resources

  • Comprehensive README: Step-by-step quick start and feature overview

  • Advanced guides: CONFIGURATION.md and DEVELOPMENT.md for production deployments

  • Inline documentation: Detailed docstrings and usage examples throughout codebase

🧪 Quality Assurance

  • Comprehensive testing: 58+ new tests covering integration workflows and error scenarios

  • Cross-platform support: Windows, macOS, and Linux compatibility testing

  • 89% test coverage: Robust validation of all major functionality

🔧 Technical Improvements

  • Python 3.10+ minimum: Updated supported Python versions to 3.10-3.14

  • Refactored internals: Better maintainability with focused, single-responsibility functions

  • Type safety: Improved with PlatformInfo and VersionCache data structures

4.2.4

4.2.3

  • Reverted the decision to store the CLI and the default config file in proper platform dirs.

    • Windows has issues with the paths or sometimes it is not possible to create them.

    • VSCode Tailwind Plugin relies on the the existance of the config within the current project.

    • Decision: Create a folder named .django_tailwind_cli within the project and store the files there.

4.2.2

  • Default configuration stored in the user cache directory is overwritten on every start of the debug server or other management command.

4.2.1

  • Bugfix for determining the latest release of the used version of Tailwind CSS.

4.2.0

[!CAUTION] Version 4.2.x and onward only support Tailwind CSS 4.x. If you are using Tailwind CSS 3.x, please use version 2.21.1 of this library. Version 4.0.x or 4.1.x still support Tailwind CSS 3.x, but these versions are not recommended to use for new projects.

[!CAUTION] This version includes changes to the handling of TAILWIND_CLI_PATH and TAILWIND_CLI_SRC_CSS.

  • Default fallback version is now 4.1.3.

  • Removed support for Tailwind CSS 3.x. The main reason is that this makes the library easier to maintain and also add better support for custom CLI builds which support DaisyUI and other plugins.

  • django-tailwind-cli now uses proper platform directories to store the CLI binary.

    • The proper directories are powered by platformdirs.

    • TAILWIND_CLI_PATH is now optional by default.

    • If TAILWIND_CLI_PATH is None, the binary is stored in user_data_dir("django-tailwind-cli", "django-commons").

    • The library doesn’t rely anylonger on a properly set settings.BASE_DIR.

  • TAILWIND_CLI_ASSET_NAME is also used for the downloaded CLI to distinguish between tailwindcss and tailwindcss-extra.

  • The behaviour of TAILWIND_CLI_SRC_CSS has been changed. The reasoning behind this change was, less default code inside the project and whitenoise had issues with a CSS file inside an asset folder referencing non-existing imports.

    • It defaults to None.

    • If it is None the default input file is created in the user cache directory.

    • If it is a relative path, this path is considered relative to settings.BASE_DIR.

    • The last option is an absolute path.

  • Proper daisyUI support using tailwind-cli-extra.

4.1.0

  • TAILWIND_CLI_VERSION defaults to “latest” now. In case it is set to this value, django-tailwind-cli tries to determine which version is the latest version of Tailwind CSS. If it is not able to access the internet, it uses a fallback version defined in django_tailwind_cli.config.FALLBACK_VERSION. Currently, it is set to 4.0.6.

4.0.1

  • Various fixes for the documentation.

  • Added Django 5.2 to the testing matrix.

4.0.0

  • Added support for Tailwind CSS 4.0.0.

  • Default version is Tailwind CSS 4.0.0.

  • The versioning is now aligned with Tailwind CSS. That means the major number of this packages follows the major number of Tailwind CSS to document the most recent supported version of Tailwind.

  • Removed the management commands install_pycharm_workaround and uninstall_pycharm_workaround. This feature broke too often.

  • Removed runserver_plus subcommand. The management subcommand runserver now starts either the debug server from django-extensions if this package is installed. Otherwise it starts the standard debug server.

  • The management subcommand runserver got an option --force-default-runserver to enforce the usage of the standard debug server from Django.

  • TAILWIND_CLI_CONFIG_FILE isn’t necessary for Tailwind CSS 4.x only for 3.x. Read the documentaiton about it.

  • Removed the documentation for the fancier tailwind.config.js as it is not recommended to use and Tailwind CSS 4.x has a way better strategy to find the used Tailwind classes.

2.21.1

  • Relaxed the minimum Django version to >=4.0.

2.21.0

  • Added install_pycharm_workaround and remove_pycharm_workaround management commands. #142

  • Added remove_cli subcommand to remove the CLI. #132

  • Refactored all the class based management command into simpler function based commands.

  • Refactored the process to build the runserver command.

2.20.2

  • Added testpypi release workflow.

2.20.1

  • Fixed a critical issue of 2.20.0.

2.20.0

  • Removed django-appconf again.

  • Switched from pyright to mypy for type checking.

  • Fixed broken links in the documentation.

  • Bumped default version of Tailwind CSS to 3.4.13.

  • Bumped minimum version of certifi to 2024.8.30. Removed the upper boundary of the version number.

2.19.0

  • Transfered the project to django-commons.

2.18.1

  • Fixed the URLs for PyPI.

2.18.0

  • Added Python 3.13 support.

  • Moved documentation from django-tailwind-cli.andrich.me -> django-tailwind-cli.rtfd.io

  • Documentation fixes.

2.17.0

  • Internal refactoring. Config class has been replaced with django-appconfig and some function in the django_tailwind_cli.utils package.

  • uv is used for publishing too.

  • Updated tooling configuration.

2.16.0

  • Set the minimum supported version of Python to 3.9.

  • Set the minimum supported version of Django to 4.2.

  • Switched the tooling completely to uv.

  • Bumped the default version of Tailwind CSS to 3.4.11.

2.15.0

  • #130 by @Tobi-De extended the support for custom tailwind cli builds. See TAILWIND_CLI_SRC_REPO and TAILWIND_CLI_ASSET_NAME in the documentation.

2.14.0

  • #129 by @Tobi-De add a setting to allow for custom tailwind source repo

  • Bumped default version of tailwindcss to 3.4.10.

2.13.0

  • #127 by @bckohan upgrade django-typer and fixed future incompatibilities with django-typer 3.0.

  • moved to tox for testing.

  • Added Python 3.13 to the test matrix.

  • Added Django 5.1a1 to the test matrix.

  • Bumped default version of tailwindcss to 3.4.4.

2.12.0

  • Reintroduced support for Python 3.8. Seems as I have to support than I want to.

  • Added justfile to ease management of package and dev environment.

2.11.1

  • Changed project tooling to uv, nox and flit.

  • Bumped default version of tailwindcss to 3.4.3.

2.11.0

  • Switched default configuration for tailwind to the less opinionated default version.

2.10.0

  • Added download_cli management command.

2.9.0

  • Bumped default Tailwind CLI version to 3.4.1.

  • Reimplemented the management command using django_typer

  • Removed Python 3.8 from the list of supported versions.

2.8.1

2.8.0

  • Bumped default Tailwind CLI version to 3.4.0.

2.7.3

2.7.2

  • Fixed broken commit for 2.7.1. Sorry guys.

2.7.1

  • Bumped default Tailwind CLI version to 3.3.6.

2.7.0

  • Added more command line arguments to tailwind runserver and tailwind runserver_plus.

    • tailwind runserver

      • --skip-checks #69

      • --noreload

      • --nothreading

      • --ipv6

    • tailwind runserver_plus

      • --noreload

      • --nothreading

      • --ipv6

      • --pdb

      • --ipdb

      • --pm

      • --print-sql

  • Fixed #67 to fetch the correct CLI on the Windows platform.

  • TAILWIND_CLI_PATH can also point to a pre-installed binary from a package manager.

  • Added a new setting TAILWIND_CLI_AUTOMATIC_DOWNLOAD to steer if you want the library to download the CLI binary or not. This comes in handy with the additional option for TAILWIND_CLI_PATH to point to a pre-installed binary.

2.6.0

  • Added ‘support’ for Django 5.0.

    • Extended the tox configuration to include Django 5.0b1 and beyond.

    • Added the trove classifiert.

    • Removed the upper boundary of the django version.

2.5.0

  • Bumped default version of Tailwind CSS CLI to 3.3.5.

2.4.5

  • Moved coverage to the dev depencies. Somehow it ended up in the package dependencies.

2.4.4

  • #59 by @killianarts fixed a regression from 2.4.3 that used the wrong runserver for the runserver_plus command.

2.4.3

  • Code and project cleanup.

  • Switched back to unittest for testing purposes.

2.4.2

  • Correctly map aarch64 machine architecture to arm64 for downloading the CLI.

2.4.1

  • Added checks for runserver_plus management command to give a nice error message, when django-extensions and Werkzeug are not properly installed.

2.4.0

  • Back to Poetry for project management.

  • #57 by @wshayes added optional django-extensions for the runserver_plus command.

2.3.0

  • Changed default config to support lsp-tailwindcss

    “python3 -m django” was replaced with “python manage.py” so that the dynamic configuration of the content selector in tailwind.config.js also works inside the language server for Tailwind CSS in VSCode, Sublime, etc.

2.2.3

  • Fixed a copy&paste error introduced by pasting the tailwind.config.js without proper escaping.

2.2.2

  • Fixed an error locating templates from the global template directories configured via settings.TEMPLATES[0]["DIRS"].

2.2.1

  • Fixed a bug introduced by refactoring the changes from #49.

2.2.0

2.1.1

  • Switched from poetry to hatch for package management.

2.0.6

  • Bugfix for default tailwind.config.js.

2.0.5

  • Fixed a regression with the default path for the Tailwind CLI.

2.0.4

  • The reworked testing setup broke the package. Had to pull 2.0.3 from PyPI.

2.0.3

  • Readded support for Python 3.8.

  • Added Python 3.12 to the testing matrix.

2.0.2

  • Bugfixes for typing errors.

  • Added missing test code.

2.0.0

  • Version 2.0.0 is major refactoring compared to version 1.4.3.

  • No more theme app required.

  • Easier to install.

  • Better out-of-the-box DX.

  • A custom runserver that starts the Tailwind CLI watcher and the debug server in a single terminal session.

  • Less dependencies.

1.4.3

  • Fixed broken links in the documentation and README.

1.4.0

1.3.1

  • Switched back to poetry after a long discussion.

1.3.0

  • Switched from poetry to pdm.

1.2.2

  • Fixed docstrings.

  • Extended ruff configuration.

1.2.1

  • Bumped default tailwind version to 3.2.7.

1.2.0

  • Added support for Django 4.2.

1.1.0

  • Fixes for documentation.

  • Bumped Tailwind CSS default version to 3.2.4.

  • Updated dependencies.

1.0.0

  • Introduced django-click to the project.

  • Refactored the management commands to use django-click.

  • Renamed the startwatcher command to watch. I’m a lazy guy. :smile:

  • Switched to tox for local and CI testing.

0.9.2

  • Removed httpx as a dependency. Downloading the cli is done with urllib.request.urlopen once again. Fixes #4

  • Removed rich-styling information from error strings. Fixes #5

  • Fixing more typos in the README.md.

0.9.1

  • Fixing some typos in the documentation.

0.9.0

  • Inital public release.