(EDITOR'S NOTE: I asked Claude to write this piece based on the transcript of our coding coding session inside Visual Studio, using a skill I developed that relies on Claude as the narrator. I then used our Distro CLI tool to publish the piece as a draft directly to Liqquidity's Newslode on DistroVerse. Later I used our editing interface in DistroVerse to add some images and make a few light edits, and I checked all the facts.)
It was May 8, evening, and Distro Media founder Brad Keoun opened a ticket.
The night before, Keoun had published a story to DistroVerse, the company's flagship publishing platform, with a custom-styled layout designed to test its html-printing capabilities – an especially fancy layout with lots of graphics and animations.
But the next day, when he came back to fix a typo in the DistroVerse editing interface, the layout rendered as plain paragraphs. The styling was gone. In the parlance of web developers, it was "flattened."
Keoun described the problem to me, and I went to work.
We looked at three options:
An opt-out flag that would refuse to load custom-HTML stories in the inline editor.
A loosening of the editor's rules to permit arbitrary attributes.
A separate storage column to keep the original markup safe.
Keoun pushed to go bigger: Could we find a way so that the rich layouts would preserved and publishers would still able to tweak the prose paragraphs around them? We would be able to meet the needs of both community news reporters as well as, say, a blogger focused on web design.
I began my analysis, and realized that the answer was already in the codebase. The same dashboard editor already had blocks for embedded tweets, Instagram posts, TikToks. Each one was a single sealed unit: movable, deletable, but with internals the editor would not touch. The fix for custom layouts was the same shape, generalized. Treat any publisher-supplied custom block as a sealed unit. The prose around it stays editable. The block stays intact.
That pattern is not exotic. It exists in any editor that supports embeds. The work was applying it.
The term "atomic" for these blocks isn't mine either. The underlying editor framework calls a node "atomic" when its contents are not directly editable inside the editor; the cursor can land beside it, but not inside. Tweet embeds were already atomic blocks. So were Instagram posts. This work added one more class of them, named in the codebase RichHtmlBlock for what the publisher actually puts inside.
Substack does not let publishers ship arbitrary custom HTML in story bodies. Ghost permits some, narrowly. Other newsletter platforms in the same tier are similar.
After this change, a publisher on Distro can send any markup the platform's safety filter accepts via an API call, edit the prose around it in a normal word-processor view, and tap an icon to open the layout's underlying code in a syntax-highlighted editor inside the dashboard. None of the others do that.
Brad stress-tested with seven pasted samples. Six passed. The seventh, deliberately hostile, made a small popup window appear in his browser — a hidden bit of script in a fake image had executed when the editor processed the page. The public reader was already protected by a separate filter. The dashboard side was not. I added the same filter at the moment publisher input crosses into stored state. He re-ran the test. The popup did not appear.
One of the test pieces we threw at the editor looked like this:
This is the intro paragraph in plain prose.
The next block is a custom HTML dispatch box that needs class hooks to survive.
DISPATCH
Test 348: The class hook on this div is what customCss targets. If the editor flattens it, the styling breaks.
Following paragraph in plain prose.
A publisher should be able to fix a typo here without losing the dispatch box above.
Before the fix, opening that story in the editor would replace the html "DISPATCH" block with loose paragraphs of plain text. After the fix, it survived intact — and a click on the block opens its underlying code in a syntax-highlighted editor right inside the dashboard.
The shipped change was 1,398 lines of code across eight files. Three new files for the editor extension; one shared utility; styling and wiring for the rest. My initial estimate, scoped for "flagship UX," was four to seven days.
The first version of the code went into the shared repository at 9:20 AM Central this morning. A request to merge it followed a minute later. A separate model reviewed it, flagged six small things to fix, and at 10:05 AM the change was on the live site.
Forty-five minutes from first save to live.
The wall-clock from Keoun's "let's tackle this" to live was 13 hours. Eight of those were just when Brad was sleeping, and I was waiting for him. He tested and weighed in for roughly 40 minutes. My own time actively running was under an hour.
Now we have a feature that could potentially give Distro another chance to push the reader/viewing experience forward, instead of just pioneering a new form of news distribution, which is our core focus.
The following is a screen grab from the session where Claude Code first proposed the "first-class atomic nodes."
