danott.website / recent

Geography is four-dimensional (sive.rs)

When someone speaks of a place, you have to ask, “When?” Geography is four-dimensional. You can’t know a place - only a place as it was at a time. Where is bound to when. Unless you are in a place right now, you can only speak of it in past-tense.

The places they are a changin’.

TIL some insights from working on electrical. It takes discipline to distinguish between “I don’t understand this” and “something is deeply wrong.”

Electrical systems are at the edge of my understanding. It feels opaque when something isn’t working as expected. Mystery gets inflated into catastrophe when it is better met with curiosity.

A lot of troubleshooting anxiety comes from not knowing the system well enough to recognize normal failure modes. The more I work through problems like these, the faster I pattern-match in a new domain.

Software Engineering Is Becoming Civil Engineering (christophermeiklejohn.com)

Semantic observability, not raw telemetry.

The endless accumulation of data doesn’t create value. Making meaning of that data is what people are craving. It all comes back to humans loving narratives.

It’s not a demotion. It’s a different kind of engineering. And honestly, it’s harder. Writing a feature is a bounded problem. Designing a platform that stays safe as dozens of people and agents ship changes to it every day, that’s an open-ended one. With AI agents doing more of the feature work, the assumption has to be that individual changes will sometimes be imperfect.

The job has always been about building resilience.

Agents hallucinate. They introduce subtle bugs. They make confident changes based on incomplete context. The platform has to absorb this. Not by making agents perfect, but by making the system tolerant of imperfection.

This has also always been true. More resilience against more volatile inputs.

Optimism is not a personality flaw (joanwestenberg.com)

I would rather be wrong about what we’re capable of than right about why we shouldn’t bother trying

Pessimism sounds wise, but doesn’t deliver on it’s promises. Optimism looks foolish sometimes, and is more fun along the way.

TIL how to launch Apple Shortcuts from plaintext links across platforms.

I wanted clickable links in my plaintext notes that launch Apple Shortcuts. It’s pretty simple:

shortcuts://run-shortcut?name=ShortcutName

Spaces and special characters require URL encoding.

shortcuts://run-shortcut?name=My%20Shortcut

This works on both iOS and macOS with the one annoyance that iOS briefly shows the Shortcuts app before running. Home Screen shortcuts don’t do this because they use a different mechanism.

Input can be passed with a query parameter.

shortcuts://run-shortcut?name=ShortcutName&input=text

URL schemes vs. x-callback-url

While playing with this this, I finally understood the difference between regular URL schemes and x-callback-url.

URL scheme is a one-way trigger. Fire and forget. There’s no way to know if it succeeded.

shortcuts://run-shortcut?name=MyShortcut

x-callback-url is a round trip.

shortcuts://x-callback-url/run-shortcut?name=MyShortcut
  &x-success=mynotes://done
  &x-error=mynotes://failed
  &x-cancel=mynotes://cancelled

“Do this, then call me back with results.”

URL schemes are dropping a letter in the mail. x-callback-url is certified mail with a return receipt.

I also learned that x-callback-url isn’t an official standard, just a convention that caught on. At least in concept…I’ve never seen it actually used in practice..

For my use case (just triggering shortcuts from notes), the simple format is all I need.

Read Later Apps

I’ve tried all the read later apps, and I don’t read the words later. I’ve simply taken the problem of too many browser tabs and time shifted its solution into the future. A future where I’ll have less context to decide what I’m hoping to get from the article, and how I’ll decide to stick with it or cut bait and move on.

I’m spending tomorrow’s energy on today’s problem, and it’s unkind to my future self. So instead of having a mind that’s free to wander, I waste my energy re-familiarizing myself with an inventory of potential knowledge I’ll never synthesize.

So here’s my new strategy.

  1. Send the link into my Things list
  2. Write a sentence about why it seems worth my time and what I hope to get from reading it
  3. Set a due date correlated with the estimated effort

Even the minimal friction of writing can reveal I don’t actually care about the potential payoff of allotting future attention. And if I don’t read it by the due date, I’ll mark it canceled. No hard feelings, just a fresh acknowledgment of my limits.

Things is becoming the single tool where I’m confronting my finite relationship with time, capacity, and focus. It’s easier to acknowledge limits when they’re gathered in one place. If my future self wouldn’t benefit from a sentence of context, the task to be done isn’t worth capturing.

Why I quit "The Strive" (joanwestenberg.com)

I’d rather be bored and present than excited and perpetually somewhere else.

Bored embodiment is still embodiment. Don’t mind me, I’m just being.

apple-intelligence-inloop (github.com)

Unix-friendly CLI wrapper for Apple’s Foundation Models (macOS 26+). Read from stdin, write to stdout, errors to stderr. Designed for scripting with Ruby, shell, and JXA.

I have no frame of reference for how capable these models are, but the idea of on-device inference for smaller tasks feels powerful.

On Backlogs

I hate my Things backlog. It’s all the tasks I captured that I may or may not ever act on. They accumulate unbounded, each one fragmenting my ability to focus. I cannot push them out of sight, out of mind. My brain just doesn’t work that way. I lose momentum because I’m dragging the weight of all my ephemeral ideas that didn’t float away. Entropy has failed me.

I’m this close to declaring bankruptcy on my personal backlog. Or at least acknowledging a bumper crop of tasks has already died from neglect. The resistance to deleting is the lingering remnant of a scarcity mindset. A belief that ideas are rare and difficult to come by. They’re not. Execution and focus is the hard part. Holding onto too many small ideas prevents the action of starting on the one that matters now.

Anything that truly needs to get done will bounce back and it will have a deadline. If not externally imposed, make one up. Projects, lists, and tags can grow without restraint. It’s the finite resources of time, attention, and affinity that must act as the forcing function.

I want to build a metabolic workspace. Things flow in, flow out, and then it’s time for lunch. If there’s any accumulation, it’s in the knowledge and experience gained. I’m no longer interested in growing stocks of shoulds and oughts.

Baggage Accumulating
Coherence Killed
Liabilities Only Grow

Burger Digest (burgerdigest.com)

A bite-sized burger blog from Louie Mantia, with a super-simple rating system.

This is everything I ever wanted in a website. Instant subscribe.

TIL that Martin Short and Steve Martin show up as a voice acting duo in the 1998 animated picture The Prince of Egypt. Working projects with your bud across three decades sounds like a pretty good way to live.

When your friend asks you for a ride to the airport, you can just add it to your calendar as “LARPing as a Lyft driver.” There’s no one to stop you. And you get a good laugh when the event reminder comes up.

I keep being reminded that nobody wants to use computers. I wonder what my life could look like if I didn’t use computers.

TIL that smaller Apple Watches have no tap-to-type keyboard. I also learned this same device prompts you to enter the iCloud password periodically, without clear motivation, with no affordances for mixed case letters or symbols. And because it’s a child’s device setup via Family Setup, there’s no prompt to type in the password on a paired phone.

This is truly some of the worst UX Apple has shipped. Think different.

McDonald’s Theory (jonbell.medium.com)

I use a trick with co-workers when we’re trying to decide where to eat for lunch and no one has any ideas. I recommend McDonald’s.

An interesting thing happens. Everyone unanimously agrees that we can’t possibly go to McDonald’s, and better lunch suggestions emerge. Magic! It’s as if we’ve broken the ice with the worst possible idea, and now that the discussion has started, people suddenly get very creative. I call it the McDonald’s Theory: people are inspired to come up with good ideas to ward off bad ones.

I’m surprised at how often I refer to McDonald’s Theory. And given that it’s published on one of those platforms that tend to disappear over time, it seems prudent to keep the crux of the idea for my personal reference.

TIL about R values for insulating a home in central Kentucky. R13 in the exterior walls. R19 in the ceilings. It has nothing to do with talking like a pirate, which is disappointing.

My cell phone charger
Comfort and security
Forever draining

Would you consider
Wrapping me with dollar signs
Be my shell escape

Generative prompts
And context millionaires
Got nothing on me

Because I have thoughts
And dreams of being at rest
Not HTTP

TIL how to convert an m4a to mp3 on macOS. ffmpeg handles this in one line:

ffmpeg -i input.m4a output.mp3

There are, of course, more options. I just needed to get something out of Voice Memos and into an mp3 so could upload it to Yoto Daily, which only accepts mp3 files.

When Your Life’s Work Becomes Free and Abundant (x.com)

I sat with that for a while, and what I felt was wonder mixed with a profound sadness. There’s something deeply disorienting about watching the pillars of your professional identity, what you built and how you built it, get reproduced in a weekend by a tool that doesn’t need to eat or sleep.

This shift would be disorienting for anyone. I think it’s increasingly disorienting to engineers who are used to existing in a world of high order and low variability.

But here’s the thing about disorientation: It passes. And what replaced my sadness was something I didn’t expect: a kind of wild, almost reckless energy.

Robin Sloan called this “manic technology.” Those words of reckless and manic hit on something real. Grief and disruption are processes with predictable stages. I believe stabilization with the new tools will come eventually. And I believe it’s going to look different.

Every layer of review makes you 10x slower (apenwarr.ca)

Maybe we finally have a compelling enough excuse to fix the 20 years of problems hidden by code review culture, and replace it with a real culture of quality.

The idea that code review isn’t the most effective way to deliver quality is jarring and compelling in a good way. Lots to think on here.

Maybe you could have multiple teams inside a company competing to deliver the same component. Each one is just a few people and a few coding bots. Try it 100 ways and see who comes up with the best one. Again, quality by evolution. Code is cheap but good ideas are not. But now you can try out new ideas faster than ever.

A single prioritized list with augmented human teams finding the best solution possible in a matter of hours/days is compelling.

TIL there’s not really a way to sort files by modification time using plain old ls. macOS had ls -ltU, but that’s non-standard. A mix of ls -ltU and ls -ltUr is good enough for my inbox file futzing.

I’m building a command line tool called yap. It creates an isolated folder where I can yap with Claude about a task at hand. Bespoke tooling with no intention to make it work for anyone else is fun.

TIL I could reverse engineer the Google Reader API by pointing NetNewsWire at a fresh rails new --minimal --api application running at http://localhost:3000 as a FreshRSS source. Logging in, adding a feed, importing .opml, fetching feeds, and marking as read are all working. The code is ugly, but it’s functional!

There’s some gotchas against Rails conventions for parsing parameters. But Rack utilities have it covered.

This is going to be intentionaly bare-bones. No multi-tenancy. Minimal status dashboard for seeing the health of feeds, maybe. It’s funner to build on Rails!

I’m experimenting with all the RSS readers, and got tired of exporting and importing OPML files into each’s bespoke iCloud syncing. So I deployed FreshRSS to a DigitalOcean droplet using kamal.

It’s syncing just fine. Even across multiple readers on multiple platforms! But the Rubyist in me wants to replace the bloated PHP app with something along the lines of rails new --minimal.

TIL that Hammerspoon is excellent. I don’t fully comprehend the power yet, but I was able to build my ideal terminal environment. Standard macOS keyboard shortcuts for creating tabs and navigating between them (cmd+t, cmd+shift+[, cmd+shift+], cmd+1, cmd+2, etc) now fluidly adapt based on whether or not my terminal window is a tmux session. It doesn’t work in macOS’s builtin Terminal, but does work in Ghostty and iTerm2. 🤞

Agents are ushering in the Antisocial Coding era (justin.searls.co)

I’ve been advising startups to stay single-developer for as long as possible and telling larger organizations to start moving to one-repo-per-human wherever they can—even if it means re-architecting their systems to align with this.

Another anecdata of the perspective that coherence of a codebase is the thing to optimize for…and coherence gets logarithmically complex as you add more people.

LLM as advance team (jmduke.com)

More often than not, the branch spun up by Conductor never even makes it to GitHub, let alone the main branch. It’s purely a first draft from an overstimulated and undercompensated robotic junior colleague — but that is value additive. I couldn’t tell you what the dollar amount of that value is, but right now it’s certainly greater than zero. And the tax on my workflow is minimal at best.

Batching explorations than reviewing them with deep focus feels like a workflow that would suit my sensibilities. In an age where progress can be spun up faster than ever, it’s important to remember that sometimes progress looks like finding the path you shouldn’t take, and throwing it aside with maybe a footnote describing why it wasn’t viable.

Good Grief

I have been grieving for 18 months. Maybe more. One loss after another. Mostly invisible. A shrinking job title that enabled my team to grow stronger. An industrial scale disruption that is melting my craftsmanship into machine learning. Relationships not meeting me where I thought they would. It’s been a stripping away of false identities and latent securities to find what I really value and what truly endures. I’ve been mourning in the unseen world where ideas, hopes, and expectations eventually meet reality.

“Imagined futures” are becoming grieved losses as each arbitrary evaluation horizon comes and goes. None of these expectations were owed to me, promised to me, or even alluded to me. And now they’ve eluded me. The grief shows up whether the desire earned it or not. I truly am God’s image bearer—I’ve created something out of nothing. That’s not quite right. Desires aren’t nothing, and emotions are definitely something. Out of nothing, I’ve created disappointment.

And yet, I’m happier than I can ever recall. My connections with my wife and children are stronger than ever. I’ve come to realize those are the constants I care about most. Everything else is free to be variable and volatile. I can’t control any of it. And the constants don’t ask me to.

I’m embodied and emboldened by this nervous system. Dis-regulation and all. Who called it a nervous system, anyway? Why not a “courage system” or a “hope system?”

I suffered a real loss today. My uncle died. He’s gone. We’ll never laugh together again. That’s an imagined future that cannot be pursued. I’m mourning. It’s good to grieve.

Kenneth Chavious was kind, patient, and generous. He came to my graduations. He endured my angst. He smiled and laughed at every opportunity. I miss my uncle Kenny.

I’m going to continue missing him indefinitely. I’m not going to miss out on my next imagined future.

My kids have been watching the ZOMBIES movies on Disney. And I’m not ashamed to share my opinion: the majority of these song are straight bangers. This is gonna be our year.

I’m trying my hand at building a macOS application. It’s the missing file browser, fuzzy searcher, and previewer I want to compliment iA Writer. It’s also another testament of the lengths I’ll go to when I stumble upon a perfectly stupid name that captures the essence of what I want.

It’s called Fimder. It’s Finder with Markdown at the center. You get it.

Agentic swarms are an org-chart delusion (joanwestenberg.com)

The people who will thrive aren’t “agent managers.” They’re people who can say what they want and evaluate whether they got it - and whether what they got was either good or shit.

This is test driven development with natural language. It’s all feedback loops, the tools and modes of collaboration are changing.

Every time a tool collapses specialized roles into generalist capability, the generalists inherit the earth — no matter how loudly the specialists insist their particular expertise can’t be automated or absorbed.

Reminds me of the neverending competition of products bundling for capture and unbundling for disruption. Career opportunities oscillate between maximizing via specialization and hedging with generalization. Stasis is a myth. Blessed are the generalists.

The Software Development Lifecycle Is Dead (boristane.com)

These engineers aren’t worse for skipping the ceremony. They’re unencumbered by it. Sprint planning, code review workflows, release trains, estimation rituals. None of it. They skipped the entire orthodoxy and went straight to building.

This description of ritual collapse is a welcome refinement to me. The ceremonies being skipped smell like the worst formalizations of agile that celebrate process adherence over serving the felt needs of humans on the other end.

Feels like a great time to revisit The Manifesto for Agile Software Development.

We are uncovering better ways of developing software by doing it and helping others do it. Through this work we have come to value:

  • Individuals and interactions over processes and tools
  • Working software over comprehensive documentation
  • Customer collaboration over contract negotiation
  • Responding to change over following a plan

That is, while there is value in the items on the right, we value the items on the left more.

Agile, in it’s truest form, is back baby. We build in collaboration with agents to serve humans. We are uncovering better ways of developing software by doing it and helping others do it.

The quality of what you build with agents is directly proportional to the quality of context you give them. Not the process. Not the ceremony. The context.

I believe this is true about all teammates, humans and agents alike. Process can provide a frame for context. Ceremony can act as scaffolding that props it up. Both can be helpful, but the most interesting people I’ve worked with never required the scaffolding or the frame to compact their point of view. They know how to explore widely to search the problem space, narrow in when it’s time to get things done, and only reach for scaffolding when it genuinely makes the work better. I think agentic workers reflect this quality, because we all enjoy the work better when working with highly talented people who challenge our thinking and ship relentlessly.

A Pitch for The History Channel

Alone is good entertainment. I keep showing up to watch it despite the familiar story arcs and predictable outcomes reinforced across several seasons. Each year I say “we don’t need to watch this, it’s just gonna be more of the same.” And then we watch each episode as rapidly as it’s available depending on when we locked in to the release cadence.

I’d like to see a companion show to bridge the gap between seasons of Alone. Connected. The premise of Connected would be endurance, just like Alone. But instead of going into the wilderness to survive on bushcraft, the contestants go into a one bedroom apartment to live a larp of luxury. They’ll inhabit the kind of cookie cutter apartment buildings that show up adjacent to the interstate in developing cities. Perfectly curated to live a simple life.

Contestants can choose any 10 items for their stay in this monument to suburbia. Instead of choosing amongst hatchets, saws, or bows and arrows, they choose which devices they’ll need to thrive in their frictionless survival. They can have laptops, phones, e-readers, coffee brewers, pots, pans, utensils, treadmills, washing machines, dryers, a bed, a book, a mirror, anything. It’s their choice, just like Alone.

Running water, unfettered internet access, and a reasonable monthly budget are provided. The only thing contestants are not permitted to experience is the real witness of another human being. All interactions must be mediated through a screen. Any arrival of supplies or exchange of services happens in an air-lock style entryway with no liminal interactions with another human.

Contestants can order anything they want and have it delivered within their budget. They can sign up for Netflix. They can subscribe to an AI companion. They can send their laundry to a dry cleaner if they opted to forego the machine. They can invest their money in the market and increase their capital if they want to take that risk. These contestants live as hyper-connected as possible in the digital world, and see how long they can endure.

Contestants tap out by walking out. No calls for retrieval. Just a step outside the one bedroom apartment.

Medical checks don’t exist on this show because the apartment is filled with closed circuit cameras that are running all the time and vitals are recorded daily. If someone is going to be pulled for medical reasons, there is no hint from previous checks or the periodic feedback of possible decline. When the decision gets made by producers, the air lock is replaced by the door opening straight into the natural world. Every time a contestant prepares to fetch new supplies, they face the dread that they might find themselves losing. It’s a constant anxiety engine to know they’re always being monitored but never receiving feedback about how it’s going.

The winner’s reward is a pension that pays exactly enough to cover a one bedroom apartment with utilities and match the contestant’s monthly budget for the rest of their life. The reward for enduring Connected is guaranteed provisions to pursue connection.

Ways of RSSeeing

The still small voice of RSS feeds emitting from personal websites is my favorite part of the web. The acts of expression and bids for connection that made the early 2000s web fun are still present, they’re just drowned in the volume of commercial adaptations. You’ve gotta work harder to find the signal and drown the noise, but the dream of the 2000s is alive in hypertext.

I’ve been enjoying two experimental RSS readers.

  • Reeder reimagines RSS feeds as a social media timeline. Working through items like an email inbox is replaced with scrolling through timelines.
  • Current leans hard into a metaphor of content flowing by in rivers and streams. There’s still marking things read, but the key interaction is releasing content from the body of work. Optimizing for flow.

Both of these apps drop the notion of unread counts, which is a welcome omission. I jump into RSS feeds to graze for interesting ideas, not to manufacture a todo list. When I was building an indie RSS reader a few years ago, that was my key design decision. Even though that ambition stalled, it’s nice to see that leaning validated in emerging alternatives.

This is what I love about simple and stable protocols. When the means of exchange are agreed upon, the receiver is free to interpret the payloads in new and interesting ways. There are many ways to see the world (wide web). Agreement on protocols enables wild experimentation in both production and interpretation.

I’m guessing we’ll see an abundance of slop apps in this space in the coming months and years. And we’ll engage in a higher order task of separating the noise of abundant tools to find the signal of an RSS reader that niches down on a reading experience that matches the reader. Both the means of production (ai slop content) and the means of distribution (ai slop reader applications) are being accelerated and amplified. Is there any audio engineering tool that handles over-amplification? Gain? Compression? The core need remains making meaningful connections with other human beings.

Anyway, if you’re into RSS feeds, maybe give these two readers a shot.

Deterministic Core, Agentic Shell (blog.davemo.com)

So, similar to how functional core was Gary’s answer to testability in a world full of side effects, my assertion is that state machines are the answer to determinism in the era of AI agents. I have seen time and again that if we draw a larger box around that core and try as hard as possible to shove all the things that are important into it, and into a state machine, that the layers above (both imperative and agentic) become minimized, reducing risk, and making it much easier to verify correctness in the core of the system.

Functional Core, Imperative Shell was truly transformational and changed the way I approached programming. This analogous paradigm applied to LLMs is intriguing. Time to brush up my thinking on state machines.

I started archiving my twitter status updates in 2017. Of course I used Rails to import the original data dump into SQLite and then continued appending to the dataset with APIs in background jobs. This freed me up to delete my data from twitter so I could own my content on my own domain. Hypothetically.

I stopped using twitter in 2022. It no longer exists, the same way that you never step in the same river twice. My content doesn’t exist there, that’s for sure. Probably soft deleted I’d guess, but not available to me or the public.

So I’m done there, and have the data here. In theory, all I need to do is hydrate the archive one time, and I’ll be done forever. It’s just plaintext, with some goofiness to inject media and mentions.

The Rails app is old and crufty and still boots. With an hour to kill, tokens to burn, and the help of LLMs, I’m now 90% of the way there to having an archive that is fully hydrated with the embarrassment of my mid-twenties to late-thirties.

I’m no longer battling IE6 like I was in 2008. I don’t miss that.

Dear RSS Faithful

I’m sorry for 40’ish repeat entries re-appearing as brand new and potentially unread in your reader of choice multiple times over the last few days. I’ve been doing some housekeeping ‘round here, and I was moving fast to get through the migration so I can get back to sharing words on the Internet with as little friction as possible.

Potential causes of the noise:

  1. Stabilizing on a canonical URL structure
  2. Moving from my bespoke static site generator to jekyllrb (RIP)
  3. Moving from an assumption of noon to building tooling that always gets my publish Date into a DateTime and down to the second
  4. Implementing the Atom feed with jekyll-feed, which uses timestamps as unique identifiers
  5. Not liking that, and some of the other choices made by jekyll-feed, so I replaced it with a custom template

Things should be stable now. If things continue re-appearing, please nag me as best as you know how, and I will find a fix!

The AI Vampire (steve-yegge.medium.com)

The narrative makes sense. Feeling mentally drained after periods of intense focus is a human experience.

Here’s the thing. I haven’t experienced it. A full day building curiosities with Claude does not leave me feeling drained. I have an irrational excitement for shipping ambition. I’m excited to get back to the prompt and see what is possible.

A vampiric lull is the way I feel after a day full of meetings and social interaction. The intense focus of listening and responding produces great results in the form of relational connection. Draining all the same.

I wonder if there’s a correlation to introversion and extroversion. Are introverts fueled by the accelerated exploration of LLMs, while extroverts are drained by the thinking that’s not out loud and void of traditional relational connection?

I just said “traditional relational connection” without skipping a beat. What a weird time to be embodied.

“The word became flesh and dwelt among us.” Even Jesus Christ finds his origins in the word. The tokens are becoming flesh and dwelling among us as folks shape their belief in response to their own prompts meeting the curated collective writings of civilization.

Its words all the way down.

Potential paths to addressing bottlenecks:

  • Decrease the supply of inflows
  • Decrease demand of outflows
  • Widen the bottleneck
  • Transmute the viscocity of the fluid flowing through the bottleneck
  • There is no bottle

Modern CSS Code Snippets (modern-css.com)

Modern CSS code snippets, side by side with the old hacks they replace. Every technique you still Google has a clean, native replacement now.

Ask and you shall receive. The universe is sending me modern CSS knowledge, and I’m not mad about it. In fact, I’m happy about it. CSS forever!