What rem actually is
A rem is a multiple of the root font size: the font size on the html element. Browsers start that at 16px, so 1rem equals 16px until something changes it. That’s the whole idea: instead of fixing a length at a number of screen pixels, you express it as a multiple of one shared size, and everything written that way moves together when the root size does. A user who raises their default text size in their browser settings changes that root, and every length in rem follows.
The conversion
The maths is one division: rem = px ÷ root font size. With the default 16px root, 16px is 1rem, 24px is 1.5rem, 10px is 0.625rem and 1px is 0.0625rem. If your project sets a different root size, put it in the base font size box and every result, and the table of common sizes, recalculates. Numbers that don’t divide evenly are rounded to four decimals, which is more precision than a screen can show.
What to convert, and what to leave alone
Rem earns its keep where things should scale with text: font sizes, line heights, padding and margins around type, the width of a text column. It’s a poor fit for details that are meant to stay fixed. A one-pixel border converted to 0.0625rem can render blurry or vanish at some zoom levels, so it’s usually kept in px, and shadows and outlines follow the same logic. The stylesheet converter has a checkbox for exactly this: with it ticked, anything 1px or thinner is left as it was, and everything else is converted.
Media queries are different
A breakpoint written in rem doesn’t use the root font size you set. Inside a media query, rem always refers to the browser’s default size, whatever your stylesheet says. That makes a converted breakpoint behave differently from the rem values around it, so the stylesheet converter leaves media and container query conditions exactly as they are. If you want breakpoints that respond to the user’s text size, that’s a deliberate choice worth making by hand.
Converting a whole stylesheet
Paste CSS into the converter and each px length is rewritten in rem at your chosen base. It understands the difference between a length and something that only looks like one: comments, quoted strings, url() paths and names like --size-10px are left alone, and 0px becomes a plain 0. The line under the boxes tells you how many values it changed, so you can see at a glance whether it found what you expected before you copy the result.
Nothing leaves your browser
There is no server involved. The conversion is simple arithmetic that runs in the page as you type, so neither a single value nor a whole stylesheet is ever sent anywhere.