see what else worm-blossom has made!
worm-blossom

worm-blossom

2026Week 3421 Aug

“and this is me starting with something that was *useful*”

A drawing of Sammy, with chin resting on her hand, a pencil between her fingers.

Back in March, Aljoscha and myself huddled at a hotel bar with adz, glyph, and sam from p2panda. We’d decided we were going to draft and submit a new grant proposal hours before said grant’s deadline. Collaboration between our projects had always seemed like a bit of a utopian idea, but we finally had convergent goals.

“Project title?” said Aljoscha, hovering his mouse over the empty form input.
“Hmmm… put Pillow” said adz. “We can always change it later”.

Pillow is a new collaboration between p2panda and worm-blossom. It’s a way for p2panda apps to quickly store and retrieve data from highly available peers. These highly available peers don’t know anything about p2panda data, but they do have decentralised, capability-powered permissions, can happily evict stale data, and can efficiently sync with each other. That’s because they’re Willow peers!

In this grant we’ll be implementing WTP, meaning that at long last Willow peers will be able to sync over the internet via range-based set reconciliation. We’ll also be developing WTP-powered servers with web interfaces for configuring capabilities, data eviction, and viewing storage usage.

The first users of these Willow ‘support peers’ will be p2panda apps, which will be able to interface with them via Pillow. The idea is that the Willow-powered peers don’t need to do all the stuff a p2panda peer usually does, and will be freed up to act as oblivious (but permissioned) storage.

Not only will we be working with the pandas on this project, but we’ll also be bringing a new member into worm-blossom (more on that later).

In the meantime, I’m getting back on my feet and using those feet to make silly announcement videos.

~sammy

A drawing of Aljoscha, fingers interlaced, with short hair!

I just came home from a productive walk with some realisations about message encodings for the WTP. These center around statefulness of peers, optimised relative encodings, and request cancellation.

The most basic requests are purely stateless: a peer issues the request, and then simply discards all state that pertains to it. Consequently, the (encoding of the) response must be fully self-contained. First realisation: such responses are indistinguishable from eagerly pushed messages — a peer might as well send such responses without ever having received a corresponding request, and the other peer would be unable to tell. I spent the past two weeks trying to argue against eagerly pushed messages, and now I feel a bit silly.

The other option are stateful requests: a peer issues a request, assigns it a request id, and keeps some state associated with the request. The response contains the request id, and can refer to the state for more efficient encodings. For example, when requesting a Willow entry in a specific namespace, the response encoding can omit that namespace. Second realisation: protocols can easily support both modes of operation. Requests can simply indicate whether responses should be standalone (allowing for stateless requesters) or whether they should be optimised (forcing the requester to keep state).

Moving on to message cancellation: as far I can tell, cancellation (by the requester) serves two important purposes. The obvious one is that it can prevent large responses from being sent only to be discarded upon arrival. The second, less obvious purpose is that cancellation allows the requester to free up any state it had to keep around to be able to decode and process an eventual response. This leads to the rather obvious third realisation: there is no sensible notion of cancellation for stateless requests — if a peer does not even record that it sent a request, it cannot later cancel it. And there is no state for it to free up anyway (though preventing pointless responses would still be desirable, of course).

For stateful requests, there is a more interesting dynamic going on. When using optimised response encodings that rely on state kept by the requester, the requestor cannot immediately clean up its state after sending a cancellation. Concurrently to sending the cancellation, the other peer might have sent a response, after all. And decoding that response requires the old state. Hence, realisation number four: stateful requests imply that cancellations must be confirmed by the other peer before state can be cleared.

This, frankly, is not great. Thankfully, there is a way by which to combine efficient encodings of responses to stateful requests with immediate, non-interactive cancellation: prefixing responses with their length allows the receiver to discard the response from the communication channel and then keep decoding the next messages even after having cleaned up the state that would have been required to properly parse the response. This was realisation number five.

I'm happy with this outcome: letting peers indicate whether their requests are stateful or stateless allows for incremental implementation of a protocol, by starting with the easier-to-implement stateless variants only. And stateful messages with their more efficient responses still do not force requesters to keep around state until their peer cooperates. This is a lot better than what the current Willow Confidential Sync draft offers (mandatory stateful encodings, mandatory cooperative cancellation).

What remains is a final meta realisation: it feels odd that I needed to come up with these approaches myself, after years of being active in the space. We really need better teaching material. I know I'm slightly peculiar in my emphasis on (bounded) state management in communication protocols, and I know that using state for optimising message encodings is a topic that will be skipped by anyone who wants to simply use a serialisation library and not think about encodings at all. But still, everything I've been writing about today is fundamental to how communication works. Guess I need to add yet another article-to-write to my todo list =S

~Aljoscha

guest article

What the pandas have been listening to lately.

glyph

Kawasaki by Remon Nakanishi
gives me the chills every time; remon’s vocals are utterly transporting. p.s. everything from DOYASA! Records is golden.

Straight drop by cootie catcher
i recently discovered the “twee” genre tag on bandcamp and am not afraid to admit that i love what it led me to.

Magpies by Tipper
sunset bike rides through the city in the summertime.

adz

Descubrimos un suspiro by Mabe Fratti
i love the whole record so much, can’t stop listening to it. ❤️

Untitled by Bill Orcutt
endless beautiful free solo improv chaos from one of my favorite guitarists.

Mirror by 13 Year Cicada
experimental pop band from berlin with a lot of fun mathy loops.

sam

Top of the World by Shonen Knife
this song always makes me happy.

~the pandas

A drawing of Aljoscha, fingers interlaced, with short hair!

It is now a few hours after writing my first editorial, and the consequences of these realisations for the WTP are starting to sink in. The initial WTP draft had both RequestGet messages for requesting individual entries (and the corresponding ResponseGet messages) and RequestPut messages for eagerly pushing an entry to the other peer. Here is the key insight: ResponseGet and RequestPut carry the same information. The only difference is that RequestPut uses an absolute encoding, whereas ResponseGet uses an encoding relative to the corresponding RequestGet message. In a design where the same messages can be encoded either absolutely or relatively, these two message types can merge into a single type.

And this can be an overarching design theme for the WTP. Instead of thinking of messages in terms of requests and responses, as many messages as possible should admit both absolute and relative encodings. Specifically this means:

  • Asking for an entry (and/or its payload): absolute only.
  • Sending an entry: absolute, or relative to anything that asks for one or more entries.
  • Sending a (part of a) payload: absolute, or relative to a message asking for a payload.
  • Asking for all entries in an area or range (and optionally supplying metadata — fingerprint, entry count, and/or total payload lengths — about one's own entries in that area or range): absolute, or relative to a message asking for a super-area or super-range.
  • Cancelling a “request”: relative to anything asking for one or more entries.

I want to note that where I write “absolute” encoding, that is only meant in the sense that the encoding is not relative to a dynamically indicated message. To make the encodings as efficient as possible, the spec might still use relative encodings even for standalone messages. To give an example: peers could be mandated to remember the last entry they sent. Each send-entry message could then be encoded relative to the previously-sent entry, allowing, for example, to indicate with a single bit that the current entry has the same namespace id as the previous one. The crucial point is that such encodings require only a constant amount of space, irrespective of the behaviour at runtime, whereas encodings relative to any previous message would require tracking state proportional to the number of previous messages. Another application of this technique will allow transmitting payload slices while keeping the corresponding entry and/or slice start purely implicit.

Aside from a certain elegance, breaking up the request-response dichotomy has a tangible benefit: this design allows peers to express and run both symmetric and asymmetric range-based set reconciliation. The old design was restricted to client-driven asymmetric reconciliation only, exactly because requests for ranges could not be sent in response to other such requests.

THIS IS SHAPING UP NICELY, I AM QUITE EXCITED!

~Aljoscha

2026Week 3314 Aug

“sufficiently human”

A drawing of Aljoscha, fingers interlaced, with short hair!

This week I have a gazillion things to share; I blame the fact that I took a proper vacation for the first time in ages.

After planning for a long time, we stripped out all generics from our Rust Willow implementation. This makes things, well, less generic, but also provides a tangible and honestly rather necessary reduction in complexity. The pull request ends up reducing our lines-of-code by about 15000. We have published the new code as willow25 0.7.0, and we have deprecated the old, generic willow_data_model and meadowcap crates.

On the WTP side of things, I realised that there is little reason to keep the protocol asymmetric. If both peers are allowed to request entries, that might even be another way of removing RequestPut messages from the protocol. But this decision is sufficiently fundamental that I have postponed working on the WTP until Sammy has enough time on her hands again to have her say as well.

So instead I turned back to my media file format designs. I have now specified exactly how to encode samples. All that is left now are the boring details of format-specific metadata. With the exception of settling on the sample predictor for audio, all the hard work is now done.

And as part of that work, I nerd-sniped myself into thinking about the role of magic numbers in file systems. So I wrote down a half-specification half-rant document that overthinks the topic quite a bit. Turns out I harbour strong feelings about magic numbers (who doesn't, right? Right?), to the point where Emmy and Miaourt had to make me tone down the polemics. Thank you folks =S

Speaking of overthinking things in a good way, I'd like to draw attention to this sneakerweb PR about presenting a sneakerweb collection in a random order. Somehow that premise escalated into a discussion of social dynamics, non-uniform sampling, and time complexity of various algorithm choices. In a good way.

There's been some other progress on the sneakerweb as well, with Emmy spearheading the modestly-named WIP: fix-all-the-things pull request. At the end of that PR will be the release of version 1.2.0, bringing some new features and making the sneakerweb work in Chrome and Edge. Thank you, Emmy (and sorry that I have somewhat dropped out of the loop regarding the state of the sneakerweb implementation)!

~Aljoscha

The Invisible Library

I am happy to announce the grand opening of the Invisible Library.


A while ago, a friend gifted me a book on the condition that all readers should gift it on. These instructions were only verbal, but otherwise that's the idea of the invisible library. The same has certainly been done a bunch of times elsewhere too. At p2pbasel, Trav championed the practice of adding one's name to books one has read, and circulating them.


When I searched the web for Decentralised Library, the AI summary I didn't ask for told me all about how a decentralised library is a p2p system that uses blockchain, smart contracts, and ipfs. That... seems a bit excessive. I tried to figure out how to get away with as little technology as possible, and the end result was the invisible library.


Classic libraries are pull-based. The invisible library is push-based. Is it even accurate to call it a library? Especially considering that the basic operation is gifting rather than lending? Although, in some sense, the book always stays property of the invisible library, which is how libraries work after all. In any case, I quite like the connotations of the name.


At Dweb Camp, somebody told me they basically stopped discovering new music because algorithmic discovery is too repulsive a concept. That is an example of push-instead-of-pull going wrong. But with recommendations by friends, I feel less worried. Perhaps passing on a book from the invisible library should be accompanied by passing on a mixtape? And zines, of course. And a sneakerweb collection.


A pull-based distributed library would easily escalate into a more general resource-sharing framework. The p2panda crew is living proof, having gone from planning festivals to implementing Hoffnung3000, spinning off p2panda, and later coming full circle with Toolkitty.

With the invisible library, I deliberately wanted to keep the scope limited to books. The push-based nature helps with that. So does the gifting-instead-of-lending approach; books are almost uniquely suited to this — an unread book is so much more valuable than a book you already read.


The invisible library works just as well without the final sentence about adding other books by copying the instructions to new books. And I would like to think that it would grow even without that explicit nudge. But still, there is something fascinating about deliberately designing viral systems. Especially to spread practices that inherently challenge neoliberal assumptions.


When I merely lend out a book to a friend, I will eventually get it back and then I can lend it out again. With the invisible library in contrast, I relinquish the opportunity and responsibility for finding a new reader. I trust the receiver that they will do just as good a job finding the next reader as I would.


Unlike a traditional library, the invisible library emphasises adding annotations, drawings, or inserting extra pages. The readers leave something of themselves in the books, the books acquire personality. It is always nice to leave a trace, and it is always good to be reminded that you are not alone in a soulless world.

A drawing of Sammy, with a bandana and sunglasses on, and a swollen chin.

This week I’ve been with the kids. It’s summer holidays and a lot of their friends are away, so we’ve spent pretty much the whole week together. I didn’t even try to work, it wouldn’t have been any good.

The kids have a vague notion of what I do. It involves computers, they know that much. My older kid knows it involves ‘networks’. Mostly they know that I have a blog with fun music by Aljoscha, and comics which they like (their favourite is this one), and that my work means I bring home lots of stickers.

“I made this for you, mum!”

Several years ago I was a consultant working with commercial clients. After my son was born and started to become a little more conscious of the world, I started to get this sense of “I want my kid to think I’m cool” (I know, I’m doomed to failure, but I’m going to try). And I just couldn’t imagine my kids thinking it was cool that I made React apps for shoe stores (which back then was really pretty lucrative).

So I gave up doing the safe thing.

~sammy

We're listening to...

The Crash

This week, I collected all music I remember that I have deliberately listened to multiple times. In the process, I relistened to a bunch of material. And for some reason, this Finnish pop-rock track from 2001 stood out. Sami had shared this years ago on Scuttlebutt (this was the opener of the Consonance 3 (?) mixtape, I think). The good old days of beaker-browser-powered music piracy. And now all these songs are on youtube for free...

Meditations

After reading this interview with Milo Fitzpatrick of Vega Trails, I turned to the keyboard and recorded a series of somewhat minimalistic improvisations. Here is one of them:

The full set turned out surprisingly coherent, and I’ve added it to the sneakerweb site with my own music. This is a lot less stressful than uploading the whole thing on the www, which honestly sounds a bit scary to do.

In an odd sense, the full improvisations remind me of Bismuth’s The Slow Dying of the Great Barrier Reef (a recommendation from Emmy). But anyway, I should stop writing about music that I didn’t actually upload =S.

2026Week 3207 Aug

“the high-risk high-reward approach to improving the world”

A two panel comic.
    
In the first panel, Aljoscha is looking at Sammy in her bandana and shades, as she appears in every editorial. Aljoscha says "Sammy how long are you going to wear this bandana"

In the second panel, it is shown that Sammy was just a cutout and falls onto the desk, and Aljoscha says "oh my god".
A drawing of Aljoscha, fingers interlaced, with short hair!

The day before I headed to my vacation, I had an idea for a blog post that I started feverishly drafting. And now that I returned, the first thing I did was to complete it. It starts from a simple idea: what happens if you structure a programming language design around the broadcasting of information rather than calling methods on specific objects? This starting point has some interesting implications, from abandoning the notion of object identity, to spatial computing based on active broadcast rather than passive sensing. Read the full post on Broadcast-Based Programming here =).

I am slowly returning to more practical worm-blossom concerns now, in particular I want to start fleshing out the WTP into a full specification.

The WTP has three types of requests: RequestGet (analogous to HTTP GET), RequestGetMany (for requesting areas or 3d ranges), and RequestPut (analogoues to HTTP PUT). For a while, I was seriously considering to remove RequestPut, turning the WTP into a purely pull-based, read-only protocol. But while this has a certain elegance, it would force application developers to use a separate protocol (such as dripdrop) to write any (new) entries to a peer. In that world, you would either need to multiplex connections or to open multiple physical connections. And that would add complexity that outweighs the minimalism and orthogonality we would have achieved by trimming down the WTP.

With this decision made, here are the next steps toward a completed WTP:

  • Rework the start-of-connection message flow. The current definitions assume that the very first thing every client has to do is to prove that they have the secret for the public key they will use in their read capabilities. But RequestPut messages do not involve read capabilities at all, and I can easily imagine write-only clients that never work with any read capabilities. And such clients shouldn’t be forced to do useless signature computations, nor should they have to wait for a server challenge before they can start issuing requests.
  • Remove non-Bab usage. Partial verification is such a good feature that I do not want to encourage implementations that skip it. So no raw indexing into payloads by byte offset without Bab verification metadata.
  • Define the responses to GetMany requests.
  • Define encodings for everything. Surely this will be quick.
  • Sketch Rust types for all request and response types. Use this to guide the way the spec defines things; currently the spec describes many optional fields together with rules for when they have to be present based on the values of other fields, and this would be much nicer to define in terms of enums.
  • Pester Sammy to design a logotype.

And with that, we would have a completely specified and half-implemented WTP already. And we are already brainstorming applications we would like to implement that would be enabled by this.

~Aljoscha

A drawing of Sammy, with a bandana and sunglasses on, and a swollen chin.

Multiple people* have now confronted us about how confusing it is to navigate the family of worm-blossom websites. That there should be some kind of unified navigation between the worm-blossom, Willow, Bab, and sneakerweb sites. And being between projects, that seems like the perfect thing to do.

This is the kind of design work only I am qualified to do at worm-blossom.

We'll see when it gets done. It's summer holidays and I'm with the kids next week. Many things simmering but nothing to report.

* Christine, and Aljoscha's dad

~sammy

A friendly computer waving his mouse, beckoning you to come contribute!!!

Contributions Welcome: Recipes Wanted

After internal discussion, we at worm-blossom concluded that the underlying idea is sound nevertheless. So if anyone has tips for making satay sauce with fruit work, please reach out.

Also, I have no idea why Miaourt requested to pose this vital question in improvised song form, but who am I to deny them.

2026Week 3131 Jul

“I'm going to be deeply unhappy if it isn't pure”

A drawing of Aljoscha, fingers interlaced, with short hair!

I am still on vacation. But you know how zoologists determine whether an animal is kept in a way appropriate for its species by observing whether it retreats into passivity or whether it is active, exploratory, and playful? By that same metric, I am having a great vacation.

~Aljoscha

A drawing of Sammy, with a bandana and sunglasses on, and a swollen chin.

I'm not on vacation. But I'm not really on top of it yet. So this week, part eight of “Why is it called worm-blossom?”.

~sammy

Why is it called worm-blossom?!

← Previous instalment

why is this website called ‘worm-blossom’? In this series we will explain why in a concise manner.

Part 8: Twodays Crossing

“I made an app with earthstar! and the thing in the corner is internet time” beams Sammy, a new regular on the Earthstar discord.

Cinnamon eyes the number in the corner of the screen. It is @876, apparently.

The app is cute. It’s a little thing for microblogging in small groups. There are thoughtful touches, like icons generated from public keys to mitigate impersonation. The layout is tasteful. There’s UI for managing your workspaces. But that clock…

“I just wouldn’t want anyone to get confused and think this internet time thing is an Earthstar thing, you know? It's a bit corporate, I don't like the connection with Swatch.”

Sammy hadn’t really thought where this thing had come from. It was just something fun she remembered from her days playing Phantasy Star Online. But Cinnamon thinks about these kinds of things a lot, and Sammy admires that.

Sammy’s next Earthstar app, Twodays Crossing, is a roleplaying chatroom where messages gradually fade away over 48 hours. There are no timestamps on the messages, and the idea of a ‘low res timestamp’ comes up. Sammy asks what it’d be like if each fraction of the day “wouldn’t be a number but a symbol of some kind - a seed, a leaf, a tree, a shell”. Cinnamon seizes upon the idea, and pretty soon there’s a spreadsheet. This new system is built into Twodays Crossing.

At the beginning of 2021, Cinnamon has pulled out the system into its own Seasonal Clock app. There is a kind of golden era for the Earthstar community, people having fun building whimsical things together with an unassuming peer-to-peer core at the heart of it.

But by around the same time next year, things have changed a lot.

2026Week 3024 Jul

“we are firmly on the hedonic treadmill of development”

A drawing of Sammy, with a bandana and sunglasses on, and a swollen chin.

Readers, this week Aljoscha and I are on holiday. So I've done what I can this week to evoke the feeling of my holiday, a summer break in a family home full of old paintings and photographs of times long past. Aljoscha's buggered off for this week's update, and good for him.

Last week I promised a truckload of impressions from Dweb camp, but to be honest most of those remaining reflections are about presentations I saw and the speakers I met, and I would like to share accompanying recordings of them, and I'm waiting for those to become available.

Instead I've been enjoying the intellectual slack you get from being on holiday. First there is just collapse, catching of breath, recuperation. But then after a few days you pick up the thread again, start laying out little patterns on the floor, experimenting with interesting knots. And before you know it, you're 'just doing a little bit of research'.

The next phase of Willow will be about exploring what sits just above the extreme latency of the Willow Drop Format and sneakerweb. So: networked communication. My plan is to use the sneakerweb itself to find the limits of comfort, the point where you say "this is fun, but I really don't want to do this with USB keys anymore". I think it will be really nice to use our own tools to do research in this way (I think this is what people call “drinking your own champagne”).

~sammy

Sketchy ink studies of some paintings in frames.
Sketchy ink studies of some paintings in frames.

We're listening to...

CCFX

The One To Wait is the song I'll put on for driving with the windows rolled down on a too-hot day, the shadows of trees flickering over my face.

Sketchy ink studies of some paintings in frames.
guest articleA mushroom-person named Emmy, looking cheery, holding an ice-cream. This image is cropped from the piece Sammy created to introduce the Summer'26 Edition of worm-blossom.com.

I did threaten to return, didn't I? Well, with Sammy and Aljoscha taking some well-earned R&R (and, apparently, starting to percolate all kinds of fun new ideas!), now seemed like a grand time.

Around this time last year, I attended a lino printing workshop organised by the lovely Imidak. I've never had much of a talent for visual art. I'm learning, slowly, that a part of what I struggle with is hesitance, and reticence, and with tools like brushes and pens it felt like those tendencies were transferred onto the page directly. Digital tools made it feel too easy to undo, redo, start over.

Aside from being enamoured with the vaguely punky aesthetic that comes naturally with lino printing, I found myself taken with the confidence the medium... has? Inspires? Something in the way that once the lino has been cut, it doesn't matter how confidently you were holding the knife. The ink shows up uniformly, there is no turning back, and the reward is images which feel like they celebrate themselves exactly as they are.

Surely there's no more general lesson I should be taking away from this, right?

Shameless pontificating aside, perhaps I ought to re-introduce myself:

async fn an_update() {
    let mut person = Person::new();

    let dan = &mut person;
    dan.live().await;
    
    drop(dan);

    let emmy = &mut person;
    emmy.live().await;
}

Once again, it's wonderful to meet you.

~Emmy

Sketchy ink studies of some paintings in frames.

2026Week 2917 Jul

“surprisingly not broken”

A drawing of Sammy, with a bandana and sunglasses on, and a swollen chin.

Reader I am shattered. Knackered. Demolished. But home and with enough experiences for several weeks' worth of worm-blossom updates. So let’s start unloading the truck.

Sneakerweb was very much at the heart of worm-blossom’s presence at DWeb camp this year. We had a table at the ‘demo night market’, in which we had to beckon passers-by with nothing but our charms. The only problem: our neighbour was the inimitable Christine Lemmer-Webber of the Spritely Institute, who not only had prepared an incredible multi-screen, multimedia experience, but also has the overpowering voice of a lady who sells onions at the market. We did our humble best, I developed my patter (“you publish websites to your computer — no web hosts, no domain registrars, no credit cards!”) and spread the good word. And someone even came to our table with a .snk file.

We also held a sneakerweb workshop in which we installed the sneakerweb CLI, claimed some domains, exported some .snk files, and sent our participants off to the four corners of the earth with the seeds of the euro sneakerweb. I had that fantastic moment where you see how other people use something you made unprompted, and you go ohhhhh this is what this thing really is? We are learning a lot about the sneakerweb and folding it back in as quickly as we can. For starters: Aljoscha added a wonderful new getting started section to sneakerweb.org.

During the confererence Aljoscha would often walk by me with a USB key in hand, and say something like “and this one is going to New Zealand”. He was the star of coordinating the physical distribution of our corner of the sneakerweb, so thank you Aljoscha.

It feels like we’ve got a project that has a life of its own.

~sammy

A drawing of Aljoscha, fingers interlaced, with short hair!

Sneeeeeeeaaaaaaaakerwebbbbbbbb! At the very least, the sneakerwebsites we brought made it to Canada, the US, Argentina, New Zealand, Switzerland, the Netherlands, the UK, Denmark, and Germany.

Also, there have been quite a few contributors over in our repo and issue tracker. We are going to release a new version with a whole bunch of improvements fairly soon I hope. And if anyone out there has expertise in setting up cross-compilation for creating Windows and MacOS builds from a linux machine, please reach out!

DWeb Camp was a lot more than only sneakerweb distribution, of course. Meeting old and new friends, electro-acoustic jam sessions, stumbling into people who know what certificate transparency (my phd topic, I guess) is, interesting presentations and discussions, learning to set up a tent, overcoming crippling social anxiety, all that good stuff.

But, somewhat surprisingly to myself, the biggest effect camp had on me is a renewed sense of how political this space is. Not only the need for decentralised tools over centralised tools, but also the nuances within the decentralised world itself. I am interested in software that minimises hierarchy and power-over, and that is definitely not the case for all decentralised technology. Blockchains tend to reinforce the notion that some participants have more rights and value than others. AI tooling has its own baggage when it comes to autonomy and agency. Even something as innocent as requiring a working internet connection to function forces a dependency on users that could perhaps be avoided.

This has given me quite a bit of energy. Both to work on our projects, and to perhaps attempt to be more vocal about those values that — for me — make the differences between distributed systems, decentralised systems, and truly peer-to-peer systems. The introduction to p2p systems I started drafting a while ago is going to be far from a neutral technical document. But more on that when the time is right...

Finally, I want to thank Christine for her guest comic again, and also Dan and Miaourt for their respective editorials last week. A decade ago, I thought about how cool it was that so many webcomics ran guest updates when the authors took a break. And a decade later, I can finally confirm that being in a position to give the stage to friends is just as cool. Much love!

~Aljoscha

Shout-outs!

Maya started innocently enough by simply adding missing license files to the sneakerweb repo, but then she went ahead and implemented two really nice features: more robust URL resolution, and warning when publishing incomplete sites. Thank you =)

Lark implemented listing the domains of your collection, and improved the sneakerweb export command.

And they started an alternate-reality game based on the sneakerweb. This is so cool! Thank you both for contributing and for immediately bursting open the possibility space of what the sneakerweb can do.

2026Week 2810 Jul

“I see the vision and I want it”

A comic drawn by Christine Lemmer-Webber. Aljoscha, Sammy, and Christine stand together. Aljoscha says "but is she a bit... too enthusiastic?". Sammy says "It's nice to have a fan...". Christine says "HAVE YOU HEARD ABOUT WORM-BLOSSOM?"

Thank you to Christine Lemmer-Webber for contributing this week's comic.

guest articleA mushroom-person named Dan, looking cheery, holding an ice-cream. This image is cropped from the piece Sammy created to introduce the Summer'26 Edition of worm-blossom.com.

Lil ol' me, writing for worm-blossom.org? The internet's premier art-music-data-structures-adventure-webcomic-devblog? How did this happen? I should probably introduce myself. Hi! I'm Dan. Nice to meet you. I've been quietly hanging out here for a little while now, slowly morphing into the ufotofu sicko I was perhaps always meant to be.

DWeb Camp means Sammy and Aljoscha are away, and when they asked if I would like to contribute something here, I found there were too many things I wanted to write about. So, let me commit now to someday spilling some pixels about eldritch-spaghetti-Ufotofu, burnout, and the virtues of lino printing. Probably not all at once.

Fortunately, for now, we are spared my writing on these topics, because while Sammy and Aljoscha have been talking with their fellow campers about Willow and sneakerweb, I have spent this evening sharing our experiment in slow, communal, permissionless web publishing with friends at my local hackerspace.

I had expected to spend at most an hour and a half explaining and demonstrating sneakerweb, and having folks in attendance swap and collect .snk files from my own collection of sneakerwebsites.

The session instead ran for three hours.

By the end, I had a small trove of new sites, including personal sites, photography, a cocktail recipe, and (inevitably) a tiny script for brute-forcing vanity prefixes for sneakerweb domains. A successful sneakmeet!

I am left feeling very fortunate - to be in community with folks who immediately grasp the appeal of protocols like sneakerweb, and to be able to have such a good time with my friends in bringing an implementation to life.

Oh, and on the off-chance that anyone reading this will be at Electromagnetic Field next week and fancies swapping some .snk files, look out for the Glasgow Hackerspace village there.

~Dan

Aljoscha at our table at DWeb Camp's 'demo night market'.
Christine Lemmer-Webber demos her work in Blender to the almost lifelike audience of Aljoscha, Adz, Tommi, and Wakest.
Sammy and Aljoscha.
guest articleA pink cat face peeking out of a blue cup with a strawberry on it

Hiiii, hello worm blossomy world, I've been invited like Dan by your two hosts Aljoscha and Sammy to write some words here while they are busy camping or something.
I'm Miaourt, longtime lurker of the Earthstar project and once-in-a-millennium contributor to Willow, and I have a bunch of half-assed opinions that I like to share!!

If I told you there was a technology that allowed yall smartphones to advertise services in the physical world, that other smartphone can almost passively pick them up and open a bidirectional connexion directly to your smartphone, opening an high bandwidth link between them without any intermediary, and in addition, you could have multiple other smartphones or devices joining this creating a mesh, all self synchronizing their poll frequencies for minimal power consumption, and everything pretty privacy preserving and... and... it's nice ??

Well, wouldn't it be nifty to have this for Willow powered stuff ? (And many other stuff, to be honest), being able to share what you like passively when meeting strangers in the street ? Being able to have a sneakerweb that kinda share itself by walking around? All of this without routers, servers, centralized and nosy infrastructures? And that this is available since Android 17 and i(pad)OS 26??

Well, I'll stop the teasing and present to you Wi-Fi Aware™! I will redirect yall to this nice article that do a good job narrating the history and how private capital can't do good things unless forced by some political will, and I'm pretty sure yall excited already to play with it, but there's a thing...

Google and Apple, in their monopolistic tendencies infinite wisdom, believed that for security the user couldn't allow applications to accept other peers blindly: you have to manually be prompted with a system screen to "pair" with another device, share some unique codes between them, and then both will be paired up. That's fine when you're sharing a file or pairing a headset, but it kinda make our dreamed p2p wireless internet useless...

Even more infuriating, Google and Apple allow themselves to do it, for their own Find My Device, Airtag, Airdrop, they go past their own authorization process to allow them to build such nice features! Per the Wi-Fi Aware's own specs, the security/consent is purely application level, the protocol itself doesn't rely on it at all, so both Apple and Google could totally allow applications to ask users for the permission to run in the background, and to trust peers, but we kinda know that it's not really the direction taken...

~Miaourt

2026Week 2703 Jul

“almost spiritual”

An illustration of a fictional hardware device, the 'Willow Pocket'. This stylish, pocket-sized device can sync Willow data over cable or with an antenna. You can configure it by connecting it to a PC, but then it can autonomously store and sync Willow data. It features blinky lights to indicate syncing state, a switch to toggle automatic syncing, and a retractable antenna for extended range.
A teeny megaphone blaring out noise

Sneakerweb Released!

We have been teasing the sneakerweb for weeks, a small application for storing, browsing, and sharing static websites without relying on the internet at all. And now we have finally released it. Head over to sneakerweb.org, where you can install the (command line) app.

We will be bringing some cool sneakerweb-exclusive sites to DWeb camp, and are looking forward to sharing them. The only thing we are looking forward to even more is to receive sneakerwebsites that others have built.

And also for everyone who does not happen to be in Berlin next week, why not craft a small html zine and have it ready in a .snk file? One of the most exciting aspects of Willow-based applications such as the sneakerweb is that there is no need for a single, global seed from which everything grows. You can create your own little island of cool stuff to share. One day it might find its way to a worm-blossom person, and that would be pretty exciting. Or maybe it never will — which, in its own way is perhaps even more exciting. Because that is the decentralisation we are all working to enable.

A drawing of Aljoscha, fingers interlaced, with short hair!

The calm of this week’s background track belies how hectic a week this has been — hence only a short update. Sammy has already travelled to DWeb camp and is busy setting things up. My preparations for DWeb camp have also entered the final phase. As have the exams I’m inflicting on my poor students. But basically all of my time not spent on teaching has been going into the sneakerweb.

Thanks to Dan’s tireless contributions, we have running software. I have been crafting sneakerwebsites. We have exchanged and ingested the first Willow Drop Format data. I am storing and reading a site that Sammy created. And it all runs on our own protocols and software. Willow feel so very real all of sudden!

And I can’t wait to share the neatness (neatidy? neatle?) with others at camp =)

~Aljoscha

We're listening to...

Torbjørn Dyrud

Not only is DWeb camp happening and exam season taking its tribute, but I am also busy memorising pieces for some upcoming choir concerts. And how unreasonably cool is this piece?! (also, an absolute pain to learn, but well worth it)

So, if you are in Berlin on the 18th or 19th of July and don't have any plans yet...

~Aljoscha

Chicken Picnic

Well, I’m still listening to this. Instead of listening to the music I need to memorise.

Shout-out!

I want to thank Vivicat for spotting and helping to debug issues in our Rust implementation of WILLIAM3. Væ spotted and fixed several bugs that would have taken me ages to discover on my own.

Now, our WILLIAM3 implementation produces the same digests as a BLAKE3 implementation when undoing exactly the bits that differ between the two specs. This gives me high confidence that the newly released version 0.8.0 of bab_rs provides a WILLIAM3 implementation free of bugs. Yay!