No more goldang inexplicable sidey-scrolling on yer phonez goldangit!!

What was it, you ask?

Why, it was the fleuron, of course. The fleuron with the negative margins.

He wants a fleuron

With negative margins [doop dweet doooo]

Because he knows there's no such thing



  • The "cancel" button for new, never-saved comments works reasonably now (broken for a long time).
  • Pasting a link to something well-annotated for social sharing, like a CNN article, now generates a nice "open graph" summary again. Also probably broken for some time super broken since ever in half a dozen ways, sorry. Debugged the daylights out of this.
  • Image comments (broken by the recent rewrite).
  • Layout issues on the iPhone, especially when open graph is in play.

Also, code quality things:

  • Removed yet more "dead code" (code no longer in use, exactly like junk DNA: if left in place too long there's a chance it'll be "in use" after all, in some sneaky and incomprehensible way).
  • Stopped using the obsolete "request" module to fetch stuff.

All in all, I'd say I got away with the rewrite pretty well. Nothing went hugely sideways. Twitching to do more with the site now, which is a nice feeling after slogging through / dreading the rewrite for so long.

Thanks to all who reported bugs.

Nice Open Graph example (CNN article).

Vastly more important Open Graph example (Mastodon #caturday post).

Looks like Mastodon's og:image tags have site-relative URLs. I noticed 'cuz I had a bug handling those. Amusingly, Facebook does not support relative URLs in open graph at all. This means I now have better support for Open Graph than Facebook. Phbbbbbt.

BTW Open Graph only "unfurls" if you paste a link straight into your text without clicking the link icon in the rich text editor. So if you don't want it, if you just want to type some text and then link it to something because this is the hyper-texter-webs goshdarnit, then type that text, select it and click the link button.

Open Graph still needs some styling love on mobile fixed that shizzle too.

You're a wonder!
Maybe even a One Post Wonder.
Thank you, thank you, for making this community and keeping it good.
Came here to say this. :)
Seems I no longer get email notifications that my friends have been writing. Or I need to inspect my spam filters?
Those still go out. Check your spam?

They only go out if you haven’t been reading.

Hey, did you feel something? I hope not.

I've deployed a new version of the One Post Wonder source code. And it should be... exactly the same, for you. If not, please let me know.

For avoidance of confusion: if something seems busted, it's not you, it's me. Let me know. Thanks! I did lots of testing. But... software is hard.

Just in case, my email is If stuff broke, tell me things ASAP. Thanks!

What Changed

"So... if everything is the same... what's different?"

I rewrote the code using a modern idiom that other programmers will be able to follow. Which makes it more practical for others to help me move OPW forward. It's a hell of a lot easier for me to maintain the code as well.

You see, back in the Bad Old Days, Node.js programming was like this:

"Hey Jane, fetch me some blog posts, then call me." [Hand-sign of phone]

"Hey Jack, when Jane calls me, fetch some comments, then call me." [Hand-sign of phone]

"Hey Joe, when Jack calls me after Jane calls me, fetch some images, then call me." [Hand-sign of phone]

Except dozens of requests are coming in at once so it's like a telethon in there with only one person manning the phones and everybody wants a fucking tote bag and theoretically that's OK because you don't actually speak continuously to one person right, so...

AAAAAAAA yeah complete madness.

In the New Idiom, Node.js JavaScript programming is like this:

MOTHER MAY I fetch some blog posts.

MOTHER MAY I fetch some comments.

MOTHER MAY I fetch some images.

Behind the scenes, it's the same telethon, but the management of all that parallel madness is encapsulated in the magic words "MOTHER MAY I," which allow us to express what we need to do as a simple series of steps and let JavaScript sort it out behind the scenes.

An astute observer will note that I still have to say "MOTHER MAY I" before each thing. I can't just do the fucking things. Which is still weird and unintuitive. However, in modern JavaScript "MOTHER MAY I" is expressed in the single word "await," which is at least convenient and readable. Crucially, it's at least readable by people who don't do this all day and who don't know this particular codebase by heart.

And the performance benefits are real enough that these days, Ruby, Python, PHP and even Rust optionally offer the same thing for those who need the speed.

So, we've got that going for us.

[Waves tattered flag]

Wait. Why do we do this?

A person might ask why programmers put up with any of this. Java and Python and Ruby and frickin' PHP all let you just write:

Do a thing

Do another thing

Do a third thing


So why would you put up with this "MOTHER MAY I" bullshit from JavaScript?

Well... because it's fast. Most languages for the web give you a separate thread, aka basically a completely separate telethon volunteer, to think about each request, aka person calling to get a tote bag. Which is enormously convenient. But, also slower because you're not maximizing the throughput of your telethon volunteers.

And... you have to write JavaScript for the browser anyway. To a first approximation, at least. So you may as well double down and use those skills on the server too, right? Less mental context switching. Which gives you plenty of energy for typing MOTHER MAY I! This is sane. [Nods firmly]

Um... great! What's next?

"So what's next?" New features? Probably new features. I promised alt attributes a LONG time ago.

Probably also breaking up that massive "routes.js" file into separate collections of API routes by topic, so I can find stuff.

Probably also TypeScript, just so I can put "8 billion years TypeScript experience" on my resume.

Thank you sir, may I please have another?

"What's TypeScript?" It's a new flavor of JavaScript that is "strongly typed." That means you have to say "MOTHER MAY I" even more often and in twisty new ways... but, if you fail to say it in exactly the same way when you try to call that same code later, it'll stop you and say "uh-uh, that's going to introduce a bug."

So it's a good thing.

One may well ask: does that mean TypeScript can check the original "MOTHER MAY I" incantations (aka "await" keywords) to make sure none are missing? That would be seriously useful.

Oh gosh no, it can't do THAT.  Who would want to catch by far the most common source of bugs in a Node.js program? No, it only stops you if you pass a string instead of a number (*), which I practically never do.

But I hear you can do it if you combine TypeScript and eslint and a roll of duct tape. So maybe I'll give that a try.

(*) Yes, yes, and a thousand more complicated but ultimately similar things.

Test. Hi.
Looks like it works. Success!

I didn't think I'd see anything at all from a construction site on the edge of a major urban area, but everything lined up in Stellarium and that is very probably the comet. I guess. I have to say my phone saw it a little better than I did. It is a little green.

For those in darker places, now is certainly the time to go outside and have a look. Shortly after sunset in the northern sky. You still have a few days.

I bet Annie will be able to see this really well in VT.
I'm waiting for that reply too.
I tried. It was very clear last night into early morning, but… I wasn’t awake early enough. The dog woke me at 6:00, and by that time it was too light already. Not sunrise, and I could see the Little Dipper well enough, but too light out all the same.

Last might was the only clear night we’ve had recently, too. Tonight it looks as though it will be partly cloudy around 5:00 am.

And anyway I didn’t sleep well last night and it’s the same tonight, so probably I won’t get up early to see if it’s visible.

There’s also a surprising amount of light pollution where we are. It can be pitch black on the ground around the house, but Burlington is just to the north of us, and the sky in that direction glows.
I will say, last night as the sun was setting, Mt. Mansfield in the *east* was jaw-dropping. The ridge line was draped in sparkling snow, and glowing pink against a fading blue sky. Rose snapped a photo through the window of the moving car. As you might expect, it didn’t begin to represent the experience.
Current status: trying not to spend $100 on a monocular telescope with a smartphone adapter so I can take zoomed-in crummy pictures.

To my astonishment, I've actually finished my first pass of converting the entire back end code base of one post wonder to modern async/await syntax. What does this mean for you? Absolutely nothing, except that it will be easier to maintain in the future, and I will hopefully be better able to get others to consider assisting in that task.

I'm making other changes as I go along that aim toward maintainability, and just making it hard to write bugs in the first place.

I reached a point where all I'm doing is testing and debugging, testing and debugging, until it actually works again, and I can think about pushing it as the new current release.

After that, it will be time to think about refactoring the front end code. Refactoring is a fancy word for rewriting, or at least restructuring. All I have to do is choose a front end framework so the code will be more maintainable for other contributors, easier for everyone to understand. All I have to do is choose a framework. Like, insert a list of at least 1000 possible choices. Of course, there are just a few well-known ones. If I go with React, people will know that word 10 years from now when they try to contribute to my code. This does not necessarily mean that what is called React in 10 years will look anything like it, but they'll know the word.

Seriously, I can see that I write software with very long release cycles. This makes me an excellent candidate to maintain the software stack for the interstellar multigenerational probe. Just slow me down and run me as a low priority process.

11/30 '22 4 Comments
Slow me down to Priority Bitty and I'll dream away just like Walter Mitty. Oh, won't you please make me code.
It’s sort of like cleaning the refrigerator, isn’t it? You do a ton of work in the name of household sanitation and sanity, then shut the door and walk away, and the house doesn’t look any cleaner. But…
The Martin Fowler and Kent Beck "Refactoring" text is one of the reference books I keep within arm's reach.
That's a job in technology - often the result of kicking ass is a smoothly-running site/app/system ... meaning that if you're really good, no one notices. If you're not really good, your site/app/system crashes and EVERYONE notices.

Taking an early upgrade slot rather than waiting for Linode to do scheduled maintenance at 5am.

11/17 '22 1 Comment
Aaaand we're back.

My experience is that everything is zoomier after you take a "free upgrade" (aka "please for the love of god let us put you on a non-ancient host server") from Linode, not that we were experiencing any real slowness before.

Linode's been a pretty great host all along. I moved my smaller projects at work to AWS Amazon Lightsail because of Linode's very occasional outages; Lightsail is Amazon's Linode / Digital Ocean clone, so moving to Lightsail allowed us to say to customers "you're hosted with AWS" while doing a more Linode-like amount of work. They also took care to set the pricing to be competitive. But I do like Linode and now that they are nestled within Akamai I see no reason not to expect them to continue to be a reliable choice for many years.

I'm back to work updating OnePo's codebase to modern standards on the server side. Specifically async/await as opposed to callbacks. it's BOOOOO-RINNNNG. But I have "only" one file left. Of course, it's the one where most of the code is.

So after that I should refactor that file as well. Also BOOOOO-RINNNG, and yet somehow satisfying. Then maybe crank up eslint to call me on my shit. Poor man's typescript. Then maybe typescript?

Then rethink the frontend code. Using [ugh I will not even think about choosing a framework today].

Of course OnePo is still a tiny, tiny place. As in "I've never bothered to index the database collections for performance" tiny.  I may need to dial up the disk space just a tad soon though.

"But Tom, aren't you gearing up to welcome former Twitter residents?" No, not really, although the six people who will actually leave in this, the most recent of many outrages are warmly welcome.

Moderation of a successful public social media site is a huge, unsolved problem. As others continously have pointed out, the real challenge for something like Twitter is moderation, not engineering. Yes, it's bad that Musk's plan is basically to fire the moderators.

But I'm in no position to improve on that. There's no moderation in practice on OnePo at the moment, although I'm pledged to supply some in the event of certain types of abuse.

What we have instead is an invitation-only model and a predilection toward thoughtfully locked posts, which reduces (though it absolutely does not eliminate) the likelihood that someone you're connected to needs moderating... at least from your perspective. So far this seems to work OK for our needs.

But, a system like that cannot function as a public square. If we indulge my ego in imagining OnePo writ large, we wind up with a worse echo chamber than Twitter, because it's so difficult to discover new people and the general habit is to limit audiences for things.

Also, OnePo is just a whole 'nother idiom. The intersection of OnePo and Twitter is a ridiculous idea. That would be... uh... BeReal, actually. BeReal is pretty fun. But it does one tiny job.

Actually I kinda like the idea of doing one tiny job. OnePo's one tiny job is allowing friends to know and support each other better. That's fine for what it is, which is a lot.

10/29 '22 9 Comments
"modern standards on the server side" sounds like lyrics to a Joe Jackson song.
And with our modern standards on the server side
Get into a car and drive

Checks out.
Haha, I can hear it in his voice.
a feature that I think may bring more people would be something tumble like where you can search posts by date or "random post."

There are a lot of times I've needed to check something that happened, say, more than six months ago, and I've thought, Oh, I should check OnePo and- Nope. But I also understand that I can search by tags and I owe it to myself to tag more of my own posts.
Search would be nice I agree. I don’t know if it would lead to growth because you have to be able to see stuff in the first place… which means public posts.

Also the existing users have invited everyone they want to invite, and there’s no other on ramp right now.


Maybe a communities feature, he said, continuing to reinvent livejournal.

Maybe a signup that more clearly paves the road to bring your community with you.
typescript just copies all I/O to a file, right? :)
Knew you were listening.
Any recommendations for good tutorials on properly implementing async/await? Asking for a bearded friend trying to get up to speed on contemporary JavaScript.
Did you want to push this site? I have considered posting content here and posting a link to it on facebook.

Midjourney created this image, given the prompt "white cat named Spike in the style of Marvel." If you've seen my cat, and if you haven't you must be new here, this is pretty amazing. I picked my favorite of the four initial images and upscaled it. I didn't do any further refinement.

Not a real photograph. Dall-E created this image, given the prompt "a big white cat named Spike with stripes like a raccoon and spots like a cow photorealistic."

My privacy-minded partner thought at first this was a photo of our cat.

So Dall-E is just better, right? It depends. The above was Dall-E's best effort on the same Marvel Spike genre prompt Midjourney nailed so well. I attempted to refine this with the words "Marvel cinematic universe" and so on, but it didn't get any closer to the concept.

Midjourney created these images from the prompt "Midjourney's mother." I didn't pick a winner or do any further refinement.

It is difficult not to read into this. But is it just telling me what I want to hear? And if it is, so what?

Midjourney created this image from the prompt "the true purpose of Midjourney." Three of these can be understood simply as riffing on the word "journey." The one at upper right is perhaps just riffing on images frequently associated with the words "true purpose." So as lovely as they are, they don't make me go "hmm" as much as the previous set.

"Dall-E's mother photorealistic" yielded this image, and other images of animal mothers. One was a chimpanzee. If they were all chimpanzees, it could be considered a little cheeky. But emphasizing one chimpanzee out of four images would just be cherry-picking on my part.

Dall-E generated these images for the prompt "the true purpose of Dall-E." There's a theme, at least for three of them, but if there's a message here this monkey isn't clever enough to figure it out.

A Google employee who claims their text-generating AI is a sentient being has been fired. On the whole, I tend to agree with those who say that particular AI (not Dall-E or Midjourney) is probably not a sentient being. And yet, I also agree with those who have serious questions about our ability to judge that. This will be more of an issue as the line gets fuzzier. And it's getting fuzzy pretty fast.

Given the state of the art in answering "Convince me that you're sapient" combined with deepfake full-motion video, are we far off from requiring shared secrets to defend against machines that can answer "Convince me that you're Thomas B. Boutell"? Truly realistic androids are probably a bit further out, but do we need to exchange secrets before that sneaks up on us? And when we do establish these secrets, how far away from civilization do we need to be to avoid eavesdropping by phones or other gadgets?
If you ever see me drinking a Miller Lite, you know I’ve been kidnapped or it’s a robot.
“DESTROY ROBOT” “But I just poured this whole can into this bowl to make pizza dough, see, I just like to drink the last s-“ *SQUINCH*
If you ever see me pouring a Miller high Life into a champagne glass, you can be pretty sure that it *is* me.
Yeah, my belly can’t tolerate beer. Good for other people, not for me.
Have you read or listened to Wanderers, by Chuck Wendig, yet?
I have a friend putting haikus into midjourney. With quite lovely results.

I'm pretty sure a subscription to mid journey is in my near future. Just because I like it, can't think of any reason I need it.
My mind is thoroughly blown. I think someone fed this machine a TON of Dave Palumbo, Blade Runner, Edward Hopper, and the lady who paints the kids with big eyes.
I found this to be a very insightful exploration of the Dall-E “mind”:
I played with Midjourney for much longer than I should have last night and blew out my free trial.
I noticed that it tends to create dark-haired, dark-eyed women with wide foreheads and cheekbones and narrow chins.

One user kept putting in different search terms to try and get pr0n, like "asian girl bikini big balloons" and getting, literally, an Asian girl in a bikini holding a bunch of balloons. It was kind of hilarious.
Mr. Blue Sky, illustrated by AI:
It was getting pretty ominous there toward the end. Very cool
Illustrated by a grim and vaguely threatening AI. Also I assume that it's "illustrated by having MidJourney create a half-dozen images and our trained team of evolved monkeys picking the one that fits best in their opinion"
I mean, strictly speaking the curation angle plus the fact that people post these pictures publicly where they will possibly be incorporated into future revisions of this sort of tech means that anyone curating the images is now part of the network generating them...

This was inspired by my own need to know about new chargers that pop up, primarily on the route to my mom's house. When you drive an EV, PlugShare is absolutely essential for checking out chargers to make sure they are legit and have no recent problems, but I think there's room for an independent newsletter that lets you know when new chargers pop up on your path.

Also: how the hell did I get this domain name? Thanks to my privacy-minded partner for thinking of it.

Only of use in the US, sadly, since I'm dependent on Department of Energy data.

(Yes, I need to work on my sharing pic game. A picture of the same text that's in the description... ouch.)

7/29 '22 4 Comments
You just keep being an excellent human sir. :)
This is an excellent idea.

And seriously. An appropriate 5-letter .com? I don't even want to know how much you spent on that.
That's the thing! I didn't! It was available!

Some small OnePo improvements and fixes:

  • Making links to other pages the traditional way, via the "link" icon and the dialog box, works again on the iPhone.
  • You can also make links by just pasting a link to any page straight into your post, without clicking the link button. When you do that, a nice automatic preview and link appears. We've had this for ages, but there was a dumb bug that broke it for most cases, except YouTube. All fixed. Here's a nice example (and a cool game):

You'll note I didn't have to create any content for that, I just pasted the address of the page straight into this post. This is based on the "open graph" tags that websites already provide for the benefit of Facebook sharing.

  • Speaking of the automatic link feature: pasting a URL like that in the middle of your text once again splits the text into two sections, with the link preview in the middle.

As I mentioned, you can still make links the old-fashioned way too.

(At this point I don't care that I'll never be able to buy the domain onepo dot com. I'm still going to call it that, because how can you not?)

7/3 '22 6 Comments
Very nice work sir! Seems like an elegant solution, and makes things both clean AND pretty.
Also, I’m going to have to check out that game.
Many thanks, dear host!
Stinker! I haven’t broken 101.