Latest Posts (20 found)
Jim Nielsen 3 days ago

A Calendar View For My Blog

807 blog posts across 14 years. That’s how much I’ve published on my blog at the time of this writing. And here’s the question I’ve been turning over in my mind: “How do I convey that kind of volume across time in a more interesting way than a mere reverse-chronological list?” I’m not hating on reverse-chronological lists. I love my list view . I use it all the time to find stuff I’ve written. But it’s only one way of navigating and digesting all my posts. “What would be another way?” Surely there are many answers to that question. And I’ll probably be exploring them more and more over time. But I had an idea for a new view that I built out and shipped: my calendar view. It’s also just a reverse-chronological view, but it’s meant to convey a sense of posting patterns through time more than it is meant to be a good browsing experience of content. The view is simple: a calendar view of days in each year, and if I posted on a day, it gets a circle (bonus: if a post hit hacker news, it gets an orange square instead). You can click on the dots to see the names of the posts from that day (and follow the link to them, but really this view is basically to scratch an itch of mine. Because you can just make stuff for yourself, and that’s what I’ve done here. And now I’m writing about it because that means I get another little circle for today! Good job, Jimbo. Check it out Reply via: Email · Mastodon · Bluesky

0 views
Jim Nielsen 5 days ago

Have You Heard the Good News About Microlighter?

Dave Rupert wrote about shipping microlighter : a tool for handling syntax highlighting using the CSS Custom Highlights API . I saw his post the day he released it, and I had an implementation PR up for my blog by end of day. Then, like I do with so many things, I let it sit there. This is the period where my subconscious takes over. It does the work of, “How do I actually feel about that? Do I want to merge it? Do I have any regrets about what I did?” If I still want to merge it after a few days, that’s usually a good sign that I’ll be happy with the work. (Sometimes after a few days I say, “What the hell was I thinking?” and then it’s easy to simply close the PR with zero regrets.) Well it’s a few days later and I still feel good about it, so time to ship! My PR for this is pretty straightforward: Granted, there are trade-offs to this approach. I get it. Dave’s explainer for this tool on The ShopTalk Show vibed with me because I’ve been in his shoes many times: “Whoops, somehow syntax highlighting on my blog is broken again. Guess I need to fix it. Ugh. I’ve done prism , I’ve done highlight.js , I’ve done shiki . What should I do this time? Could I do this in a way that’s just less ?” He clarifies: I’m not coming at this like, “Everyone is doing it wrong!” I was just kind of like, “Could I do this in a way that suited me?” Well, this approach suites me. There’s a kind of conceptual elegance to it where syntax highlighting lives in the realm of a styling operation rather than a content transformation plus styling. In short: syntax highlighting, i.e. styling text, is a styling concern so solve it with CSS — no DOM manipulation required! Plus, I mean, how cool is it that the code on the website is the same as the code in the DOM?!? I guess this is how I know I still like working on the web, because seeing browsers do stuff like this that they couldn’t do before still feels really cool! Reply via: Email · Mastodon · Bluesky Remove dependency (and related plumbing) On paths that 1) match my post pages (i.e. ), and 2) have code on them, pull microlighter deps from a CDN and run it.

0 views
Jim Nielsen 1 weeks ago

Getting an LLM to Make Me a Tool for Enriching the Color Metadata in My Icon Collection

On my icon gallery sites , I have metadata I’ve manually added over the years to tag certain icons as being predominantly “blue” or “orange” or some other color. Then I use this metadata to present icons of (roughly) the same color. It’s kinda neat to be able to browse a wall of icons that are all the same color. The thing is: I know there are a lot of icons I’ve missed tagging over the years. But I have no idea how many, and figuring that out seems like a really arduous task. How do I go through 2,000+ icons and find all the ones that look predominantly “orange” but haven’t been tagged as such yet? Seems like a good task to throw at an LLM. But I don’t want to just say, “Go tag everything that’s missing” and blindly trust the output. I need to be able to make a decisions as to whether I think a particular color is “orange” or not. What I need is a tool for the job. I’m a very visual thinker, so to continue curating these color categorizations, I need some way for the computer to do its thing really, really fast, and then pull me into the loop to visually make decisions. Here’s how I am thinking about about accomplishing this task: That seems like it would be a good tool to put me in control of visual decision making around color categorization. So I tell the LLM to run with it. We chat back and forth. I think, “You probably need to run all the icons through some model to make the correlation?” But it’s like, “Nah bro, just make a ‘hue histogram’.” It tells me how. For a color like “orange”, I can: [process] each PNG, skip transparent pixels, skip low-saturation gray, convert the rest to HSV, and score how much of the remaining mass sits in the orange hue band (roughly 15–45°). Rank icons that don’t already have colorId: . Ok, sure. That sounds reasonable. [This] scores each icon PNG by share of opaque pixels per color bucket, then writes a standalone HTML page: tagged vs maybe-missing, per color. Let’s just make it, and then I’ll decide whether it’s good enough. After a few iterations, the computer going “brr…”, and me saying “explain that like I’m dumb”, I have a really effective little tool! The little threshold slider is a nice touch. It lets me fiddle around with the fidelity of the matches. In some cases, sliding it down reveals more icons I would’ve otherwise missed. In other cases, I’m like “What are you thinking? I don’t see that as ‘yellow’ at all!” Supper effective little tool. I go through each color, select the ones I think are missing, paste the IDs back into the LLM, and then have it update each icon's metadata. Boom, done! That all would’ve taken so long before. I would’ve never done it. Reply via: Email · Mastodon · Bluesky Create a page with a list of colors on the left (red, green, orange, blue, etc.) When a color is clicked, show two columns. 1) All icons I currently have tagged for that color, and 2) all icons that might be that color but aren’t tagged as such (you, computer, process all my icons and do the work to figure this out and make recommendations). Allow me to select one or more icon(s) in the “not yet tagged as this color” column. Once I have all the ones I perceive as missing, give me a button to say “Copy” which copies the IDs of those icons. I’ll paste the IDs back here in the chat and you go add the corresponding metadata. The LLM is good at making throw-away code. This doesn’t need to be “production-grade” code I depend on. Just something that’s good enough for me to get a job done, then toss. The resulting metadata is the goal, not the tool I use to get to the goal. The LLM is good at making one-off HTML pages for a specific task. In my case, all these images were hosted on a CDN, easy enough to just point at and have a standalone file that I can locate on my hard drive and open directly as a URL. No bundling. No transpilation. None of that. I don’t even need a web server! Keeping things very basic on this project is paying off: I had really elemental building blocks that didn’t require additional third-party tooling. Just HTML, CSS, a little in-page JS, and images on a server! It’s fun to say, “Don’t do the work for me. Instead, help me make a custom-fit tool that facilitates me doing the work in the most empowering, correct way possible.”

0 views
Jim Nielsen 1 weeks ago

A Sloppy Interface Is a Security Liability 

In his talk “Why AI Is Breaking Software Security As We Know It” ( my notes here ), Feross Aboukhadijeh talks about the Axios npm incident and how the maintainer got phished by succumbing to (amongst other things) a faux Microsoft Teams interface: this is the kind of thing that AI makes easy to do, because it can vibe code that whole fake Microsoft Teams interface pretty trivially You’ve probably seen these: interfaces designed to look like some other product in order to provide a facade of authenticity and exploit someone. What struck me in listening to Feross was this idea of how the quality of your interfaces can be a protection mechanism against attackers. I don’t know if I’ve ever heard someone say that out loud — interface and interaction design as a security control — but I’m saying it. Now, of course, not everyone will consciously notice the level of polish that world-class professionals imbue in digital interfaces. But some will. Personally, I’ve always used the quality and care of digital experiences as a heuristic for judging authenticity — and competency to be honest, e.g. “If this UI is so bad, what else will surely be bad?” Granted, it was a much more dependable heuristic before AI came along. But even now, I can still suss out slop and carelessness which is a skill that continues to be a reliable, protective form of digital literacy (for me). That’s all to say: a sloppy, careless approach to interface design not only hurts your brand in terms of customer perception, but it can be an attack vector. The easier it is to sloppily reproduce what you sloppily ship, the easier it will be for your product or brand to be leveraged as a vehicle for exploiting your customers. If everything you make was produced from a single prompt, then everyone else is one prompt away from imitating you. The easier something is to make, the more likely it’ll be in the genre of “easy to exploit”. One way to protect yourself (it’s not the only one way, security is never a binary “you are / are not secure”) is to do that extra work to make your experiences go above and beyond what you can easily get out of an LLM. The protection here is having an interface and experience that is hard to replicate with the same level of fidelity that discerning users will notice — things like micro-interactions, loading behavior, UI copy and voice, handling of edge-cases, etc. That’s the stuff that’s hard (and expensive) to fake because it’s hard (and expensive) to notice you need to fake it. tl;dr — Fidelity to craft is not only valuable from a product standpoint, but it’s also valuable from security standpoint. If attackers are going after low-hanging fruit, your fruit will be harder to reach if it’s up high. Reply via: Email · Mastodon · Bluesky

0 views
Jim Nielsen 2 weeks ago

Oh Hey, It’s Not Just Me

My whole life I’ve felt like I have great eyesight (and I still do). But lately I’ve been noticing what feels like…some slippage. Nothing big. Just this feeling in the morning like, as my brain and body wake up, my vision needs to as well. The strange novelty of this phenomenon was operating in some small part of my subconscious the other day when I was scrolling the internet and come across this post from Chris Coyier : you ever get to your mid fourties and have your eyesight drop off a friggin cliff And I’m all like: And then even more people weighed in on Chris’ thread, like “Hey me too!” This is why I love the web. I continually get that feeling of, “Oh hey, it’s not just me!” On both a personal and a professional level. And for that I’m grateful. I love being able to connect with people in a way that makes me not feel so alone (or weird) in my experience of life. In a polarized digital world, it’s good to remember that the web can still draw you to folks rather than push them away. We’ve got a lot in common. Reply via: Email · Mastodon · Bluesky

0 views
Jim Nielsen 2 weeks ago

The Fruits of AI

Terry Godier has a post titled “Mea culpa” (which, given his framing, might’ve been better titled “Claude’s Culpa”). I’m not sure how much to even trust anything in his post given the backstory , but this line stood out: I was careless in relying on AI [...] without doing the work to understand Let’s face it: carelessness is the grain of AI. It’s what the tool encourages and makes easy by default. Without constant vigilance and deliberate, active participation to cut against this grain — to maintain an understanding — careless outcomes are the default fruit of AI. And given how good humans are at being constantly vigilant and deliberate, it seems reasonable to expect more stories like this one. To analogize, AI is pitched like having your very own fruit tree. “Plant a seed, and soon enough, boom! Yummy, juicy fruit for you! So fast and easy!” But, like most things, it’s not that easy. Getting good fruit requires all kinds of effort: planting, fertilizing, watering, pruning, thinning, cutting out disease, etc. Good fruit requires cultivation and care. Otherwise you’ll just end up with something that looks like a peach, but when you (or someone else) bites into it, you realize it’s disgusting and barely edible. Reply via: Email · Mastodon · Bluesky

0 views
Jim Nielsen 1 months ago

The AI Aesthetic

Every zeitgeist comes with new design idioms unique to its challenges. Many of them disappear as fads change, but others bake themselves into deeper parts of existing software interaction paradigms. For example, there’s the hamburger menu (≡) which saw a proliferation during the rise of mobile due to the constraints around screen size. It has since spread to many other parts of software interaction design and will likely remain prevalent for a long time as a terse way of indicating “more menu-type content here”. As another example, before AI what were the connotations of the sparkle emoji ✨? Personally, I don’t know, but now it means AI. (AI = sparkles and rainbow colors — it’s funny when you think about it. They should’ve just thrown unicorns in there for the trifecta. AI = sparkles, rainbows, and unicorns ✨🌈🦄. Apt.) Some patterns are very specific to the interactions inherent to the nature of AI as a technology. For example: streaming text. This is a pattern made for and refined by chat interfaces, so it may not have tons of utility for reuse across other software interaction paradigms. Then there are other patterns that’ve been refined by AI interfaces and are starting to spread to other places in software. For example, the “shimmering text” which in AI land implies a kind of “thinking” but is being repurposed to indicate any kind of asynchronous task (thinking, fetching, computing, etc.). Then there are other influences my subconscious is picking up on. For example, a lot of AI apps use tiny icons. These are most obvious (to me) in desktop Electron apps because they clash with the system-level grain of applications . Take a look at this screenshot, where you have desktop AI apps on the left (Claude, Codex, Cursor) and macOS apps from Apple on the right (Finder, Photos, Mail). You can see how the AI apps all have much smaller, thinner icons than their native counterparts. Are tiny icons our collective future in interfacing with computers? (Personally, I hope not.) There are other aesthetics my brain associates with AI, like beige/cream colors, orange accents, and serif typefaces as well as whack-a-mole UI controls (you know, the ones where you click the toggle and the entire UI repaints and you have to move your mouse somewhere else in the UI to click the toggle again? The non-determinism of AI’s grain has seeped into its UI/X). It all makes me wonder what other aesthetics are being born out of this AI moment and how many will spread, take seed, and become part of common software interaction paradigms for years or decades to come? Reply via: Email · Mastodon · Bluesky

0 views
Jim Nielsen 1 months ago

Can the Tide of AI Investment Lift All Boats on the Web?

Jason Grigsby has a great article where he surfaces an opinion from the Safari team about how AI agents shouldn’t get special treatment: An agent acting on a user’s behalf is, in effect, assistive technology : it should operate a site as the user would, and the site should not single it out for different treatment. Jason synthesizes different discussions happening at standards levels to argue, in essence, that agents should be required to use existing technologies and solutions (APIs, semantics, etc.) rather than get their own bespoke ones. And where there are gaps in the platform, solutions should be centered around closing those gaps generally for everyone (vs. specifically for agents). Imagine that! Take the billions being invested in AI and funnel it towards improving and enhancing the existing technology agents already use and profit from. No bespoke solutions just for AI, but generalized solutions everyone can benefit from. In other words: allow the rising tide of AI investment to lift all boats in the platform because the web is for everyone. As Jason says: If we’re solving this problem for AI, perhaps we can find a solution that works for end users too. His suggestion being that maybe we should frame AI needs in the web platform the same way we do other needs in the web’s priority of constituents: user needs come before developer needs, implementor needs, spec writer needs — or even agent needs. ( UX over DX over AX .) Now for the funny part. Here’s Jason: let’s set aside for the moment the irony that AI is supposed to replace all of our jobs and become a super intelligence and at the same time we also need to add special AI training wheels for it to use the web. It’s like that person you know who prides themselves on their independence, that they don’t bend to society and culture, and that they don’t need anyone or anything — oh, and by the way, could you spot them twenty bucks? Reply via: Email · Mastodon · Bluesky

0 views
Jim Nielsen 1 months ago

Podcast Notes: Ed Catmull on David Senra

Ed Catmull, co-founder of Pixar and former president of Disney Animation, was on the David Senra podcast and I quite enjoyed the interview. (If you like the interview, you should read his book .) Ed talks about what he considered his job to be: get the dynamics right for groups of people working together. To do this, he would pull people out of meetings, make groups smaller, make them bigger, just constantly work on fine-tuning getting the right people together at the right time with the right feedback (without ego). Granted he didn’t always do it, but that was his goal. He says: This is so important to get [these group dynamics right] because this is what our product is based on: getting this group of people to work well together. So paying attention to the dynamics of the room is the job. They’re the ones making the movies. I’m not making the movie. I’m just trying to get them to work well together. When Steve Jobs came to Ed and essentially said, “We’re gonna bet everything at Pixar on Toy Story , and the same week that Toy Story is released in theaters we’re gonna IPO.” What did Ed think? I thought it was crazy [laugh] I’ve learned a lot in this process. He was right. I love this frank exchange and Ed’s ability to go from “I thought he was crazy” to “I learned”. In a creative endeavor, where so many earlier iterations suck, how do you gauge whether you should keep going? Because to keep going can make you seem a tad crazy, e.g. “This sucks — let’s keep going!” So how do you know whether you should keep investing in it? Ed’s answer: What’s your basis for proceeding? For me, the basis was: what’s the spirit of the team? Because we all know it [sucks] but if they’re all working together — they’re laughing, and [doing things] together — then you say, “Let’s keep going. Let’s keep trying to solve it.” I love this. He didn’t say, “You open a spreadsheet and do a cost analysis.” He said he looks at the spirit of the people working on it. It really backs up what he said his job is: find and help groups of people work together. His attitude seems to be: a group of people with the right dynamics can solve anything. Ed talks about Pixar’s willingness to take on hard problems because they believed a hard problem led to better outcomes (because few others were willing to do the hard work): A hard problem is more likely to lead to an interesting film. If it’s easy, then it’s more derivative. You know how to write a script, you know what the three-act structure is, you know all these elements of storytelling, and you put together all the pieces and you got a story. Is it a great story? Is it emotional? Sometimes yes, sometimes no […] It’s fairly easy to come up with something that is mediocre — and it’s cheaper too. If you take on hard things then you need to spend more time trying to figure out how to be different in what you’re doing. So if you take on a hard problem and you just keep pushing at it, then the fact that it was hard is what is going to make it different. Stated again for emphasis: “ the fact that it was hard is what is going to make it different ”. And it’s the execution that’s hard, not having the idea: If you’re going to make a movie about a rat that likes to cook, that is not a slam dunk. A lot of people want to keep their projects secret, but this is one where you could tell everybody: “We’re going to make a movie about a rat that cooks!” His point being: nobody can steal that idea and make it good. Execution is everything there. And if you look at it and say, “Well that’s too hard. How could you make a film about a rat that likes to cook?” You’re skirting the hard work, which is exactly what is going to make you different. Don’t skirt the hard thing. If you do something that’s hard, that’s the differentiation. Lastly: I love Ed’s perspective on mission statements: The reason [we never had a mission statement] is because a mission statement is an answer, when typically we should always be asking questions, like “What are we doing?” His point being: if somebody asks “What are we doing?” and you immediately go back to the mission statement and say, “Oh, well we’re doing this” that’s not good. It’s better to always be questioning. “Are we doing the right thing? Are we going in the right direction?” You should always be wrestling with those questions. Reply via: Email · Mastodon · Bluesky

0 views
Jim Nielsen 1 months ago

Make It Work vs. Make It Good

There are two wolves inside of me, lol. Some days I want to be a “designer”. Other days I want to be a “developer”. On the days I find myself wanting to feed the developer, it’s often because making something “work” seems easier (and more impressive) than making something “good”. Making something function often results in a reaction of “Wow, that’s so cool! It didn’t work before and now it does! And I could’ve never made that, nice job!” And sometimes it’s like, good job, you made a bear ride a unicycle . Not really what bears are supposed to do — and they’ll probably never be good at it — but it’s novel and functioning! However, the task of making something good — of arriving at a solution that is obvious — is often met with a kind of ambivalence, like “Nice work…I guess? Seems obvious tbh.” That’s the work of design: to make something so good, it’s obvious. But there’s often little acclaim for the obvious because, well, it’s so obvious (in hindsight). This plays out in many different ways. For example, consider a task like making a web site responsive. In my experience, it’s often quite easy to get people to say “Hey that’s cool, it looks like a mobile site now! Good job!” Getting to that point is often just a matter of sticking a few media queries in your CSS. And people are impressed because they’re not honing in on the details of how it works, just that it works at all. “Cool, the site displays on a mobile phone now! We can move on.” But just because it works doesn’t mean it’s good. And that extra mile to “it works on mobile and it’s also a good experience” is a ton of work. Is it fast? Is it accessible? Is it intuitive? Does it work across multiple devices? Can it be iterated on quickly? So. Many. Questions. “Does it work?” is a binary question. “Is it good?” is a subjective question whose answer lives at the intersection of multi-disciplinary knowledge and taste, which is to say: it’s harder to answer than “Does it work?” “Let’s do X” often boils down to two stages: To “make it work”, all you gotta do is get it running. Consensus on when to applaud and reward the work is simple because it’s either working or it’s not. To “make it good” requires all kinds of nuanced work. Consensus on when to applaud and reward this work is often impossible to discern because not everyone agrees on what “good” looks like. “Make it work” is the first 90% of the work. “Make it good” is the other 90%. Reply via: Email · Mastodon · Bluesky Make it work Make it good

0 views
Jim Nielsen 1 months ago

What’s an Icon in 2026?

As icons continue to change across Apple’s platforms, I have thoughts. They mainly revolve around two perspectives: Let’s see if I can articulate my thoughts. In “Create icons with Icon Composer” from WWDC 2025, Lyan Bewry from Apple’s Design Team gives the rationale for why developers should use Apple’s new Icon Composer: Icon design is moving from a past of simply static images, to a future of expressive, multi-layered artworks that respond to user input and adapt between appearances. They’ve become a much richer and more integrated experience on-device. Catch that? Icons are moving from a “static” past to an “expressive, multi-layered […] much richer” future. You may have noticed this in some of Apple’s latest OS releases, how lighting effects, customizations, etc., can all affect what an icon looks like at any given moment within the operating system. So what are these files made by Icon Composer? In the Accidental Tech Podcast episode 699 “Not the Correct Squircle” John Siracusa talks about some of the technical details and differences between app icons in macOS 26 (Tahoe) and 27 (Golden Gate): These files, this format that Apple came up with, it’s a bunch of resources and a recipe. So it’s like bitmaps, vector images, layers, recipes and effects. That’s what it is. And these icons are assembled on the fly by the operating system. It doesn’t burn up bitmaps of them. I take your ingredients, I assembled them, I composite them, I apply your layer effects, and then eventually it renders a bitmap that it keeps in memory somewhere. Who is thinking about backwards compatibility in their icons? Tahoe’s effects are different than 27’s effects […] And also, 27 has effects that 26 doesn’t support. And 26 won't even read the files from 27, which makes everything complicated. Complicated indeed. As noted, the days of a single, static image for icons are over. An app icon is no longer a PNG file. It’s a bit of a Schrödinger’s icon if you will. There’s no longer a universal answer for “What does your app icon look like?” An icon is simultaneously light, dark, glass, tinted, etc.. Only once it is “observed” — that is rendered at runtime on a device with settings applied (user preferences, device angle, etc.) — can you really know what it looks like. An icon now has a runtime. I don’t know. Icons are effective because of their ability to be quickly recognizable and memorable. Visual simplicity and consistency support that. Making something more “expressive” and “richer”, to me, means conveying more. But icons are meant, to a degree, to convey less. Only the essential. That’s what makes them effective. There’s definitely a point where, the more they convey, the less effective they are at their purpose. The more you move away from a singular, visual representation, the more room there is for confusion and greater cognitive effort for discernment. Take, for example, Apple’s Phone app. What’s the icon for it? Can you picture it in your head? It’s a green icon with a white phone glyph. That’s what it was in the original iPhone keynote (and it’s what the Phone app will always be to me). Iconic! But wait! Now it’s also a black icon with a green phone glyph if you’re in dark mode. And there’s more! It’s a clear glass icon with a phone glyph if you’re in clear mode. And! It’s [insert color here] with a phone glyph if you’ve tinted it. Consistent color is a strong ingredient in aiding memorability and recognizability. Look at Coke: Simplicity matters. It aids recognizability and memorability. If you start making it more complicated and more varied, you lose what made it simple, recognizable, and memorable to begin with. And what are app icons but visual tools for immediate recognizability? Anyway, now that app icons have a runtime and will increasingly vary in their appearance, I’m not sure how to archive them anymore. This story is still developing… Reply via: Email · Mastodon · Bluesky What I think of icons as a long-time user of Apple’s platforms. What I think of icons as a digital collector and physical archivist of icons. Red can? Coke Black can? Coke Zero Silver can? Diet Coke

0 views
Jim Nielsen 1 months ago

Family Feud: Mac-assed Mac App Edition

“We asked 100 people: What are the top three companies on earth best positioned to make a world-class Mac-assed Mac app ?” Survey says: Yes! Apple at the number one spot. Makes sense. Who better to make the very definition of a great Mac app than the people who make the Mac? No brainer, I suppose. Granted, they’ve had some misses , but nobody bats 1000. Ok, let’s keep going. “We asked 100 people: What are the top three companies on earth best positioned to make a world-class Mac-assed Mac app?” “Anthropic!” Survey says: Wow, that’s odd huh? You’d think Anthropic would be right there at number two. Not only do they have billions of dollars, but they also develop, maintain, and control the super intelligence we’ll all soon be subservient too, right? Surely if anyone (besides Apple) is well positioned to make a world-class Mac app, it would have to be Anthropic — right? And yet, here we are with Claude Desktop as an Electron app . Ok, let’s keep going. “We asked 100 people: What are the top three companies on earth best positioned to make a world-class Mac-assed Mac app?” Maybe not . Not so much . I’m sorry, but that’s three strikes. Apparently it’s a mistake to assume that a big company with piles of cash is well poised to make a great Mac app — even if they are enabled by hyper-super-intelligence. “Well who cares? It just goes to show you don’t have to make a good Mac app to be obscenely successful in terms of revenue!” Well, maybe that’s true. Actually, come to think of it, it kinda does seem like the bigger you get and the more money you make, the more likely it is you’re making an Electron app. There seems to be a correlation between “Mac-assed Mac app-edness” and “Company size/revenue”. Why is that? I’ll leave that as an exercise for the reader (though my mind is leaning towards something to do with care ). Thank you for playing reading this game of family feud. Reply via: Email · Mastodon · Bluesky

0 views
Jim Nielsen 1 months ago

Making a Shuffle Button

I made some updates to my notes blog , including a change to how my “Shuffle” feature worked. Figured I’d blog about it. At the time of this writing, I have 974 “notes” that I’ve published. For fun, I have a “shuffle” button that digs up a random note from the past. I like to press it from time to time and re-encounter some insight from the past. It’s like going through an old album, pulling out a random photo, and thinking, “Oh yeah, I remember this! Good times.” Like old photos, there’s also the occasional “that didn’t age so well”. But I find it fun to randomly dig up old insights from others and continue to be inspired. Since my site is built and hosted as static files without a runtime server, this feature required JavaScript to work. Every page had a snippet like this: Essentially: inject every note ID into every HTML page and, when the shuffle button is clicked, randomly grab one and navigate the user to it. Not the most elegant thing, but it worked. The problem was that every time I published a new post, every single page had to be re-uploaded to Netlify because every file’s hash would change and its etag/cache was invalidated. This made my builds slow. It also made it difficult, from a development perspective, to ensure refactors didn’t result in unexpected changes to output (using from my SSG web origami ). So I decided to make a change. Because I love to see if I can make things work without JavaScript, I had the thought to randomly write the at build time using my SSG, which would result in output like this: And every time I re-build my site, just have this logic run on the static site generator so that it’s different for every page, every time. I decided I didn’t want to do this, so on to JavaScript! My first thought was to create a single JSON file that contained all my note IDs. Then when the “Shuffle” button gets clicked, I fetch that, grab a random ID, and navigate the user, e.g. This would work. It localizes the caching issue to a single file, so only one file has to be invalidated/re-uploaded across builds. But in playing with it a little more, I decided to try something a little more...unconventional. I’ve written before about having lots of little HTML pages and I thought, “Can I put this functionality in a single HTML page rather than a JSON file?” And what I ended up with was a link, e.g. That when clicked navigates the user to a new page. That page has all the JS logic embedded in it, e.g. There are a few things I like about the experience this implementation provides. First: shuffle is a route , so I can navigate to it directly without using the GUI, e.g. notes.jim-nielsen.com/shuffle Second: I handle the UI/X with a slight delay to make it appear like something is happening when you click the button. If you click the button and it immediately jumps to the next, randomized page, it almost seems to happen too fast. Like you’re left with this feeling of “What just happened?” But in this scenario, it navigates you to the “Shuffle” page, the button you just clicked turns into a spinner + text indicating something is happening, and there’s a slight (intentional) delay before the JS executes and sends you to a randomized note. I know it’s a bit weird. “Introduce artificial slowness? Are you crazy?” But I like it. It feels like the shuffle feature on an old music player. I remember one of my CD players had a “Shuffle” feature. When I’d click the button, it would display “Shuffling…” on the little black and white screen and you’d encounter this brief state where (I presume) the lens inside the hardware would move along the physical track to the spot where it would start reading a new, random song from the CD. The hardware constraints necessitated this kind of an experience, but I always liked it because it felt like the CD player was “thinking” about what track to pick next. This state clearly conveyed to me that my intent to shuffle was received and being followed. I liked that feedback, and it’s exactly what I wanted to do on my notes site (even though it was completely unnecessary). I like having that brief moment of feedback where it’s very clear that your intention was received and being followed, vs. having it happen so fast you can’t even perceive precisely what happened. Here’s a video to show it in action: I know that’s a lot of information for something so small — and, arguably, unnecessary. But I still enjoy writing about how I make decisions when I build things for myself. Hence this post. Reply via: Email · Mastodon · Bluesky Doesn’t require JavaScript Doesn’t require a server (request-time logic) File hashes change across builds (even if there’s no new content or template changes, every HTML page now has a different for the shuffle link for every build ). This makes deployments way slower because Netlify has to redeploy every file on every build. Plus Etags change so caching is basically ineffectual.

0 views
Jim Nielsen 1 months ago

This Page Left Intentionally Blank

I was popping off about negation being an act of creativity, when Blake Watson introduce me to the idea of the “This Page Intentionally Left Blank”-Project (Internet Archive) : In former times printed manuals had some blank pages, usually with the remark “this page intentionally left blank”. In most cases there had been technical reasons for that. Today almost all blank pages disappeared […] [this project] tries to introduce these blank pages to the Web again […] to offer internet wanderers a place of quietness and simplicity on the overcrowded World Wide Web Ahead of its time. In our age of generative AI, a blank page is a deliberate act! So I went ahead made my own . Go ahead and crawl that bots. I don’t use , but I’m thinking of making one specifically to say “Make sure you don’t miss this page Botty Bot.” Reply via: Email · Mastodon · Bluesky

0 views
Jim Nielsen 2 months ago

Notes from Bryan Cantrill’s “Intelligence is not Enough”

I quite enjoyed this talk from Bryan Cantrill where he discusses the difficult engineering problems they overcame while working on their company Oxide . Some of the problems they ran into were bugs. But these weren’t any ordinary bugs, they were company-destroying bugs: bugs that, if they couldn’t be fixed, would sink the entire company. And the difficulty in solving these bugs was that they had no precedent. Any documentation or knowledge they could find around the symptoms of the problem was actively incorrect. In fact, Bryan says that the team’s breakthroughs on these bugs were solutions that an artificial super intelligence would’ve never suggested because they ran against all known and available reasoning, documentation, and knowledge. His point being: intelligence isn’t everything. Human values are still incredibly important. Intelligence alone does not solve problems like [the ones we encountered]. Our ability to solve these problems had nothing to do with our collective intelligence as a team. We’ve got a terrific team, but it’s a lot more than just intelligence. And in particular for these [kinds of] problems, and many like them, we had to summon the elements of our character not our intelligence. Our resilience. Our teamwork. Our rigor. Our optimism. […] We talk about super intelligence, but is anyone talking about super collaboration or super teamwork? We absolutely needed teamwork [at Oxide]. If human values like curiosity are what led to breakthroughs — not the application of synthetic intelligence — why is there so much emphasis on intelligence these days? Bryan has a curt analysis: This infatuation with intelligence comes from people who just don’t get outside enough. He notes how intelligence isn’t everything in a job interview. Like, you don’t hire people by giving out an exam and taking whoever scores highest. You try to suss out other aptitudes. Nobody looks at applicants who lack values like teamwork or optimism and says, “Well, they can’t work with anyone and they’re incredibly unpleasant to be around, but their intelligence is great — let’s hire them!” Intelligence is great, but it’s not everything. We do a disservice to our own humanity when we pretend that [AI] can engineer autonomously. A cogent case for the values of our humanity. More like this please. Reply via: Email · Mastodon · Bluesky

0 views
Jim Nielsen 2 months ago

My Om Malik Story

If you have’t heard, Om Malik passed away . People are sharing stories of their graceful encounters with him. This one is mine. Back at the beginning of 2021, I set a goal to write 72 blog posts . I was puttering along, publishing whatever came to mind, mostly figuring that nobody was reading any of it. But that was ok. The process was therapeutic and it helped clarify my professional thinking, so I kept going. One day on Twitter I got a DM from someone with the handle . “I don’t know who this is,” I thought, “but damn that is a great handle!” Then I peaked at the follower count: over 1 million! “WTF? Who is this???” I thought. I’d never — then or since — been contacted by someone with such a high profile online. How was I even on this person’s radar? I continued on to his message: Jim I wanted to thank you for your blog. I am neither a developer or a designer but appreciate the web, the open web and in general normal, common sense writing from experts. I have quietly enjoyed your work — and hope you hit the target of 72 posts in 2021. My highly selfish ask, as I know it will feed my brain good important stuff. Have a wonderful weekend and a great writing year I was flabbergasted. Who was this person with such a high follower count saying such kind words and I’d never heard of him? I quickly went to Google. He had his own Wikipedia . “Om Malik…tech writer…founded Gigaom!” Ah-ha! I knew Gigaom the company/blog . It shaped a lot of my early exposure to the tech beat. I devoured it. I can still picture the logo in my head! Now I knew the man behind it. Knowledge unlocked! I thanked him graciously for taking the time to send a message whose importance seemed incredibly lopsided in my favor. I quote his message here because I still think about it on occasion. His words then (as well as later ones ) continue to lift me up on days when I feel like an imposter. They remind me of the power of a small act of kindness, even within such a vast world wide web. I still think about his words. I still think about him . I’m sure many will for some time. And that is a legacy. Reply via: Email · Mastodon · Bluesky

0 views
Jim Nielsen 2 months ago

Blogging Can Just Be Stating The Obvious

John Gruber writes about those annoying popups every website seems to have now and while he does a great job tearing into these ubiquitous, user-hostile patterns, one of the things that stood out to me about his piece was this meta commentary on blogging. Here’s John: If you visit a website you should ... see the website . See its content. Be able to read the article whose page you are attempting to visit. Showing a “subscribe to our newsletter” or “accept our fucking cookies” dickover to someone trying to read an article on the web makes no more sense than sending out an email newsletter that only contains a link to read the newsletter on a webpage. A webpage should show the webpage. An email should show the email. I should not have to explain this. It’s funny how often blogging feels like being the little child in the story of The Emperor’s New Clothes . You’re just stating what seems obvious to you. I often look at my own posts and think, “There’s nothing novel, or important, or deep in here at all — is this even worth saying?” A post’s point can seem so glaringly obvious to me (and thus, I presume, others) it feels like a waste of time to even say it. As John says: A webpage should show the webpage. An email should show the email. I should not have to explain this. But then real-world examples of annoyance pile up around you and nobody talks about it, so you finally just have to say it in a post and bring receipts . You feel like someone gone mad: “Is anyone else seeing the same thing I’m seeing? And we’re just ok with this?” Very often, those are the best posts I read from others. So it must be that a key ingredient to blogging is simple: have a willingness to state something that seems obvious to you but nobody else is saying it. Or if someone else is saying it, just link to them and say, “Yes!!! This!!!” Reply via: Email · Mastodon · Bluesky

0 views
Jim Nielsen 2 months ago

Consistency, But in Excellence Not Appearance

Consistency serves a purpose in visual design, but it seems to have become the purpose of a lot of visual design. Look no further than these evolutions of macOS icons ( image courtesy of BasicAppleGuy ): The Creator Studio icons are undeniably consistent visually: rounded rectangles, controlled gradients, simplified forms, restrained depth, etc. In contrast (and by modern standards) the originals seem heretically inconsistent. They lack coherence in visual details like shape, material, and lighting. But what they lack in visual consistency between one another, they make up for in excellence individually. In fact, their aversion to familial visual consistency almost seems like an intentional choice — a deliberate augmentation of individual purpose. What purpose? To be singularly representative and deeply iconic. Icons that are iconic . To be iconic, by definition, is to be famously distinctive. None of the Creator Studio icons, especially when held up as a suite, are iconic. None are atypical, they’re merely typical. All in pursuit of what, consistency — amongst each other and across platforms — as the overriding goal? This over-emphasis on “systems” design seems endemic to modern software. Systems prescribe rules because they are the easiest attributes to document, enforce, and automate — “All icons must use this shape, this lighting, this stroke.” Excellence, by contrast, is harder to systematize. It requires judgment, taste, care, experience, and a sensitivity to context — all in service of meaning and purpose, not superficial similarity. When you strive for consistency across a suite, individual elements lose their ability to be exceptional and iconic on their own terms. Consistency for the group becomes a ceiling on individual excellence. But if you flip that, if you make excellence the goal for each individual element, something interesting can happen: excellence becomes your motif of consistency. It’s no longer a consistency of shapes and gradients, but one of quality and intention that serves a deeper meaning and purpose than superficial visuals. Give me a consistency of excellence any day over a consistency of appearance. Reply via: Email · Mastodon · Bluesky

0 views
Jim Nielsen 2 months ago

Full Page Paralysis

You’ve probably heard the term. It’s meant to convey how difficult it can be to start something. “Blank page paralysis”. But for my money, beginning is easy. Finishing is the hard part. In software, they call it “the last 90%”. In logistics, they call it “the last mile”. It’s that final stretch that’s disproportionately hard. Finishing makes something real and finite, subject to judgment. As I near completion, there’s a little voice in my head that says, “As long as it’s unfinished, there’s nothing wrong with it. It’s still potentially perfect!” I don’t struggle with blank page paralysis. But I am paralyzed in the face of a full page ready for publishing. Reply via: Email · Mastodon · Bluesky

0 views
Jim Nielsen 2 months ago

Being “Good” at Things

Golf content on social media is my online junk food and the other day I came across a video interviewing professional golfers that asks: “What does an amateur golfer have to shoot to be considered good?” It’s a leading question because the phrasing implicitly frames a number as the answer for a qualitative measurement , but I digress. All the pros give their answers. Some say you gotta shoot a number in 90’s. Others say the 80’s. Some even say the 70’s. Then along comes Collin Morikawa: I don’t think there’s a number, but I think you have to be able to finish out every hole without, like, picking up a two-footer. Love it! I don’t want to go too deep on a social media golf interview clip, but… I love how he breaks out of the question’s implicit framing and really strikes at the heart of the qualitative question: “What does it mean to be good at golf?” Being “good”, in his eyes, is not shooting a specific number. Numbers are standardized proxies for measurement across a wide variety of players, skill levels, and — to be quite frank — degrees of honesty. Anyone who has played golf knows that scores can be easily manipulated. On a casual outing amongst friends, my “82” may be very different than the “82” of the players in front of me — or even the players in my own group. It all depends on how you play the game. So saying “if you can shoot number ___” is a very lossy picture of what it means to be “good” at golf — at least for amateurs. That’s why I love Morikawa’s answer: if you finish every hole and don’t get a double bogey, you’re “good” at golf. Because guess what? Finishing is the hard part. The consistency. Showing up to every hole, finishing out based on the actual rules of the game, not taking mulligans, not picking up a two-footer and saying “That’s good.” (Or even missing a two-footer and re-putting and giving yourself the make.) Relieving yourself of the exacting burden of the reality of the game is the easy way to play, but it doesn’t make you a better golfer. I think that’s true of so many things we do as humans: programming, design, writing, etc. If you want to be “good” at what you do, do the hard, little things that others gloss over. Do them consistently and well, with discipline and perseverance. If you do, then I’d say you’re “good” at what you do because “good” isn’t a number. It’s quality. A disposition. A way of being. Reply via: Email · Mastodon · Bluesky

0 views