← everything

2026

17 entries — 6 posts, 11 notes

Did I write this?

Opinion

The words you’re reading right now have my name attached to them.

That has always been difficult for me.

I’ve never been particularly comfortable putting my thoughts into words. Especially not when writing for other people. Saying what I think feels like committing to it. Writing it down feels even more burdensome. Once it’s published, it feels fixed. Like I’ve created a version of myself that I’m now responsible for defending.

Lately, though, I’ve been writing more.

A lot more.

And that’s been good for me. Writing has helped me explore ideas I would normally leave bouncing around in my head. I’ve become more comfortable saying what I think, being wrong, changing my mind, and trying again.

And, uncomfortably, AI has been a meaningful part of that process.

And that’s left me with a different version of the same problem.

I’m finally getting more comfortable putting my thoughts into writing, but I’m using something outside of myself to help me do it. So when I put my name on the result, what exactly am I claiming?

Did I write this?

Words feel permanent

Rationally, I know that’s nonsense. Obviously, I’m accountable for what I say. But writing something down doesn’t mean I have to believe it forever.

Knowing that doesn’t make the feeling disappear.

I think a lot of that fear comes from my personal experiences. Mostly the internet. I’ve spent my whole life watching people on the internet pick sides, name-call, humiliate, tease, and harass others simply for having another opinion. Growing up with that taught me to expect disagreement to become combative.

When I’m writing, I often find myself stuck finding the right words. I worry people won’t understand exactly what I mean. I hate the feeling of being misinterpreted. I worry about people disagreeing with me, and what their reaction will be. So I get defensive in my writing.

And that’s tiring.

I spin my wheels trying to make every sentence perfectly accurate, never giving myself the time to actually process my thoughts. I end up writing from a combative stance, where my gut tells me, “I need to prove that my ideas are right” before anyone has even read them.

This also happens to me in conversation. I get defensive before anyone has a chance to respond. And that pushes people away.

Unless no one is listening.

Unless I’m talking to myself.

Only then can I explore ideas without fear of being wrong. I lose the ability to endlessly rewrite an opinion before I’ve even finished forming it, so it’s easier to let the thoughts flow. But it’s difficult to capture my thoughts while speaking to myself. Without something to look back at, it’s hard to trace how I got there. Writing it down gives me something I can inspect, refine, and eventually feel more confident standing behind.

Enter: Artificial Intelligence

At first, the idea of using AI to help me write was nearly repulsive. It felt like slop by nature, as if any usage would be cheating.

But, as an industry software engineer, AI became a tool I had to learn how to use or be left behind. That meant embracing it, in almost every aspect of my job.

In the beginning, it was just another way to ask questions, replacing Stack Overflow and Google. Then it could generate code snippets for me, or offer a second set of eyes on a tricky bug. Then came autonomous coding agents. Agents that could investigate a codebase, make meaningful changes, draft documents and messages, run test suites, and keep working while I did something else.

That progression happened quickly enough that I’m still trying to understand what it means for my career. There have been times where I’ve been so anxious about how AI will impact my life that I’ve become nauseous. It’s scary. There have also been times I’ve laughed at how bad it is.

I don’t think that’s a contradiction. AI can be comically bad and awe-inspiring at the same time. It just depends on how it’s used.

AI is hard to talk about

Part of what makes all of this difficult to write about is how polarized the subject has become.

There are people who see AI mentioned and immediately assume the worst version of what “using AI” means.

I understand some of that reaction because I share a lot of the underlying fear.

I am suspicious of AI-generated content. I don’t want an internet filled with writing nobody cared enough to write and nobody cared enough to read. I worry about labor displacement. I worry about ownership and training data. I worry about what happens when companies can automate work faster than governments and societies can adapt to the people whose livelihoods were built around doing that work. I worry about exploitation of small communities and their infrastructure, and unethical methods for powering the data centers that make AI possible.

I also know I am in a privileged position here. I work in an industry where I will likely benefit personally from technology that will likely make life substantially harder for a lot of other people.

That bothers me. A lot.

This tension has made it difficult for me to form opinions around AI, let alone talk about them. I feel the need to resolve my opinions around AI and its usage as a whole before I can be “allowed” to talk about the benefits of a smaller part of it.

But, that’s a Catch-22. I can’t form that broader opinion without working through the smaller topics by themselves.

There is a lot more to say about AI than I can fit here. I don’t want to talk about the benefits without acknowledging that some of the costs scare me. This post isn’t an attempt to decide whether AI is “good” or “bad.” It’s just me trying to work through one part of it.

Talking into the void

At the end of the day, working with AI is mostly typing into a chat box. I began having to type a lot more than I used to in order to explain all the context needed for AI to effectively do work for me.

During this same time, voice dictation went from a joke to nearly perfect in a matter of months. Once it got good enough that I wasn’t wasting time fighting it, I started talking to my coding agents instead of typing to them.

Constantly.

These days, I dictate thousands of words a day. At work, I spend more time speaking to agents than speaking to humans. Out of context, that sounds terribly sad. In reality, it’s not that I’m talking to humans less. I just speak to agents in place of typing out code or spelunking through git history. (Oh, and I work remotely. With people who live on another continent.)

And that habit has translated into my personal usage as well.

All day, I find myself speaking out loud about nuanced and technically complex problems. I ideate out loud. I debate the pros and cons of a decision. I explain my perspective and the reasoning behind it, sometimes meandering back and forth as I figure out what I actually think.

That turns out to work really well with agents. Giving them all of that messy reasoning often communicates my intent better than trying to reduce everything down to a perfectly accurate and concise instruction.

The agent isn’t really a void. It responds. It can disagree with me, critique an idea, or point out something I missed.

But there aren’t the same social stakes.

I’ve always had entire conversations in my head. I argue with myself, imagining some vague entity disagreeing with me. In person, though, a half-formed thought can suddenly feel like a position I’m expected to defend.

So a lot of the time, I find it easy to instead avoid those awkward situations with other people.

At some point I realized that talking to agents had given me a place to explore half-formed ideas out loud.

I can word something poorly.

I can contradict myself five minutes later.

I can start explaining an idea and realize halfway through that I don’t believe it.

Nothing gets published. Nobody feels like I’m trying to convince them of anything. I’m not committing to a position.

I’m just thinking out loud.

I tend to Ramble

Once I realized that, I tried to harness it. I built a tool called Ramble around this process.

The goal wasn’t to build some facsimile of me that can pump out blog posts while I play video games.

I wanted a way to get my thoughts out of my head and into a form I could react to.

I can talk for twenty minutes, or an hour, or however long I need to get my thoughts out. Ramble takes that material and organizes it. It pulls together things I repeated, groups ideas that belong together, points out contradictions, and gives me counterarguments I may have not fully considered.

Most importantly, I ask it to preserve my own words and phrases as much as possible.

The output isn’t a blog post or essay. Sometimes it’s barely even a draft or outline. It’s something I can read back and react to.

That’s where most of the thinking happens.

I can highlight a passage and explain that I didn’t mean it quite that way. I can expand on an idea I rushed through. I can clarify something that avoids nuance. Or I can simply blabber some more because reading the first one made me think of something new.

Then Ramble processes all of that too.

A single piece might go through a dozen iterations like this. Each time I’m looking at some version of my own thoughts, reacting to them, and giving it more source material.

It’s a loose feedback loop.

I speak.

I read what I said.

Then I speak some more.

That gives me something I don’t get from simply talking to myself. I can look back on one specific thought and ask: Is that actually what I meant? What did I leave out? Why does that feel wrong?

I’m not just capturing a rambling monologue and turning it into prose.

I’m using that process to turn half-formed thoughts into ideas I actually understand and feel comfortable claiming.

Thoughts into words

Ramble isn’t the means to an end. It’s really just the beginning.

Ramble helps me organize my ideas, and get to a starting point. It skips that “blank page anxiety” that makes it hard to start. What happens next is countless iterations on top of that draft, in a near-constant back-and-forth with AI agent. Post editor on the left, chat on the right.

This post alone went through four full editing passes with over a hundred exchanges with AI. I’m not feeding Ramble’s output into a model and asking it to turn it into a blog post.

I’m reading it. Reacting to it. Arguing with it. Rewriting it. Realizing something is missing and talking for another five minutes. Rejecting suggestions because they don’t sound like me. Accepting others because they say something I was struggling to say myself.

It never really ends. At some point, I have to stop myself from iterating.

There are still mistakes. There are sentences I could rewrite. Again. But eventually I can read the whole thing and feel like it represents what I actually think. It feels like mine.

That’s when I publish it.

Influence

Through this process, I end up with something that feels more representative of what I actually think than what I could have written alone. AI has helped me produce writing that feels more authentic to me.

And that makes me a little uncomfortable.

None of my ideas exist in isolation. I talk to coworkers. I talk to friends. I read things. Something someone said six months ago might stick in my head and eventually become part of how I think about something.

That’s normal.

But AI can influence me differently when I let it go beyond simple critiques. It can take something I said and propose a change that nudges an argument somewhere I didn’t intend.

It can make me sound more confident in an idea than I am.

It can produce nice-sounding passages that don’t really represent my thoughts.

That is different from spell check.

Spell check isn’t quietly changing the thesis.

The more I use AI, the more suspicious I need to be of its output and how it impacts my own thinking. My concern isn’t that an LLM touched my words. It’s that its writing can get ahead of my own thoughts and feelings. It’s easy to stop questioning and start parroting something just because it sounds good.

If I let that happen, I end up with writing that doesn’t represent me. I end up with slop.

That’s where the line is. I want AI to help me express my thinking, not quietly replace it.

What’s helped me

Constantly voice dictating to agents has made me much more practiced at expressing myself out loud.

That sounds obvious written down. If you spend hours every week explaining what you think, you get better at explaining what you think.

But explaining isn’t the same thing as having a conversation.

An agent will happily let me ramble for ten minutes. It doesn’t need a turn. I can blatantly interrupt it and completely disregard things it’s told me. I don’t need to notice that I’ve been talking too long, or that someone else has something they want to say.

Those are behaviors I’m self-conscious about when talking with humans.

I’ve had a tendency to ramble, over-explain, monologue, and occasionally soapbox since long before AI. I don’t want thousands of hours of talking to an infinitely patient robot to make me even more comfortable doing that to real humans.

So I’m hesitant to say that voice dictating LLM prompts is the same as practicing conversation with people. Not all habits I build while working with AI will be good ones.

But I am practicing expressing myself. Exploring ideas out loud. Being wrong, changing my mind, and correcting myself without feeling embarrassed.

Those are useful skills.

And, I’ve noticed some of those skills carrying over into how I communicate in person.

My wife and I have always had deep, engaging conversations. It’s one of the main reasons I married her. But even when I’m with the person I’m most comfortable being myself with, I struggle to feel comfortable voicing fresh ideas or exploring nuanced topics because of that irrational fear. That fear that if I share a half-formed opinion out loud, I’ve somehow committed to it and need to be ready to defend it.

That can make exploration difficult, especially with sensitive topics.

Sometimes you need to say the wrong thing before you can figure out what the right thing is.

Sometimes you need to hear yourself explain something before you realize you don’t actually believe (or understand) the explanation.

Practicing those fuzzy parts of conversation somewhere I feel completely safe being wrong has made me more comfortable doing it with other people.

I feel more willing to say, “I think this, but I’m not sure.” I’m finding myself changing my mind halfway through a conversation, and just admitting it. I’ve become less boxed in by things I said in the past.

And that has allowed me to have more meaningful and more open conversations with people I care about.

That might be the most meaningful way AI has benefited me.

What worries me

AI is always available. It doesn’t get tired. It doesn’t get offended. It doesn’t need me to make room for its own feelings or experiences.

It would be easy to let myself have more and more “conversations” with AI, while slowly avoiding those same conversations with other people.

That would be incredibly isolating. A life where I become better at talking to AI and worse at talking to people sounds miserable. I don’t want a tool that gives me the feeling of human connection while slowly making actual human connection less appealing.

And I don’t think the danger would necessarily be obvious while it’s happening. It would probably feel convenient. Maybe even helpful.

That’s what makes it uncomfortable.

Right now, AI is helping me practice skills I want to have on my own: exploring a thought before I understand it, being uncertain out loud, and changing my mind without feeling like I’ve failed.

I want those skills to make my relationships with other people better. I don’t want the easier conversation with an AI to slowly replace the harder, human ones.

To the future robot overlords: please remember I said nice things too.

So… Did I write this?

After all of this, I think the thing that matters most to me is agency.

If I type, “write me a thoughtful essay about AI and human connection,” copy the result into my blog, and put my name on it, that feels fundamentally inauthentic. A waste of everyone’s time.

But that’s just one end of the spectrum of AI-Assisted writing. I feel like my process is much closer to the other end.

AI heavily influenced this post. It has reorganized things I’ve said, challenged my arguments, suggested alternative phrasing, and pointed out repetitions. In some cases, it’s rewritten entire passages in ways that better represent my thoughts and opinions than the words I had come up with.

But, the writing wasn’t really the point when I started doing this. I was just trying to get more comfortable exploring my own thoughts. And, it turns out that the process I came up with has helped me write too. It’s also helped me become more comfortable being uncertain, changing my mind, and bringing half-formed ideas into conversations with other people.

I don’t want AI doing those things for me. I want to get better at doing them myself. Right now, AI is a tool that’s helping me get there.

But that still leaves me questioning the authenticity of my writing.

Does the finished post represent what I actually believe? Do I understand the arguments being made? Do I stand behind them?

Was I actively engaged in getting there? Did I decide what mattered, what didn’t, and what this post was actually trying to say?

When AI changed my wording, did I actually consider the change or did I accept it because it sounded better, or more convincing?

If someone quoted a passage back to me, would I recognize myself in it? Would I remember writing it?

For this blog post, my answer to those questions is yes.

So… Yeah. I think I wrote it. I’m the author.

I’m less sure what I owe the reader in terms of disclosure. A simple AI-Assisted label would leave so much unsaid that I’m not sure it actually clarifies anything.

This post is probably the most complete disclosure I could give you. I don’t know yet what that means for the next post.

If I figure that out, or if my mind changes, I’ll write some more and let you know.

In the meantime, give it a shot. Ramble into the void.

I want to finish a thought

Opinion

What changed?

I started using Fable as my daily driver. For the work I’ve been doing, I’ve been getting results I like more than Opus, and I’ve been getting them faster.

What stood out the most was how much more I’ve enjoyed agentic development with Fable. With a model that’s both capable and fast:

  • I spend less time waiting for the agent to finish, so I feel less pressure to start something else.
  • I spend less time juggling multiple threads of work just to keep myself occupied.
  • I spend less time context switching, remembering where I left off, and reconstructing what I wanted to do next.

The improvement changes the shape of my work. I can stay with a problem, follow a thought, and act on the result while I still have the context in my head. At the end of the day, I feel less “brain-fuzzy” and I have a stronger understanding of what I changed and why.

A lot of agent tooling treats parallelism as the answer to latency. Sometimes it is. But I’m more interested in removing that latency from the work where I’m focused; and, pushing the waiting into the parts of the process that don’t need my active attention..

I want more focus in my day-to-day.

Working on more things at once

A lot of the conversation around coding agents seems to focus on how much work we can run at once. More sessions. More tasks. More agents coordinating with other agents. Increasingly elaborate tools for managing everything happening in parallel.

I understand the appeal. I generally have somewhere between three and ten active threads of work myself, each with its own agent session. I’ve put effort into tooling that helps me manage them.

But when I’m working through a hard problem, I want to be able to stay with it.

Suppose I’m partway through a change and need a refactor before I can continue. I know what I want to try next. I understand the relevant code. I’m thinking about the behavior we need and the tradeoffs we’re making.

Then the agent needs 30 minutes to churn.

That’s enough time to make sitting there feel wasteful. So I open another session. Or two or three. I check another agent’s output. I start thinking about other problems.

When the first agent finishes, the code might be ready, but my attention has moved. I need to return to the problem, rebuild the context in my head, and remember why the next step mattered.

The agent’s execution time is only part of that delay.

Parallelism helps me make productive use of that waiting time. It doesn’t make the interruption free.

Speed has to come with capability

A model that responds quickly but needs repeated correction doesn’t help me preserve my focus. I spend the time I saved fixing mistakes, explaining context again, or steering it back toward what I asked for.

The more capable models have changed that experience for me. The jump from pre-opus-4-6 to opus-4-6 was the first time I felt like I stopped spending most of my time correcting an agent’s work. More recently, switching to Fable has reduced the other side of the loop: waiting for useful work to come back.

I can make a change, inspect the result, reconsider something, and continue while I’m still thinking about the same problem.

That continuity is valuable to me. It also seems easy to leave out of a comparison spreadsheet.

What are we actually paying for?

Token prices are concrete. You can compare them. You can put a budget around them.

The cost of repeatedly interrupting someone’s thinking is harder to account for. So is the time spent correcting an agent, reviewing several attempts, or reconstructing context after switching to something else.

I pay for my own usage outside work, and I regularly exhaust my plan. I care about using that budget efficiently.

Over time, I’ve become increasingly convinced that a more expensive model can still be the cheaper tool for me if it reaches a useful result in fewer attempts and consumes less of my attention along the way.

I’m not sure that “value per token” is even the metric I care about most. I care about useful work per dollar, certainly. But I also care about useful work per minute of my own attention.

That’s a suspicion based on my experience, not a cost study.

Where I want to be involved

There are parts of development where I’m happy to send an agent away and hear from it later.

For me, there’s a useful distinction between working through a problem and getting an agreed change delivered.

Research, design, implementation, and iteration are where I tend to want a close feedback loop. I’m still figuring things out. The result of one step changes what I want to do next.

Waiting for CI checks, tracking approvals, merging, watching a deployment, validating the rollout, and cleaning up are often better candidates for unattended, orchestrated work. There are mechanical parts of that process I would happily stop managing myself.

I want shared tools that handle those steps reliably and ask for my attention when a decision needs it.

What frustrates me is that many attempts I’ve seen to improve the development part seem to accept long waits as the starting point. The proposed solution is to make it easier to work on something else.

That helps me manage the interruption. I’d also like tools that reduce the need for it.

Your workflow will be different

When I discussed this with other engineers at work, one described almost the reverse of my workflow. They delegate research and implementation, then spend more time working closely with the agent during validation and cleanup.

That seems entirely reasonable. Correctness and minimizing impact during rollout are important parts of this equation. My preference is to make that end of the lifecycle reliable enough that I don’t need to supervise every mechanical step myself.

People differ in where they want to participate and what they trust an agent to handle. I expect our agent workflows to become a lot like our dotfiles: shared tools and dependencies, surrounded by years of personal preferences and customizations.

I don’t expect everyone to want the same workflow I do.

What are we trying to scale?

When discussing this topic at work, I was asked: “how would you scale this approach if you needed to ship twenty or fifty times more pull requests?”

I’m doubtful that my brain could manage that many more independent problems. I’m also unconvinced that this is the outcome I should be designing my work around.

Routine dependency updates, vulnerability fixes, and feature flag removal seem like things shared engineering systems could increasingly own. I hope we automate that work well enough that each engineer doesn’t need to personally supervise an expanding collection of agents doing it.

There’s a difference between scaling how much implementation machinery I can supervise and scaling how effectively I can apply my judgment.

My employer pays me to understand problems, make decisions, and help ensure that what we’re building is what we should be building. PR counts, attributed deployments, and lines of code are only fragments of that process. Yet those are some of the primary metrics I see quoted when people justify or critique AI spend.

They tell you very little about how much value was actually delivered, or how effectively I used my time and attention.

What I want back

When I think about where my career might go over the coming years, I hope more of my time goes toward product behavior and system design. I want to think about what someone needs, how a system should behave, and whether the proposed change actually helps.

I don’t want AI to help me keep fifty independent threads in my head.

I want it to make more of those threads unnecessary.

I want the routine work to require less attention. I want the difficult work to receive more of it.

I want to focus on one hard problem at a time.

calsync: It syncs calendars

Before the COVID shut down, I really didn’t worry about accessing my work calendar while at home. I was just at work, from 9 to 5, Monday through Friday. I even left my laptop at work back then…

But now that I work remotely and have kids, organizing my time has become much trickier. Family and personal events started impacting my work day a lot more. My life is spread accross a few different calendars:

  • Personal
  • Household
  • Lisa’s (for awareness)
  • Work Meetings (work account)
  • On Call (work account)

The hard part is that they cross work/life boundaries. A kid’s dentist appointment on Household calendar doesn’t automatically block my time in my work calendar. And my wife can’t see when my meetings are when making plans that include me.

The whole thing comes down to the wall between my work life and my personal life. Work lives in one Google account, my personal and shared calendars live in another, and getting them to cooperate across that wall - without handing either side access it shouldn’t have - is the entire problem.

A few years ago, I wrote a little Google Apps Script to copy my personal appointments onto my work calendar as “busy” blocks. It worked, but it only solved half of the problem I actually have. So I wrote a second, more complex script to go the other way with slightly different features.

I made: calsync.

I want to see my work calendar without giving work my personal devices. I want my meetings on my phone, and I want Lisa to see when I’m busy so she can plan around it. There are only 2 real options, and both stink: opening up the Slack calendar app; or log into my work account on my personal phone, allowing work to enforce device policies I don’t want. I just want to know what time my next meeting is.

I want my personal life to block off my work day. Dentist appoints, haircuts, (maybe interview…) - these happen between 9 and 5, and if they only exist on my personal calendar, a coworker will book a meeting right over them if I double double-enter my events. And the calendar slot undersells the real cost. “Dentist, 2:00-2:30” ignores the drive there and back, the context switch, and the few minutes it takes catch up on whatever happened in Slack while I was gone.

Mask: show that you’re busy, without the details

The first move is the one the old script did. Take an event from a personal calendar and drop a copy onto my work calendar as an opaque block. Same time slot, but the title and notes are gone - coworkers see “Busy,” not “Dentist - Dr. Toothy.”

Mask: a personal event becomes an opaque "Busy" block on the work calendar

Buffer: pad the block

A 2-2:30 appointment isn’t really over at 2:30. I have to drive back home and get my head back into work. So the busy block gets padded on both ends by a buffer. The half-hour haircut becomes a wider hold on my work calendar.

Buffer: the busy block is padded past the appointment on both ends

Mirror: see my work day on my own calendar

The other direction, and the half the old script never did. Take my work meetings and copy them onto a personal calendar - but just the title. No guest list, no attached docs, no meeting notes. Enough to see the shape of my day on my phone, with none of the work content riding along where it shouldn’t.

Mirror: a work meeting copied to the personal calendar as title only

This is the half that lets Lisa glance at her calendar and see I’m in a meeting from 10 to 11, without either of us logging into my work account.

Extras: carry the two things I actually reach for

The title is usually enough, but two details are worth carrying over, and each is its own switch.

The join link, for when I’m running late and need to drop into a Zoom from my phone while walking to the car - no laptop, no digging through email.

The room, for when I’m on-site and have no idea where a meeting actually is. I want to glance at my phone and see “Skyscraper, 4th floor, Room 2” not pull out my laptop to find it.

Extras: the room and join link carried onto the personal calendar

Quick setup

It’s a Google Apps Script, so there’s no server to babysit - it lives in your Google account and fires whenever a calendar changes. Setup is mostly wiring:

  1. Share the calendars you want to sync into the account the script runs as - read on the sources, write on the targets.
  2. Clone the repo, npm install, and copy the template: cp Config.example.js src/Config.js.
  3. Edit src/Config.js (below) with your calendars and rules.
  4. npx clasp login, npx clasp create --type standalone --rootDir src, then npx clasp push to send it up.
  5. In the Apps Script editor, run dryRunAll to preview, syncAll to do it for real, and setupTriggers once to keep it running on its own.

The config is the whole interface. You name your calendars once, then write rules against those names. Here’s roughly what mine looks like:

// Name the calendars once; rules reference these names.
const CALENDARS = {
  work: 'primary',                       // the account calsync runs as
  personal: '[email protected]',          // shared into the work account
  family: '[email protected]',
  phone: '[email protected]', // a calendar I read on my phone
};

function getSyncRules() {
  return [
    // Personal life -> work, as opaque "busy" blocks padded for travel.
    {
      name: 'personal_to_work',
      mode: 'mask',
      sources: ['personal', 'family'],
      target: 'work',
      maskTitle: 'Busy',
      bufferMinutes: 20,                  // a 2:00-2:30 appt holds 1:40-2:50
      color: CalendarApp.EventColor.YELLOW,
      visibility: CalendarApp.Visibility.PRIVATE,
      includeWeekends: false,
      excludeTitles: ['[free]'],          // skip personal events tagged [free]
    },

    // Work day -> a calendar I read on my phone: titles, room, and join link.
    {
      name: 'work_to_phone',
      mode: 'mirror',
      sources: ['work'],
      target: 'phone',
      copyLocation: true,                 // carry the room
      extractUrlRegex: 'company\\.zoom\\.us', // carry a matching join link
      excludeTitles: ['Busy'],            // don't mirror my own mask blocks back
    },
  ];
}

The mask rule is the one I lean on most. bufferMinutes is the travel-and-context-switch pad, maskTitle and visibility are what keep the details off my work calendar, and excludeTitles lets me opt a personal event out by tagging it [free]. Everything not set falls back to sensible defaults, so a rule only has to say what’s interesting about it.

If you want to run your own, setup and the full list of knobs are in the README.

Open Comment

Ian and I had a brief overlap at Datadog; we weren’t even on the same team. It wasn’t until after his last day that I discovered we were both house heads.

I found out from his departure message, which included his email address.

Which included his personal website.

Which linked to a great collection of DJ sets.

That he mixed.

dj.ianlesperance.com

The sets are an eclectic collection of soulful, jazzy, downtempo, organic deep house. Thoughtfully mixed and paced with subtle, flowing transitions that let each track breathe.

I love stumbling across new music that jives with my tastes. And it’s all thanks to Ian hosting these DJ sets on his personal website. The custom music player paired with a small ambient visualizer brings me back to my Winamp days.

It’s exactly the sort of serendipitous discovery that I love about personal websites. They build that sense of connection while exposing you to things you never would have found otherwise.

How apropos.

Thank you for sharing, Ian.

Your corner of the internet

Opinion

Do you have one? I want to visit it.

I long for a world where I can connect with people directly on the internet.

I’m tired of our reality where the only convenient way to stay connected with friends and family is through advertising streams dressed up as social media feeds, or through chat clients built to farm your habits, interests, and relationships as data to be sold to companies.

I wish I could speak into the internet and know that my words are heard directly instead of through reverberations and echoes that have been recorded, parsed, replayed, ranked, and filtered before they reach the people I care about.

What I’m after

The older I get, the more I find myself wanting something simple: a sense of what’s happening in the lives of the people I care about. Most importantly, I want to gain that sense through a direct and authentic medium.

I have friends scattered all over. We have jobs, kids, responsibilities, projects, hobbies, and busy lives. Sometimes months go by before we have a chance to talk. I’d love to know what they’ve been up to in between those chances. I want to know what they’ve been building. What hobby has captured their attention lately. What project they’re excited about. What they’re learning.

Not because an algorithm surfaced it.

Because they’re my friends.

The obvious answer is “just text them!” - but it doesn’t solve the right problem.

Texting is a conversation. A blog post is an invitation.

When I text someone, I’m asking for their attention. I’m creating an obligation, however small, for them to read and respond.

When I post on social media, whether or not my friends see it is largely up to an algorithm.

When I publish a blog post, I’m simply making a piece of myself available to anyone who cares enough to look. Intentionally.

That’s the kind of connection I miss. The internet used to be much better at this.

What we have

The systems we originally built for this purpose have become something else.

What should be a direct connection between two people now passes through a machine built to monetize our relationships. Our thoughts and ideas become products. They’re sequenced and filtered in order to maximize engagement and generate profit. My words become a tool to manipulate my friends and strangers. The emotional impact of the things we write - no matter how small - becomes another input into a system designed to keep people scrolling, clicking, watching, and consuming.

The decisions that have led to this were not made by any one person.

They’re the result of algorithms and incentives that have been designed, curated, nudged, and refined to extract more money from us. To control the people using them. Not because someone set out to make the world worse, but because the systems that generate the most revenue tend to be the systems that capture the most attention.

I think a majority of the people who have helped build these platforms wanted to build experiences that were truly beneficial to their users. But the economic incentives driving these platforms rarely align with healthy human connection. It turns out that our brains are remarkably easy to exploit. It’s a shame that reinforcing healthy relationships and positive human connection isn’t quite as profitable as reinforcing outrage, envy, fear, and compulsion.

It’s not the Internet’s fault

The internet itself isn’t the problem.

I love the internet.

I love what it makes possible. I love the accessibility of information, the ability to communicate across the world instantly, the communities that form around shared interests, and the incredible tools and technologies that have emerged because of it.

But somewhere along the way, we stopped building systems that primarily connected people and started building systems that primarily monetized and manipulated them.

I have a romantic vision of what the web used to feel like.

Personal websites. Blogs. Weird little corners of the internet. Sites with terrible fonts, custom backgrounds, music that autoplayed, and layouts that made no sense. They were messy, but they were personal. You could learn something about a person before reading a single sentence.

The web felt less like a feed and more like an adventure.

You found interesting websites because someone linked you to them. You followed rabbit holes. You bookmarked things. You shared them with friends. Discovery happened through people.

Today, discovery mostly happens through algorithms. Instead of exploring ideas, we’re served content. Instead of wandering, our paths are optimized. Instead of finding interesting things through human relationships, we find them through endless scrolling, hoping that the next swipe will finally reveal that last “good video” before you close the app.

I don’t think that’s a better internet.

What can we do

Ultimately, I think the healthiest way to avoid the algorithm is through direct access. What’s the simplest way to do that?

Hosting your own website.

Put your projects, thoughts, updates, photos, essays, and hobbies there. Let it reflect who you are.

Then bookmark your friends’ websites. Visit them intentionally.

Read what they’ve been up to. See what they’re building. Learn what they’re excited about this month. Follow links they find interesting. Discover new ideas through people you trust instead of through systems designed to maximize engagement.

Personal websites aren’t as convenient as social media. They require more effort. They require intent. But that’s part of the appeal. The important thing is that the mechanisms are transparent. They’re understandable. They’re auditable. They’re not black boxes making decisions on our behalf.

If I choose to visit a friend’s website, that’s my choice. If I intentionally spend an evening catching up on what they’ve been working on, reading about a new hobby they’ve picked up, seeing photos from a recent trip, or learning about something they’ve become passionate about, that’s a direct relationship.

No black-box algorithm decided it was time for me to see them. No recommendation engine boosted their content because it would increase engagement.

I explored their content because of one core reason: I thought about them.

That’s a fundamentally different experience than following people, “liking” posts, and endlessly scrolling through our modern social media feeds hoping the algorithm serves you well.

This isn’t a novel idea

This isn’t some new realization. Most of us have felt some version of this for years.

To me, what’s changed is that it’s becoming harder to ignore.

The incentives are more visible. The consequences are more obvious. The tradeoffs are no longer hidden behind the novelty of the technology.

Hosting your own website won’t fix the internet. It won’t solve every problem with social media, advertising, surveillance, or propaganda.

But it does restore something valuable.

Ownership. Intentionality. Transparency.

I want an internet where I can keep up with my friends because I choose to. An internet built from connections, curiosity, and real communication. An internet where discovery comes from people instead of algorithms. An internet where I can visit a friend’s little corner of the web and grow more connected to them.

Not because a feed told me to.

Because I chose to.

Addendum

I consider this blog post over, any more and it muddles the point.

That said… there are a few topics that I wanted to fit in - but they all felt forced, scattered, and out of place. So I thought I’d list them off below.

I would love to hear your own opinions and thoughts. I want to hear about the problems I might be overstating or the solutions I might be propping up a little too high.

I’m not suggesting a replacement for Social Media

I’m not advocating that everyone delete their social media accounts and retreat into a network of independent blogs.

Social media has created genuine value.

It helps people find communities they otherwise never would have discovered. It helps minority groups connect across geographic boundaries. It helps information spread during emergencies, natural disasters, political movements, and world events. It has allowed families and friends to stay connected across enormous distances.

There is a tremendous amount of good that can come from these platforms.

My criticism isn’t that social media exists. It’s that the default incentives behind many modern platforms have drifted away from helping people connect and toward maximizing monetization and control.

Personal websites aren’t a replacement. They’re a supplement. A counterbalance. A way to reclaim a small amount of ownership and intentionality over how we communicate online.

Even if only a fraction of our interactions happen through spaces we truly control, I think that’s a healthier internet than one where every relationship is mediated by a feed.

And if nothing else, I’d love to know what my friends are working on without having to hope an algorithm decides it’s important enough for me to see.

You don’t need to be a technologist

It’s easy to read this post and imagine some tech bro building their home lab and writing their website from scratch.

That’s not what I’m advocating. The point isn’t self-hosting.

The point is ownership.

A personal website can be a Squarespace page. It can be a Tumblr blog. It can be a simple site hosted on a free service. It can be anything that gives you a place on the internet that feels like yours, that can be accessed directly, and freely.

If you can create a Facebook profile, you can create a personal website.

The bigger challenge isn’t technical. It’s creative. If you have a personal space on the internet, you might feel an obligation to write an A-tier blog post at least every 5 business days. But that expectation is not there. Write what matters to you, when it matters. Don’t stress.

And honestly, I understand why that’s intimidating.

Writing about your hobbies, documenting projects, sharing photos, expressing opinions, or talking about what you’re learning isn’t for everyone. Not everybody wants to create content, and not everybody should feel obligated to.

But for people who already have the desire to share - what they’re working on, what they’re learning, or what they’re excited about - I think personal websites remain one of the most powerful and underused mediums.

Privacy

Personal websites and blogs are public. That’s a real concern.

Not everyone wants to share details about their personal life with the entire internet. And to be clear, I’m not advocating that everyone become a public billboard.

But I do think it’s worth examining the privacy model we’ve become comfortable with.

Today, many of us are willing to share enormous amounts of information with a handful of large companies. We hand over our interests, relationships, habits, locations, browsing history, and social circles. We trust that the data is anonymized, aggregated, or handled responsibly. Yet those companies often possess enough information to know exactly who we are.

The privacy isn’t really from the platform.

The privacy is from each other.

That’s a strange tradeoff when you think about it. The corporations know everything, but the people we’re actually trying to connect with know almost nothing.

That said, I understand why. There are legitimate reasons to be cautious online. Harassment, stalking, doxxing, and other forms of abuse are real concerns. Anonymity exists for important reasons.

The challenge is finding a middle ground.

I don’t have a perfect answer here, and everyone’s balance will be different. I simply think we’ve accepted a model where the only entities guaranteed to know who we are are the corporations sitting between us.

And that feels backwards.

Authentication and Federation

On the topic of Privacy… Part of what makes social media appealing is that you can control who sees your content. You add friends. You create private groups. You share things with people you know and trust.

Personal websites don’t naturally solve that problem.

Interestingly, some of the more recent movements on the internet have been exploring exactly this space. Projects like Mastodon, Bluesky, and other federated platforms are attempting to solve pieces of the puzzle: identity, ownership, authentication, and content distribution without relying entirely on a single centralized company.

I’m still learning about many of these technologies, but I find the direction encouraging.

In theory, a federated identity could allow you to host your own content while still controlling who can access it. You could maintain ownership of your space while preserving some of the comfort and safety that comes from sharing only with people you trust, without relying on a centralized identity platform.

But I don’t know if these systems are the answer yet. Very few of my friends are participating in any of these platforms and gating content behind one of them would ostracize them. For now, I still think a public, personal website is the easiest method to share your content. Maybe if one of these options become more widespread and as ubiquitous as other social platforms, it will be an obvious solution.

What I do know is that they are at least trying to solve the right problem: how do we maintain authentic connections online without handing complete control of those relationships to a handful of companies?

The future probably isn’t “everyone hosts a blog and manually emails the URL to their friends.”

The future is likely some combination of personal ownership, open standards, federation, and tools that make discovery and authentication easier without turning them into advertising products.

The void

There is one more thing that feels worth mentioning.

I think a natural fear of posting anything online is the possibility that nobody will care.

Nobody will read it. Nobody will respond. Nobody will even know it exists.

Whether you spend thirty seconds writing a post or thirty days writing one, the chance of it being seen is never guaranteed.

I have that fear with this very post.

I’ve spent a lot of time thinking about these ideas. I’ve argued with myself about them. I’ve written and rewritten sections of this blog post more times than I’d like to admit. I’ve spent literal hours talking out loud to myself, recording my thoughts, reading them back, and trying to figure out what I actually believe.

If nobody reads this, I can’t really be mad.

Over time, I’ve come to treat much of what I publish online more like a diary than a performance. It’s a record of what I was thinking, what I was building, what I cared about, and who I was at a particular moment in my life.

Years from now, I’ll be able to look back on it and remember where I came from.

And if someone else finds value in it - if it makes them think, helps them understand me better, or simply makes them feel a little more connected to me - that’s an amazing side effect.

If your only reason for sharing something online is for other people to listen, I understand the hesitation. The internet can feel like shouting into a void.

But I’ve found that the act of creating has value on its own.

Writing forces me to organize my thoughts. It helps me understand what I actually believe. It gives me something to revisit years later. For me, that’s enough to make it worthwhile.

That said, part of this entire argument is an attempt to encourage more people to occupy that same space. The more people who share their thoughts, projects, hobbies, photos, and experiences through places they control, the more valuable those places become.

Maybe this post becomes part of that.

Maybe it doesn’t.

But if it inspires you to start posting somewhere on the internet in the future, let me know.

I’ll bookmark it.

Making my dream weather dashboard, irl

Smart Home

I love the idea of e-ink devices: low power, low eye-strain, no doom scrolling.

I’ve been noticing a flood of consumer e-ink devices lately; e-ink feels like it’s finally escaping its “Kindle-only” niche. Today, I build a dashboard for my new TRMNL X.

Exciting e-ink devices

Kindles, despite their vendor-locked nature, are what got me back into books. Having a digital medium that doesn’t require blinding LEDs to function, that looks great in the light, is such a dream idea for me. I can be connected and have conveniences, without feeling like I’m plugged into the matrix.

Since I fell in love with e-ink displays for reading, I’ve kept my eye on the consumer market. But for years, it’s been more of the same old: devices designed to make you buy more things. Kind of antithetical to the reasons I like the idea of e-ink devices.

But recently there have been a few devices to hit the market that have me excited: the Boox Palma 2 Pro is a fully featured $400, color e-ink cellphone; the ET X4 is a super cheap, palm-size book e-reader; and the TRMNL X is a large format ambient e-ink dashboard.

I purchased the original TRMNL a few years back and I’ve had it sitting on my office desk displaying weather, calendar details, stock prices, and smart home data. I only have to charge it about once every six weeks, and it just keeps chugging along. I love it.

But recently I realized that I’d stopped looking at it - it wasn’t helping me where I needed it. I had put it on my desk, next to my computer, where all of that information was already available. After the novelty wore off, I stopped checking in on it.

Replacing what I have today

I recently picked up the newer, much larger TRMNL X. I had one goal in mind when purchasing it: replace the bright, gaudy, functionally limited weather station monitor we’ve been using for the past few years.

some cheap-o amazon special of a weather station

The weather station sits right next to the sliding door to our backyard porch, a threshold we walk through a dozen times a day during the summer. It’s full of bright and colorful LEDs, and has terrible viewing angles. It functions well enough to answer some basic “right now” questions:

  • Is it warm enough to eat dinner outside?
  • Should I close the windows because it’s hot and muggy outside?
  • Is the temperature rising or falling?

But it doesn’t show forecast data. It doesn’t tell us if it’s going to rain later. It doesn’t predict the highs and lows. It doesn’t help me plan my day.

At a glance, I want to know:

  • What’s the weather right now? Temperature? Humidity? Wind?
  • How hot is it going to get? How cold?
  • Is it going to rain today? When?
  • Is it going to be too windy for disc golf later?
  • Should I stop at the park with the kids on the way home from school?
  • Will it be cloudy? What’s the UV index?
  • Is there high pollen? Bad air quality due to forest fires?
  • What’s the temperature and humidity inside?

These are all things I could pull up on my phone or ask Alexa but that’s more friction than feels necessary.

This is all information that could simply be visible, all the time.

So let’s do it.

Building my dream weather dashboard

The TRMNL ecosystem has a rich community marketplace for plugins, allowing you to connect third-party APIs and render data using a simple component library. But, as with most things, it’s hard to get the display exactly how I want it, so I decided to roll my own.

To get my custom dashboard onto the device, I used the built-in “Display Image” plugin. You provide a URL and a refresh cadence, and the device periodically downloads and displays whatever image is returned.

I just needed a way to generate a 4-bit grayscale dashboard image and make it accessible over HTTP. To do this, I built trmnldash. The project runs in a Docker container as a cron job. It pulls data from several sources:

  • Weather from api.weather.gov
  • Sensor data from my Home Assistant server
  • Calendar data from Google

It then renders static HTML pages and captures screenshots using Playwright. I run the project as a cron job on Proxmox, and every five minutes it generates a fresh dashboard image for the TRMNL to download.

Here’s the result:

my new weather dashboard

The dashboard combines hourly forecasts, precipitation, cloud cover, wind, indoor sensor data, and forecast highs/lows into a single view.

A few details I’m particularly happy with:

  • The temperature graph highlights the forecast high and low temperatures.
  • Sunrise and sunset are marked on the timeline, with nighttime hours darkened.
  • Expected rainfall accumulation appears when precipitation is forecast.
  • Subtle background imagery helps distinguish cloud and precipitation graphs without adding too much visual clutter.

Breathing new life into my old TRMNL

As I mentioned above, my smaller, original TRMNL device had been sitting on my desk getting ignored.

With my new trmnldash project in hand, it got me thinking: where could I move my smaller TRMNL where it would be more useful? Where do I pull out my phone to look up the same thing every day? Where do I ask Alexa the same questions over and over again?

My bathroom.

That’s where. When we’re getting ready for the day, Lisa and I are constantly fighting with Alexa, or looking for our phones to figure out:

  • Should I wear pants today? A sweatshirt?
  • Do we need to rush because Fisher has a 9 AM meeting?
  • Who’s bringing the kids to daycare today?
  • Do we have any appointments during the day? Social plans at night?
  • What time is that dinner reservation tonight?

It’s silly, simple, everyday information. But I couldn’t tell you the number of times I’ve asked “Alexa, what’s the weather today?” only for me to get distracted with kids by the time it finally tells me the temperature. If I can avoid that at least once a day, then it’s worth giving it a shot.

So, I built another dashboard:

  • The left side is a daily agenda showing events from our collection of personal and shared calendars
  • The right side is a simplified weather forecast with just enough detail to help me choose appropriate attire for the day

my new and improved bathroom dashboard

Worth it?

Both have already proven surprisingly useful.

I spend way too much time hacking little things like this together. But few remain useful past their novelty period. In this rare instance, I’m certain both of these will be long-term “man, I’m glad I did that” items. Better yet, Lisa has already expressed how “super helpful” it’s been for her. So yeah, worth it.

What’s next?

I’m excited about the future of consumer e-ink devices. I hope this is just the start. I have this romantic idea of replacing my daily-driver phone with an e-ink device:

  • No doom scrolling or videos
  • Easy access to texting, email, calendars, and other boring-but-important apps
  • Distraction-free reading of books and news
  • Phone calls and music playback still work fine
  • Dramatically better battery life

But until the cameras improve, my iPhone isn’t going anywhere.

As for TRMNL, I may not be done yet. The TRMNL project originally started as a way to repurpose old Amazon Kindles. Flash an ESP32 with their firmware and you can build a functionally equivalent dashboard device yourself.

So a third display might be in my future. Here are some ideas I’m considering:

  • Top news headlines next to my coffee station
  • Smart home status on a bedside table:
    • Are there any open windows or doors downstairs?
    • Are the garage doors open?
    • Any lights still left on around the house?
    • Is it trash night, and is the trash can still in the garage?
  • A display by the garage door showing:
    • School lunch menus
    • Kid-friendly weather forecast
    • Family schedule

There are so many ideas… Maybe next time.

Every blog has a first post

If I’m being honest… This blog is for me. It has to be. It’s like a diary of the little projects I work on, of my passions. To keep me honest, motivated, humble. For me to enjoy. For me to look back on.

But I share these publicly to connect, to find like minded people, and in turn: discover other neat things that are shared with me.

Welcome.

Edit: This WAS the first blog post. I’ve since worked on back-porting content I’ve posted online and on other blog systems I’ve used in the past. Enjoy the “archive”.

I finally replaced my Animech sprites and animations with something I’m happy with! I’ve been using a placeholder up until now. It’s actually a fusion of 2 or 3 assets I bought on itch.io that I heavily modified to match the style I wanted.

Now you can select where you want to deploy your Animech, from your space ship! I’m really happy with the vibes in the cockpit with the stars. I was able to refactor my Xenolog screen utilities in order to build out the navigation computer pretty easily. It’s all coming together :)

8 more notes

in Primortal ··