One tokenizer, two machines. The beautifier reflows a stylesheet into clean, indented rules — one selector per line, declarations optionally sorted A→Z. The minifier squeezes the same sheet toward a single line and reports exactly how many bytes it saved, with an aggressive mode that shaves zero units and leading zeros. Strings, comments and data URIs are tracked character by character and never mangled. Nothing is uploaded, nothing is stored.
Parses with a real tokenizer — not a regex — so quoted strings, comments, url() payloads and data URIs are tracked character by character and survive the trip untouched. The reflow is opinionated where it should be and hands-off where it matters: one selector per line, one declaration per line, nested @media, @supports and @keyframes indented as sheets-within-sheets, and @font-face / @page treated as the declaration blocks they are. Values come out byte-identical — the beautifier never "fixes" your CSS. Flip ⇅ sort decls A→Z for alphabetized declarations, and choose 2-space, 4-space or tab indentation from the deck.
Use it for design handoffslegacy sheetscode reviewlearning
Runs the same parsed model through the compactor: comments stripped, whitespace collapsed, the last semicolon before each } dropped, selectors tightened around their commas. The stat strip reports bytes in, bytes out, bytes saved and the reduction percentage — real bytes, measured with a Blob, not character estimates. Flip ⚡ aggressive and it goes further: 0px becomes 0, 0.5 becomes .5, spaces inside function calls disappear — while anything between quotes is declared a no-fly zone, so your data URIs and content strings pass through byte for byte.
Use it for production bundlescritical CSSCDN payloadspage-speed budgets
Parsing rules · both tools share one tokenizer — strings, comments, url() payloads and data URIs are tracked character by character and never reformatted · @media, @supports and @keyframes recurse as nested sheets; @font-face and @page are treated as declaration blocks · the beautifier puts one selector per line and never touches declaration values · declaration sorting is opt-in — duplicate properties are order-sensitive in CSS, so sort with care · the minifier strips comments, collapses whitespace and drops the last semicolon before } · aggressive mode additionally turns 0px into 0, 0.5 into .5 and strips spaces inside functions — never inside strings · custom properties, calc() and modern selectors pass through untouched · ⇄ Output → Input feeds any result straight back for another pass
The privacy promise
Paste anything. We couldn't read it even if we wanted to.
This page has no backend and no database. Every rule re-indented, every comment stripped and every byte counted just now was computed by JavaScript inside your own browser tab — your stylesheet never traveled a single centimeter of cable. Close the page and it's gone for good.
RAW CSS→PARSED IN YOUR BROWSER→SHIPPABLE OUTPUT
✕ SERVER · DATABASE · LOGS · ANALYTICS
Databasenull
Backendnone
CSS uploads0
Session logs0
Questions
Asked often, answered plainly.
( 02 )
Will the beautifier change how my styles behave?
No — it's formatting only. Selectors, properties and values come out byte-identical; only whitespace and line breaks change. The one opt-in exception is declaration sorting: because duplicate properties are order-sensitive in CSS (the last one wins), sorting can reorder them, so the toggle is off by default and the rules paragraph above says so in plain text.
What does aggressive minification actually do?
On top of comment stripping and whitespace collapse, aggressive mode turns 0px into 0 (zero is zero in any unit), 0.5 into .5, removes spaces inside function calls like rgba( ) and drops the final semicolon before each closing brace. It never touches anything inside quotes — strings and data URIs pass through byte for byte, so a url("data:image/svg+xml,...") payload survives with its semicolons and braces intact.
Are data URIs and quoted strings safe?
Yes. The tokenizer tracks single quotes, double quotes and backslash escapes character by character, so a semicolon inside a string never terminates a declaration and a brace inside a data URI never closes a block. Both tools carry those payloads through exactly as written.
Does it understand @media, @keyframes and @font-face?
Yes. Conditional at-rules like @media and @supports recurse as nested sheets with their own indentation, @keyframes steps are treated as rules with percentage selectors, and declaration at-rules like @font-face and @page are handled as declaration blocks. Custom properties, calc() and modern selectors like :is() and :has() all pass through untouched.
Is my CSS saved anywhere?
No. IrisTool has no backend and no database. Parsing happens inside your browser tab and the stylesheet disappears the moment you close or refresh the page. There is nothing to leak, because nothing is ever collected.