Skip to main content

minify-html

A Rust HTML minifier meticulously optimised for speed and effectiveness, with bindings for other languages.

  • Advanced minification strategy beats other minifiers while being much faster.
  • Uses SIMD searching, direct tries, and lookup tables.
  • Handles invalid HTML, with extensive testing and fuzzing.
  • Uses minify-js for super fast JS minification.

View the changelog to see the latest updates.

Performance

Comparison with html-minifier and minimize, run on the top web pages. See the breakdown here.

Chart showing speed of HTML minifiersChart showing compression of HTML minifiers

The onepass variant is even more optimised for speed. See its README for more details.

Compatibility and usage

CLI

Precompiled binaries are available for Linux, macOS, and Windows.

Get

Linux x64 | Linux ARM64 | macOS x64 | macOS ARM64 | Windows x64

Use

Use the --help argument for more details.

minify-html --output /path/to/output.min.html --keep-closing-tags --minify-css /path/to/src.html

To quickly parallel process a batch of files in place:

minify-html --keep-closing-tags --minify-css /path/to/**/*.html
Rust

Get

[dependencies]
minify-html = "0.9.2"

Use

Check out the docs for API and usage examples.

Deno

Use

import init, {minify} from "https://wilsonl.in/minify-html/deno/0.9.2/index.js";

const encoder = new TextEncoder();
const decoder = new TextDecoder();

await init();

const minified = decoder.decode(minify(encoder.encode("<p>  Hello, world!  </p>"), { keep_spaces_between_attributes: true, keep_comments: true }));

All Cfg fields are available as snake_case properties on the object provided as the second argument; if any are not set, they default to false.

Node.js
  • Package: @minify-html/node
  • Binding: Neon
  • Platforms: Linux (ARM64 and x64), macOS (ARM64 and x64), Windows (x64); Node.js 8.6.0 and higher

Get

Using npm:

npm i @minify-html/node

Using Yarn:

yarn add @minify-html/node

Use

TypeScript definitions are available.

import * as minifyHtml from "@minify-html/node";
// Or `const minifyHtml = require("@minify-html/node")` if not using TS/ESM.

const minified = minifyHtml.minify("<p>  Hello, world!  </p>", { keep_spaces_between_attributes: true, keep_comments: true });

All Cfg fields are available as snake_case properties on the object provided as the second argument; if any are not set, they default to false.

Java

Get

Add as a Maven dependency:

<dependency>
  <groupId>in.wilsonl.minifyhtml</groupId>
  <artifactId>minify-html</artifactId>
  <version>0.9.2</version>
</dependency>

Use

import in.wilsonl.minifyhtml.Configuration;
import in.wilsonl.minifyhtml.MinifyHtml;

Configuration cfg = new Configuration.Builder()
    .setKeepHtmlAndHeadOpeningTags(true)
    .setMinifyCss(true)
    .build();

String minified = MinifyHtml.minify("<p>  Hello, world!  </p>", cfg);

All Cfg fields are available as camelCase setter methods on the Builder; if any are not set, they default to false.

Python
  • Package: minify-html
  • Binding: PyO3
  • Platforms: Linux (ARM64 and x64), macOS (ARM64 and x64), Windows (x64); Python 3.8 to 3.10

Get

Add the PyPI project as a dependency and install it using pip or pipenv.

Use

import minify_html

minified = minify_html.minify("<p>  Hello, world!  </p>", minify_js=True, remove_processing_instructions=True)

All Cfg fields are available as Python keyword arguments; if any are omitted, they default to False.

Ruby
  • Package: minify_html
  • Binding: Rutie
  • Platforms: Linux, macOS; Ruby 2.5 and higher

Get

Add the library as a dependency to Gemfile or *.gemspec.

Use

require 'minify_html'

print MinifyHtml.minify("<p>  Hello, world!  </p>", { :keep_spaces_between_attributes => true, :minify_js => true })

All Cfg fields are available; if any are omitted, they default to false.

WASM

A bundler may be required to use the WebAssembly module, see this for more details.

Use

import init, {minify} from "@minify-html/wasm";

const encoder = new TextEncoder();
const decoder = new TextDecoder();

await init();

const minified = decoder.decode(minify(encoder.encode("<p>  Hello, world!  </p>"), { keep_spaces_between_attributes: true, keep_comments: true }));

All Cfg fields are available as snake_case properties on the object provided as the second argument; if any are not set, they default to false.

Minification

Note that some of the minification done can result in HTML that will not pass validation, but remain interpreted and rendered correctly by the browser; essentially, the laxness of the browser is taken advantage of for better minification. To prevent this, refer to these configuration options:

  • do_not_minify_doctype
  • ensure_spec_compliant_unquoted_attribute_values
  • keep_spaces_between_attributes

Whitespace

minify-html has advanced context-aware whitespace minification that does things such as:

  • Leave whitespace untouched in pre and code, which are whitespace sensitive.
  • Trim and collapse whitespace in content tags, as whitespace is collapsed anyway when rendered.
  • Remove whitespace in layout tags, which allows the use of inline layouts while keeping formatted code.

Methods

There are three whitespace minification methods. When processing text content, minify-html chooses which ones to use depending on the containing element.

Collapse whitespace

Applies to: any element except whitespace sensitive elements.

Reduce a sequence of whitespace characters in text nodes to a single space (U+0020).

BeforeAfter
<p>↵
··The·quick·brown·fox↵
··jumps·over·the·lazy↵
··dog.↵
</p>
<p>·The·quick·brown·fox·jumps·over·the·lazy·dog.·</p>
Destroy whole whitespace

Applies to: any element except whitespace sensitive, content, content-first, and formatting elements.

Remove any text nodes between tags that only consist of whitespace characters.

BeforeAfter
<ul>↵
··<li>A</li>↵
··<li>B</li>↵
··<li>C</li>↵
</ul>
<ul>↵
··<li>A</li><li>B</li><li>C</li>↵
</ul>
Trim whitespace

Applies to: any element except whitespace sensitive and formatting elements.

Remove any leading/trailing whitespace from any leading/trailing text nodes of a tag.

BeforeAfter
<p>↵
··Hey,·I·<em>just</em>·found↵
··out·about·this·<strong>cool</strong>·website!↵
··<sup>[1]</sup>↵
</p>
<p>Hey,·I·<em>just</em>·found↵
··out·about·this·<strong>cool</strong>·website!↵
··<sup>[1]</sup></p>

Element types

minify-html assumes HTML and SVG elements are used in specific ways, based on standards and best practices. By making these assumptions, it can apply optimal whitespace minification strategies. If these assumptions do not hold, consider adjusting the HTML source or turning off whitespace minification.

Group Elements Expected children
Formatting a, strong, and others Formatting elements, text.
Content h1, p, and others Formatting elements, text.
Layout div, ul, and others Layout elements, content elements.
Content-first label, li, and others Like content but could be layout with only one child.
Formatting elements

Whitespace is collapsed.

Formatting elements are usually inline elements that wrap around part of some text in a content element, so its whitespace isn't trimmed as they're probably part of the content.

Content elements

Whitespace is trimmed and collapsed.

Content elements usually represent a contiguous and complete unit of content such as a paragraph. As such, whitespace is significant but sequences of them are most likely due to formatting.

Before
<p>↵
··Hey,·I·<em>just</em>·found↵
··out·about·this·<strong>cool</strong>·website!↵
··<sup>[1]</sup>↵
</p>
After
<p>Hey,·I·<em>just</em>·found·out·about·this·<strong>cool</strong>·website!·<sup>[1]</sup></p>
Layout elements

Whitespace is trimmed and collapsed. Whole whitespace is removed.

These elements should only contain other elements and no text. This makes it possible to remove whole whitespace, which is useful when using display: inline-block so that whitespace between elements (e.g. indentation) does not alter layout and styling.

Before
<ul>↵
··<li>A</li>↵
··<li>B</li>↵
··<li>C</li>↵
</ul>
After
<ul><li>A</li><li>B</li><li>C</li></ul>
Content-first elements

Whitespace is trimmed and collapsed.

These elements are usually like content elements but are occasionally used like a layout element with one child. Whole whitespace is not removed as it might contain content, but this is OK for using as layout as there is only one child and whitespace is trimmed.

Before
<li>↵
··<article>↵
····<section></section>↵
····<section></section>↵
··</article>↵
</li>
After
<li><article><section></section><section></section></article></li>

Tags

Optional opening and closing tags are removed.

Attributes

Any entities in attribute values are decoded, and then the shortest representation of the value is calculated and used:

  • Double quoted, with any " encoded.
  • Single quoted, with any ' encoded.
  • Unquoted, with "/' first character (if applicable), any >, and any whitespace encoded.

Attributes have their whitespace (after any decoding) trimmed and collapsed when possible.

Boolean attribute values are removed. Some other attributes are completely removed if their value is empty or the default value after any processing.

type attributes on script tags with a value equaling a JavaScript MIME type are removed.

If an attribute value is empty after any processing, everything but the name is completely removed (i.e. no =), as an empty attribute is implicitly the same as an attribute with an empty string value.

Spaces are removed between attributes when possible.

Entities

Entities are decoded if they're valid and shorter or equal in length when decoded. UTF-8 sequences that have a shorter entity representation are encoded.

Numeric entities that do not refer to a valid Unicode Scalar Value are replaced with the replacement character.

Encoding is avoided when possible; for example, < are only encoded in content if they are followed by a valid tag name character. If necessary, the shortest entity representation is chosen.

Comments

Comments are removed.

Ignored

Bangs, processing instructions, and empty elements are not removed as it is assumed there is a special reason for their declaration.

Parsing

minify-html can process any HTML, handling all possible syntax (including invalid ones) gracefully like browsers. See Parsing.md for more details.

Issues and contributions

Pull requests and any contributions welcome!

If minify-html did something unexpected, misunderstood some syntax, or incorrectly kept/removed some code, raise an issue with some relevant code that can be used to reproduce and investigate the issue.

Metadata

Release files for minify-html 0.9.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for minify-html 0.9.2
File
minify_html-0.9.2-cp310-none-win_amd64.whl CPython 3.10 none Windows x86-64 Details
minify_html-0.9.2-cp310-cp310-manylinux_2_28_aarch64.whl CPython 3.10 CPython 3.10 Linux glibc 2.28+ ARM64 Details
minify_html-0.9.2-cp310-cp310-manylinux_2_27_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.27+ x86-64 Details
minify_html-0.9.2-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details
minify_html-0.9.2-cp310-cp310-macosx_10_7_x86_64.whl CPython 3.10 CPython 3.10 macOS 10.7+ x86-64 Details
minify_html-0.9.2-cp39-none-win_amd64.whl CPython 3.9 none Windows x86-64 Details
minify_html-0.9.2-cp39-cp39-manylinux_2_28_aarch64.whl CPython 3.9 CPython 3.9 Linux glibc 2.28+ ARM64 Details
minify_html-0.9.2-cp39-cp39-manylinux_2_27_x86_64.whl CPython 3.9 CPython 3.9 Linux glibc 2.27+ x86-64 Details
minify_html-0.9.2-cp39-cp39-macosx_11_0_arm64.whl CPython 3.9 CPython 3.9 macOS 11.0+ ARM64 Details
minify_html-0.9.2-cp39-cp39-macosx_10_7_x86_64.whl CPython 3.9 CPython 3.9 macOS 10.7+ x86-64 Details
minify_html-0.9.2-cp38-none-win_amd64.whl CPython 3.8 none Windows x86-64 Details
minify_html-0.9.2-cp38-cp38-manylinux_2_28_aarch64.whl CPython 3.8 CPython 3.8 Linux glibc 2.28+ ARM64 Details
minify_html-0.9.2-cp38-cp38-manylinux_2_27_x86_64.whl CPython 3.8 CPython 3.8 Linux glibc 2.27+ x86-64 Details
minify_html-0.9.2-cp38-cp38-macosx_11_0_arm64.whl CPython 3.8 CPython 3.8 macOS 11.0+ ARM64 Details
minify_html-0.9.2-cp38-cp38-macosx_10_7_x86_64.whl CPython 3.8 CPython 3.8 macOS 10.7+ x86-64 Details

Total release size: 8.9 MB

Release files / minify_html-0.9.2-cp310-none-win_amd64.whl

Download URL minify_html-0.9.2-cp310-none-win_amd64.whl
Size 546.3 kB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
481936dd4ef083afd5e4672fb8727d00a2cb945db22d0a60a397e7791276d710
BLAKE2b-256 checksum
How to use checksums
6030648fba178dcbf1c12c1748d5963692400c637c34d440ec2a7b8e6c6f99fd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.10.5

Release files / minify_html-0.9.2-cp310-cp310-manylinux_2_28_aarch64.whl

Download URL minify_html-0.9.2-cp310-cp310-manylinux_2_28_aarch64.whl
Size 625.8 kB
Tags CPython 3.10 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
9ce703f6d9a18b8618457ac5791ef91635211e4fe253540a6a17e38e69922802
BLAKE2b-256 checksum
How to use checksums
35358cab0d0176e49dfd50667e4a0b13e2384144884e6a54ced763e0cde01561
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.10.5

Release files / minify_html-0.9.2-cp310-cp310-manylinux_2_27_x86_64.whl

Download URL minify_html-0.9.2-cp310-cp310-manylinux_2_27_x86_64.whl
Size 694.9 kB
Tags CPython 3.10 Linux glibc 2.27+ x86-64
SHA-256 checksum
How to use checksums
95edae199f951b3ccc3d4b2e1727982a694c7464631a61c21b0a49ccd53338ac
BLAKE2b-256 checksum
How to use checksums
09c38707ee274de2b379d5a4398897b1b6aeb714c9158d8710f0ebac14ccb9f7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.10.5

Release files / minify_html-0.9.2-cp310-cp310-macosx_11_0_arm64.whl

Download URL minify_html-0.9.2-cp310-cp310-macosx_11_0_arm64.whl
Size 530.6 kB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
69bf111a39062db5d773da0d4b1c39e829668327e2d744d273fc6b930185d395
BLAKE2b-256 checksum
How to use checksums
1e24fb914d2ce45127a881865b4c3d0de66bca5391577d147031135a9d40dd60
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.9.7

Release files / minify_html-0.9.2-cp310-cp310-macosx_10_7_x86_64.whl

Download URL minify_html-0.9.2-cp310-cp310-macosx_10_7_x86_64.whl
Size 584.2 kB
Tags CPython 3.10 macOS 10.7+ x86-64
SHA-256 checksum
How to use checksums
fb0ec0ce8c3f9494152979678003ec843ebd2d0f0499362db2fa198e49113fe0
BLAKE2b-256 checksum
How to use checksums
42b2dfe750ed361cc91397f05a77bfc5621d40ffd96fc6e34bdd6a0348255d73
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.10.5

Release files / minify_html-0.9.2-cp39-none-win_amd64.whl

Download URL minify_html-0.9.2-cp39-none-win_amd64.whl
Size 546.4 kB
Tags CPython 3.9 Windows x86-64
SHA-256 checksum
How to use checksums
087d84e60443e4a11455a60e31db78313d2e08c63b90b5aa9a3c2055383f9dbb
BLAKE2b-256 checksum
How to use checksums
359ba05c2079fc5c118104aecf8cf7a356f69483e46774988c4a389a5133b2f3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.9.13

Release files / minify_html-0.9.2-cp39-cp39-manylinux_2_28_aarch64.whl

Download URL minify_html-0.9.2-cp39-cp39-manylinux_2_28_aarch64.whl
Size 625.8 kB
Tags CPython 3.9 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
cf65be62e2e8f77ee7cd8b3346ef46088882ee06451ffc041f4e84bb5007617d
BLAKE2b-256 checksum
How to use checksums
7108e8ee8c2e19f6f119c949e9da793c94db8f1ea4c89e3096094b73fe677ee2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.9.13

Release files / minify_html-0.9.2-cp39-cp39-manylinux_2_27_x86_64.whl

Download URL minify_html-0.9.2-cp39-cp39-manylinux_2_27_x86_64.whl
Size 694.8 kB
Tags CPython 3.9 Linux glibc 2.27+ x86-64
SHA-256 checksum
How to use checksums
031a5ec031d56b815402193b69c9db6b04990f6db08e5c78cd9d7d4379891ba4
BLAKE2b-256 checksum
How to use checksums
3ebc9e158acfe766e28ae9a9940fafd1266302d62215d7e001dc158646c68767
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.9.13

Release files / minify_html-0.9.2-cp39-cp39-macosx_11_0_arm64.whl

Download URL minify_html-0.9.2-cp39-cp39-macosx_11_0_arm64.whl
Size 530.6 kB
Tags CPython 3.9 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
4944cf1f10805e20f68bcb67304a4a692d7bb28b9212f6825abe0dbad4d76647
BLAKE2b-256 checksum
How to use checksums
02b08a6aa9256f646b179e16a8b60a176d0d5505662be380ba34826a715c5956
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.9.7

Release files / minify_html-0.9.2-cp39-cp39-macosx_10_7_x86_64.whl

Download URL minify_html-0.9.2-cp39-cp39-macosx_10_7_x86_64.whl
Size 584.2 kB
Tags CPython 3.9 macOS 10.7+ x86-64
SHA-256 checksum
How to use checksums
cfe6e5e5e6c75e64bdb2a8753241432242aa8ac1b94443a649c3b393f07f8481
BLAKE2b-256 checksum
How to use checksums
48eeb443ee0ca5279b3b1c417762d8624c4ef58712703d2dbfb109b27747aaa2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.9.13

Release files / minify_html-0.9.2-cp38-none-win_amd64.whl

Download URL minify_html-0.9.2-cp38-none-win_amd64.whl
Size 546.2 kB
Tags CPython 3.8 Windows x86-64
SHA-256 checksum
How to use checksums
6dff2d565f94fe7c5e9fe5254b75262271fc76277065af156dec5ca856d21fb0
BLAKE2b-256 checksum
How to use checksums
6f2a7b3cc58c6e3fe3013c8db2b5156bf2150442e69c2ecddd18ad20ce6f4ee6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.8.10

Release files / minify_html-0.9.2-cp38-cp38-manylinux_2_28_aarch64.whl

Download URL minify_html-0.9.2-cp38-cp38-manylinux_2_28_aarch64.whl
Size 625.9 kB
Tags CPython 3.8 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
a66eaa7af27826f908adb85f9854db7bef23a9e4c237475196fdb3b3386c94fe
BLAKE2b-256 checksum
How to use checksums
5ca70e45119d8bcf85954d88eec7854989e7e0562c443025c6af03cb313cedb2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.8.13

Release files / minify_html-0.9.2-cp38-cp38-manylinux_2_27_x86_64.whl

Download URL minify_html-0.9.2-cp38-cp38-manylinux_2_27_x86_64.whl
Size 694.7 kB
Tags CPython 3.8 Linux glibc 2.27+ x86-64
SHA-256 checksum
How to use checksums
b001dadd29ace73dc12c8f73e4ef203248f807866a31d6e9578a3c52c2b2a27b
BLAKE2b-256 checksum
How to use checksums
9035713249ce4cd87f99f764f40419693e498afa6a00cd49e3d11527162c8374
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.8.12

Release files / minify_html-0.9.2-cp38-cp38-macosx_11_0_arm64.whl

Download URL minify_html-0.9.2-cp38-cp38-macosx_11_0_arm64.whl
Size 530.5 kB
Tags CPython 3.8 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
96e11bc0bf86066317396e15f872033c5a67a25c2138790fe60602387a6fd163
BLAKE2b-256 checksum
How to use checksums
7b0a924e143e281b96d6ca1aafc0134bb87a28a568c7545c20e7a4d6d03e45ef
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.9.7

Release files / minify_html-0.9.2-cp38-cp38-macosx_10_7_x86_64.whl

Download URL minify_html-0.9.2-cp38-cp38-macosx_10_7_x86_64.whl
Size 584.1 kB
Tags CPython 3.8 macOS 10.7+ x86-64
SHA-256 checksum
How to use checksums
2a2f0c1588ff7ae77b55c6bfcfbe21f1682afa6586deee71e638b69635d43d18
BLAKE2b-256 checksum
How to use checksums
0abf930667c69f7f1b74780b04a0410d0df685c3cefbacb6298cd39f847a77d8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.8.12

Release history Release notifications | RSS feed

This release

0.9.2 This release

15 release files

0.9.1

15 release files

0.9.0

15 release files

0.8.1

4 release files

0.8.0

15 release files

0.7.2

15 release files

0.7.1

15 release files

0.7.0

15 release files

0.6.10

9 release files

0.6.9

9 release files

0.6.8

9 release files

0.6.7

9 release files

0.6.6

2 release files

0.6.5

9 release files

0.6.4

9 release files

0.6.3

9 release files

0.6.2

9 release files

0.6.1

9 release files

0.6.0

9 release files

0.5.3

9 release files

0.5.2

9 release files

0.5.0

9 release files

0.4.11

9 release files

0.4.10

9 release files

0.4.9

9 release files

0.4.8

9 release files

0.4.7

9 release files

0.4.6

9 release files

0.4.5

9 release files

0.4.3

9 release files

0.4.2

7 release files

0.4.1

9 release files

0.4.0

9 release files

0.3.9

12 release files

0.3.7

12 release files

0.3.6

12 release files

0.3.5

12 release files

0.3.4

12 release files

0.3.3

12 release files

0.3.2

12 release files

0.3.1

12 release files

0.3.0

12 release files

0.2.6

8 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page