“we did end up here organically, but that isn't to say it was a good place to arrive at”


sneakerweb 1.2.0
This week we're releasing sneakerweb 1.2.0, which importantly allows your sneakerweb collection to be browsed from Chromium and Webkit based browsers (like Chrome and Safari).
That problem was caused by the base16 encoding we previously used for domains, which basically resulted in hostnames which were too long. Domains now use a base32 encoding. Old base16 hyperlinks will still work in some browsers, but you'll want to update them to base32 links for full cross-browser support.
We’ve also added a sneakerweb remove command. This removes a domain and its data from your sneakerweb collection without blocking it. Hopefully this adds an extra level of nuance to curating your collection (and also makes it easier to experiment with publishing).
Commands like sneakerweb serve and sneakerweb publish now respect custom collection locations. So you can work with independent collections of sites. This is a stopgap to more complete collection organisation.
Downloadable builds are available at sneakerweb.org, and a complete list of changes can be found on the project's CHANGELOG.
Thanks to Emmy, slug, and interfect for their contributions to this release!

We're resilient creatures that can adapt to a surprising amount of stress. Before reaching a breaking point, there are several other intermediate points where things start to get a bit wobbly and plans start to go awry.
As this is a blog about making things and about being a person who makes things, it seems negligent not to mention that I hit my wobbly point a while ago, and that it's been affecting my ability to make things.
Would you believe me, reader, if I told you that updating this website each week started to fill me with apprehension? This cute little blog where no-one is making the rules apart from myself (and some might argue, Aljoscha)? Which we update without fail every Friday for nearly a year?
Regardless of our stringent publishing schedule, I recognise that my apprehension is not really about worm-blossom.org. It's about me, the rapidly changing circumstances which have brought me to my wobbly point, and recognising that if I don't want to hit my breaking point I need to do something about it.
So I'll briefly mention what nourishes me right now — maybe the only thing that really nourishes me right now — which is being in the physical presence of other people who care. About what they're doing there, about each other. When I'm sitting in that I feel like I'm part of a circuit, that there's nothing more precious than to be part of that interchange.
~sammy

Between the final days of my vacation and then catching up with work (the semester is starting soon, so there's a flurry of admin stuff to prep for teaching), I had barely any time for worm-blossom. So nothing to report this week.
Instead, have a random programming language design sketch! Imagine a statically typed, object-oriented programming language where all method calls must be mediated through an interface. Classes do not have ad-hoc method implementations, they can only implement interfaces. And concrete classes cannot appear in type signatures, only interfaces can (with semantics analogous to those of using interfaces as types in Java, or to trait objects in Rust).
The impetus for this (slightly cumbersome) design is to combine the flexibility originally envisioned by OOP — every object can be transparently replaced by a different kind of object as long as the new object reacts to the same methods — with static typing. In a language like Java, you lose the fungibility of concrete types the moment you constrain a variable or argument to a specific class. This interface-only type system would enforce fungability everywhere.
This has some interesting properties: for example, an equals method would have to implement comparisons based on public trait methods rather than by accessing internals. This feels like a bit of a hassle, but also it makes sense philosophically: equality (or equivalence, more generally) must depend only on publicly observable properties rather than inaccessible state. A bit like whether a person is perceived as a good person depends only on their observable actions, not on the belief system sustaining their actions. This type system design applies that viewpoint consistently to all programming.
Generics play a fairly important role in this type system: compare the kinds of values that could be returned by newer(a: Entry, b: Entry) -> Entry with those that could be returned by newer<E: Entry>(a: E, b: E) -> E.
Finally, this language should probably have some unconventional type-level operators: A && B could denote the set of types implementing both the A and the B interface. And A || B could denote the set of types implementing at least one of the A and B interfaces. On the value level, there'd then be a match statement for different branches depending on whether a value of type A || B implements A or B.
But enough of that, I have emails to write and access rights to assign =S.
~Aljoscha




















