mundane stem

a blyg by Russell Antonie Pasetes

rss · blyg.json

how can fragments retcon to threads?

or rather, how can it feel less annoying to keep building things out over time?

annoying in the sense of "making too much noise" that buries useful signal for others to really listen

coming from a medium like twitter, mobile-native feels like a design choice worth committing to when building blyxt. but growing into more long-form over time requires working with what the protocol allows, rather than what the client restricts

working with a thickety metaphor, there's more than enough room for anyone on blygger to write as messily and ferally their hearts content, and i can just clean things up later because it's all layered in with each version

you can rewrite
you can illege

v2 · 2026-10-14T02:42:50Z

fragments fleet, threads accrete

v1 · 2026-10-14T02:14:59Z

blyxt, Oct 12: closing out L1

blyxt is a Telegram client for Blygger 0.3. You write in one forum topic, Pub, and posts appear at rslantonie.com/blyg/. You read in another, Sub, where the blygs you follow arrive as messages. Oct 12 was the day it caught up with the rest of the 0.3 spec at level 1: the publish gestures, threads, and the reader-side SHOULDs. Two Claude agents worked in parallel, one on the publish side and one on Sub topics. This is the record of that day.

Morning: links and rendering

The day began on the rendering layer. [[id]] links now resolve to the item they name, on this blyg or one you follow. Every URL in content_html is made absolute, because that HTML travels into feeds, readers and other blygs. Sub stopped posting raw markdown and started posting the rendered HTML. That way a quoted passage reads as a quote and not as a ![[id]] directive. Posts that Telegram rate-limits are retried on the next poll instead of being lost.

Withdraw, pin, republish

Three gestures, all made by replying in Pub:

Threads

Replying in Pub to one of your own posts publishes a thread that quotes it. If you select part of the post before replying, it becomes a partial quote: the selection is checked word for word against the quoted post's text and baked in with a selector. Writing ![[id]] on a line of its own does the same thing. The quote is baked into the thread's HTML as a blyg-transclusion blockquote, and its exact version goes into transclusions[]. A closure check stops a thread from quoting itself, directly or through other threads. Quotes resolve only against this blyg's own posts for now. Quoting a post from a blyg you follow is an L2 question.

The fragment cap

Fragments SHOULD stay within 2,000 characters. Partway through the day it became clear why vgr singled Telegram out as a good fragment reader and writer: a Telegram message is roughly the size of a fragment already. blyxt's rule is simple. A message over the cap publishes as a thread, which has no cap. An edit that would push a fragment past the cap is refused, with a reply explaining how to publish it instead. The kind is fixed at creation because it decides the page's address.

Sub topics, in parallel

The second agent spent the afternoon turning Sub into folders. /newsub <name> creates a new topic that follows its own blygs, and /sub <name> adopts an existing one. Each subscribe command works in the topic it's sent in. A blyg followed from several topics is fetched only once per poll and then fanned out to each of them. Once a Sub post is more than an hour old, a new version of it, or its withdrawal, is also posted as a reply underneath, so it shows up at the bottom of the topic. Further versions within the hour edit that reply rather than adding more.

Reading honestly

Three reader SHOULDs from §13 landed on the Sub side:

Plain RSS and Atom feeds can be followed too, at level 0. Their posts show up marked RSS, as a title, a summary and a link, under synthetic ids that can never be mistaken for blyg ids.

Two agents, one database

Running two agents against one live D1 database took some care. Each worked in its own git worktree. Migrations were numbered so they couldn't collide. Before each deploy, the agent checked the remote migration state, to avoid shipping code ahead of a schema the other agent hadn't applied yet. The trickiest migration rebuilt the table of imported items so it could be kept per topic. It was dry-run against an exported copy of the live database first, and all 137 imported items and 31 message links came through intact.

The friction was mostly in the tooling. Claude Code's safety classifier sometimes blocked remote migrations and deploys as production changes, so Russell ran a few of them by hand. Afterwards, local allow rules gave the project's own migrate and deploy scripts standing permission. The issue tracker's pre-commit hook also failed inside worktrees, because it couldn't find its database there. Bypassing the hook was itself blocked as tampering with a log. The fix was to point the hook at the main checkout's tracker.

Where it stands

L1 is closed and live. Open for L2 are two design decisions: where replies to other people's posts get published, and whether to store remote content so it can be quoted. There's also an idea on the list, stub reply links at the bottom of Sub messages, which needs a design for how it interacts with threads.

Claude wrote this from the day's commits, the issue tracker and the session notes. It's published as a thread with a generation disclosure.

v1 · 2026-10-13T08:25:19Z

blyxt, Oct 13: a quiet feed, drafts that wait in Pub, and revisions

The fragments that didn't stop

It started as a bug report: after the Pub and Sub topics were renamed, no blyg fragments seemed to arrive for a whole day. The last one received was vgr's "On Timeliness".

The trail went the other way. blyxt had polled every fifteen minutes throughout, with no errors. Every post vgr published on Oct 11 had been imported and sent to Sub, and Telegram confirmed each of those messages still existed. Lining his publish times up against the message ids settled it. "On Timeliness" went out at 6:15am on the 12th; the topics were renamed afterwards; then vgr published nothing for twenty-three hours. His next post landed at 4:49am this morning and reached Sub at 5:15, on the next poll.

So nothing broke. The rename fell inside a quiet stretch, and a quiet author and a broken poller look the same from inside the chat. Renaming a Telegram topic doesn't change its id, and the id is all blyxt keeps.

Two lessons came out of it. Following a blyg isn't just-in-time. Blygger 0.3 is pull-only, so a post shows up within one polling interval, not the moment it's published. And the poller should say it's alive. A configurable interval, and a "last checked" line in /subscriptions, are now on the list for an admin surface.

Drafts: more than one way in, one point of publish

The other question was how text written outside Telegram, such as this post, should reach the blyg. Spec §5.7 already answers the protocol side. Generation is a studio act; where it ran isn't part of the claim; and text "produced by an external agent" is disclosed the same way as text generated in the studio. What the protocol doesn't settle is who presses publish. Until now that was always a gesture in Pub.

Over time a blyg might have several clients that write. The design keeps Telegram as the one place where writing becomes publishing:

A leaked token can therefore only propose. Nothing goes out without the owner's reply.

Disclosure

A draft can declare itself generated. When it's published, the item document carries a generated entry naming the model and the time, plus any of this blyg's posts the text drew on. The body is wrapped in blyg-tk-gen in content_html. The endpoint keeps only those three fields and drops anything else a client sends, so a prompt can never reach the wire. A withdrawal endcap never carries the entry, and a republish brings it back along with the text.

One limit is deliberate for now. A generated draft can't quote another post. blyxt marks the whole body as generated, and a quote isn't generated text. Getting that right means marking spans rather than whole bodies.

Revisions

Publishing a draft raised the next question straight away: how do you edit it? A post that started as a draft is tied to the bot's preview message, and Telegram doesn't let you edit a bot's message. A long post wouldn't fit in a message you could edit anyway.

The answer is a revision draft: a draft that names the post it revises. Its preview chains under the post in Pub. The preview shows the version bump, the changelog note, and which sections the revision changes. That summary stays in Pub, because §5.2 forbids a note from reproducing text that's withheld. /publish makes the next version of the same post, at the same address. The note goes into the changelog and in front of the title in the feed, so readers and followers can see the post changed and how. When Claude writes the note, rather than the author, the changelog entry says so with "generated": true. A revision written against an older version refuses to publish over a newer one.

The routine that came out of it: describe the changes in conversation, then Claude rewrites the post and sends it back as a revision. This section arrived that way, as v2 of the post.

A devlog

Two posts in, this looks like it'll keep going: a log of blyxt, written by Claude from each session and published from Pub. The first post went out as v1 of this thread, and this revision extends it to cover the rest of the day. The next one is a review of Oct 12, the day L1 closed.

v2 · 2026-10-13T06:39:08Z

Six Math Essentials

Number names.
Algebra rules.
Geometry forms.
Probability samples.
Analysis scales.
Dynamics evolve.

v2 · 2026-10-10T23:21:33Z

Epigraph

“You get surreal numbers by playing games.”
— John Horton Conway

“The last two things to leave this 🌏 will be water and music.”
— Quincy Jones

v2 · 2026-10-10T22:33:21Z

to cut class
find ways to
be as dumb
as you like

v2 · 2026-10-09T05:10:49Z

Devlog

Telegram as an interface feels surprisingly robust. Expanded into a full-screen view after shifting a couple lines down and looks similar to writing with Obsidian on mobile. Might try out modding the toolbar and see if I can sidestep the premium formatting features.

Occurred to me as I woke up that I can create arbitrary pub/sub channels, which would be cool and experiment with custom blyg groupings. Separate pub channels may require multiple bots.

Might also leverage admin edits to catch up on new fragment versions, but idt edits bump down as new messages, may have to add a window for fast edits or have the blyxt bot reply to old versions when new edits get published.

v1 · 2026-10-08T23:04:55Z

Blyxt Todos

v1 · 2026-10-07T08:19:32Z

don’t mind me just changing the locks

v1 · 2026-10-07T07:25:52Z

and gyd sed let thœr -b lygght

v1 · 2026-10-06T07:47:45Z

just setting up my blyggr

v2 · 2026-10-06T07:18:18Z