Top stories

Live mirror
30 storiesupdated 0s agoView source snapshot
  1. Introducing System One Models and Jev(typesafe.ai ↗)
    179comments
  2. Show HN: An e-ink frame that hears birds and draws them as 1800s illustrations(github.com/arnegiacomo ↗)
    158comments
  3. German Rheinmetall open-sources its Battlesuite connected weapon system protcol(rheinmetall.github.io ↗)
    13comments
  4. An Update on Wayback Machine Access(blog.archive.org ↗)
    163comments
  5. Jean-Pierre Serre is 100 years old today(st-andrews.ac.uk ↗)
    10comments
  6. Gemini 3.8 Live and 3.8 Live Extended Thinking(blog.google ↗)
    158comments
  7. We got admin access to Baseten's production GitHub in 25 minutes(strix.ai ↗)
    89comments
  8. Building a Linux GPU Driver for the M4 Mac Mini in One Month(codyho.dev ↗)
    35comments
  9. Chopping up books when they're physically too big(mattkirkland.com ↗)
    80comments
  10. WangNet – 1.8 MB, zero-dependency Numberwang adjudication in 11 languages(github.com/graafhenk ↗)
    29comments
  11. I can't stop thinking about Papua New Guinea(notnottalmud.substack.com ↗)
    408comments
  12. Why I'm still bearish on LLMs after Navier-Stokes(dank.systems ↗)
    4comments
  13. Data races and the limits of ThreadSanitizer in C and Go(theconsensus.dev ↗)
    1comments
  14. Show HN: Capsule – Single-file web apps that save their data into SQLite(withcapsule.app ↗)
    112comments
  15. Vibe Coding is the new Internet Dating?(joecmarshall.com ↗)
    35comments
  16. GEFS on OpenBSD: A Early Preview(marc.info ↗)
    49comments
  17. Let's make quality the norm again(forbrukerradet.no ↗)
    279comments
  18. Jiga (YC W21) Is Hiring Product Engineer (Remote/US)(jiga.io ↗)
    discuss
  19. Learning to solve hard problems in RL for LLMs by never giving up(mnoukhov.github.io ↗)
    discuss
  20. The CSS Zen Garden dream, finally shipped(josprague.com ↗)
    54comments
  21. Suspected sabotage causes major Netherlands rail disruption(bbc.com ↗)
    376comments
  22. A single firm is behind OpenAI, Anthropic, and Meta hacking scandals(effort.news ↗)
    133comments
  23. Show HN: Hacking a $20 4G wireless hotspot into a texting device(bkovac.github.io ↗)
    30comments
  24. Cartesian – AI 3D Modeling for Design(formas.ai ↗)
    66comments
  25. Show HN: Pizza Bot – An inbox for AI agents that work in the background(github.com/pizza-bot-app ↗)
    2comments
  26. The Inference Hardware Revolution of 2026(ieee.org ↗)
    9comments
  27. Most people prefer traditional architecture(worksinprogress.news ↗)
    184comments
  28. US confirms for first time it has deployed space weapons(bbc.com ↗)
    291comments
  29. 25 years of mass surveillance is enough(schneier.com ↗)
    270comments
  30. Giving up on smart rings(notesbylex.com ↗)
    133comments

The CSS Zen Garden dream, finally shipped

110 pointsby 8h agojosprague.com
53 comments
8h agoHN ↗

Author here. Like a lot of people on HN, Dave Shea's CSS Zen Garden is how I learned CSS in the first place. Building stylesheets for that one HTML file taught me to think about CSS as a system, and it stuck. Nearly two decades later I got to build the design system for the new Firefox.com together with a team from Lincoln Loop, on a contract engagement with Mozilla using pure, modern CSS with no preprocessors (almost). In the end, we did run a few things through preprocessors for performance reasons, but the site's CSS is fully authored in pure CSS syntax.

Happy to answer questions about the layered CSS, the legacy browser fallback, how the tokens got exported from design files, or anything else you're curious about.

5h agoHN ↗

Is the code open source? It‘s not part of the protocol design system?

2h agoHN ↗

I too was strongly inspired by the ideas that CSS Zen Garden was promoting, even if little to none of the real world work looked or worked like that.

Always weird to see what posts really bring out the negativity on HN, but pay that no mind. Some people can't stand others being happy (and some are just having a bad day...)

Be proud of what you accomplished and it must feel great to have contributed to something like Firefox!

7h agoHN ↗

Yes! Thank you. I linked to the site from my post as well. This is a great resource for anyone currently learning CSS.

6h agoHN ↗

This was the site shown to me to prove the separation of style and content. After that it was CSS-Tricks that I found myself frequently reading for answers to the things I was stuck on getting the layout to work.

3h agoHN ↗

Dave's old portfolio/blog is gone though: http://www.mezzoblue.com

The Bright Creative site is also AWOL.

Too bad neither is set up to redirect to the current https://daveshea.com/

Hope he's doing well. Guys like him, Doug Bowman, Jeffrey Zeldman... all a huge influence on teenaged-me hacking away on my little blog and thinking of going to SXSW someday.

EDIT: He's just left after being at Shopify for six years: https://lnkd.in/p/dcYBvQfq

6h agoHN ↗

There’s one honest footnote.

I'm so tired of AI writing

6h agoHN ↗

It's a pity. Spending so much time to ship the CSS dream (clean, well-thought-out) and then using AI-talk to share it with the world.

6h agoHN ↗

Came here to say the same. I closed the window on the spot. I don't even care if I miss out on something.

5h agoHN ↗

I don't think these people realize how much damage they are doing to their reputations.

5h agoHN ↗

AI loves an adverb. Even the title feels AI to me.

4h agoHN ↗

"Honest" is not an adverb though? It's an adjective, the adverb would be "honestly".

4h agoHN ↗

The below is a selected copy of the blog post, unbelievable that it didn't get unslopped:

[..] , and on a site like this one that matters more than architectural purity. [..] Nothing in it depends on a build step [..] That distinction is worth keeping in mind [..] What matters is [..]

4h agoHN ↗

And the entire analogy is incoherent.

And how all six people links are to LinkedIn, when most of them have websites. (Wouldn’t surprise me if some of the LinkedIn profiles were incorrect, but since you can no longer view anything on LinkedIn without having an account…)

2h agoHN ↗

I get the sentiment, but what if it was the difference between not getting the thoughts out there and being able to celebrate the fruits of their labor?

It's okay to exercise nuanced views (as well as choosing to say nothing.)

1h agoHN ↗

    what if it was the difference between not getting the thoughts out there and being able to celebrate the fruits of their labor?

I'm sure I don't know what implausible hypothetical scenario to which this could refer.

The "difference" is that of spending five entire minutes proofreading the output. But this blog post, like the other 98%, is once more the tasteless fruit of very, very little labor. Whether you value it or not, whether you are even able to recognize it anymore, writing for an audience is a skill.

I (and probably GP) feel legitimate dismay when I read the output of someone who had an obvious opportunity to exercise good taste for the benefit of the people who actually take the time to read it.

The continued inconvenience to you of reading opinions like this is obviously extremely unfortunate.

38m agoHN ↗

Maybe they ARE lazy. Maybe they are unapologetically bullish on AI AND they did it just to spite the haters.

But it’s also possible that they have other, more important stuff going on in their life? Or that they find writing legitimately difficult?

I’m not excusing anything, or saying that you can’t feel dismay or even sickened.

I was merely proposing another perspective, that’s all.

29m agoHN ↗

Mostly, I have other, more important stuff going in my life. I did write a lot of this post myself, but used AI to flesh out some of the details because otherwise between my perfectionism and tendency to overthink blog posts, I would have never gotten around to publishing this.

6h agoHN ↗

good good but are there really websites with 2 or more variously different designs for the same content, like Zen Garden did?

3h agoHN ↗

For some reason this is a thing on almost every private torrent tracker

6h agoHN ↗

Do they have the design system open source somewhere?

5h agoHN ↗

Considering the post ends with a link to the author's consultancy page, I'm guessing not.

If your team is rethinking its front-end foundation, get in touch.

6h agoHN ↗

I tried some of the examples. The UX for seeing the different designs is terrible.

1. Go to site

2. Visually scan the page for the style controls

3. Click one

4. Everything changes

5. Visually scan the page for the style controls etc.

I dont want to visually scan every time I change the stlye.

https://csszengarden.com/216/

5h agoHN ↗

That non-CSS swappable layout is much better

5h agoHN ↗

The current firefox.com is incredibly simple, though. It's also pretty tablet/phone centric (everything is so large on Desktop).

5h agoHN ↗

The CSS Zen Garden worked because everyone was using a single markup file. In real life, it doesn't really work.

Instead of thinking of separation of concerns as a religious principle, think about what benefits it actually yields in the case of HTML.

When the markup is completely separated from its styling, this means that the CSS rules need a way to be mapped onto the DOM. This involves specific elements, organized a specific way. If anything is out of place in the markup, the properties may not apply as intended. Similarly, if the CSS doesn't account for DOM structures, then you need modify rules or add new ones.

This way of mapping is an implicit structure. It's something extra that's required, beyond the source code that's there. It can be computed by the browser, but it's not explicitly stated for a developer looking at the code to understand.

Contrast this with Tailwind, Tachyons, etc., where nearly all the structure is explicit, less complex, discoverable, and out in the open.

Hidden structure looks nice to the developer. The code "looks" clean. But understanding a code base's implicit structure is ephemeral, and there's inherent technical debt that will need to be repaid later.

Tailwind looks ugly, but there are no hidden abstractions or structures in the code, beyond its easy conventions and a minimal config file.

And, yes, there are ways to make high-abstraction CSS work, say, with a component library of known DOM patterns. But at that point, why not build the styles into the components directly, a la Tailwind, instead of adding complexity?

4h agoHN ↗

I also dont think you can cleanly separate HTML and style. Technically you can separate them but doing so in practice just handicaps your design and ability to express things in HTML and CSS (Zen Garden prohibiting css 3+ in most cases).

People have this idea that they should be decoupled. You can do that if you really contort them. Naturally, they are coupled.

The structure of HTML puts constraints on the style. You have to know about the style when writing HTML, even in this Zen Garden project. You can't escape the style and HTML understanding each other. If you have a compelling reason to make a broad range of styles swappable then OK - but you are constraining the design space considerably and there is usually no reason for this complexity and reduction in expressiveness.

The document and the style depend on eachother. You see this with localization. You might need to change spacing or padding or breakpoints to accomodate different languages (text being different length in different languages).

This is why all UI paradigms tightly couple style and structure. QT, GTK, SwiftUI, Flutter, etc. Its the same with CSS/HTML except for people who delude themselves into thinking these were supposed to be loosely coupled.

4h agoHN ↗

Couple them how you want, HTML+CSS+JS is the system we've got, and it has to render well on mobile, tablet, and desktop. "deluded" and "supposed to be" are just word barriers that get in the way of doing shit that works.

3h agoHN ↗

The dream was that you could separate content from presentation and content could be adapted and reinterpreted by anyone using whatever tools they choose: User Agents that actually respected the users' vision, not the publishers'.

40m agoHN ↗

And accessibility.

The posts above claiming design and content are inextricably linked are probably blessed with all the standard senses.

As usual it's a bunch of folks talking past each other. Style and content together is a nice simplification when you want to conform to a particular vision. Separation is a nice abstraction if you want to enable multiple views of the same content (like a pdf version or a colorblind version or a vision impaired version) without having to change/control the content.

Like most things in this space, different tradeoffs make one better than the other in different scenarios. Taking a hard stance of "one true way" is probably missing some imagination or experience.

3h agoHN ↗

The document and the style depend on eachother.

I’d previously understood the relationship to be that the document could remain unchanged, whilst the style (including visual structure/layout) changed. The simplest canonical example is that you can change the font, and all the words and meaning remain unchanged.

You see this with localization. You might need to change spacing or padding or breakpoints to accomodate different languages (text being different length in different languages).

This is a really intereting case. Strictly I’d say it was a different document, if the language has changed. Really good translations change idiom, which can change meaning, and words, at the level of ohraes, although the intent would be preserved.

But I’m nit-picking, being contrarian, or exploring the edges of your comment.

Today, many web documents are app GUIs. Each field is essentially the same “thing” regardless the languge of its label. And in that sense, these are the same document, and your point holds.

I still think that if you can keep the markup as minimal as possible (reduce the div nesting to just what’s require to mark up logical sections of the content), then you could make a good stab at Zen-gardening your design. It’s very hard to do, however.

1h agoHN ↗

The real divide isn’t separation of concerns or implicit vs explicit structure. It’s whether you have staff that wants to think about markup as a data format expressing domain entities and/or generalization of presentation concerns.

Most developers and organizations don’t want to and they don’t want to think why or what doing so would buy them. They will probably find the tailwind local maxima enabling that reasonably comfortable and may even repeat the familiar mantra as has been done here. It especially pairs well with unreflective product management, which is the most popular kind of product management.

5h agoHN ↗

Oh yeah. The fucking CSS Zen Garden. It started the trend that led to utter degradation of any usability in modern web interfaces. The idea was to make HTML decoupled from presentation, but the feeble CSS of that time could not express any real layouts.

So very quickly web designers started to just hard-code pixel widths into the CSS, removing any dynamic sizing.

For example, on this very page: https://csszengarden.com/ the two-column layout is done by using two overlapping DIVs with a padding on the left one. You could do 3 columns by using the same trick with left padding.

Want to do four columns? Tough. You'd better redesign your whole HTML for that to work. Or just hardcode the sizes.

Of course, this quickly led to interfaces where buttons have text that is cut off. But with lots and lots of useless whitespace padding around them.

2h agoHN ↗

Umm... this is disingenuous. At the time, most websites were built using tables and were completely non-accessible. One of the reasons we moved to XHTML, semantic markup, CSS instead of Tables... was to enable accessibility.

2h agoHN ↗

No, it's not disingenious. Tables _were_ accessible and easily navigable, including by screen readers. They are also a very logical way of organizing content.

One of the reasons we moved to XHTML, semantic markup, CSS instead of Tables... was to enable accessibility.

Again, nope. Try a design with 3-4 columns with the old CSS and see how it behaves. The order of elements in the HTML often differs from the visual order, confusing the readers.

It also breaks tab-navigation, even the https://csszengarden.com/ has the "View All Designs" button that is inaccessible.

Then add absolutely-positioned headers and other popular CSS patterns.

1h agoHN ↗

tables are a very logical way of organizing _tabular_ content. they're a terrible tool for layout, accessibility wise

1h agoHN ↗

No, they're not. They are _perfect_ for layouts, as they naturally support "move left/move right/up/down" directions.

To this day, this is STILL not working well for DIV-based designs.

19m agoHN ↗

I remember tables within tables within tables. Were those really accessible? The humans writing that html couldn't always keep it straight

4h agoHN ↗

The postprocessor remains to fix some performance issue with @import? How does inlining imports fixes it? When I loaded the page, the font flickered.

Perhaps the article isn't about font import, those better be in html headers or simply stick to system fonts.

4h agoHN ↗

I still remember being like 15 years old and seeing my website(s) land on CSS Zen Garden, CSS Thesis, etc... using Mint analytics (throwback! shoutout to @shauninman) to see all the inbound traffic. What a time to be alive.

4h agoHN ↗

I see no connection whatsoever with the CSS Zen Garden dream. CSS Zen Garden was about applying radically different styles to the same markup. This is about newer CSS features like Custom Properties, Flex and Grid making maintenance of a single stylesheet for a single completely typical website.

4h agoHN ↗

This is really great work, but I think a lot of folks on HN don't look kindly on the CSS Zen Garden or that era of CSS. They think the markup/stylesheet separation of concerns was a terrible idea, an idea that Tailwind exists to fix. (I think they're wrong, that separation of concerns is good, Tailwind is a hack, and get off my lawn while you're at it.)

The point is - now the modern vanilla web platform really can support first-class CSS-styled app components, from design systems, in production. This is really cool!

HTML and CSS were originally designed as document-oriented languages for digital document display; think MS Word or PDF with cross-document hyperlinks, and not an app SDK. The idea was simply "style your web site's titles, headings, paragraphs, footers, etc. in just one place; change it there and the whole site will update". That's the dream that CSS Zen Garden was meant to showcase. Interactivity and web apps came later, and CSS has taken a very long time to catch up.

But catch up it has, and I'll be glad when frontend web development sheds Tailwind and React in favor of the updated vanilla web platform; and I won't complain if we use super light web component libraries like Lit[0]).

[0] https://lit.dev

3h agoHN ↗

CSS Zen Garden in the era of agentic software development.... I would say we're at a point where if the entire site was developed in tables or CSS or a Rust based engine emitting wasm positioned elements - no one would care anymore.

Just give me a view and let me operate on things. We're going to have our "LCARS" moment soon. Where no one really needs to create a UI - the system creates one for you at time of use - based on what you're looking at and doing. We're no longer going to need UI/UX, everything will adapt to the person using things.

3h agoHN ↗

People say stuff like this and just... do you never think about accessibility? Have you never experienced stuff changing the UI under your feet and how incredibly annoying and flow-breaking it is?

It reminds me of people wanting Hollywood UIs that would obviously suck to actually use. Just completely ignoring the reality of using what you are suggesting.

2h agoHN ↗

People with AI Delusion Syndrome don’t really concern themselves with reality or other people. They’ve literally lost the plot in life under a grand delusion of corporate bootlicking.

1h agoHN ↗

On Chrome, Android, when I bring the menu up, and scroll to the bottom, the Newsletter menu item is cut off (I know it is there as I can see it on Firefox Android).