NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #2499 most downloaded on PyPI
Compresses linked and inline JavaScript or CSS into single cached files.
Last release 10 months ago
10 Nov 2025
Release timing varies
gaps range from 2 weeks to 1.3 years
Nearly every release is documented
notes for 38 of 41 stable releases
Nothing withdrawn
no release was ever pulled
17 years old
41 releases · first in 2010
Nothing published for this version
Full list of changes from v4.5 _
Full list of changes from v4.5 <https://github.com/django-compressor/django-compressor/compare/4.5...4.5.1>_
path() method.Full list of changes from v4.4 _
Full list of changes from v4.4 <https://github.com/django-compressor/django-compressor/compare/4.4...4.5>_
COMPRESS_STORAGE_ALIAS and COMPRESS_OFFLINE_MANIFEST_STORAGE_ALIAS
settings. These point to keys in Django's storages handler. If set by the
user, Compressor will use these storages, or otherwise will set a default
storage, given by COMPRESS_STORAGE and
COMPRESS_OFFLINE_MANIFEST_STORAGE respectively on first access.One column per quarter.
Full list of changes from v4.3.1 _
Full list of changes from v4.3.1 <https://github.com/django-compressor/django-compressor/compare/4.3.1...4.4>_
Full list of changes from v4.3 _
Full list of changes from v4.3 <https://github.com/django-compressor/django-compressor/compare/4.3...4.3.1>_
Full list of changes from v4.2 _
Full list of changes from v4.2 <https://github.com/django-compressor/django-compressor/compare/4.2...4.3>_
Full list of changes from v4.1 _
Full list of changes from v4.1 <https://github.com/django-compressor/django-compressor/compare/4.1...4.2>_
CachedS3Boto3Storage example storage subclass in "Remote Storages"
to work properly after the v4.0 change to how duplicate file names are handled
by CompressorFileStorageDon't include "Unreleased" in master/releases changelog
Don't include "Unreleased" in master/releases changelog
Full list of changes from v4.0 <https://github.com/django-compressor/django-compressor/compare/4.0...4.1>_
Add Django 4.1 compatibility
New setting COMPRESS_OFFLINE_MANIFEST_STORAGE to customize the offline manifest's file storage (#1112)
With this change the function compressor.cache.get_offline_manifest_filename() has been removed.
You can now use the new file storage compressor.storage.default_offline_manifest_storage to access the
location of the manifest.
Deprecate SlimItFilter, stop testing it with Python 3.7 or higher
Full list of changes from v3.1 <https://github.com/django-compressor/django-compressor/compare/3.1...4.0>_
Fix intermittent No such file or directory errors by changing strategy to deal with duplicate filenames in CompressorFileStorage
Note: if your project has a custom storage backend following the example of
CachedS3Boto3Storage from the "Remote Storages" documentation, it will need
to be updated to call save instead of _save to work properly after this
change to CompressorFileStorage.
Deprecate SlimItFilter, stop testing it with Python 3.7 or higher
Full list of changes from v3.0 _
Full list of changes from v3.0 <https://github.com/django-compressor/django-compressor/compare/3.0...3.1>_
Fix various deprecation warnings
Full list of changes from v2.4.1 <https://github.com/django-compressor/django-compressor/compare/2.4.1...3.0>_
extends tags (#979)rCSSMinFilter by default (#888)COMPRESS_JS_FILTERS and COMPRESS_CSS_FILTERS settingsRaise proper DeprecationWarning for COMPRESS_JS_FILTERS and COMPRESS_CSS_FILTERS
Full list of changes from v2.4 <https://github.com/django-compressor/django-compressor/compare/2.4...2.4.1>_
DeprecationWarning for COMPRESS_JS_FILTERS and COMPRESS_CSS_FILTERS…and COMPRESS_JS_FILTERS. The latter are now deprecated. See the docs _ on how to use the new setting, the conversion is straightforward.
Full list of changes from v2.3 <https://github.com/django-compressor/django-compressor/compare/2.3...2.4>_
Note: in 2.3, a new setting COMPRESS_FILTERS has been introduced that combines the existing COMPRESS_CSS_FILTERS and COMPRESS_JS_FILTERS. The latter are now deprecated. See the docs <https://django-compressor.readthedocs.io/en/stable/settings/#django.conf.settings.COMPRESS_FILTERS>_ on how to use the new setting, the conversion is straightforward.
Full list of changes from v2.2 _
Full list of changes from v2.2 <https://github.com/django-compressor/django-compressor/compare/2.2...2.3>_
{% addtoblock "js" %} and {% addtoblock "css" %} (#891)Full list of changes from v2.1.1 _
Full list of changes from v2.1.1 <https://github.com/django-compressor/django-compressor/compare/2.1.1...2.2>_
Switch from MD5 to SHA256 for hashes generation.
Add Django 1.11 compatibility
Various compatibility fixes for Python 3.6 and Django 1.8
Made OfflineGenerationError easier to debug
Drop support for Python 3.2
Add new CssRelativeFilter which works like CssAbsoluteFilter but outputs relative URLs.
Fix URL CssAbsoluteFilter URL detection
Full list of changes from v2.1 _
Full list of changes from v2.1 <https://github.com/django-compressor/django-compressor/compare/2.1...2.1.1>_
Full list of changes from v2.0 _
Full list of changes from v2.0 <https://github.com/django-compressor/django-compressor/compare/2.0...2.1>_
Add Django 1.10 compatibility
Add support for inheritance using a variable in offline compression
Fix recursion error with offline compression when extending templates with the same name
Fix UnicodeDecodeError when using CompilerFilter and caching
Fix CssAbsoluteFilter changing double quotes to single quotes, breaking SVG
Full list of changes from v1.6 _
Full list of changes from v1.6 <https://github.com/django-compressor/django-compressor/compare/1.6...2.0>_
Add Django 1.9 compatibility
Remove official support for Django 1.4 and 1.7
Add official support for Python 3.5
Remove official support for Python 2.6
Remove support for coffin and jingo
Fix Jinja2 compatibility for Django 1.8+
Stop bundling vendored versions of rcssmin and rjsmin, make them proper dependencies
Remove support for CSSTidy
Remove support for beautifulsoup 3.
Replace cssmin by csscompressor (cssmin is still available for backwards-compatibility but points to rcssmin)
Fix various deprecation warnings on Django 1.7 / 1.8
Full list of changes from v1.5 <https://github.com/django-compressor/django-compressor/compare/1.5...1.6>_
Upgrade rcssmin and rjsmin
Apply CssAbsoluteFilter to precompiled css even when compression is disabled
Add optional caching to CompilerFilter to avoid re-compiling unchanged files
Fix various deprecation warnings on Django 1.7 / 1.8
Fix TemplateFilter
Fix double-rendering bug with sekizai extension
Fix debug mode using destination directory instead of staticfiles finders first
Removed some silent exception catching in compress command
Full list of changes from v1.4 _
Full list of changes from v1.4 <https://github.com/django-compressor/django-compressor/compare/1.4...1.5>_
Fix compress command and run automated tests for Django 1.8
Fix Django 1.8 warnings
Handle TypeError from import_module
Fix reading UTF-8 files which have BOM
Fix incompatibility with Windows (shell_quote is not supported)
Run automated tests on Django 1.7
Ignore non-existent {{ block.super }} in offline compression instead of raising AttributeError
Support for clean-css
Fix link markup
Add support for COMPRESS_CSS_HASHING_METHOD = None
Remove compatibility with old 'staticfiles' app
In compress command, use get_template() instead of opening template files manually, fixing compatibility issues with custom template loaders
Fix FilterBase so that does not override self.type for subclasses if filter_type is not specified at init
Remove unnecessary filename and existence checks in CssAbsoluteFilter
Added compatibility with Django 1.6.x and dropped support for Django 1.3.X.
Added Python 3 compatibility.
Added compatibility with Django 1.6.x and dropped support for Django 1.3.X.
Fixed compatibility with html5lib 1.0.
Added offline compression for Jinja2 with Jingo and Coffin integration.
Improved support for template inheritance in offline compression.
Made offline compression avoid compressing the same block multiple times.
Added a testenv target in the Makefile to make it easier to set up the
test environment.
Allowed data-uri filter to handle external/protocol-relative references.
Made CssCompressor class easier to extend.
Added support for explicitly stating the block being ended.
Added rcssmin and updated rjsmin.
Removed implicit requirement on BeautifulSoup.
Made GzipCompressorFileStorage set access and modified times to the same time as the corresponding base file.
Defaulted to using django's simplejson, if present.
Fixed CompilerFilter to always output Unicode strings.
Fixed windows line endings in offline compression.
*Backward incompatible changes*
Backward incompatible changes
Dropped support for Python 2.5. Removed any and walk compatibility functions in compressor.utils.
Removed compatibility with some old django settings:
~COMPRESS_ROOT no longer uses MEDIA_ROOT if STATIC_ROOT is not defined. It expects STATIC_ROOT to be defined instead.
~COMPRESS_URL no longer uses MEDIA_URL if STATIC_URL is not defined. It expects STATIC_URL to be defined instead.
~COMPRESS_CACHE_BACKEND no longer uses CACHE_BACKEND and simply defaults to default.
Added precompiler class support. This enables you to write custom precompilers with Python logic in them instead of just relying on executables.
Made CssAbsoluteFilter smarter: it now handles URLs with hash fragments or querystring correctly. In addition, it now leaves alone fragment-only URLs.
Removed a fsync() call in CompilerFilter to improve performance. We already called self.infile.flush() so that call was not necessary.
Added an extension to provide django-sekizai support. See django-sekizai Support for more information.
Fixed a DeprecationWarning regarding the use of django.utils.hashcompat
Updated bundled rjsmin.py to fix some JavaScript compression errors.
…and make sure you've accounted for the backwards incompatible change of the template context mentioned above.
Added compatibility with Django 1.4 and dropped support for Django 1.2.X.
Added contributing docs. Be sure to check them out and start contributing!
Moved CI to Travis: http://travis-ci.org/django-compressor/django-compressor
Introduced a new compressed context dictionary that is passed to the templates that are responsible for rendering the compressed snippets.
This is a backwards-incompatible change if you've overridden any of the included templates:
compressor/css_file.html
compressor/css_inline.html
compressor/js_file.html
compressor/js_inline.html
The variables passed to those templates have been namespaced in a dictionary, so it's easy to fix your own templates.
For example, the old compressor/js_file.html:
<script type="text/javascript" src="{{ url }}"></script>
The new compressor/js_file.html:
<script type="text/javascript" src="{{ compressed.url }}"></script>
Removed old templates named compressor/css.html and compressor/js.html that were originally left for backwards compatibility. If you've overridden them, just rename them to compressor/css_file.html or compressor/js_file.html and make sure you've accounted for the backwards incompatible change of the template context mentioned above.
Reverted an unfortunate change to the YUI filter that prepended 'java -jar' to the binary name, which doesn't always work, e.g. if the YUI compressor is shipped as a script like /usr/bin/yui-compressor.
Changed the sender parameter of the ~compressor.signals.post_compress signal to be either compressor.css.CssCompressor or compressor.js.JsCompressor for easier customization.
Correctly handle offline compressing files that are found in {% if %} template blocks.
Renamed the second option for the COMPRESS_CSS_HASHING_METHOD setting from 'hash' to 'content' to better describe what it does. The old name is also supported, as well as the default being 'mtime'.
Fixed CssAbsoluteFilter, src attributes in includes now get transformed.
Added a new hook to allow developers to completely bypass offline compression in CompressorNode subclasses: is_offline_compression_enabled.
Dropped versiontools from required dependencies again.
Fixed an installation issue related to versiontools.
Fixed a stupid ImportError bug introduced in 1.1.
Fixed a stupid ImportError bug introduced in 1.1.
Fixed Jinja2 docs of since JINJA2_EXTENSIONS expects a class, not a module.
Fixed a Windows bug with regard to file resolving with staticfiles finders.
Stopped a potential memory leak when memoizing the rendered output.
Fixed the integration between staticfiles (e.g. in Django <= 1.3.1) and compressor which prevents the collectstatic management command to work.
Warning
Make sure to remove the path method of your custom remote storage class!
Made offline compression completely independent from cache (by writing a manifest.json file).
Made offline compression completely independent from cache (by writing a manifest.json file).
You can now easily run the compress management command locally and transfer the ~django.conf.settings.COMPRESS_ROOT dir to your server.
Updated installation instructions to properly mention all dependencies, even those internally used.
Fixed a bug introduced in 1.0 which would prevent the proper deactivation of the compression in production.
Added a Jinja2 contrib extension.
Made sure the rel attribute of link tags can be mixed case.
Avoid overwriting context variables needed for compressor to work.
Stopped the compress management command to require model validation.
Added missing imports and fixed a few 8 issues.
Fixed regression in compressor.utils.staticfiles compatibility module.
compressor.utils.staticfiles compatibility
module.BACKWARDS-INCOMPATIBLE Stopped swallowing exceptions raised by rendering the template tag in production (DEBUG = False). This has the potential to bre
BACKWARDS-INCOMPATIBLE Stopped swallowing exceptions raised by rendering the template tag in production (DEBUG = False). This has the potential to breaking lots of apps but on the other hand will help find bugs.
BACKWARDS-INCOMPATIBLE The default function to create the cache key stopped containing the server hostname. Instead the cache key now only has the form 'django_compressor.<KEY>'.
To revert to the previous way simply set the COMPRESS_CACHE_KEY_FUNCTION to 'compressor.cache.socket_cachekey'.
BACKWARDS-INCOMPATIBLE Renamed ambigously named COMPRESS_DATA_URI_MAX_SIZE setting to COMPRESS_DATA_URI_MAX_SIZE. It's the maximum size the compressor.filters.datauri.DataUriFilter filter will embed files as data: URIs.
Added COMPRESS_CSS_HASHING_METHOD setting with the options 'mtime' (default) and 'hash' for the CssAbsoluteFilter filter. The latter uses the content of the file to calculate the cache-busting hash.
Added support for {{ block.super }} to compress management command.
Dropped Django 1.1.X support.
Fixed compiler filters on Windows.
Handle new-style cached template loaders in the compress management command.
Documented included filters.
Added Slim It filter.
Added new CallbackOutputFilter to ease the implementation of Python-based callback filters that only need to pass the content to a callable.
Make use of django-appconf for settings handling and versiontools for versions.
Uses the current context when rendering the render templates.
Added post_compress signal.
Fixed stdin handling of precompiler filter.
- Fixed encoding related issue. - Minor cleanups.
Fixed encoding related issue.
Minor cleanups.
Fixed the precompiler support to also use the full file path instead of a temporarily created file.
Fixed the precompiler support to also use the full file path instead of a temporarily created file.
Enabled test coverage.
Refactored caching and other utility code.
Switched from SHA1 to MD5 for hash generation to lower the computational impact.
Replace naive jsmin.py with rJSmin (http://opensource.perlig.de/rjsmin/) and fixed a few problems with JavaScript comments.
Replace naive jsmin.py with rJSmin (http://opensource.perlig.de/rjsmin/) and fixed a few problems with JavaScript comments.
Fixed converting relative URLs in CSS files when running in debug mode.
Note
If you relied on the split_contents method of Compressor classes, please make sure a fourth item is returned in the iterable that denotes the base name of the file that is compressed.
Fixed import error when using the standalone django-staticfiles app.
Created new parser, HtmlParser, based on the stdlib HTMLParser module.
Created new parser, HtmlParser, based on the stdlib HTMLParser module.
Added a new default AutoSelectParser, which picks the LxmlParser if lxml is available and falls back to HtmlParser.
Use unittest2 for testing goodness.
Fixed YUI JavaScript filter argument handling.
Updated bundled jsmin to use version by Dave St.Germain that was refactored for speed.
Fixed Closure filter argument handling.
Fixed options mangling in CompilerFilter initialization.
Fixed options mangling in CompilerFilter initialization.
Fixed tox configuration.
Extended documentation and README.
In the compress command ignore hidden files when looking for templates.
Restructured utilities and added staticfiles compat layer.
Restructered parsers and added a html5lib based parser.
Minor bugfixes that caused the compression not working reliably in development mode (e.g. updated files didn't trigger a new compression).
Fixed staticfiles support to also use its finder API to find files during development -- when the static files haven't been collected in STATIC_ROOT.
Fixed staticfiles support to also use its finder API to find files during
development -- when the static files haven't been collected in
STATIC_ROOT.
Fixed regression with the COMPRESS setting, pre-compilation and
staticfiles.
Deprecated COMPRESS_LESSC_BINARY setting because it's now superseded by the ~django.conf.settings.COMPRESS_PRECOMPILERS setting. Just make sure to use…
Major improvements and a lot of bugfixes, some of which are:
New precompilation support, which allows compilation of files and hunks with easily configurable compilers before calling the actual output filters. See the ~django.conf.settings.COMPRESS_PRECOMPILERS for more details.
New staticfiles support. With the introduction of the staticfiles app to Django 1.3, compressor officially supports finding the files to compress using the app's finder API. Have a look at the documentation about remote storages in case you want to use those together with compressor.
New compress management command which allows pre-running of what the compress template tag does.
Various performance improvements by better caching and mtime checking.
Deprecated COMPRESS_LESSC_BINARY setting because it's now superseded by the ~django.conf.settings.COMPRESS_PRECOMPILERS setting. Just make sure to use the correct mimetype when linking to less files or adding inline code and add the following to your settings:
COMPRESS_PRECOMPILERS = (
('text/less', 'lessc {infile} {outfile}'),
)
Added cssmin filter (compressor.filters.CSSMinFilter) based on Zachary Voase's Python port of the YUI CSS compression algorithm.
Reimplemented the dog-piling prevention.
Make sure the CssAbsoluteFilter works for relative paths.
Added inline render mode. See usage docs.
Added mtime_cache management command to add and/or remove all mtimes from the cache.
Moved docs to Read The Docs: https://django-compressor.readthedocs.io/en/latest/
Added optional compressor.storage.GzipCompressorFileStorage storage backend that gzips of the saved files automatically for easier deployment.
Reimplemented a few filters on top of the new compressor.filters.base.CompilerFilter to be a bit more DRY.
Added tox based test configuration, testing on Django 1.1-1.3 and Python 2.5-2.7.
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →