explain-interface
Answers how was this built about an interface. Give it a URL and name the thing you're curious about, and it reads the layers that produce the effect. Reads the whole frontend instead when you don't name a thing. From a screenshot it reconstructs rather than reads and says so.
Install
npx skills add https://github.com/jakubkrehel/skills --skill explain-interfaceReading a site without a browser
Fetch the HTML, then the stylesheets it links, then grep. That answers most questions a scriptable browser answers and a few it cannot.
Do not use a markdown-converting fetch for this. It strips exactly what you came for, so fetch the raw bytes. Work in a temporary directory, never in the user's project.
Pull each stylesheet the same way into style.css, resolving protocol-relative and root-relative hrefs against the page's origin first.
Utility CSS is self-describing
Where the site uses utility classes, the markup already contains the declarations and no stylesheet lookup is needed. Grep the class attribute for the effect:
A class list carries every responsive and state variant at once. blur-[50px] md:h-214 md:-translate-x-1/2 says the element changes shape at the md breakpoint.
Semantic CSS gives you a hashed class name instead, such as Hero_glow__a1b2c. Take that name to the stylesheet and grep it there.
Inline styles carry the values utilities cannot express
A multi-stop gradient is usually too specific for a utility, so it lands in a style attribute:
The stylesheet, for tokens and generated utilities
To understand a custom utility, grep its class name in the stylesheet and read the declaration whole. That is how gradient-ease-in-out turns into its mechanism, a generated stop list built with color-mix() and relative color syntax.
Stack fingerprints from the HTML alone
What this method cannot tell you
Say so rather than guessing past it:
- Paint order and what is actually visible. A declaration in the CSS may be overridden or never rendered.
- Live animation state. Whether an effect moves at all.
- Resolved values. A
remstays arem, and you never learn the pixel size.