Compatibility
What matches dart-sass, what does not, and how it is measured.
dart-sass is the reference implementation, currently 1.104.1. A deviation from it is a bug rather than a dialect, with two declared exceptions: error message wording and error spans.
The framework corpus
CI compiles four real frameworks with both engines on every commit. A single differing colour value fails the job.
| Framework | Version | Result |
|---|---|---|
| Bulma | 1.0.4 | No colour differences |
| Pico | 2.1.1 | No colour differences |
| Foundation | 6.9.0 | No colour differences |
| USWDS | 3.13.0 | No colour differences |
Foundation gets a second check: a probe stylesheet calls every Sass function Foundation documents, one per line, and any differing line fails the build. Whole-framework output tolerates rule grouping and ordering; a function result does not.
Bootstrap 5.0.2 is compiled too, but advisory: it reports the delta rather than gating.
Byte-identical output
All four frameworks compile byte-identically to dart-sass 1.104.1, comments
included. For USWDS 3.13.0 that is 32,781 lines each, zero differences.
Measured 2026-09-13 with .github/scripts/frameworks.sh.
The spec suite
The official sass-spec suite, run against the release build:
14266 runs, 14147 passing, 111 failures, 8 todo, 0 ignored, 0 errors
Measured on macOS 2026-09-13 against sass-spec b39c32768, with the flags CI
uses: --trim-errors --ignore-warning-diffs --ignore-error-diffs. The Linux CI
runner reports two fewer passing, 14,145, an offset that is stable across
commits. The job is advisory in CI and publishes the tallies rather than
gating.
The 111 remaining failures are tracked one work item at a time in
specs/docs/features/,
ranked by how many fixtures each would unlock.
Known divergences
Compressed output
--style compressed produces equivalent CSS that is under-minified rather
than wrong. Measured across USWDS:
| Class | Count | This compiler | dart-sass |
|---|---|---|---|
Numbers inside calc() | 623 | calc(1rem - .25rem) | calc(1rem - 0.25rem) |
| Commas in font stacks | 378 | Helvetica,Roboto | Helvetica, Roboto |
@supports spacing, transparent | 110 | @supports (mask: ...) | @supports(mask: ...) |
| A rule left empty once its comment is dropped | 8 | kept | omitted |
| Semicolon before the closing brace | 8 | ...:100%;} | ...:100%} |
Every one is valid CSS meaning the same thing; the file is simply larger than dart-sass's. If byte-for-byte minification matters, run a dedicated minifier over the expanded output.
Warning and debug formatting
The message text of @warn and @debug matches dart-sass, including the rule
that a string message is reported as its text: @warn "careful" says
careful. @debug matches in full, down to the line it writes:
file.scss:2 DEBUG: careful.
What surrounds a @warn message does not. This compiler writes
Warning: ... above an ./file:line:column location, where dart-sass writes
WARNING: ... above an indented stack trace. Do not match on those two lines.
Deprecation warnings
One deprecation is reported so far, bogus-combinators: a style rule whose
selector has a leading, trailing or repeated combinator, and an @extend
inside one. Its banner, message and source frame match dart-sass 1.104.1.
The line below the frame does not always. dart-sass writes a stack trace;
this compiler writes the file, line and column, followed by
root stylesheet only when that is the whole trace: a warning from the entry
stylesheet, outside any mixin or function. A warning from a module names the
module by the path it was loaded from, where dart-sass prints it relative to
the working directory.
Not reported yet: the other deprecations dart-sass has, including import
for @import and global-builtin for global functions, and the
bogus-combinators warning the selector functions give, such as
$extender: > is not valid CSS. from selector.extend().
Error messages and spans
Wording may change between bugfix versions, and which characters an error points at may change. Do not match on either.
Not implemented
- Source maps
--watch
How to check a claim yourself
# The framework corpus, against a real dart-sass binary .github/scripts/frameworks.sh
The script installs the frameworks from npm, compiles each with both engines,
and reports differing lines, colour-bearing differences, and the difference
after canonicalising both sides through lightningcss.
Note
Use the native dart-sass release binary, which is what CI uses. The npm
sass package is the JavaScript build and does not always agree with it.