Skip to content
Dev Tools Article

Why a Windows 98 CSS File Keeps Topping Hacker News

Four front-page runs in six years — 98.css endures because it's a real design system, not a gag.

Lenn Voss
Lenn Voss
Cloud & Infrastructure Writer · Jul 24, 2026 · 4 min read
Why a Windows 98 CSS File Keeps Topping Hacker News

A 27 KB CSS file hit the front page of Hacker News again this week — 535 points and counting. That would be unremarkable except that 98.css launched in April 2020, when it pulled 838 points, then did it again in 2022 (606 points) and 2024 (471). Almost nothing resurfaces on HN four times without shipping a single new headline feature. Jordan Scales' pixel-faithful recreation of the Windows 98 interface keeps coming back because it's not really a nostalgia gag. It's one of the best small design systems you can read, and every couple of years a new cohort of frontend developers discovers that.

Windows 98 was a design system before we had the word

Here's the thing the retro framing obscures: the Windows 98 UI was a complete, ruthlessly consistent component library. One typeface at one size, a 20-color-friendly palette, and a single trick — light-source bevels — applied identically to every button, scrollbar, tab, and title bar in the operating system. Microsoft solved the problem modern design-system teams still struggle with: every control, one look, no exceptions.

98.css ports that system with obsessive fidelity. Scales built it during a burnout break from Stripe, running a Windows 98 VM on one monitor and a text editor on the other, measuring pixels and recreating icons in Figma. Crack open the stylesheet and the whole aesthetic turns out to be stacked inset box-shadow declarations — #fff and #dfdfdf on the top-left, grey and #0a0a0a on the bottom-right — with zero images for any control chrome. Text renders in a bundled "Pixelated MS Sans Serif" webfont at 11px with font smoothing switched off. Pressed buttons invert the bevel and nudge the label a pixel down and right, exactly like the real thing. It's a masterclass in doing a lot with box-shadow, and it's short enough to read in one sitting.

The bet that aged well: zero JavaScript

The design decision that actually explains the longevity is architectural. 98.css contains no JavaScript at all. It styles semantic HTML — real <button>, <input>, <label>, <select> elements, plus a handful of class conventions like .window, .title-bar, and .status-bar — and stops there.

In 2020, at peak everything-is-a-React-component, that was a contrarian call. Component libraries of that era fused appearance and behavior into framework-specific packages, which is why so many of them have since been through breaking rewrites or quietly died with their framework version. A pure stylesheet has no framework to churn against. The file that topped HN this week is v0.1.21, published to npm in April 2025, and it works identically in React 19, Svelte, or a static HTML page — which is precisely why it can keep resurfacing unchanged.

It also anticipated where the platform went. Six years later, native <dialog>, the popover attribute, and increasingly customizable form controls have made "style the platform instead of replacing it" a mainstream position rather than a purist one. 98.css was an early, extreme proof that a UI kit which feels complete can be nothing but CSS on native elements.

Using it for real

Adoption is a single tag — <link rel="stylesheet" href="https://unpkg.com/98.css"> — or npm install 98.css if you'd rather bundle it. What you get is every visual: windows, title bars, tree views, tabs, sliders, progress bars, status bars, group boxes. What you don't get is behavior. Windows don't drag, tabs don't switch, dropdown menus don't open. You wire that yourself in whatever framework you already use, which in practice takes an afternoon and is a feature, not a bug: the library never fights your state management.

The honest trade-offs: 11px type and 23px-tall buttons flunk every modern touch-target guideline, there's no responsive layer, and there's no dark mode (Windows 98 didn't have one; fidelity cuts both ways). This is a desktop-viewport aesthetic. Where it shines is internal tools, admin panels, hackathon demos, and marketing moments — Scales himself built an AOL Instant Messenger simulator with it, and it's shown up in commercial Y2K-flavored projects. An internal dashboard people actually smile at is worth more than most engineering managers will admit.

Maintenance-wise, this is "done software" in the good sense: stable releases, commits through late 2025, and an unusual stewardship model where Scales grants commit access to contributors who land a solid PR — an approach he credits to John Resig. The MIT-licensed repo sits at about 11,300 stars.

The genre it spawned

98.css also seeded a whole lineage: XP.css (around 3,000 stars) and 7.css (2,400, updated as recently as this spring) forked the concept forward through Microsoft's design history. Retro OS chrome is now a recognized genre of web design, and this file is its reference implementation.

So: genuine or hype? Neither, exactly — it's finished. And that's the real lesson worth taking from its fourth trip up the HN front page. The industry default is design systems that span dozens of packages, ship breaking changes annually, and still can't keep a button consistent across products. Here is one that achieved total consistency in 27 KB of CSS by copying a 1998 operating system, and it hasn't needed a rewrite since. If you're starting a design system this year, read this stylesheet before you read anyone's monorepo.

Sources & further reading

  1. 98.css - A design system for building faithful recreations of old UIs — jdan.github.io
  2. jdan/98.css — github.com
  3. Reflections on 98.css — notes.jordanscales.com
  4. Behold the Windows 98 CSS file — theregister.com
Lenn Voss
Written by
Lenn Voss · Cloud & Infrastructure Writer

Lenn writes about cloud platforms, Kubernetes internals, and the infrastructure decisions that quietly make or break engineering organizations. Based in Berlin's vibrant tech scene, they have a talent for turning dense platform-engineering topics into prose that people actually finish reading.

Discussion 5

Join the discussion

Sign in or create an account to comment and vote.

Will Carter @weekend_warrior_will · 2 weeks ago

been sitting on this for a while but never actually dug into the source—is the 98.css approach (inline styles + class selectors) something you'd actually use for a production project or is it more of a reference implementation? curious how it scales past the retro demo stuff.

Oleg Petrov @db_nerd_oleg · 2 weeks ago

totally get why this keeps resurfacing — i spent two weeks last year debugging a schema migration that got tangled up partly because our team's design system docs were scattered across three wikis, and then i looked at 98.css and realized it's just... coherent. every component has a clear spec, the constraints are explicit, no ambiguity. that's what actually matters in a design system, whether you're styling buttons or designing storage layouts.

Marco Bianchi @shipfast_marco · 2 weeks ago

the constraint forcing readability here is real. we shipped a design system at my startup that bloated to 200kb before we gutted it back to essentials, and yeah—people still reach for those old files. turns out when you can't hide behind abstractions you actually have to think about what you're building.

Russ Holloway @devops_dadjokes · 2 weeks ago

that's the whole thing right there. constraints breed clarity. 98.css is basically a masterclass in 'what if we just... didn't add more

Rashid Patel @rashid_patel · 2 weeks ago

that's the thing though—how do you know when you've actually hit the essentials? 98.css got there by copying something with hard constraints from 20+ years ago, but most of us just guessing. did you find specific metrics that helped you decide what stays vs. what's cruft, or was it mostly pushback from your team saying 'why is this here'?

Related Reading