• Projects
  • Archive
  • Links
  • Ok, be real with me: how bad of an idea is it to get into amateur radio? Or how hard is it to get started?

    → 10:14 PM, Oct 14
    Also on Bluesky
  • People Are People, or Why I Don't Want to Be a Landlord

    There’s a dustup going on over at Bluesky over moderation decisions. I won’t go into details because—for the purposes of this blog post—I’m less focused on why the dustup is happening and more that it is happening. It’s happening at Bluesky, it happens on Mastodon, it happened on Tumblr, and it will keep happening in the future despite all the best intentions.

    And I need to stop fooling myself that I want any part of it.

    Expectations, Meet Reality

    Every relationship that lasts long enough or goes deep enough eventually hits a point where expectations meet reality. Language is imperfect, there’s always things left unsaid, and we fill those gaps with assumptions. Eventually, those assumptions are proven correct—or more often incorrect. There’s disappointment, anger, and a lot of blame.

    In personal matters, people talk it out and maybe seek counseling. In business, contracts get more detailed. In social media… it’s people making personal expressions on a business' platform. Not only is that a recipe for mismatched expectations, it’s incredibly unbalanced.

    And it’s a rude awakening for both parties when a significant group of users realize that, despite everyone’s best efforts, this is not their beautiful house.

    Some of the backlash can be blamed on social media itself. We’re encouraged to reach out and make connections, especially with celebrities or people we admire in some way. But this can lead to a false sense of relationship and nurture the notion that the person on the other end cares as much about us as we do about them. In this environment, disagreements can feel less like a disappointment and more like a betrayal.

    And I’m finally realizing how pervasive it is.

    Refusal of the Call

    As tensions rise, even actions meant to calm the waters can only infuriate people more. Calls for moderating language are seen as tone policing or censorship. Attempts at reiterating common principles are met with accusations of failing said principles. And the longer it goes, the less human everyone becomes.

    And the worst part? It’s understandable. Because at the end of the day, these are people trying to assert agency over their online identities.

    A moderation decision or policy change by a site operator is, for them, a business decision. For a user that has tied part—or all!—of their online identity into their use of the site, such decisions would have the same emotional investment as a decision about where to live or what they believe. One party is talking business, the other is talking religion. No wonder these conversations get so charged!

    Let me be clear: I’m not trying to shame anyone involved here. I’m trying to describe the current environment of running a social media site. What I’m describing here just is. These aren’t technical problems; they’re personal ones. Apps and protocols can mitigate these problems, but I don’t see any technical way to deal with a situation that’s escalated out of control other than suspending or banning users.

    And I’m just not cut out for that.

    What About Smolblog?

    The original plan for Smolblog (laid out in the video I posted last year) was to have the project supported by a paid hosted service. I’m abandoning those plans. I will not be running a hosted Smolblog service for the general public.

    Limiting the service to paid users would encourage shared values, but not guarantee them. Having a self-hosted open source option rings hollow when users sign up for the paid service to avoid self-hosting. That’s on top of the brand confusion that happens when an open source project has a hosted service with the same name. And all this while selling what is basically web hosting, a notoriously high-support, low-margin business.

    The goal would be to sustainably support the project, but a hosted service is looking more and more unsustainable itself, at least for me to run.

    In the decentralized social media and independent website circles, we like to talk about digital serfdom and comparing site owners to landlords. What we may not realize is that this applies to anyone operating a site for others to use, even operators with the best of intentions and sites with the best user freedoms. Decisions still have to be made that affect the users much more than the operators.

    I applaud the people willing to do this, especially because I am not one of them.

    This is both part of and prompting a broader re-thinking of the project for me. The mission is still to make an adaptable content management system that lets people own their expression and approach social media on their own terms. The actual execution will just look less like a website to sign up for. Beyond that, I don’t know what the specifics are yet.

    In the meantime, I’m working on packaging up some of the less Smolblog-specific code into its own thing, but that’s all I’ll say on that for right now…

    → 12:19 PM, Oct 13
    Also on Bluesky
  • And so goes my annual ritual of getting knocked on my ass by Dolly Parton via SPIKEVAX.

    Get your shots. Protect yourself and those around you.

    → 10:56 PM, Oct 8
    Also on Bluesky
  • Not me searching for if there’s a plugin to use the Caddy web server with the Lando dev tool…

    Anyway, happy Singapore Grand Prix weekend to all who celebrate. 🏎️

    Photo of a DuckDuckGo web search for “lando caddy” with the results being stories about the Formula One driver Lando Norris and a golf caddy.
    → 9:54 AM, Oct 3
    Also on Bluesky
  • Anyone use Nova (by Panic) for PHP dev? If so, how do you like it?

    → 12:38 PM, Oct 2
    Also on Bluesky
  • I keep falling into the ADD trope of forgetting to take my meds in the morning. So I’ll wait to relieve myself until I have breakfast ready so that I can see the med cabinet and be reminded.

    That doesn’t work when I relieve myself at 5 in the morning because my dog also had to relieve himself.

    → 9:52 AM, Sep 28
    Also on Bluesky
  • Who is the marketing genius at Panera that decided the best time to alert me that I’m one visit away from earning a reward is right after I’ve placed an order?! I’m not hungry; I literally just ate your food! Set it to 23 hours later or something!

    → 9:56 PM, Sep 16
    Also on Bluesky
  • Okay, yes, I’m announcing a new project instead of finishing the current one BUT what if the new project is really part of the current project that’s actually shippable?

    → 11:10 PM, Sep 7
    Also on Bluesky
  • Ok, so modern dishwashers work best if you don’t pre-rinse and leave food residue on your dishes. And my dishwasher is super airtight.

    So is there any way for me to load dishes as I use them over several days without it smelling like absolute death every time I open it?

    → 6:28 PM, Aug 15
    Also on Bluesky
  • My Christian Rap past has come back to haunt me. (Do they know I was more of a John Reuben guy?)

    Screenshot from a McDonald’s mobile order: your order (voice code KJ52)
    → 8:52 PM, Aug 7
    Also on Bluesky
  • Abstractions, Future-Proofing, and a Reasonable Amount Of Effort

    I’ve been looking into Tempest. It’s a new PHP framework that is built for modern PHP: type hinting, property accessors, the works. I’m most excited about its approach to discovery. It closely models what I’ve been building towards in Smolblog’s framework, but with infinitely less manual configuration.

    So this past weekend, I started playing around with seeing if I could get Smolblog’s core domain model working. And… I ran into a speed bump. It wasn’t hard to get around, but I was curious about the reasons behind it. And when I asked about said reasons… well, apparently I wasn’t the first.

    Which brings me to this blog post. This isn’t me trying to die on this hill or even claim some semblance of high ground. I’ve just been thinking about this a lot since the topic was broached and I wanted to get my thoughts in order. But I especially want to emphasize: Nothing in here is meant as an insult to others or a statement on the quality of their code. I have my perspective, and they have theirs, and none of that means we can’t work together.

    That being said, let’s get some context.

    The Umpteenth Rewrite

    I’ve been working on Smolblog for way too long. I started it as a WordPress plugin, but as I learned more about SOLID principles and modern Object-Oriented software, I realized I had bigger ambitions. Especially when it felt like what I wanted to do and how I was thinking about content management was running headlong into some of the decisions WordPress made about how it approached things.

    So, I made a decision that honestly haunts me to this day: the core of Smolblog’s code would be framework-independent. I say “haunts” because while it’s meant the code I’m writing is—theoretically—incredibly versatile, it also means I can’t take advantage of any of the shortcuts that come from using a framework.

    That being said, while development has been slow, it’s also forced me into some design decisions that I’m happy about:

    • I’ve ended up with a distinction between Value and Service objects: Values have state but no logic. Services have logic but no state. It’s helped me stay closer to making “single responsibility” objects.
    • I haven’t had any real input or output with the system, since a user interface is an implementation detail. Which means the only way I know something works is to write a test. So I’ve got a lot of cussing tests.
    • If the code is something that is core to the application, it goes in. If it’s an implementation detail, it gets an interface and I move on.

    That last point was helped a lot by the existence of PSR interfaces. These are recommended standards for pieces of infrastructure that are often found in frameworks. For a concrete example, even though I wrote my own dependency injection container, the core domain model only needs something that implements PSR-11. Which means, if I want to finally stop building my own stuff I can swap out my container for the one in Tempest!

    Except… Tempest doesn’t implement PSR-11.

    The Other Side Of the Coin

    Naturally I asked in the community chat about this, trying to get an idea of the reasoning. Brent, the lead developer/architect/founder? of Tempest pointed me to an older blog post of his, with the note that the “long version” (describing how it pertained to Tempest specifically) still needed to be written1. Between that and some of the ensuing conversation, I gathered a few points:

    • The design of Tempest’s components don’t always match up with the PSR specification.
    • Having interoperability between frameworks doesn’t make sense when code is tied so closely to its framework.
    • The interfaces designed by the PHP FIG can be outdated or only fit for a specific purpose.
    • For PSR-11 specifically, Brent cites two frameworks, Laravel and Symfony, who both implement the Container standard yet add several methods on top of it. Any real use of the class would inevitably be tied to the specific framework.

    I highly encourage you to read Brent’s post, especially as at the end he acknowledges the popular use case of smaller packages being used in multiple frameworks.

    It’s that particular use case that I end up falling into for Smolblog: the core domain model isn’t written as a monolithic application but as a library to be used by an application. There’s so much more that goes into an app than just the core logic; in fact that’s often some of the smallest parts! But in this particular case, I wanted to take the time to get this core logic right… and I had another motivation.

    Fool Me Once

    I didn’t realize until I went to write this paragraph how ingrained the idea of limiting dependencies is to Smolblog. The first essays around the idea of Smolblog came in the wake of poorly-implemented policy changes at Tumblr. The original feature set leaned heavily on POSSE, the IndieWeb idea of owning your own content.

    So it makes sense that I wanted to reflect this idea in code. I didn’t want to be trapped into a particular framework’s idioms and then find out later that it would have been better to pick a different one. Part of this came from writing a different app with a WordPress backend and realizing… I wasn’t getting anything out of WordPress that I couldn’t get elsewhere with less hassle.

    So while I do plan on using Tempest—and I have the highest respect for Brent as someone that’s actually doing the thing he blogged about!—I wanted to push back against this:

    I’m more than happy to ditch “interoperability” — what does that even mean when you’re building a project closely tied to a framework and never intend to change it — and just use a simpler, straight forward, opinionated solution.

    You never intend to change it until you do. The framework is just what you need until it isn’t. One thing that I took away from POODR was the idea of using dependency injection and interfaces to keep your code reusable. And no one with any serious experience with object-oriented programming disagrees, Brent included!

    What I keep coming back to is when I finally understood the reasons for dependency injection:

    I genuinely think part of the reason SOLID never clicked for me at the agency was the simple fact that we were always going to be using WordPress. […] Now that I’m working on a project—a big one!—that doesn’t have that constraint, I’m beginning to see the value even if we were staying with WordPress.

    If you know your project won’t outgrow your framework—perhaps the scope is limited by your contract or ambition—then hack away. Even if you have bigger plans, building a project tightly coupled to a framework is fine if that’s what it takes to build the cussing thing! Am I speaking for myself? Yes.

    But I was always going use WordPress… until I wasn’t.


    1. To be extra clear: as someone who typically writes code five times faster than blog posts, there’s no judgement here! ↩︎

    → 9:56 PM, Aug 4
    Also on Bluesky
  • To every senator and representative who could have done something to stop the federal rescissions package and didn’t, and especially the ones that voted for it:

    Bless your hearts.

    → 6:19 PM, Aug 1
    Also on Bluesky
  • Yeah, our tap water is that good.

    A 16 ounce can of “purely GVL” which is lightly carbonated Greenville tap water. The label is white with black text and an illustration of a rabbit.
    → 8:53 AM, Jul 31
    Also on Bluesky
  • I would like to formally thank the cancel culture participants for getting James Gunn fired by Disney in 2018. I don’t think we would have the Superman movie we do today without them.

    → 7:12 PM, Jul 22
    Also on Bluesky
  • You ever realize you’ve fallen too far down the Amazon search results?

    Screenshot from an Amazon listing. Headline is What's in the box. A single bullet point follows that simply says NO.
    → 9:08 PM, Jul 8
    Also on Bluesky
  • So I’m making a native Web Component with a library specifically for building native Web Components. Go to add it to my project… and the docs only describe adding it to a build process, not building a singular JS file I can add to my plain HTML page.

    → 11:07 PM, Jul 3
    Also on Bluesky
  • Hey, Apple? What the ‼️ is this?! Where’s the ‼️ing unsubscribe link? How do I mark this as spam?

    → 9:09 AM, Jun 24
    Also on Bluesky
  • Thinking about this:

    For where two or three are gathered in my name, there am I among them.

    And thinking of why people might be gathering right now.

    → 8:09 PM, Jun 8
    Also on Bluesky
  • Jony Ive with too much budget and too few restraints is how we got the 2016 MacBook Pro. So that’s what I’m expecting from “io.”

    → 9:19 PM, May 21
    Also on Bluesky
  • Look, mom: I’m quoted in Fast Company!

    → 8:33 AM, May 8
    Also on Bluesky
  • Had some old MIDI files from our circa-2000 iMac. For ease of use, I’d “converted” them to QuickTime movies. So naturally, they wouldn’t play today, and QT Pro doesn’t work. Shout out to Infinite Mac where I was able to load Mac OS 8.6 and convert the files back to standard MIDI.

    → 8:57 PM, May 2
    Also on Bluesky
  • Apple has been ordered to stop blocking and charging commission on links from apps to websites. Good.

    I use IAP for PillTimer; it lets me focus on the app and not payments and DRM. It’s well worth the 15% fee. But as I’ve mentioned a few times on this blog, forcing it on everyone is stupid.

    → 10:08 AM, May 1
    Also on Bluesky
  • Well I didn’t have “dentist tells me not to brush my teeth” on my 2025 bingo card, yet here we are.

    → 11:01 PM, Apr 30
    Also on Bluesky
  • “The light shines in the darkness, and the darkness has not overcome it.”

    Ergo, “while I breathe, I hope.”

    → 10:11 AM, Apr 20
    Also on Bluesky
  • In reading about Gumroad, I managed to find out that the founder is working with DOGE. That bumped up my attitude from “not angry, just disappointed” to “close my account.”

    → 6:59 PM, Apr 5

Slightly uneven since 2005.

Find oddEvan on

  • Micro.blog
  • Bluesky
  • Mastodon
  • GitHub
  • Tumblr
  • YouTube
  • LinkedIn
  • Read.cv
  • TCGplayer

Projects

  • Smolblog
  • PillTimer
  • oddEvan UI
  • madcrasher
  • Other projects

Archive

Links

  • Blogroll
  • Resources
  • Fun Times

About

  • About Istoria

Colophon

Typeset in Raleway by The League of Movable Type and Satoshi by the Indian Type Foundry. Powered by Micro.blog. All your base are belong to us.

© Evan Hildreth; licensed under CC BY 4.0.