css.landing Open editor

web/css

Online CSS Editor with Instant Live Preview

Write stylesheets the way you would locally — several files, real imports, custom properties and a preprocessor if you want one — with the page repainting as you type.

repaintas you type
filesreal stylesheets
preprocessorsSCSS, Sass, Less
devicesreal frames
tokens.csslayout.csscomponents.css
:root {
  --space: clamp(1rem, 2vw, 2rem);
  --ink: light-dark(#111, #eee);
}

.card {
  padding: var(--space);
  color: var(--ink);
}
repainted

01 platform

Writing a stylesheet, not styling a snippet

A single CSS box is fine for one rule. Everything that makes a stylesheet maintainable — splitting it, importing it, sharing tokens — needs real files.

  • Several stylesheets, imported properly

    tokens.css, layout.css, components.css with @import or separate <link> tags. One file stops being workable around the two-hundredth line.

  • Custom properties that cascade for real

    A :root token block inherited by everything below it behaves as it does in production, because the preview is a real document rather than a scoped fragment.

  • Preprocessors when you want them

    SCSS, Sass and Less compile in the tab through Dart Sass. Nesting and mixins are available without a watcher, and plain CSS stays an option.

  • The repaint is instant and partial

    Changing a rule repaints without a reload, so the element you were looking at stays put and any open state survives.

02 deep dive

The features that replaced the old workarounds

CSS changed more in the last three years than in the decade before it, and most of what people still work around is now native.

Native nesting works everywhere current. The & selector is supported across modern browsers, which means a lot of projects no longer need a preprocessor at all — worth knowing before adding a build step.

light-dark() and color-mix() remove a whole layer. Theming that used to need two token sets and a class toggle is now one declaration.

Container queries scope to the component. A card that reflows because it is narrow, rather than because the viewport is, is the model most design systems actually wanted.

:has() styles a parent from its children. That removes a category of JavaScript that existed only to add a class to an ancestor.

nesting
native, no build
theming
light-dark()
queries
container + media
selectors
:has(), :is()
components.css
.card {
  container-type: inline-size;

  & .title { font-weight: 600 }

  &:has(img) { padding-block-start: 0 }
}

03 features

What ships with a CSS project

Everything below is active the moment the editor opens — no plugin to choose and no configuration file to write.

  • Autocomplete for properties and values

    Properties with their valid keywords, so a half-remembered value is a suggestion rather than a documentation trip.

  • Dart Sass in the browser

    SCSS and Sass compile client-side with no watcher. @use and @forward work across files.

  • Less, on the same path

    Less compiles alongside, so an existing project using it opens without conversion.

  • Device frames for breakpoints

    Check a media or container query at real device dimensions rather than a resized window.

  • Find and replace across files

    Rename a class used in four stylesheets with one regular expression rather than four passes.

  • Fonts and assets in the project

    Drop a .woff2 in, @font-face it, and the preview uses it — the only way to judge how a face actually sets.

04 ecosystem

A project that mixes languages

A stylesheet can sit beside a React component and a Python script; XCODX picks the right handling per file rather than per project.

  • React
  • Vue
  • Angular
  • Svelte
  • SolidJS
  • Lit
  • HTMX
  • Vite
  • TypeScript
  • JavaScript
  • HTML
  • CSS
  • SCSS
  • Less
  • Pug
  • Tailwind
  • Bootstrap
  • Vuetify
  • Ant Design
  • shadcn/ui
  • Phaser
  • Node.js
  • Python
  • Java
  • C++
  • C#
  • Go
  • Rust
  • Ruby
  • PHP
  • Kotlin
  • Swift
  • SQL
  • Bash

05 languages

Every language the editor styles

Highlighting and IntelliSense cover 70+ languages. These are the ones XCODX also compiles or executes for you.

Compiled in your browser11

Zero build step. Transform runs on a Web Worker, so typing never blocks.

  • JSX
  • TSX
  • TypeScript
  • Vue SFC
  • Svelte
  • Angular (JIT)
  • SolidJS
  • SCSS
  • Sass
  • Less
  • Pug

Rendered natively8

Straight to the live preview, no transform in the way.

  • HTML
  • CSS
  • JavaScript
  • JSON
  • Markdown
  • Jupyter (.ipynb)
  • SVG
  • YAML

Executed on demand22

70+ languages run through a self-hosted Piston engine. stdout, stderr, images and tracebacks land in the console.

  • Python
  • Java
  • C
  • C++
  • C#
  • Go
  • Rust
  • Ruby
  • PHP
  • Kotlin
  • Swift
  • Lua
  • Scala
  • Perl
  • Haskell
  • Elixir
  • Dart
  • R
  • Julia
  • SQLite
  • Bash
  • PowerShell

06 questions

CSS on XCODX — common questions

The questions that decide whether this fits your work.

How is this different from the HTML playground?

The playground is for trying a layout — grid, flexbox and container queries, one idea at a time. This is for writing and maintaining stylesheets: several files, shared tokens, imports and a preprocessor. Same editor, different job.

Do I still need SCSS now that CSS has nesting?

Often not. Native nesting works across current browsers, and color-mix() and light-dark() cover much of what variables and functions were used for. SCSS still earns its place for loops, @use across many partials and large mixin libraries — and it compiles here either way.

Which Sass compiler is this?

Dart Sass, the reference implementation, compiled to WebAssembly and running client-side. Nesting, variables, mixins, @use and @forward all behave as they do locally.

Can I split my CSS across several files?

Yes, and you should past a certain size. Use @import or separate <link> tags — both resolve, because the preview serves a real directory rather than concatenating text areas.

Can I test container queries and :has()?

Yes. The preview is a real browsing context, so anything your browser supports works — container queries, :has(), light-dark(), view transitions and the rest.

Can I check a breakpoint at phone width?

Yes, in real device frames rather than a resized window. Pixel ratio and pointer type are matched, which is where hover-only styles reveal themselves as unusable on touch.

Can I use custom fonts?

Yes. Upload a .woff2 into the project and reference it from @font-face with an ordinary relative path. It exports and commits with everything else.

Is it free and does it need an account?

Free, and no account. Projects live in your own browser rather than on a server, which is also why editing and previewing keep working with no connection.

Do I need to install anything to use XCODX Studio?

No. XCODX Studio is a browser-based IDE — the editor, the compilers and the preview all run client-side. There is no download, no package manager to set up and no configuration file to write. Opening the editor is the whole setup step.

Where is my code stored?

In your own browser. Projects, file history and Git objects live in local storage on your device and are never uploaded to a server. That also means XCODX works offline: it is a Progressive Web App, so you can install it and keep coding with no connection.

Is XCODX Studio free?

Yes. The editor, the live preview, the 70+ language runtimes, npm installs, Git and the integrated terminal are all free to use.

Can I use XCODX on a tablet or Chromebook?

Yes. The editor is a responsive web app, so a Chromebook, an iPad or an Android tablet gets the same compilers and the same preview a laptop does — there is no desktop-only build, because there is no build to install at all. The layout adapts to the screen rather than shrinking a desktop UI into it.

Can I export a project or move it to my own machine?

Yes. Export the whole project as a zip with its folder structure intact and open it locally, or commit it and push. It is ordinary source on disk from that point on — no proprietary format and no lock-in, which is also why importing an existing repository from GitHub works the same way in reverse.