hasmin: CSS Minifier

[ bsd3, library, program, text ] [ Propose Tags ]

A CSS minifier which not only aims at reducing the amount of bytes of the output, but also at improving gzip compression. It may be used as a library, or a stand-alone executable. For the library, refer to the Hasmin module documentation. For the program: the output is the minified CSS file, but hasmin allows also its compression into gzip using Google's Zopfli library.

To use it: ./hasmin input.css > output.css

By default, most minification techniques are enabled. For a list of available flags, do: ./hasmin --help

[Skip to Readme]


Note: This package has metadata revisions in the cabal description newer than included in the tarball. To unpack the package including the revisions, use 'cabal get'.

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees


Versions [RSS],, 0.3.2,,,,, 0.3.3,, 1.0, 1.0.1, 1.0.2,, 1.0.3
Change log CHANGELOG.md
Dependencies attoparsec (>=0.12 && <0.14), base (>=4.10 && <5.0), bytestring (>= && <0.11), containers (>=0.5 && <0.7), gitrev (>=1.0.0 && <1.4), hasmin, hopfli (>=0.2 && <0.4), matrix (>=0.3.4 && <0.4), mtl (>=2.2.1 && <2.3), numbers (>=3000.2.0.0 && <3000.3), optparse-applicative (>=0.11 && <0.16), parsers (>=0.12.3 && <0.13), text (>=1.2 && <1.3) [details]
License BSD-3-Clause
Copyright © 2016-2018 Cristian Adrián Ontivero
Author Cristian Adrián Ontivero
Maintainer Cristian Adrián Ontivero <cristianontivero@gmail.com>
Revised Revision 1 made by contivero at 2019-09-06T10:17:33Z
Category Text
Home page https://github.com/contivero/hasmin#readme
Bug tracker https://github.com/contivero/hasmin/issues
Source repo head: git clone https://github.com/contivero/hasmin.git
Uploaded by contivero at 2018-12-30T20:38:45Z
Reverse Dependencies 1 direct, 0 indirect [details]
Executables hasmin
Downloads 9211 total (30 in the last 30 days)
Rating 2.0 (votes: 1) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2018-12-30 [all 1 reports]

Readme for hasmin-1.0.3

[back to package description]

Hasmin - A Haskell CSS Minifier

Build Status Hackage Hackage-Deps License

Aside from the usual techniques (e.g. whitespace removal, color minification, etc.), the idea was to explore new possibilities, by implementing things other minifiers weren't doing, or they were, but not taking full advantage of.

Also, the minifier implements some techniques that do nothing for minified sizes, but attempt to improve post-compression sizes (at least when using DEFLATE, i.e. gzip).

For a list of techniques, see the wiki. To use it as a library, see below.

Building & Installing


The easiest and prefered way is using stack. To directly install, use the following one-liner:

git clone git@github.com:contivero/hasmin.git && cd hasmin && stack install

Stack installs inside ~/.local/bin by default. If you'd rather just try hasmin out, replace install by build, and then use stack exec hasmin from inside the hasmin directory (keep in mind it has a slight additional delay at the beginning when run this way).


Alternatively, you can use cabal:

$ cd path/to/hasmin/repo
$ cabal update                      # Make sure to have the latest package list
$ cabal sandbox init                # Initialise a sandbox
$ cabal install --only-dependencies # Install dependencies into the sandbox
$ cabal build                       # Build hasmin inside the sandbox

Minifier Usage

Hasmin expects a path to the CSS file, and outputs the minified result to stdout. Say you have a sheet.css and want to minify it, and save it as sheet.min.css. Then, run:

$ hasmin sheet.css > sheet.min.css

Every technique is enabled by default, except for:

  1. Escaped character conversions (e.g. converting \2714 into , enabled with --convert-escaped-characters).
  2. Dimension minifications (e.g. converting 12px to 9pt, enabled with --dimension-min, or just -d).
  3. Lexicographical sorting of declarations (enabled with --sort-declarations).

The first two are disabled mainly because they are—on average, not always—detrimental for DEFLATE compression. As for declaration sorting, whether it benefits or hurts compression rates is very stylesheet-dependent, and the current implementation is quite naive, hence unsafe.

When something needs to be disabled, use the appropriate flag. Not every technique can be toggled, but if there is any one in particular that you need to and can't, open an issue about it.

Note: there is a problem in Windows when using the --convert-escaped-characters flag to enable the conversion of escaped characters. A workaround is changing the code page, which can be done by running chcp 65001 in the terminal (whether cmd, or cygwin).


The preferable way to use Hasmin as a library is to import Hasmin; a usage example can be seen in the module's documentation. That is currently the only module that is sure to abide by PVP. Most other exposed modules are so because tests need it, and thus definitions there may be changed anytime. In case something internal is needed though, feel free to open an issue about it.

Zopfli Integration

Hasmin uses bindings to Google's Zopfli library, allowing the possibility to compress the result.

Since the output is a gzip file, it can be used for the web. It tipically produces files 3~8% smaller than zlib, at the cost of being around 80 times slower, so it is only a good idea if you don't need compression on the fly.

Zopfli is released under the Apache License, Version 2.0.