
Company News
Socket Named Top Sales Organization by RepVue
Socket won two 2026 Reppy Awards from RepVue, ranking in the top 5% of all sales orgs. AE Alexandra Lister shares what it's like to grow a sales career here.
HTML formatter yo! Prettify, minify and more!
htmlfy is a fork of html-formatter. A lot of the processing logic has been preserved, and full credit for that goes to the original author. I've made the following major enhancements.
npm install htmlfy
Most projects will only need to use prettify and/or minify.
Turn single-line or ugly HTML into highly formatted HTML. This is a wrapper for all other functions, except trimify, and then it adds indentation.
import { prettify } from 'htmlfy'
const html = `<main class="hello there world"><div>Welcome to htmlfy! </div></main>`
console.log(prettify(html))
/*
<main class="hello there world">
<div>
Welcome to htmlfy!
</div>
</main>
*/
Turn well-formatted or ugly HTML into a single line of HTML.
This feature is not a replacement for compressors like htmlnano, which focus on giving you the smallest data-size possible; but rather, it simply removes tabs, returns, and redundant whitespace.
import { minify } from 'htmlfy'
const html =
`<main class="hello there world">
<div>
Welcome to htmlfy!
</div>
</main>`
console.log(minify(html))
/*
<main class="hello there world"><div>Welcome to htmlfy!</div></main>
*/
This is done when using prettify, but you can use it in a one-off scenario if needed.
Ensure void elements are "self-closing".
import { closify } from 'htmlfy'
const html = `<br><input type="text">`
console.log(closify(html))
/*
<br /><input type="text" />
*/
This is done when using prettify, but you can use it in a one-off scenario if needed.
Enforce entity characters for textarea content. This also performs basic minification on textareas before setting entities. When running this function as a standalone, you'll likely want to pass minify as true for full minification of the textarea. The minification does not process any other tags.
import { entify } from 'htmlfy'
const html = `<main class="hello there world"><div>Welcome to htmlfy! </div></main><textarea >
Did you know that 3 > 2?
This is another paragraph.
</textarea><textarea class=" more stuff "> </textarea>`
console.log(entify(html, true))
/*
<main class="hello there world"><div>Welcome to htmlfy! </div></main><textarea>Did you know that 3 > 2? This is another paragraph.</textarea><textarea class="more stuff"></textarea>
*/
Trim leading and trailing whitespace for whatever HTML element(s) you'd like. This is a standalone function, which is not run with prettify by default.
import { trimify } from 'htmlfy'
const html = `<div>
Hello World
</div>`
console.log(trimify(html, [ 'div' ]))
/* <div>Hello World</div> */
If needed, you can use a default import for htmlfy.
import * as htmlfy from 'htmlfy'
console.log(htmlfy.prettify('<main><div>Hello World</div></main'))
Although meant to be an ESM module, you can import using require.
const { prettify } = require('htmlfy')
These configuration options can only be passed to prettify.
Default config:
{
content_wrap: 0,
ignore: [],
ignore_with: '_!i-£___£%_',
strict: false,
tab_size: 2,
tag_wrap: 0,
trim: []
}
Wrap text content at a certain character-width breakpoint. Default is 0, which does not wrap.
import { prettify } from 'htmlfy'
const html = '<div>Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis.</div>'
console.log(prettify(html, { content_wrap: 40 }))
/*
<div>
Lorem ipsum dolor sit amet consectetur
adipiscing elit. Quisque faucibus ex
sapien vitae pellentesque sem placerat.
In id cursus mi pretium tellus duis
convallis.
</div>
*/
Tell htmlfy to not process some elements and leave them as-is.
import { prettify } from 'htmlfy'
const html = `
<main><div>Hello World</div></main>
<style>
body {
width: 100
}
</style>`
console.log(prettify(html, { ignore: [ 'style' ] }))
/*
<main>
<div>
Hello World
</div>
</main>
<style>
body {
width: 100;
}
</style>
*/
You can pass in your own string, for ignoring elements, if the default is actually being used in your ignored elements.
prettify(html, { ignore: [ 'p' ], ignore_with: 'some-string-that-wont-be-in-your-ignored-elements' })
If set to true, removes comments and ensures void elements are not self-closing.
import { prettify } from 'htmlfy'
const html = `<main><br /><div><!-- Hello World --></div></main>`
console.log(prettify(html, { strict: true }))
/*
<main>
<br>
<div></div>
</main>
*/
Determines the number of spaces, per tab, for indentation. For sanity reasons, the valid range is between 1 and 16.
import { prettify } from 'htmlfy'
const html = `<main class="hello there world"><div>Welcome to htmlfy! </div></main>`
console.log(prettify(html, { tab_size: 4 }))
/*
<main class="hello there world">
<div>
Welcome to htmlfy!
</div>
</main>
*/
Wrap and prettify attributes within opening tags and void elements if they're overall length is above a certain character width. Default is 0, which does not wrap.
In the below example, the <input> element is well over 40 characters long, so it's wrapped and prettified.
import { prettify } from 'htmlfy'
const html = `<form><input id="email-0" type="email" title="We need your email for verification." name="email" required /></form>`
console.log(prettify(html, { tag_wrap: 40 }))
/*
<form>
<input
id="email-0"
type="email"
title="We need your email for verification."
name="email"
required
/>
</form>
*/
Trim leading and trailing whitespace within textarea elements, since all whitespace is preserved by default.
import { prettify } from 'htmlfy'
const html = '<textarea> Hello World </textarea>'
console.log(prettify(html, { trim: [ 'textarea' ]}))
/*<textarea>Hello World</textarea>*/
For compatibility and possible future expansion, we require declaring an array with the value 'textarea', as opposed to using something like
{ trim: true }. Passing in additional HTML element values has no real effect, since we already trim whitespace for all other elements.
FAQs
html formatter yo! Prettify or minify html.
The npm package htmlfy receives a total of 1,001,673 weekly downloads. As such, htmlfy popularity was classified as popular.
We found that htmlfy demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Company News
Socket won two 2026 Reppy Awards from RepVue, ranking in the top 5% of all sales orgs. AE Alexandra Lister shares what it's like to grow a sales career here.

Security News
NIST will stop enriching most CVEs under a new risk-based model, narrowing the NVD's scope as vulnerability submissions continue to surge.

Company News
/Security News
Socket is an initial recipient of OpenAI's Cybersecurity Grant Program, which commits $10M in API credits to defenders securing open source software.