More from Jim Nielsen’s Blog
A friend gave me a copy of the book “Perfect Wave” by Dave Hickey. I’ve been slowly reading through each essay and highlighting parts with my red pencil. When I got to the chapter “Cool on Cool”, this passage stood out. I want to write it down and share it: there was this perfect, luminous pop single by the Carpenters that just blew me away. And, believe me, the Carpenters were the farthest thing from my kind of thing. But when something that is not your thing blows you away, that’s one of the best things that can happen. It means you are something more and something other than you thought you were. I find this beautiful. I should take more time to wonder at moments of surprise I did not expect. What a beautiful thing that I can be plowing through my existence and suddenly be surprised by something outside my taste, my beliefs, even my identity, that reaches in past all those things and rearranges me. Perhaps my boundaries are more porous than I assume. In an instant, I can become something different, something more that I ever believed was possible. Just think, that ability is lying there inside all of us. I don’t have to think of myself as a walled garden but an open field. Who knows where my boundaries will expand to next. All it takes is someone walking by and tossing out a seed I would’ve never chosen to plant myself. (Tangential: I love this interaction between Jerry Seinfeld and Brian Regan talking about being “blown away”.) Email :: Mastodon :: Bluesky
Jeremy Keith, Chris Coyier, and others (see Jeremy’s post) have written about the idea of “pace layers” and now I’m going to take a stab at applying it to user interface primitives. First, let’s start with a line of reasoning: Common user interface controls — such as checkboxes or radios — should be visually and functionally consistent. This provides users a uniform, predictable interface for common interactions across various applications (turning things on/off, selecting an option from a pre-defined list, etc.). Designers and developers should use the primitives afforded by the lower-levels they’re building on. This gives application and web site users a consistent, predictable interface within their context and environment. For web designers, every person accessing your site has a particular piece of hardware with a particular operating system and design language to boot. You can build on top of those primitives, rather than re-create them yourself, which gives end users consistency within their chosen environment. For example, a radio button on one website or in one native app is the same radio button on another website or in another app. (Rather than every single website and application rolling their own radios that might be identical, similar, or drastically different.) To achieve this, user interfaces can be built in “layers” where each layer builds on top of the layer below it, providing a level of integration and consistency within its environment. And, where lower levels don’t provide primitives necessary for a user interface, designers and developers can create their own. In this world, individual websites are free to explore patterns and interactions which don’t yet exist (or are only half-implemented by lower layers). However, where a lower-level dependency exists, they can leverage it which gives end users a more consistent experience in their chosen environment while also giving designers and developers more time to focus on building UI controls and patterns that don’t yet exist. UI Primitives We Build Ourselves Are a Liability Every UI control you roll yourself is a liability. You have to design it, test it, ship it, document it, debug it, maintain it — the list goes on. It makes you wonder why we insist on rolling (or styling) our own common UI controls so often. Perhaps we’d be better off asking: What are the fewest amount of components we have to build to deliver value to our users? When creating user interfaces, you can leverage the existing controls and patterns of the layers you’re building on top of. This helps you build, maintain, and debug less because you’re using primitives built and maintained by the makers of levels below you (which are generally more stable and change less). And it helps your users because the experience of your app or website is more consistent and predictable within whatever particular hardware and operating system they’re using. Adopting UI Primitives: Addition or Subtraction When designers and developers set out to create a user interface, they have to ask themselves: Are we going to use something that already exists, or create our own? When you use a checkbox or radio control, are you adopting those controls by 1) leveraging existing APIs of lower-level layers, or 2) re-implementing them yourself? Approach (1) makes it easier for you to maintain and easier for your users to use, as it’s a pattern consistent with the shared language and functionality of their bespoke computing experience. Approach (2) does neither of these. It’s more work for you to build and maintain, and it’s more cognitive work for your users to learn yet another visual and functional variant of an otherwise standard UI primitive. An Example: The Switch Control For a long time, a checkbox was all you had on the web. So people built their own “switch” controls. Eventually, browsers got around to providing an API to the existing switch control of lower-level systems. So the question for many websites and design systems became: Do we adopt the switch control that the browser (and lower-level layers) now provide us? Or do we keep our hand-rolled switch? In this sense, there are two approaches to building a design system: Build everything that’s needed. Build only what is not already provided by lower layers (and trade variance in your system for consistency in your users’ systems). In approach (1) you build and maintain everything yourself. In approach (2) you build what isn’t provided and you maintain by deleting previous implementations now provided by lower layers. Priority Says: Brands > People In a world of layers built on top of each other, you would see updates to UI primitives change in lower levels and “bubble up” to websites. OS -> Native -> Browser -> Website -> Form control However, the world we’ve constructed with many of our websites and design systems is outside of this flow of updates. There’s the OS-level stuff: OS -> Native -> Browser And then tangential to that stream of updates is this flow, which requires manual intervention and updates: Design system -> Website -> Form control For example, if the OS changes its radios, websites only get those updates if individual design system and website owners decide to pick up those changes, leaving users’ experiences inconsistent in their chosen computing environment. In other words, the UI layering of operating systems and websites diverge from each other. We opt to make the experience of our brands primary over the users’. Whereas we could be choosing to make our brands fit into users' choices. But then we’d have to value honoring user choice over brand consistency, and I just don’t know if the world is ready for that because brands pay the bills. Email :: Mastodon :: Bluesky
Let me tell you about one of the best feelings. You have a problem. You bang your head on it for a while. Through the banging, you formulate a string of keywords describing the problem. You put those words into a search engine. You land on a forum or a blog post and read someone else’s words containing those keywords and more. Their words resonate with you deeply. They’re saying the exact same things you were saying to yourself in your head. You immediately know, “This person gets it!” You know they have an answer to your problem. They’ve seen what you’re seeing. And on top of it all, they provide a solution which fixes your problem! A sense of connection is now formed. You feel validated, understood, seen. They’ve been through what you’re going through, and they wrote about it to reach out to you — across time and space. I fell in love with the web for this reason, this feeling of connection. You could search the world and find someone who saw what you see, felt what you feel, went through what you’re going through. Contrast that with today. Today you have a problem. You bang your head on it. You ask a question in a prompt. And you get back something. But there’s no human behind it. Just a machine which takes human voices and de-personalizes them until the individual point of view is annihilated. And so too with it the sense of connection — the feeling of being validated, understood, seen. Every prompt a connection that could have been. A world of missed connections. Email :: Mastodon :: Bluesky
This is a note to my future self, as I’ve setup HTML minification on a few different projects and each time I ask myself, “How did I do that again?” So here’s your guide, future Jim (and anyone else on the internet who finds this). I use html-minifier to minifiy HTML files created by my static site generator. Personally, I use the CLI tool because it's easy to add a CLI command as an npm postbuild step. Example package.json: { "scripts": { "build": "<BUILD-COMMAND>" "postbuild": "html-minifier --input-dir <BUILD-DIR> --output-dir <BUILD-DIR> --file-ext html <OPTIONS>" } } All the minification options are off by default, so you have to turn them on one-by-one (HTML minfication is a tricky concern). Me personally, I’m using the ones exemplified in the project README: --collapse-whitespace --remove-comments --remove-optional-tags --remove-redundant-attributes --remove-script-type-attributes --remove-tag-whitespace --use-short-doctype --minify-css true --minify-js true So, for a site folder named build, the entire command looks like this: html-minifier --input-dir ./build --output-dir ./build --file-ext html --collapse-whitespace --remove-comments --remove-optional-tags --remove-redundant-attributes --remove-script-type-attributes --remove-tag-whitespace --use-short-doctype --minify-css true --minify-js true That’s it — that’s the template. What Kind of Results Do I Get? I use this on a few of my sites, including my notes site and this blog. When testing it locally for my blog’s build, I: Run a build and put files to ./build Copy ./build to ./build-min Command: cp -R build build-min Run html-minifier on build-min and compare the resulting folders in macOS finder. Here’s my results for my blog (2,501 items in ./build): Directory size: Before: 37MB After: 28.4MB Difference: ▼ -8.6MB (-23.24%) Main index.html file lines of code: Before: 1,484 After: 15 lines Difference: ▼ -1,469 lines (-99%) Main index.html file size over the network: Before: 30.6kB After: 17.6kB Difference: ▼ -13kB (-42.48%) And the results for my notes (one big index.html file): File size: Before: 1.5MB After: 1.1MB Difference: ▼ -0.4MB (-26.67%) Lines of code: Before: 25,974 After: 1 Difference: ▼ -25,973 lines (-99.996%) Email :: Mastodon :: Bluesky #html
More in design
In the heart of Bengaluru, a global asset management leader envisioned more than just a workspace—it imagined a sanctuary of...
A friend gave me a copy of the book “Perfect Wave” by Dave Hickey. I’ve been slowly reading through each essay and highlighting parts with my red pencil. When I got to the chapter “Cool on Cool”, this passage stood out. I want to write it down and share it: there was this perfect, luminous pop single by the Carpenters that just blew me away. And, believe me, the Carpenters were the farthest thing from my kind of thing. But when something that is not your thing blows you away, that’s one of the best things that can happen. It means you are something more and something other than you thought you were. I find this beautiful. I should take more time to wonder at moments of surprise I did not expect. What a beautiful thing that I can be plowing through my existence and suddenly be surprised by something outside my taste, my beliefs, even my identity, that reaches in past all those things and rearranges me. Perhaps my boundaries are more porous than I assume. In an instant, I can become something different, something more that I ever believed was possible. Just think, that ability is lying there inside all of us. I don’t have to think of myself as a walled garden but an open field. Who knows where my boundaries will expand to next. All it takes is someone walking by and tossing out a seed I would’ve never chosen to plant myself. (Tangential: I love this interaction between Jerry Seinfeld and Brian Regan talking about being “blown away”.) Email :: Mastodon :: Bluesky
Jiak Kim House, a modern Asian dining establishment adjacent to Fraser Residence River Promenade, nestled in a restored early 20th-century...
The internet reflects us. But new technologies must explore the world beyond. We’ve spent more than two generations and trillions of dollars building the internet. It is, arguably, humanity’s most ambitious technological project. And yet, for all its power to process and reflect information, the internet cannot tell us a single new thing about the physical world around us. The internet cannot detect an approaching asteroid, discover a new species in the deep ocean, or detect changes in the Earth’s magnetic field. It cannot discover a new material or invent something new from it. The internet is, fundamentally, an introspective technology; it is a mirror, showing us only what we’ve already put into it. What we desperately need are more extrospective technologies — windows into the unknown. Consider what the internet actually does: it processes and transmits information that humans have already discovered, documented, and digitized. Even the most sophisticated applications it enables — like artificial intelligence — can only recombine and reinterpret existing information about ourselves and our own creations. They cannot generate genuinely new knowledge about the physical world. (Let’s debate whether pattern recognition truly fits the bill in another pieces.) When we marvel at AI’s capabilities, we’re really just admiring an increasingly sophisticated form of introspection. So what is an example of an extrospective technology? The James Webb Space Telescope is a good one. It offers a striking contrast to the internet’s introspective limitations. While we spend billions optimizing ways to look at ourselves, Webb actually shows us something new about our universe — it shows us more of it that we’ve ever seen before. Every image it sends back is a discovery — whether it’s the atmospheric composition of distant planets, the formation of early galaxies, or phenomena we hadn’t even thought to look for. Unlike the internet, which can only reflect what we already know about ourselves, Webb is quite literally a window for looking outward. It extends our vision not just beyond our natural capabilities, but beyond what any human has ever seen before. The imbalance between introspective and extrospective technologies in our society is striking. The entire James Webb Space Telescope project cost about $10 billion — roughly what Meta spends on its metaverse project in a single year. We have more engineers working on optimizing our digital reflections than on all of our outward-looking scientific instruments combined. The most talented minds of our generation are focused on perfecting the mirror rather than opening new windows to the universe. Of course, this isn’t just about how we spend our money — it’s about our relationship with discovery itself. The internet has made us incredibly efficient at examining and reprocessing our own knowledge, but it may have dulled our appetite for looking outward. We’ve become so accustomed to the immediate gratification of accessing existing information that we’ve forgotten the importance of the long, patient work of discovery. The technologies that can actually tell us something new about our world often operate on different timescales than introspective ones. A deep ocean sensor might need years to reveal meaningful patterns. A space telescope might require decades of operation before making a groundbreaking discovery. These extrospective technologies demand patience and sustained investment — qualities that our internet-shaped attention spans increasingly struggle with. Yet these are exactly the technologies we need most urgently. As we face unprecedented environmental challenges and explore new frontiers in space, we need more windows into the physical world, not better mirrors of our digital one. We need technologies that can warn us of environmental changes, reveal new resources, and help us understand our place in the universe. As enthusiastic as I am about things like the James Webb Telescope, I’m also fascinated by how much we still don’t know about this planet. Only 26% of the ocean floor has been mapped using high resolution sonar technology. Only 5% of the ocean has actually been physically explored. It has been estimated that the ocean’s ecosystem is home to somewhere between 700,000 and 1 million unique species. The vast majority of them — greater than 60% — remain undiscovered. Isn’t it astonishing how little we know about this thing that covers 70% of our planet’s surface? What could we create to learn more about the ocean? It has to be something truly novel — something other than a better submarine. The ocean is just one place to point an extrospective technology. Think of the greatest unknowns. How many of them will be illuminated by the internet? Will the internet expand our understanding of physics, or will it document what we find by some other means? Will the internet ever be more than a catalog of discoveries? Will the internet explain the nature of time, or will it just continue to draw from our finite supply of it? The internet will remain vital infrastructure, but it’s time to rebalance our technological investment. We need to direct more resources and talent toward extrospective technologies — tools that can tell us something new about the world beyond our screens. Only then can we move beyond endless introspection and toward genuine discovery of the universe that exists whether we look at it or not.
Prime Foods is a premium brand of high-quality marbled beef, utilizing a unique approach to fattening and raising animals in...