SCSS Compiler

Real Sass code lives across several files. Open a tab per partial, import them from the entry file, and compile the whole set into one stylesheet without installing anything.

A leading underscore marks a partial. @import 'tokens' finds _tokens.scss.

Source

.scss

Compiled stylesheet

.css

Loading the compiler.

0Files compiled
0Rules written
0Selectors
0 BOutput size
Load a project

One entry file, several partials

A single textarea handles a snippet. It falls apart the moment your variables sit in _tokens.scss and your breakpoint mixin sits in _mixins.scss, because pasting the entry file alone gives the compiler names it has never seen. This page keeps a tab per file and hands the whole set to the compiler together, so @import resolves the way it does on your machine.

Two rules decide how the files fit together:

Imports drop the underscore and the extension. Writing @import 'tokens' in the entry file pulls in _tokens.scss. Order matters, because a variable has to be defined before the rule reading it, which is why token files sit at the top of almost every entry file you will meet.

Entry filemain.scss
@import 'tokens';@import 'mixins';.panel {padding: $space-3;border: 1px solid $line;}
Partial_tokens.scss
$line: #d5e3e8;$space-1: 4px;$space-3: $space-1 * 4;
Resultmain.css
.panel {padding: 16px;border: 1px solid #d5e3e8;}

Notice what survives the trip. The arithmetic $space-1 * 4 is gone, replaced by 16px. Both partials vanish from the output entirely, since a partial contributes definitions rather than rules. What ships is one flat stylesheet a browser reads without knowing Sass exists.

This compiler is LibSass, so some newer syntax fails

The engine here is a WebAssembly build of LibSass running inside your tab. LibSass was retired in 2020 and stopped at the Sass language as it stood then, which makes the gap against the Dart Sass in your build pipeline worth knowing before you paste production code.

SyntaxCompiles hereWhat to do
@import 'partial'YesWorks across every open tab. Deprecated in Dart Sass, still the syntax most existing projects use.
@use and @forwardNoThe module system arrived after LibSass froze. Rewrite the pair as @import to test a file here.
math.div($a, $b)NoUse the slash form $a / $b, which still divides in this engine.
map-get, @each, @ifYesMaps, loops, and conditionals all run. The theme sample above is built on them.
@mixin, @content, @extendYesPlaceholders group selectors, mixins copy blocks in. The two samples show the difference in output.
@media with nestingYesNested queries bubble to the top level, same as they do in Dart Sass.
Colour functionsMostlymix, lighten, rgba, and friends work. The newer color.adjust module functions do not.

Nothing leaves your browser. The compiler, the editors, and the download all run in page JavaScript, so a stylesheet from a client project stays on your machine. A few hundred lines across half a dozen partials compile in well under a second, though the WebAssembly binary itself is a couple of megabytes on first load.

The first error is the only error

Sass stops at the first thing it cannot resolve. A run that fails tells you nothing about the rest of the file, which catches people out when a large paste reports one problem and they assume the remainder is clean.

The error panel names the file, the line, and the column. Press Open that line and the tab switches to the file at fault with the cursor already there. Load the missing variable sample to see the shape of it: the entry file reads $card-bg, the partial never defines it, and the compiler reports an undefined variable rather than silently writing an empty value.

Three messages account for most failures:

Picking an output style

Four styles ship the same rules with different whitespace. Expanded is the readable one and the right choice while you are checking what the compiler produced. Compressed strips every space and newline for the file a browser downloads.

StyleLooks likeUse for
ExpandedOne declaration per line, braces on their own linesReading the output and diffing it against a previous build
NestedIndentation mirrors the source nesting depthTracing which nested block produced which flat selector
CompactOne rule per lineScanning a long stylesheet for a specific selector
CompressedA single line, no whitespaceThe production file, though your bundler normally does this step

The size counter tracks the raw byte count, not the transfer size. Servers gzip CSS, and gzip closes most of the gap between expanded and compressed, so the difference on the wire is far smaller than the counter suggests.

This page checks Sass, it does not replace your build. There is no source map, no folder structure, no watch mode, and no node_modules, so a @import pointing at Bootstrap or a design system package has nothing to resolve against. For anything shipping to users, run Dart Sass through your bundler and treat the output here as a second opinion.

When a different page suits the job better

Reach for this one when several files have to see each other: a token partial feeding a component file, a mixin library you are testing a call against, a bug you suspect lives in import order. For a single snippet with no imports at all, the SCSS to CSS converter is the lighter page. Writing the indented Sass syntax rather than SCSS braces? That belongs in the Sass compiler, since the two dialects are parsed differently and pasting one into the other reports an error on line one.

Questions from people with a real project open

What comes up once partials, imports, and a compiler error are involved.

How do I compile SCSS that imports other files?

Open a tab per file with Add partial, name each one the way it is named in your project, and write the imports in the entry file exactly as you wrote them there. The compiler receives every open tab at once, so an import naming another tab resolves. Names starting with an underscore are partials and produce no output of their own.

Why does my @use rule fail?

The engine is LibSass, which was retired before the Sass module system landed. Neither @use nor @forward is recognised. Swap them for @import to test a file on this page, and keep the module syntax in the project itself, since Dart Sass in your build understands it.

Does math.div work?

No. It arrived with the module system. Divide with the slash form instead, which this engine still treats as division rather than a separator. Your build pipeline may warn about slash division, and that warning is about Dart Sass, not about the output here.

Are my files uploaded to a server?

No. The compiler is a WebAssembly binary loaded into the page, and every file you open lives in browser memory. Nothing is transmitted and nothing persists after you close the tab, so a client stylesheet is safe to paste. Save anything you want to keep before leaving.

Why did the compiler report only one error?

Sass halts at the first thing it cannot resolve, so a file with four problems reports the first and says nothing about the rest. Fix it, compile again, and the next one surfaces. The panel gives the file and line, and the jump button puts the cursor on it.

Can I import a package like Bootstrap?

Not from here. There is no node_modules and no load path, so an import resolves only against the tabs you have open. Pasting a framework partial in as a tab works for small pieces, though the full Bootstrap source runs to dozens of files and belongs in a local build.

Where did my partials go in the output?

Partials contribute variables, mixins, functions, and placeholders rather than rules, so a file holding only definitions adds nothing to the stylesheet. Any actual rule inside a partial does appear, positioned where the import sits in the entry file.

Is the compiled CSS identical to what my build produces?

Close, rarely identical. LibSass and Dart Sass agree on the language as it stood in 2020, and they differ on selector ordering in some @extend cases, on colour function precision, and on everything added since. Treat a match as reassurance and a mismatch as a reason to check the version your project runs.