Latest Posts (20 found)
Jim Nielsen 2 days ago

Computers and the Internet: A Two-Edged Sword

Dave Rupert articulated something in “Priority of idle hands” that’s been growing in my subconscious for years: I had a small, intrusive realization the other day that computers and the internet are probably bad for me […] This is hard to accept because a lot of my work, hobbies, education, entertainment, news, communities, and curiosities are all on the internet. I love the internet, it’s a big part of who I am today Hard same. I love computers and the internet. Always have. I feel lucky to have grown up in the late 90’s / early 00’s where I was exposed to the fascination, excitement, and imagination of PCs, the internet, and then “mobile”. What a time to make websites! Simultaneously, I’ve seen how computers and the internet are a two-edged sword for me: I’ve cut out many great opportunities with them, but I’ve also cut myself a lot (and continue to). Per Dave’s comments, I have this feeling somewhere inside of me that the internet and computers don’t necessarily align in support my own, personal perspective of what a life well lived is for me . My excitement and draw to them also often leave me with a feeling of “I took that too far.” I still haven’t figured out a completely healthy balance (but I’m also doing ok). Dave comes up with a priority of constituencies to deal with his own realization. I like his. Might steal it. But I also think I need to adapt it, make it my own — but I don’t know what that looks like yet. To be honest, I don't think I was ready to confront any of this but reading Dave’s blog forced it out of my subconscious and into the open, so now I gotta deal. Thanks Dave. Reply via: Email · Mastodon · Bluesky

0 views
Jim Nielsen 6 days ago

Making Icon Sets Easy With Web Origami

Over the years, I’ve used different icon sets on my blog. Right now I use Heroicons . The recommended way to use them is to copy/paste the source from the website directly into your HTML. It’s a pretty straightforward process: If you’re using React or Vue, there are also npm packages you can install so you can import the icons as components. But I’m not using either of those frameworks, so I need the raw SVGs and there’s no for those so I have to manually grab the ones I want. In the past, my approach has been to copy the SVGs into individual files in my project, like: Then I have a “component” for reading those icons from disk which I use in my template files to inline the SVGs in my HTML. For example: It’s fine. It works. It’s a lot of node boilerplate to read files from disk. But changing icons is a bit of a pain. I have to find new SVGs, overwrite my existing ones, re-commit them to source control, etc. I suppose it would be nice if I could just and get the raw SVGs installed into my folder and then I could read those. But that has its own set of trade-offs. For example: So the project’s npm packages don’t provide the raw SVGs. The website does, but I want a more programatic way to easily grab the icons I want. How can I do this? I’m using Web Origami for my blog which makes it easy to map icons I use in my templates to Heroicons hosted on Github. It doesn’t require an or a . Here’s an snippet of my file: As you can see, I name my icon (e.g. ) and then I point it to the SVG as hosted on Github via the Heroicons repo. Origami takes care of fetching the icons over the network and caching them in-memory. Beautiful, isn’t it? It kind of reminds me of import maps where you can map a bare module specifier to a URL (and Deno’s semi-abandoned HTTP imports which were beautiful in their own right). Origami makes file paths first-class citizens of the language — even “remote” file paths — so it’s very simple to create a single file that maps your icon names in a codebase to someone else’s icon names from a set, whether those are being installed on disk via npm or fetched over the internet. To simplify my example earlier, I can have a file like : Then I can reference those icons in my templates like this: Easy-peasy! And when I want to change icons, I simply update the entries in to point somewhere else — at a remote or local path. And if you really want to go the extra mile, you can use Origami’s caching feature: Rather than just caching the files in memory, this will cache them to a local folder like this: Which is really cool because now when I run my site locally I have a folder of SVG files cached locally that I can look at and explore (useful for debugging, etc.) This makes vendoring really easy if I want to put these in my project under source control. Just run the file once and boom, they’re on disk! There’s something really appealing to me about this. I think it’s because it feels very “webby” — akin to the same reasons I liked HTTP imports in Deno. You declare your dependencies with URLs, then they’re fetched over the network and become available to the rest of your code. No package manager middleman introducing extra complexity like versioning, transitive dependencies, install bloat, etc. What’s cool about Origami is that handling icons like this isn’t a “feature” of the language. It’s an outcome of the expressiveness of the language. In some frameworks, this kind of problem would require a special feature (that’s why you have special npm packages for implementations of Heroicons in frameworks like react and vue). But because of the way Origami is crafted as a tool, it sort of pushes you towards crafting solutions in the same manner as you would with web-based technologies (HTML/CSS/JS). It helps you speak “web platform” rather than some other abstraction on top of it. I like that. Reply via: Email · Mastodon · Bluesky Go to the website Search for the icon you want Click to “Copy SVG” Go back to your IDE and paste it Names are different between icon packs, so when you switch, names don’t match. For example, an icon might be named in one pack and in another. So changing sets requires going through all your templates and updating references. Icon packs are often quite large and you only need a subset. might install hundreds or even thousands of icons I don’t need.

0 views
Jim Nielsen 1 weeks ago

How AI Labs Proliferate

SITUATION: there are 14 competing AI labs. “We can’t trust any of these people with super-intelligence. We need to build it ourselves to ensure it’s done right!" SOON: there are 15 competing AI labs. (See: xkcd on standards .) The irony: “we’re the responsible ones” is each lab’s founding mythology as they spin out of each other. Reply via: Email · Mastodon · Bluesky

0 views
Jim Nielsen 1 weeks ago

A Few Rambling Observations on Care

In this new AI world, “taste” is the thing everyone claims is the new supreme skill. But I think “care” is the one I want to see in the products I buy. Can you measure care? Does scale drive out care? If a product conversation is reduced to being arbitrated exclusively by numbers, is care lost? The more I think about it, care seems antithetical to the reductive nature of quantification — “one death is a tragedy, one million is a statistic”. Care considers useful, constructive systematic forces — rules, processes, etc. — but does not take them as law. Individual context and sensitivity are the primary considerations. That’s why the professional answer to so many questions is: “it depends”. “This is the law for everyone, everywhere, always” is not a system I want to live in. Businesses exist to make money, so one would assume a business will always act in a way that maximizes the amount of money that can be made. That’s where numbers take you. They let you measure who is gaining or losing the most quantifiable amount in any given transaction. But there’s an unmeasurable, unquantifiable principle lurking behind all those numbers: it can be good for business to leave money on the table. Why? Because you care. You are willing to provision room for something beyond just a quantity, a number, a dollar amount. I don’t think numbers alone can bring you to care . I mean, how silly is it to say: “How much care did you put into the product this week?” “Put me down for a 8 out of 10 this week.” Reply via: Email · Mastodon · Bluesky

0 views
Jim Nielsen 2 weeks ago

Unresponsive Buttons on My Fastest Hardware Ever

This is one of those small things that drives me nuts. Why? I don’t know. I think it has something to do with the fact that I have a computer that is faster than any computer I’ve ever used in my entire life — and yet, clicking on buttons results in slight but perceptible delays. Let me explain. Imagine a button that looks like this: For SPA apps, when the user clicks that button it takes a split second (even on a fast connection) for anything to happen because: When clicking on that button, even on a fast connection, my brain glitches for a second, my thought process going something like: Granted those thoughts occur in my brain in under a second, but I hate that pause of indetermination. I clicked, I want (perceptibly) instant feedback. If something is happening, tell me! For SPA apps, you could put some state in there, like: This would provide more immediate feedback. But it also raises a whole set of other questions: Oh boy, this is getting complicated isn’t it? This is why, I assume, lots of apps just don’t deal with it. They accept there will be a slight delay in the responsiveness of the UI (and that it might error, but the user can just click again) and justify that it’s really not that big of a deal if there’s a slight, almost imperceptible delay between clicking a button and seeing the UI respond. “We’ve got bigger fish to fry.” And it makes sense. I mean, a slight delay in UI responsiveness, is that why people will or won’t buy your thing? Seems like a small detail. Who’s got the time to spend on details like this?Who cares? I care. That’s why I’m writing this post. To my original point, every piece of hardware I currently own is the fastest version of that device I’ve ever had in my life. And yet, everywhere I go I encounter lag. Lag everywhere. And I’m grumpy about it, hence this post. Reply via: Email · Mastodon · Bluesky The browser makes a request to the server The server talks to Stripe to get a session The server responds with the session data to the client The client redirects [nothing happens] I think “Did that work?” Just as I’m about to click again, I see the URL bar change I think, “Oh, ok, it’s doing something .” I stop myself from clicking again while I wait for the UI to redraw Is that actually the interaction you want, where the text changes? That’s probably gonna shift layout. Maybe you want something different, like a spinner in place of the text. How do you handle that? What if you have multiple places to upgrade? Do you have to implement state in all those places too? What if the trigger in each place is slightly different? A button here, some text there, and icon over yonder? How do you handle all of those different interactions in a standard, immediate way? Errors. What if it fails? Well, we already weren’t handling that in the first code example were we? But maybe we should…

0 views
Jim Nielsen 2 weeks ago

A Brief History of App Icons From Apple’s Creator Studio

I recently updated my collection of macOS icons to include Apple’s new “Creator Studio” family of icons. Doing this — in tandem with seeing funny things like this post on Mastodon — got me thinking about the history of these icons. I built a feature on my icon gallery sites that’s useful for comparing icons over time. For example, here’s Keynote : (Unfortunately, the newest Keynote isn’t part of that collection because I have them linked in my data by their App Store ID and it’s not the same ID anymore for the Creator Studio app — I’m going to have to look at addressing that somehow so they all show up together in my collection.) That’s one useful way of looking at these icons. But I wanted to see them side-by-side, so I dug them all up. Now, my collection of macOS icons isn’t complete. It doesn’t show every variant since the beginning of time, but it’s still interesting to see what’s changed within my own collection. So, without further ado, I present the variants in my collection. The years labeled in the screenshots represent the year in which I added the to my collection (not necessarily the year that Apple changed them). For convenience, I’ve included a link to the screenshot of icons as they exist in my collection ( how I made that page , if you’re interested). Final Cut Pro: Compressor: Pixelmator Pro: (Granted, Pixelmator wasn’t one of Apple’s own apps until recently but its changes follow the same pattern showing how Apple sets the tone for itself as well as the ecosystem.) One last non-visual thing I noticed while looking through these icons in my archive. Apple used to call their own apps in the App Store by their name, e.g. “Keynote”. But now Apple seems to have latched on to what the ecosystem does by attaching a description to the name of the app, e.g. “Keynote: Design Presentations”. Reply via: Email · Mastodon · Bluesky Keynote -> Keynote: Design Presentations Pages -> Pages: Create Documents Numbers -> Numbers: Make Spreadsheets Final Cut Pro -> Final Cut Pro: Create Video Compressor -> Compressor: Encode Media Logic Pro -> Logic Pro: Make Music MainStage -> MainStage: Perform Live Pixelmator Pro -> Pixelmator Pro: Edit Images

3 views
Jim Nielsen 3 weeks ago

Study Finds Obvious Truth Everybody Knows

Researchers at Anthropic published their findings around how AI assistance impacts the formation of coding skills : We found that using AI assistance led to a statistically significant decrease in mastery […] Using AI sped up the task slightly, but this didn’t reach the threshold of statistical significance. Wait, what? Let me read that again: using AI assistance led to a statistically significant decrease in mastery Honestly, the entire articles reads like those pieces you find on the internet with titles such as “Study Finds Exercise Is Good for Your Health” or “Being Kind to Others Makes People Happier”. Here’s another headline for you: Study Finds Doing Hard Things Leads to Mastery. Cognitive effort—and even getting painfully stuck—is likely important for fostering mastery. We already know this. Do we really need a study for this? So what are their recommendations? Here’s one: Managers should think intentionally about how to deploy AI tools at scale Lol, yeah that’s gonna happen. You know what’s gonna happen instead? What always happens when organizational pressures and incentives are aligned to deskill workers. Oh wait, they already came to that conclusion in the article: Given time constraints and organizational pressures, junior developers or other professionals may rely on AI to complete tasks as fast as possible at the cost of skill development AI is like a creditor: they give you a bunch of money and don’t talk about the trade-offs, just the fact that you’ll be more “rich” after they get involved. Or maybe a better analogy is Rumpelstilskin : the promise is gold, but beware the hidden cost might be your first-born child. Reply via: Email · Mastodon · Bluesky

0 views
Jim Nielsen 4 weeks ago

The Browser’s Little White Lies

So I’m making a thing and I want it to be styled different if the link’s been visited. Rather than build something myself in JavaScript, I figure I’ll just hook into the browser’s mechanism for tracking if a link’s been visited (a sensible approach, if I do say so myself ). Why write JavaScript when a little CSS will do? So I craft this: But it doesn’t work. is relatively new, and I’ve been known to muff it, so it’s probably just a syntax issue. I start researching. Wouldn’t you know it? We can’t have nice things. doesn’t always work like you’d expect because we (not me, mind you) exploited it. Here’s MDN : You can style visited links, but there are limits to which styles you can use. While is not mentioned specifically, other tricks like sibling selectors are: When using a sibling selector, such as , the adjacent element ( in this example) is styled as though the link were unvisited. Why? You guessed it. Security and privacy reasons. If it were not so, somebody could come along with a little JavaScript and uncover a user’s browsing history (imagine, for example, setting styles for visited and unvisited links, then using and checking style computations). MDN says browsers tell little white lies: To preserve users' privacy, browsers lie to web applications under certain circumstances So, from what I can tell, when I write the browser is telling the engine that handles styling that all items have never been (even if they have been). So where does that leave me? Now I will abandon CSS and go use JavaScript for something only JavaScript can do. That’s a good reason for JS. Reply via: Email · Mastodon · Bluesky

0 views
Jim Nielsen 1 months ago

The Don’t “Contact Us” Page

Nic Chan comes out as the whistleblower on how many “Contact Us” pages are made (spoiler: they’re designed to keep us from contacting anyone). A “fuck off contact page” is what a company throws together when they actually don’t want anyone to contact them at all. They […] are trying to reduce the amount of money they spend on support by carefully hiding the real support channels […] If you solve your own problem by reading the knowledge base, then this is a win for the company. They don’t want to hear from you, they want you to fuck off. It’s true. This is how the proverbial sausage is made. I’ve been there. I’ve seen these decisions handed down. Which means, like Chan, I know how to read between the lines of most “Contact Us” pages on the internet. I’m not sure about you, but as a user, when I see [these kinds of pages], knowing that whatever my original query was, [I know] I’m going to have to solve it unassisted. My process follows this arc: A direct line to a human is the ultimate luxury in today’s world. The project finished on time, everyone got paid, and the client was happy with the end result, but I still felt very disappointed in the whole thing. So it goes. There’s a scene from The Matrix that kept echoing in my head while reading Chan’s post. There are contact pages, my friends. Endless “Contact Us” pages. Where human beings no longer exist. For a long time I probably wouldn’t have believed it, and then I saw the pages made with my own eyes. Watched them remove the ability for human beings to contact one another. And standing there, facing the pure, automated precision of it all, I came to realize the obviousness of the truth. What is the “Contact Us” page? Cost savings. The “Contact Us” page is a computer-generated dream world, built to keep us from contacting another human in order to save cost and turn a human being into this: a source of revenue. Reply via: Email · Mastodon · Bluesky I have a question. Go to the company’s “Contact Us” page. Immediately intuit from the design of the page whether I’m actually going to be able to contact someone and get help, or if I’m on my own.

0 views
Jim Nielsen 1 months ago

You Can Just Say No to the Data

“The data doesn’t lie.” I imagine that’s what the cigarette companies said. “The data doesn’t lie. People want this stuff. They’re buying it in droves. We’re merely giving them what they want.” Which sounds more like an attempt at exoneration than a reason to exist. Demand can be engineered. “We’re giving them what they want” ignores how desire is shaped, even engineered (algorithms, dark patterns, growth hacking , etc.). Appealing to data as the ultimate authority — especially when fueled by engineered desire — isn’t neutrality, it’s an abdication of responsibility. Satiating human desire is not the highest aspiration. We can do so much more than merely supply what the data says is in demand. Stated as a principle : Values over data. Data tells you what people consume, not what you should make. Values, ethics, vision, those can help you with the “should”. “What is happening?” and “What should happen?” are two completely different questions and should be dealt with as such. The more powerful our ability to understand demand, the more important our responsibility to decide whether to respond to it. We can choose not to build something, even though the data suggests we should. We can say no to the data. Data can tell you what people clicked on, even help you predict what people will click on, but you get to decide what you will profit from. Reply via: Email · Mastodon · Bluesky

0 views
Jim Nielsen 1 months ago

CTA Hierarchy in the Wild

The other day I was browsing YouTube — as one does — and I clicked a link in the video description to a book. I was then subjected to a man-in-the-middle attack, where YouTube put themselves in the middle of me and the link I had clicked: Hyperlinks are subversive . Big Tech must protect themselves and their interests. But link hijacking isn’t why I’m writing this post. What struck me was the ordering and visual emphasis of the “call to action” (CTA) buttons. I almost clicked “Back to YouTube”, which was precisely the action I didn’t want. I paused and laughed to myself. Look how the design pattern for primary/secondary user interface controls has inverted over time: It seems like everywhere I go, software is increasingly designed against me. Reply via: Email · Mastodon · Bluesky Classic software: Primary CTA: what’s best for you Secondary CTA: an alternative for you Modern software: Primary CTA: what’s best for us Secondary CTA: what’s acceptable to us

0 views
Jim Nielsen 1 months ago

New Year, New Website — Same Old Me

I redesigned my www website . Why? I read something along the lines of “If you ship something that shows everything you’ve made, it’s dead on arrival.” Oooof. I feel that. It’s so hard to make a personal website that keeps up with your own personal evolution and change. But the hell if I’m not gonna try — and go through many existential crises in the process. I was chasing the idea of making my “home” page essentially a list of feeds, like: You get the idea. The thought was: if I condense the variety of the things I do online into a collection of feeds (hard-coded or live from other sites I publish), then I’ll never be out of date! Plus I love links. I love following them. I wanted my home page to be the start of a journey, not the end. A jumping off point, not a terminal one. At least that was the idea behind this iteration. I built the (static) site using Web Origami . I loved it! Origami is great for dealing with feeds because it makes fetching data from the network and templating it incredibly succinct. In just those few lines of code I: For example, here’s the code showing my latest blog posts: And here’s the code showing the latest icons in my iOS collection: Beautiful and succinct, isn’t it? Origami is a static site builder, so to keep my site “up to date” I just set Netlify to build my site every 24 hours which pulls data from a variety of sources, sticks it in a single HTML file, and publishes it as a website. The “build my site every 24 hours” isn’t quite as easy as you might think. You can use a scheduled function on Netlify’s platform but that requires writing code (which also means maintaining and debugging said code). That seems to be Netlify’s official answer to the question: “How do I schedule deploys?” I went with something simpler — at least simpler to me. So the “cron server” in my case is my iPhone, which works great because it’s basically always connected to the internet. If I go off grid for a few days and my website doesn’t refresh, I’m ok with that trade-off. Reply via: Email · Mastodon · Bluesky The end of year / holiday break is a great time to work on such things. I wanted to scratch an itch. Websites are a worry stone [ gestures at current state of the world ] Do I really need a reason? Nope. Hey, I blog . Here’s the latest: [1, 2, 3] Yo, I take notes . Here’s the latest: [1, 2, 3] Bruh, I collect iOS icons . Here’s the latest: [1, 2, 3] Guess what? I collect macOS icons too. Here’s the latest: [1, 2, 3] Hey, I ___. Here’s the latest: [1, 2, 3] Fetch a JSON feed over the network Grabbed the 3 most recent entries Turn the data into markup Setup a build hook on Netlify (which you have to do for the schedule function approach anyway). Use Apple’s Shortcuts app to create a shortcut that issues a POST request to my build hook. Use Shortcuts’ “Automation” feature to run that shortcut every day.

13 views
Jim Nielsen 1 months ago

Easy Measures Doing, Simple Measures Understanding

In his talk , I like the way Jake Nations pits easy vs. simple: Easy means you can add it to your system quickly. Simple means you can understand the work that you’ve done. I like this framing. Easy means you can do with little effort. Simple means you can understand what you do with little effort. In other words: easy measures the effort in doing, while simple measures the effort in understanding the doing. For example: or “Hey AI, build an instagram clone”. These both get you a website with little effort (easy) but do you understand what you just did (simple)? It’s easy to get complexity , but it’s not easy to get simplicity. (I get this is arguing semantics and definitions, but I find it to be a useful framing personally. Thanks Jake!) Reply via: Email · Mastodon · Bluesky

0 views
Jim Nielsen 1 months ago

In The Beginning There Was Slop

I’ve been slowly reading my copy of “The Internet Phone Book” and I recently read an essay in it by Elan Ullendorff called “The New Turing Test” . Elan argues that what matters in a work isn’t the tools used to make it, but the “expressiveness” of the work itself (was it made “from someone, for someone, in a particular context”): If something feels robotic or generic, it is those very qualities that make the work problematic, not the tools used. This point reminded me that there was slop before AI came on the scene. A lot of blogging was considered a primal form of slop when the internet first appeared: content of inferior substance, generated in quantities much vaster than heretofore considered possible. And the truth is, perhaps a lot of the content in blogosphere was “slop”. But it wasn’t slop because of the tools that made it — like Movable Type or Wordpress or Blogger. It was slop because it lacked thought, care, and intention — the “expressiveness” Elan argues for. You don’t need AI to produce slop because slop isn’t made by AI. It’s made by humans — AI is just the popular tool of choice for making it right now. Slop existed long before LLMs came onto the scene. It will doubtless exist long after too. Reply via: Email · Mastodon · Bluesky

1 views
Jim Nielsen 1 months ago

The AI Security Shakedown

Matthias Ott shared a link to a post from Anthropic titled “Disrupting the first reported AI-orchestrated cyber espionage campaign” , which I read because I’m interested in the messy intersection of AI and security. I gotta say: I don’t know if I’ve ever read anything quite like this article. At first, the article felt like a responsible disclosure — “Hey, we’re reaching an inflection point where AI models are being used effectively for security exploits. Look at this one.” But then I read further and found statements like this: [In the attack] Claude didn’t always work perfectly. It occasionally hallucinated […] This remains an obstacle to fully autonomous cyberattacks. Wait, so is that a feature or a bug? Is it a good thing that your tool hallucinated and proved a stumbling block? Or is this bug you hope to fix? The more I read, the more difficult it became to discern whether this security incident was a helpful warning or a feature sell. With the correct setup, threat actors can now use agentic AI systems for extended periods to do the work of entire teams of experienced hackers: analyzing target systems, producing exploit code, and scanning vast datasets of stolen information more efficiently than any human operator. Less experienced and resourced groups can now potentially perform large-scale attacks of this nature. Shoot, this sounds like a product pitch! Don’t have the experience or resources to keep up with your competitors who are cyberattacking? We’ve got a tool for you! Wait, so if you’re creating something that can cause so much havoc, why are you still making it? Oh good, they address this exact question: This raises an important question: if AI models can be misused for cyberattacks at this scale, why continue to develop and release them? The answer is that the very abilities that allow Claude to be used in these attacks also make it crucial for cyber defense. Ok, so the article is a product pitch: But that’s my words. Here’s theirs: A fundamental change has occurred in cybersecurity. We advise security teams to experiment with applying AI for defense in areas like Security Operations Center automation, threat detection, vulnerability assessment, and incident response. We also advise developers to continue to invest in safeguards across their AI platforms, to prevent adversarial misuse. The techniques described above will doubtless be used by many more attackers—which makes industry threat sharing, improved detection methods, and stronger safety controls all the more critical. It appears AI is simultaneously the problem and the solution. It’s a great business to be in, if you think about it. You sell a tool for security exploits and you sell the self-same tool for protection against said exploits. Everybody wins! I can’t help but read this post and think of a mafia shakedown. You know, where the mafia implies threats to get people to pay for their protection — a service they created the need for in the first place. ”Nice system you got there, would be a shame if anyone hacked into it using AI. Better get some AI to protect yourself.” I find it funny that the URL slug for the article is: That’s a missed opportunity. They could’ve named it: Reply via: Email · Mastodon · Bluesky We’ve reached a tipping point in security. Look at this recent case where our AI was exploited to do malicious things with little human intervention. No doubt this same thing will happen again. You better go get our AI to protect yourself.

0 views
Jim Nielsen 1 months ago

Creating “Edit” Links That Open Plain-Text Source Files in a Native App

The setup for my notes blog looks like this : I try to catch spelling issues and what not before I publish, but I’m not perfect. I can proofread a draft as much as I want, but nothing helps me catch errors better than hitting publish and re-reading what I just published on my website. If that fails, kind readers will often reach out and say “Hey, I found a typo in your post [link].” To fix these errors, I will: However, the “Open iA Writer” and “Find the post” are points of friction I’ve wanted to optimize. I’ve found myself thinking: “When I’m reading a post on and I spot a mistake, I wish I could just click an ‘Edit’ link right there and be editing my file.” You might be thinking, “Yeah that’s what a hosted CMS does.” But I like my plain-text files. And I love my native writing app. What’s one to do? Well, turns out iA Writer supports opening files via links with this protocol: So, in my case, I can create a link for each post on my website that will open the corresponding plain-text file in iA Writer, e.g. And voilà, my OS is now my CMS! It’s not a link to open the post in a hosted CMS somewhere. It’s a link to open a file on the device I’m using — cool! My new workflow looks like this: It works great. Here’s an example of opening a post from the browser on my laptop: And another on my phone: Granted, these “Edit” links are only useful to me. So I don’t put them in the source markup. Instead, I generate them with JavaScript when it’s just me browsing. How do I know it’s just me? I wrote a little script that watches for the presence of a search param . If that is present, my site generates an “Edit” link on every post with the correct and stores that piece of state in localstorage so every time I revisit the site, the “Edit” links are rendered for me (but nobody else sees them). Well, not nobody. Now that I revealed my secret I know you can go get the “Edit” links to appear. But they won’t work for you because A) you don’t have iA Writer installed, or B) you don’t have my files on your device. So here’s a little tip if you tried rendering the “Edit” links: do to turn them back off :) Reply via: Email · Mastodon · Bluesky Content is plain-text markdown files (synced via Dropbox, editable in iA Writer on my Mac, iPad, or iPhone) Codebase is on GitHub Builds are triggered in Netlify by a Shortcut Open iA Writer Find the post Fire Shortcut to trigger a build Refresh my website and see the updated post Read a post in the browser Click “Edit” hyperlink to open plain-text file in native app Make changes Fire Shortcut to trigger a build

0 views
Jim Nielsen 2 months ago

To Make Software Is To Translate Human Intent Into Computational Precision

In “The Future of Software Development is Software Developers” Jason Gorman alludes to how terrible natural language is at programming computers: The hard part of computer programming isn’t expressing what we want the machine to do in code. The hard part is turning human thinking – with all its wooliness and ambiguity and contradictions – into computational thinking that is logically precise and unambiguous, and that can then be expressed formally in the syntax of a programming language. The work is the translation , from thought to tangible artifact. Like making a movie: everyone can imagine one, but it takes a director to produce one. This is also the work of software development: translation . You take an idea — which is often communicated via natural language — and you translate it into functioning software. That is the work. It’s akin to someone who translates natural languages, say Spanish to English. The work isn’t the words themselves, though that’s what we conflate it with. You can ask to translate “te quiero” into English. And the resulting words “I love you” may seem like a job complete. But the work isn’t coming up with the words. The work is gaining the experience to know how and when to translate the words based on clues like tone, context, and other subtleties of language. You must decipher intent . Does “te quiero” here mean “I love you” or “I like you” or “I care about you”? This is precisely why natural language isn’t a good fit for programming: it’s not very precise. As Gorman says, “Natural languages have not evolved to be precise enough and unambiguous enough” for making software. Code is materialized intent. The question is: whose? The request ”let users sign in” has to be translated into constraints, validation, database tables, async flows, etc. You need pages and pages of the written word to translate that idea into some kind of functioning software. And if you don’t fill in those unspecified details, somebody else ( cough AI cough ) is just going to guess — and who wants their lives functioning on top of guessed intent? Computers are pedants. They need to be told precisely in everything, otherwise you’ll ask for one thing and get another. “Do what I mean, not what I say” is a common refrain in working with computers. I can’t tell you how many times I’ve spent hours troubleshooting an issue only to realize a minor syntactical mistake. The computer was doing what I typed, not what I meant. So the work of making software is translating human thought and intent into functioning computation (not merely writing, or generating, lines of code). Reply via: Email · Mastodon · Bluesky

0 views
Jim Nielsen 2 months ago

You Might Also Like: My Notes Blog

If you subscribe to this blog, you must like it — right? I mean, you are subscribed to it. And if you like this blog, you might also like my notes blog . It’s where I take short notes of what I read, watch, listen to, or otherwise consume, add my two cents, and fire it off into the void of the internet. It’s sort of like a “link blog” but I’m not necessarily recommending everything I link to. It’s more of “This excerpt stood out to me in some way, here’s my thoughts on why.” It’s nice to have a place where I can jot down a few notes, fire off my reaction, and nobody can respond to it lol. At least, not in any easy, friction-less way. You’d have to go out of your way to read my commentary, find my contact info, and fire off a message (critiquing or praising). That’s how I like it. Cuts through the noise. Anyway, this is all a long way of saying: if you didn’t already know about my notes blog, you might like it. Check it out or subscribe . Today, for example, I posted lots of grumpy commentary. Reply via: Email · Mastodon · Bluesky https://notes.jim-nielsen.com/#2025-12-18T1130 https://notes.jim-nielsen.com/#2025-12-18T1128 https://notes.jim-nielsen.com/#2025-12-18T1136

6 views
Jim Nielsen 2 months ago

The “A” in “AI” Stands For Amnesia

My last article was blogging off Jeremey’s article which blogged off Chris’ article and, after publishing, a reader tipped me off to the Gell-Mann amnesia effect which sounds an awful lot like Chris’ “Jeopardy Phenomenon”. Here’s Wikipedia: The Gell-Mann amnesia effect is a cognitive bias describing the tendency of individuals to critically assess media reports in a domain they are knowledgeable about, yet continue to trust reporting in other areas despite recognizing similar potential inaccuracies. According to Wikipedia, the concept was named by Michael Crichton because of conversation he once had with physicist Murray Gell-Mann (humorously, he said by associating a famous name to the concept he could imply greater importance to it — and himself — than otherwise possible). Here’s Crichton: you read with exasperation or amusement the multiple errors in a story—and then turn the page to national or international affairs, and read with renewed interest as if the rest of the newspaper was somehow more accurate about far-off Palestine than it was about the story you just read. You turn the page, and forget what you know. He argues that this effect doesn’t seem to translate to other aspects of our lives. The courts, for example, have a related concept of “false in one thing, false in everything” . Even in ordinary life, Crichton says, “if somebody consistently exaggerates or lies to you, you soon discount everything they say”. In other words: if your credibility takes a hit in one area, it’s gonna take a hit across the board. At least, that’s his line of reasoning. It’s kind of fascinating to think about this in our current moment of AI. Allow me to re-phrase Crichton. You read with exasperation the multiple errors in AI’s “answer”, then start a new chat and read with renewed interest and faith as if the next “answer” is somehow more accurate than the last. You start a new prompt and forget what you know. If a friend, acquaintance, or family member were to consistently exaggerate or lie to you, you’d quickly adopt a posture of discounting everything they say. But with AI — which even comes with a surgeon general’s warning, e.g. “AI can make mistakes. Check important info.” — we forgive and forget. Forget. Maybe that’s the keyword for our behavior. It is for Crichton: The only possible explanation for our behavior is amnesia. Reply via: Email · Mastodon · Bluesky

0 views
Jim Nielsen 2 months ago

It’s Uncomfortable To Sit With “I Don’t Know”

Chris Coyier : There’s the thing where if you’re reading an article in the newspaper, and it’s about stuff you don’t know a ton about, it all seems well and good. Then you read another article in the same paper and it’s about something you know intimately (your job, your neighborhood, your hobby, etc) there is a good chance you’ll be like hey! that’s not quite right! Chris extends this idea to AI-generated code, i.e. if you don’t know or understand the generated code you probably think, “Looks good to me!” But if you do know it you probably think, “Wait a second, that’s not quite right.” Here’s Jeremy Keith riffing on Chris’ thoughts : I’m astounded by the cognitive dissonance displayed by people who say “I asked an LLM about {topic I’m familiar with}, and here’s all the things it got wrong” who then proceed to say “It was really useful when I asked an LLM for advice on {topic I’m not familiar with, hence why I’m asking an LLM for advice}.” Kind of feels like this boils down to: How do we know what we know? To be fair, that’s a question I’ve wrestled with my whole life. And the older I get, the more and more I realize how often we barely know anything. There’s a veneer of surety everywhere in the world. There are industries of people and services who will take your money in exchange for a sense of surety — influencers, consultants, grifters, AI, they all exist because we are more than willing to pay with our time, attention, and money to feel like we “know” something. “You’re absolutely right!” But I, for one, often feel increasingly unsure of everything I thought I knew. For example: I can’t count the number of times I thought I understood a piece of history, only to later find out that the commonly-accepted belief comes to use from a single source, written decades later in a diary or on a piece of parchment or on a stone, by someone with blind spots, questionable incentives, or a flair for the dramatic, all of which leaves me seriously questioning the veracity and objectivity of something I thought I knew. Which leads me to the next, uncomfortable question: How many other things are there that I thought I knew but are full of uncertainty just like this? All surety vanishes. And that’s an uncomfortable place to be. Who wants to admit “I don’t know”? It’s so easy to take what’s convenient over what corresponds to reality. And that’s what scares me about AI. Reply via: Email · Mastodon · Bluesky

0 views