Removes unused classes, ids, and element selectors from CSS.
Project description
RefreshCSS 🫧
RefreshCSS is a Python library that removes unused classes, ids, and element selectors from CSS.
Make your CSS so fresh, so clean.
🔧 Installation
To use the refreshcss library or use the django-compressor integration
uv add refreshcss
To run refreshcss on the command-line
uvx refreshcss[cli]
⭐️ Features
- Pure Python (no extra NodeJS build process needed)
- Fast and spec-compliant CSS and HTML parsing
- Filters out unused classes, ids, and elements from CSS based on HTML templates
- Supports modern CSS syntax, including nested rules, container queries, and media queries
- Handles Django/Jinja-style HTML templates with context-aware extraction
- Integrates with
django-compressorto clean CSS during thecompresscommand - Command-line interface for use in CI/CD pipelines
⌨️ Command-line interface
uvx refreshcss[cli]
Usage: refreshcss [OPTIONS] CSS HTML...
Remove classes, ids, and element selectors not used in HTML from CSS.
Options:
-o, --output FILENAME Write to file instead of stdout.
-R, -r, --recursive Recursively search subdirectories listed.
--encoding TEXT Character encoding to use when reading files. If not
specified, the encoding will be guessed.
--version Show the version and exit.
--help Show this message and exit.
🗜️ Integrate with django-compressor
Add "refreshcss.filters.RefreshCSSFilter" to COMPRESS_FILTERS in the Django settings file.
COMPRESS_FILTERS = {
"css": [
"refreshcss.filters.RefreshCSSFilter",
...
],
"js": [...],
}
⚙️ Library
from refreshcss import RefreshCSS, PathSite
def clean_css(css_path: Path):
# Parse the HTML files
site = PathSite(paths=["templates"], recursive=True)
site.parse()
# Get clean CSS based on the parsed HTML
css_text = css_path.read_text()
cleaned_css = RefreshCSS(site).clean(css_text)
return cleaned_css
🤓 How does it work?
- Catalogue classes, ids, and elements that are currently being used in found HTML templates
- Catalogue classes, ids, elements, and at-rules in a particular CSS stylesheet
- Return a new CSS stylesheet that only contains rules that are actively being used by the HTML
🧐 Why?
I wanted to have a filter for django-compressor that would purge unused CSS as part of the compress step when deploying for coltrane apps. After dealing with a manual process and attempting to integrate https://purgecss.com and https://github.com/uncss/uncss I thought "this couldn't be that hard to do in Python".
Which is always the thought at the beginning of every side project... 😅
🙋 FAQ
Will this work with SPAs?
Probably not. RefreshCSS only inspects HTML templates, so if CSS classes are being changed client-side then refreshcss will not know about it.
Does this work by crawling a website URL?
Currently no, although that is a possibility in the future. PRs appreciated. 😉
Does this support HTML written in the Django Template Language?
Yes! That was a primary reason I built my own solution. 😅 Jinja might also be possible to support with some small tweaks, although it is currently untested.
Is this what people mean when they say "treeshaking"?
Maybe. 🤷
I found a bug!
Thanks for trying RefreshCSS out! Please make a PR (pull request) with a small test that replicates the bug or, if that is not possible, create a new discussion.
🤘 Related libraries
Node
Python
- treeshake: I unfortunately could not get this to work on my local environment.
- cssutils: This unfortunately seemed to choke on more modern CSS when I tested on Bulma 1.0.
- css-optomizer
🙏 Thanks
❤️ Support
This project is supported by GitHub Sponsors and Digital Ocean.
🥳 Contributors
Tobias Bölz 💻 📖 ⚠️ |
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file refreshcss-0.6.0.tar.gz.
File metadata
- Download URL: refreshcss-0.6.0.tar.gz
- Upload date:
- Size: 10.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a66900c4b8169d3a22024cf1a168c91f853220c921e5309bb83f36428c5f0fca
|
|
| MD5 |
e774a8be25ce496aed4cd7af00529690
|
|
| BLAKE2b-256 |
5d4ee9dc8492a6c7448bea0d4e5575b3a74817f226c9667d5ddc475f1ee71784
|
Provenance
The following attestation bundles were made for refreshcss-0.6.0.tar.gz:
Publisher:
publish.yml on adamghill/refreshcss
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
refreshcss-0.6.0.tar.gz -
Subject digest:
a66900c4b8169d3a22024cf1a168c91f853220c921e5309bb83f36428c5f0fca - Sigstore transparency entry: 813364196
- Sigstore integration time:
-
Permalink:
adamghill/refreshcss@f7f2084e23ed867ba46b198e5b74a0148ec87dd6 -
Branch / Tag:
refs/tags/0.6.0 - Owner: https://github.com/adamghill
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f7f2084e23ed867ba46b198e5b74a0148ec87dd6 -
Trigger Event:
release
-
Statement type:
File details
Details for the file refreshcss-0.6.0-py3-none-any.whl.
File metadata
- Download URL: refreshcss-0.6.0-py3-none-any.whl
- Upload date:
- Size: 12.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
224546a9077647594b88d3d6f9895f9a813c09faa09a99f9c7c57f6ac532a24f
|
|
| MD5 |
81b18138bc46546090798125712d644e
|
|
| BLAKE2b-256 |
5b2be4ad3c057eec181986f7d077b473c2dc923b718594f354916707676501b1
|
Provenance
The following attestation bundles were made for refreshcss-0.6.0-py3-none-any.whl:
Publisher:
publish.yml on adamghill/refreshcss
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
refreshcss-0.6.0-py3-none-any.whl -
Subject digest:
224546a9077647594b88d3d6f9895f9a813c09faa09a99f9c7c57f6ac532a24f - Sigstore transparency entry: 813364199
- Sigstore integration time:
-
Permalink:
adamghill/refreshcss@f7f2084e23ed867ba46b198e5b74a0148ec87dd6 -
Branch / Tag:
refs/tags/0.6.0 - Owner: https://github.com/adamghill
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f7f2084e23ed867ba46b198e5b74a0148ec87dd6 -
Trigger Event:
release
-
Statement type: