“it’s in the nature of the universe to be a bit annoying (with respect to what we are doing here)”

Willow’s data model has a special feature called prefix pruning. Let’s say I have some data stored at /blog/summer and /blog/autumn. If I were to write some new data to /blog, both of those entries at /blog/summer and /blog/autumn would be pruned, that is, erased without any trace that they were ever there.
Meadowcap has scoped capabilities. We can give someone read permission to /blog, and we can even grant permissions as specific as being only able to read stuff within /blog/summer.
This week, community member Alex Burdiyan alerted us to an interesting tension between these features: if I only have permission to know what’s happened within /blog/summer, how would we ever know that this data has been prefix pruned by someone writing to /blog?
You wouldn’t. And for us, that’s kind of an undesirable state of affairs, because deletions conditionally propagating is clearly not how people would expect these features to work. But this is a case of a feature working too well: Meadowcap really doesn’t let you learn about something outside of the granted area. Fixing this issue kind of requires us to break this rule.

Breaking this rule means telling people about data outside of their granted area, meaning they can learn information they have not been granted explicit permission to. But there’s no way to propagate a deletion without informing someone of a deletion. It’s a have your cake and eat it kind of situation.
So, crisis within worm-blossom? Are we going to have to eat humble pie and change the specifications we’ve marked as FINAL? Create new specifications? Thankfully, we don’t think so: we can let peers determine whether to reveal pruning entries at their own discretion during sync.
We did have a discussion about how we handle the statuses of our specs. Currently we have Draft, Proposal, Candidate and Final. Previously we promoted the Willow Data Model and Meadowcap to model to final after implementing them, but in the future we’ll only be doing so after these implementations have seen meaningful real world usage.
Finally, huge thanks to Alex for identifying this issue!
~sammy

Contributions Welcome: WbBox
I have added an Edit link to the weekly background music players. If you right-click and open the link in a new tab, it takes you to the song editor. If you give it a regular left-click, however, nothing happens. I have absolutely no idea why that is (when you open the player iframe in a dedicated tab, clicking the link there works!), and it is driving me nuts. If anyone could figure out what is happening there, I would be eternally grateful!
The code base is a bit of a mess, sadly. The javascript that generates the player lives here, and there is some CSS that cleans up the resulting page so that it works nicely as a small embed. ~Aljoscha

This week I allowed myself to give in to the mania part of Macromania and ported defref — the system for defining terms and referencing them, all with fancy tooltip generation — to the new macromania version. Chief amongst the new features I added along the way: the ability to do cross-domain references. Now we can tell you all about AreaSlices here on worm-blossom.org despite them being defined on a completely different website with a different domain and independent codebase. Though admittedly the real star here is the WebTT specification for static cross-domain tooltips. That spec dearly needs a nicer page.

Porting and debugging defref triggered a veritable cascade of bugfixes, refactors and feature additions across our nascent collection of macromania packages, too many to list in detail. Because I want to talk about something completely different: sneakerdep!
The idea of sneakerdep is to add a lightweight dependency mechanism to the sneakerweb: sneakerwebsites specify a list of domains they depend upon. The semantics are weak, a dependency merely indicates “I might reference things in this domain, so please try to have it in your collection”. The real utility comes not at runtime (i.e., while browsing), but when creating collections: you can easily specify a set of root domains and then transitively include all dependencies to obtain a self-contained collection.
Sammy raised an important question: how does this interact with deletion and blocking? I think it should work like this: when you block a domain, you (recursively) delete all domains it depends on, except for those which are depended upon by at least one other page in the collection. Doing this efficiently initially sounds like a job for reference counting, but since dependencies can be circular, we’d actually need proper garbage collection. Which, given that a stop-the-world garbage collector would be absolutely no problem here, is far less scary than it might sound at first.
What this also introduces is a need to mark the roots of a collection, i.e., those sneakerwebsites which were added deliberately and explicitly, not just as dependencies to a more important site. And you would need to preserve this information as you merge collections, so it should be part of .snk files. Luckily, .snk files are simply Willow drops, so the format is easily extended.
Tracking roots explicitly would additionally be useful in browsing collections. Our current implementation provides a frontpage that simply lists all available sites. Filtering out non-roots would solve the problem of “garbage” domains (say, domains that provide assets that would otherwise need to be duplicated across many sneakersites) clogging up the landing page. And Emmy pointed out that rooting and pet-naming could be related operations. Hmm...
~Aljoscha
Auntie Source

Dear Auntie Source,
Today, I took the plane to Schiphol with 4 suitcases totaling 70kg of luggage. I'm moving here. Why would I do that?!
Well, first of all: calm down Auntie. I want to be closer to the communities I believe in, having worked on indie federated protocols for the last few years.
Aug 2025-2026 I got into a Big League, Real Kids startup, and it was lovely until they started vibecoding. Then I realized I was burning out, visited the Netherlands with 25 hours advance notice, couchsurfed and cried on my best friend's shoulder in Eindhoven. So I came back home, quit, found a replacement tenant for my lease, packed all my stuff and went. Tomorrow I'm on my way to my new apartment, in Limburg.
What do you think I should do? Since I decided to not look for a job ahead of moving, because it would be too much so soon, I have a lot of freedom. In a month or so, I can think about opening as a zzp'er - maybe applying to NLNet or some other grant. But if it doesn't work, I'm worried I'll have to vibecode. I'm not sure whether I can refuse them, because I don't have as much experience as some of the big bloggers like dbushell.com.
What would you do in my situation? Of course, at first I will try my best to simply adjust to the constant rain, moody skies and biking everywhere. But after? Do you think I can embrace FOSS and live? People tell me it's an employers' market right now.
Love from Amsterdam,
Mei

Dear Mei,
You’ve got so much more to adjust to than the weather. Have you seen what they call food in the Netherlands? And how much they charge for it?! This is a time of great adjustment for you, and you must use this precious freedom you have wisely. Like, maybe learn to cook if you haven’t already.
But okay, okay, let’s say you’ve got a handle on moving to a new country, and you still want to work in FOSS. You have to ask yourself: how much do I like writing grant proposals? If the answer is A LOT then this is the right career for you!!! If the answer is no, find a friend who likes to write grant proposals. Being a brilliant programmer with great projects is a nice-to-have.
Look. The NLnet proposal form isn’t very big. Write a proposal, shoot your best shot, worst thing that happens is they don’t accept it this time. And in the meantime, keep working on your projects and make sure people know they exist and that you’re doing something!!! Like, maybe write a blog that updates every week or something? Consistency is everything baby.
Got a question for Auntie Source? Send it to sammy@worm-blossom.org (who will make sure it gets passed on)
All content from Auntie Source is provided for general information only, and should not be treated as a substitute for face to face counselling, medical or legal advice. Auntie Source is not responsible or liable for any action made by a user based on the content of this website or from correspondence with Auntie Source.We're listening to...

Emmy recommended this to Aljoscha, and since then Aljoscha has been listening pretty much nonstop.


There is an idea that's been knocking around the community discord server and in our own conversations about using Willow regarding how best to arrange the data in a store, which I'm going to call the “trailing empty component convention”. Because it has found yet another way to be useful in the context of choosing trade-offs between deletion propagation and scoped permissions, I thought I might describe it here, and explain why we think it's kind of neat.
Really, the trailing empty component convention is exactly what it says on the tin. If you find that you want to label some entry using /some/path, the trailing empty component convention tells you that you should probably store that data at /some/path/<empty> instead (where that last component is literally empty).
This makes for a nice way to avoid tripping over yourself when adjusting, for instance, /blog/summer without prefix-pruning /blog/summer/assets and having to re-write Entries for those assets with a higher timestamp (since /blog/summer/<empty> is not a prefix any path starting with /blog/summer/assets).
Under this convention, when you do want to prune, you instead write to a path which does not end in an empty component. Since the purpose of such a write is deletion, the payload is meaningless and can be set to the empty string. Entries divide into two distict flavours: writes (with a trailing empty component), and deletions (without a trailing empty component).

Sharing these signed deletions outside the scope of a Meadowcap capability still leaks information on which key performed a deletion, when, and at what prefix, but it seems that it should be easier to reason about when an entry should be shared out-of-scope in this setting. At the very least, no information about the payloads themselves need be revealed.
The deletion-propagation problem was one of two things to nerd-snipe me at the start of the week, the other being Sammy's Send bound woes from last week. Fortunately, we are apparently not short of ideas on either front, so in the remainder of this week, I have been settling into a more focused flow of work. In particular, I have been reminded of how comforting it is to spin up the fuzzer to test new code, incrementally refining and correcting an implementation, all the while accompanied by the whirr and warmth of the machine. It's like coding by the fireside, really. Very cosy.
Alas, I've still no idea what of fun, creative contribution I could be making to these weekly updates. A part of me thinks that it would be cute to make tiny video games, but I've done just about enough game jams to balk at the idea of sustaining a one-game-a-week cadence.
~Emmy





















