To the victors go the one post wonders, but let's remember the guys who weren't so fortunate:
Priest #1 acquired Magicbane, but was promptly instakilled by a rabid rat.
Priest #2 was pincushioned by a gnome lord in the Gnomish Mines.
Priest #3 was killed by an ape while blinded by a yellow light.
Priest #4 was killed by a chameleon imitating a warg.
Priest #5 was killed by a touch of death from an ARCH-LICH on level 7???  That was probably a chameleon, too.

But the sixth one stayed up!  He was gifted Vorpal Blade and used it throughout the dungeon, also acquiring the means of reflection, levitation, conflict, and teleport control.  It was at this point that he stumbled into a level teleporter and was presented with a fateful choice: 

"To what level do you want to teleport?"

Answering "99" gets you underneath the Castle, so he sneaked in the back door and allowed the trolls in the throne room to finish off most of the other monsters.  From there, it was back to the Quest and some great dining experiences.  "Welcome to experience level 20.  You feel cool!"  Indeed.

Vorpal Blade has its disadvantages, like "Somehow, you miss the invisible black light wildly" but it is fun to decapitate demon lords instead of just wounding them.  Here's a scary moment:  "The bullwhip wraps around Vorpal Blade you're wielding!  The horned devil yanks Vorpal Blade from your hand!"  Oh, fudge.  Luckily it was cursed to wield that bullwhip instead of turning the beheading tables.

Later our heroic priest became the Envoy of Balance and cut down some shades with a silver saber, but for the most part it was Vorpy all the way.  While trying to find everything else on his shopping list, he got one last treat:  "You unleash a water demon!  Grateful for her release, she grants you a wish!"

He went to his reward with 4769988 points and 105737 pieces of gold, after 81735 moves.

He took his vorpal blade in hand, long time the manxsome foe he sought, then rested he by the tumtum tree and stood a while in thought.

It would be interesting if I could make my way through the dungeon by healing everyone I meet.  "The werejackal thanks you for removing his curse and departs rejoicing!"  But no, it's mostly slaying things as usual.  The vast majority of the healing I performed was vampiric in nature:  "The Staff of Aesculapius draws the life from the <Alas Poor Yorick>".  I established base camps at altars on levels 7, 17, 27, and 37.  Lucky 7s!  "This ring of teleport control is delicious!"  My pet giant zombie named Zorba kept picking up things I was trying to sort, so I locked him on the other side of a door, which he promptly smashed down.  "Master I love you so much!  Why did you lock the door?"  I really have no idea what became of him shortly after that.  He and Stoney the stone golem and Vlad the vampire didn't make it to the altar with me.  I stumbled a bit in the Plane of Air and the Astral Plane, but eventually turned things around.  Keeping spare wishes in your back pocket is sometimes a very good idea.

I and Quatro the Coatl and invisible Archie the Archon went to our reward with 3182509 points,
The Staff of Aesculapius (worth 5000 zorkmids and 12500 points)
The Bell of Opening (worth 5000 zorkmids and 12500 points)
The Book of the Dead (worth 10000 zorkmids and 25000 points)
The Candelabrum of Invocation (worth 5000 zorkmids and 12500 points)
Trollsbane (worth 200 zorkmids and 500 points)
Sunsword (worth 1500 zorkmids and 3750 points)
Excalibur (worth 4000 zorkmids and 10000 points)
Cleaver (worth 1500 zorkmids and 3750 points)
Frost Brand (worth 3000 zorkmids and 7500 points)
      11 amethyst stones (worth 6600 zorkmids),
      10 diamonds (worth 40000 zorkmids),
      10 rubies (worth 35000 zorkmids),
       8 turquoise stones (worth 16000 zorkmids),
       8 amber stones (worth 8000 zorkmids),
       8 topaz stones (worth 7200 zorkmids),
       7 emeralds (worth 17500 zorkmids),
       7 jasper stones (worth 3500 zorkmids),
       5 aquamarine stones (worth 7500 zorkmids),
       5 agate stones (worth 1000 zorkmids),
       4 jet stones (worth 3400 zorkmids),
       3 chrysoberyl stones (worth 2100 zorkmids),
       3 fluorite stones (worth 1200 zorkmids),
       2 black opals (worth 5000 zorkmids),
       2 opals (worth 1600 zorkmids),
       2 garnet stones (worth 1400 zorkmids),
       2 jade stones (worth 600 zorkmids),
       1 dilithium crystal (worth 4500 zorkmids),
       1 jacinth stone (worth 3250 zorkmids),
       1 sapphire (worth 3000 zorkmids),
       1 citrine stone (worth 1500 zorkmids),
       1 obsidian stone (worth 200 zorkmids),
       6 amulets of life saving (worth 900 zorkmids),
       1 amulet of magical breathing (worth 150 zorkmids),
and 95231 pieces of gold, after 64647 moves.
I was level 22 with a maximum of 376 hit points when I ascended.

What game is this? I could use some ascension and a pet zombie.
At you can play or watch other games in progress. Be prepared to die early and often, but we're here for you.
Is that Bell of Opening from the Bulls and Bears of the Wall Street module?
The Dev Team thinks of everything, but there are no bulls. Owlbears?

Exploring dungeons isn't easy, what with all the rolling boulder traps.  Some creatures even enjoy being hit with a +2 bullwhip.  Not snakes, though.  "The pit viper falls into a pit!  How pitiful.  Isn't that the pits?"

If you need to hide from enemies in a bookstore, always remember to pick up a book and look like you're thinking about buying it.  Stay in there for as long as you need to.  The shopkeeper will keep those ruffians away from his customer.

If you have something you want to get rid of, find someone who will take it from you.  But first make sure that you've nothing else left for them to take.

I and Celeborn the elf-lord went to our reward with 4798200 points and 115592 pieces of gold, after 81116 moves.  I was level 29 with a maximum of 593 hit points when I ascended.

I never thought of that! I always knew that it was a big big mistake to attack a shopkeeper when playing nethack, but I hadn’t considered that shopkeepers could take care of unwanted nasties for you.
It's simpler than that. If you are holding merch, he blocks the door!

I just saw an advertisement for the Fantasy Island TV series.  Not the original with Ricardo Montalbán, may he rest in peace, but is the reboot with Malcolm McDowell still going after a decade or so?  No, it is not.  That lasted for one season TWENTY-FIVE YEARS AGO.

Where did you see it?
It's on Fox, so I didn't notice its premiere in August 2021 either.

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.