<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Voboda</title>
  <link>https://voboda.com/</link>
  <atom:link href="https://voboda.com/blog/feed/" rel="self" type="application/rss+xml"/>
  <description>I like making new things with cryptography.</description>
  <language>en</language>
  <item>
    <title>Tough Puzzles at the Community Privacy Residency</title>
    <link>https://voboda.com/blog/community-privacy-residency/</link>
    <guid isPermaLink="true">https://voboda.com/blog/community-privacy-residency/</guid>
    <pubDate>Tue, 13 Oct 2026 16:06:00 GMT</pubDate>
    <description>&lt;blockquote&gt;
&lt;p&gt;&amp;quot;As soon as you're caught in the room, cryptography won't help you.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Most cryptographers are trained on that separation of concerns. If you're locked in a room, someone can coerce you into handing over your password and cryptographic keys, so that part is &amp;quot;out of scope&amp;quot;.&lt;/p&gt;
&lt;p&gt;During three weeks at the &lt;a href=&quot;https://community-privacy.github.io/&quot;&gt;Community Privacy Residency&lt;/a&gt;, I met a journalist from an occupied territory, and his reality threw the whole distinction out.&lt;/p&gt;
&lt;p&gt;There were daily roadblocks, with military police doing phone inspections. If you didn't unlock your phone, you were detained and your phone confiscated.  If there was an encrypted chat app on your phone, you were detained and investigated. If there was a number from the wrong area code in your call log, you could be arrested on terrorism charges.  If you were a regular suspect or a journalist, they had no problem leaning on your family with threats of detention. Detention without charge, potentially for years.&lt;/p&gt;
&lt;p&gt;So if you need to go to the shop, you can't go with Signal on your phone. Not if you want to make it back home.&lt;/p&gt;
&lt;p&gt;It's based on perception, not reality. WhatsApp is end-to-end encrypted, and nobody looks twice. Telegram isn't (by default), and it's treated as a cause for suspicion.&lt;/p&gt;
&lt;p&gt;Anything that looks like encryption - an app with &amp;quot;secure&amp;quot; in the name, a blob of encoded text in a message, is like &amp;quot;waving a flag and saying, come take me.&amp;quot;&lt;/p&gt;
&lt;p&gt;Plausible deniability, one of cryptography's favourite answers to coercion, made it worse. A soldier at a roadblock who knows hidden profiles might exist on a phone can never know they've seen all of them. That obliges them to keep turning up the pressure. And the more uncomfortable part that took a while to say out loud: think about what this does to someone being interrogated or tortured.&lt;/p&gt;
&lt;p&gt;That was one puzzle. There were plenty more.&lt;/p&gt;
&lt;h2&gt;The short train&lt;/h2&gt;
&lt;p&gt;Before we arrived, everyone was pinging each other on Signal, working out who could ride together from Berlin to the house in Brandenburg. That's how I met the journalist, on the train platform, and it was an embarrassing start. I’d found a free bench at the far end of the platform, but didn't realise it was a short train. After an hour of waiting, we only saw the train as it pulled out, and we had three hours until the next one.&lt;/p&gt;
&lt;p&gt;The village called our old farmhouse &amp;quot;the bunker&amp;quot; because after WWII its facade was redone in typical socialist concrete. About fifteen years before we arrived, a couple bought it, took the concrete off, and started restoring it. They had an ethos, and saw themselves as restoring an environment that had been designed to be adaptive and let people thrive.&lt;/p&gt;
&lt;p&gt;High ceilings, big windows and creaky wooden floors. Downstairs, the huge kitchen opened into an even bigger common room, with a modular table long enough for thirty people. Couches ran along the walls. Thirteen bedrooms across two floors. A few tents in the big garden outside, surrounded by farms. The closest shop was in a town eight kilometres away.&lt;/p&gt;
&lt;p&gt;We were about thirty people once you counted the mentors and guests staying overnight, and the organisers were putting final touches on the first puzzle: who slept where. A list of special requests, matched against the rooms of an old house.&lt;/p&gt;
&lt;p&gt;Then we went round the table and introduced ourselves. I'd seen &lt;a href=&quot;https://community-privacy.github.io/2025-projects/&quot;&gt;last year's projects&lt;/a&gt;, so I knew the people would be smart. I didn't expect to feel this out of my league. A Brazilian resident protecting activists and journalists who report on cartels. A digital rights lawyer from India, working on internet shutdowns and gender-based violence. New York protest organisers. Prisoners' rights researchers. Legal counsel for massive human rights orgs. A security director for a journalism protection association. A mathematician researching an emerging category in post-quantum cryptography. And someone who popped in a few times to help make lunch, modest but happy to talk shop, turned out to be the Mr. Wolf of TEE architecture.&lt;/p&gt;
&lt;p&gt;A world-class cryptographer sat next to someone on the front lines of a freedom movement, and you could feel it both ways: everyone was accomplished, and everyone was a little intimidated. The game was &amp;quot;draw your life in 2 minutes&amp;quot; which was loads of fun, and let us glimpses of what really made us who we are beyond our credentials.  But we still introduced ourselves through the institutions we'd passed through, the names that carry clout.&lt;/p&gt;
&lt;h2&gt;Picking your teachers&lt;/h2&gt;
&lt;p&gt;On the day people settled on projects, I was tired and behind, and needed more time to read all the poster sessions taped up around the main room.&lt;/p&gt;
&lt;p&gt;I'd brought a question with me: which problems really matter now, out in the world? And we'd spent a few days naming real problems from real communities, circulating them, and leaving them for other people to pick up.  The idea was to team up around real needs rather than our pet projects. The project I applied with was a way to deliver apps &lt;a href=&quot;/blog/webpage-hijacks/&quot;&gt;without depending on centralised app stores&lt;/a&gt;.  In one group session I asked, &amp;quot;Has anyone heard about &lt;a href=&quot;https://f-droid.org/en/2026/02/24/open-letter-opposing-developer-verification.html&quot;&gt;the F-Droid problem with Google's developer ID policy&lt;/a&gt;?&amp;quot; Most of the room put their hands up, but it didn't get anyone excited.&lt;/p&gt;
&lt;p&gt;The guy doing operational security for researchers in South America was standing on his own, and I went over, thinking I'd love to learn from him. Like at university: pick the teacher, not the subject. I could just work on whatever he picked. But he was still undecided. Right beside was an abandoned poster: help journalists working in occupations with phone and device inspection/confiscation. If a journalist teamed up on this, would he be interested? I knew one from the train ride. I walked over and asked. He was in too.  So it started with the three of us.&lt;/p&gt;
&lt;p&gt;There was also a question on the wall I hadn't noticed.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How do you get better forms of identity in chat apps, to keep out imposters?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I wrote a note back, half-joking:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ZK. Who are you?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That note kicked off a collab: a chat app she later named Little Homes. What if the answer wasn't better identity, in the cryptographically verifiable sense, but accepting we can't rely on it, and working from there? Ink &amp;amp; Switch had built something like this, &lt;a href=&quot;https://github.com/inkandswitch/backchannel&quot;&gt;Backchannel&lt;/a&gt;: no global key directory. Two people swap a short one-time code, their devices derive a shared key, and that key is the relationship. No global key, no global identifier.  I'd been toying with the idea for &lt;a href=&quot;https://www.infinite.build/&quot;&gt;Infinite Build&lt;/a&gt;, where I wanted everybody to have full agency over their group learning experiences. She was circling the same questions for direct action groups.&lt;/p&gt;
&lt;p&gt;We kept meeting each other like quarks all over the house. Conversations in stairwells, over the kitchen sink, people exploring the grounds.  I met a friend of a resident in the garden when she arrived. She introduced herself as being short but not too short to need children's shoes. Her friend introduced her as working for the UN. I kidded her about how all our modern organisations are built the same way, with the same hierarchies, then fail under the same pressures, in the same directions. And somehow we're surprised every time. She said, &amp;quot;we're going to be friends.&amp;quot; We got on to talking about our parents who were displaced by political shifts, and what that means to our identities and responsibilities.&lt;/p&gt;
&lt;p&gt;At the end of the week, we had an event in Berlin at the &lt;a href=&quot;https://iniradar.org/casino-for-social-medicine/&quot;&gt;Casino for Social Medicine&lt;/a&gt;. It was packed, with people standing outside on the street looking in. From the shows-of-hands in different presentations, I picked up maybe a quarter of the room were cryptographers or deep in opsec. A huge number had made sure there was no online record of the events they go to. One of us started their presentation with a question, &amp;quot;If I say The Hegemonic Internet, do you know what I mean?&amp;quot; and the place erupted in snaps and laughter.&lt;/p&gt;
&lt;h2&gt;The barn studio&lt;/h2&gt;
&lt;p&gt;Back at the farmhouse, some people could put on headphones and work right through the noise of the main room, with the kitchen next door. Some of us needed quiet. So the hosts let us use a studio above the barn.&lt;/p&gt;
&lt;p&gt;That's where we worked out Little Homes, on a whiteboard. Arisu, Karoi, Satoshi and Taka stood in for Alice and Bob, and every step had the cryptographic protocol, the UI and the social graph drawn side by side, to keep them &lt;a href=&quot;/blog/better-affordances-for-federated-systems/&quot;&gt;congruent&lt;/a&gt;. We broke direct action groups down into roles: leadership, staff, super volunteers, and the general community. The horde!&lt;/p&gt;
&lt;p&gt;My collaborator advises direct action groups, and she could tell the security needs they have from the ones they feel. They worry about infiltrators, and about adding the wrong person to a group or posting in the wrong place.  &lt;a href=&quot;https://www.theatlantic.com/politics/archive/2025/03/trump-administration-accidentally-texted-me-its-war-plans/682151/&quot;&gt;Hegsething themselves&lt;/a&gt;. Their more immediate risks are around operational security, data hanging around on insecure devices and that type of thing, but that's not something they tend to see until it's too late. Also chat group membership itself is becoming legal exposure: being in a group where others planned something is used in court to argue you were part of it. We wanted to address all of this.&lt;/p&gt;
&lt;p&gt;For high-risk scenarios, we designed NFC check-ins as a countermeasure to group members being captured, coerced or losing their phones: check in with another member regularly, or you get kicked from the group and the phone auto-deletes message history.&lt;/p&gt;
&lt;p&gt;Then started with the question she'd written on the wall. Identity and impersonation. Almost every chat app gives you one username and one public key that follows you everywhere. Say you've joined your local Alcoholics Anonymous group on Signal. Then you meet someone in a professional context and join their group too. Now they can see you're in AA. On Signal, seeing common groups is a feature. For these groups, it's doxxing. And the central user list gives rise to accidentally adding the wrong person, not to mention a place for people to create look-alike accounts.&lt;/p&gt;
&lt;p&gt;So in Little Homes, if you and I are both in rooms A and B, we hold different keys for each other in each. Nothing in room B tells me you're the person I know from room A. No common username, IDs or keys at the protocol level. Only you can disclose this. This means every pair of people in a room needs to introduce themselves with a specific name and a unique signing key for that group.&lt;/p&gt;
&lt;p&gt;It doesn't scale, but it doesn't have to: the groups we were designing for maxed out at twenty or thirty people.&lt;/p&gt;
&lt;p&gt;Under this system, some things broke right away, like @mentions. The name I use for you, a &lt;a href=&quot;http://www.skyhunter.com/marcs/petnames/IntroPetNames.html&quot;&gt;petname&lt;/a&gt;, is mine alone, and can be meaningless (or revealing) to others in the room. What if an @mention was stripped out and turned into a private notification for that message? But then nobody else knows who the message was for, so it's really more like a DM nudge for a public message. And also, one typo can leak your name for someone.&lt;/p&gt;
&lt;p&gt;Backchannel syncs through Automerge, a CRDT that keeps its full history forever. That's the right thing for messages and the wrong thing for room keys that are meant to be rotated and destroyed. A rotated key stored there would never really be gone. So room keys live outside it, on the device, where deleting them actually deletes them.&lt;/p&gt;
&lt;p&gt;I brought in a problem I keep seeing in online communities. Every online group has an admin who holds the control. But in real communities, the people actually leading often aren't the admins or the staff. They get frustrated and leave, and the admins go looking for new moderators. It turns out this happens a lot in larger US direct action groups too.&lt;/p&gt;
&lt;p&gt;So in Little Homes, rooms have no admins. A room's policy is fixed when it's created. To change it, you fork: you start a new room with the new policy, and members of the old room prove their way in. In the app interface, that can still feel like changing the room's settings and pressing &lt;em&gt;Save&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;As we worked through each step, my collaborator and I sometimes pulled in different directions. She wanted to protect anonymity across groups more than I did, because accidental doxxing is how these groups get hurt. This design was already way safer for them and I didn't want to lose users to annoying security steps. My proposal: when joining a room, just announce the name you'd like to go by. If you'd rather stay anonymous, you can, and tell your name only to specific people. She wanted anonymity by default, with no announcing. But then every time a room split off, you'd have to swap names with each member again...&lt;/p&gt;
&lt;p&gt;Whenever we got to an issue like this, we'd stop and ask what assumptions we weren't putting on the whiteboard. Sometimes we couldn't name the use case that called for a specific privacy property, it was more an instinct. Then a scenario would pop up later. There! That's why! It went both ways. We trusted each other's intuition and gave the other room to explore. We kept those options open.&lt;/p&gt;
&lt;p&gt;She explored an &amp;quot;are you this person?&amp;quot; protocol. Say I'm in a new room and think I recognise you. Can I ask, &amp;quot;Are you Arisu?&amp;quot; The catch: just asking tells a possible stranger there might be an Arisu around, which is a doxxing problem. So we dropped it, but it got us somewhere I didn't expect. Members of a new room already had private one-to-one channels from the old room, so they could use those to share the new room's keys, without swapping codes from scratch. And each person joining could choose whether to introduce themselves, and to whom. Nothing was announced by default.&lt;/p&gt;
&lt;h2&gt;Couch City&lt;/h2&gt;
&lt;p&gt;Riley, one of the organisers, grabbed a bunch of us and cut out half of the big table. What was left of it became a coworking table, where people worked with headphones on.  We filled the other half of the room with unused couches, carrying them from the barn across the garden. Someone called it Couch City and the name stuck.&lt;/p&gt;
&lt;p&gt;Couch City did a lot. Small teams worked there, and you could overhear and jump in. People were more willing to host a workshop, because the couches made it feel easy-going and less official. Around eleven every night there was an NYT crossword ritual on the projector, everyone shouting answers while one person typed madly.  It's insane to watch someone finish the NYT crossword in a couple of minutes.&lt;/p&gt;
&lt;p&gt;After dinner, people drifted out to the patio. More than once I passed conversations about old jams: you like that too? Then the stories went deeper. Our parents: the Nigerians would imitate theirs, full accents and body language, and argue with each other in character. The Indians would talk about theirs, and about dealing with their approval. All the coming-out experiences too. Poetry readings. Poetry divinings. A chess board appeared with a label you could flip: black turn / white turn. I'd catch up on games when I walked by, and played a few turns. There was always something to connect on.&lt;/p&gt;
&lt;p&gt;Early in week two, we had our first big meeting since forming teams. Laptops open, people half-listening to each other's updates. I felt it was a bit corporate but didn't know how to say that nicely. Our UN friend was sat on a couch in the corner. She was asked if she'd like to share an update alongside our projects. Instead she said, &amp;quot;Thanks for offering me this space. I'm going to use it to share how I'm feeling.&amp;quot; Looking around the table, she said, &amp;quot;Disconnected.&amp;quot; Everyone in the room had been talking about their anti-colonial work, and she invited us to reflect on whether a boardroom table and status updates were the format we really wanted. It was a question for all of us, about habits we'd carried in from our academic and corporate lives. She knew the irony, and deals with it all the time: her own organisation still calls its work &amp;quot;missions&amp;quot;.&lt;/p&gt;
&lt;p&gt;Our journalism team had grown to six or seven of us, and I was struggling to organise and facilitate. A UX designer offered to run Cade Diehm's Anxiety Mapping workshop for us one evening: we individually brainstormed every troubling scenario we could think of. One stage of Anxiety Mapping combined our separate scenarios into one, literally using dice rolls:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You've been arrested at a roadblock, with sensitive evidence on your phone, during an internet shutdown. Also there's a flood.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Oh come on, does this really happen?  And the journalist said, actually, yeah it did. And later he pushed back even more:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;[Security experts] are always thinking about the threat modeling top-down, like the state does. You're not looking at the human being who's actually fighting something.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;My first thought was: that's a great line for the presentation. Then it hit me: I'd come to the residency partly to learn threat modeling from professionals, and here was the person I wanted to do it for, commenting on ten years of threat modeling done for him. But I've seen what good stuff comes out of just trying to see through the eyes of the individual people you're trying to help. It struck me that I might have something to offer here.&lt;/p&gt;
&lt;p&gt;From there we split off, each of us researching one of the areas he'd identified.&lt;/p&gt;
&lt;p&gt;The same designer helped with Little Homes. (She was everywhere - helping almost all the teams!) She sat with us for an hour, then the next day, in about twenty minutes, she speedran ten or fifteen flows. She'd taken our group relationship map, which was never meant for the interface, and told us that was the right mental model, but too complex for a small phone screen. So we jammed on it. What about skewing it into a grid-like space? Swipe sideways between separate social groups, scroll down to the rooms connected within one.&lt;/p&gt;
&lt;p&gt;The harder part was telling rooms apart. We'd been debating whether rooms should have petnames too, a name each member sets, or one shared name to anchor some common purpose, like regular chat apps. We never settled it. But when we got to the descriptor text on each room's card, what distinguished a room was its size, the members you know, and most of all the policy for getting in: people in this room are admitted by being in rooms D, F or J, or by invitation from these specific people. The rule for who gets in, written in social terms, turned out to be more meaningful and orienting than a name alone.&lt;/p&gt;
&lt;h2&gt;The house&lt;/h2&gt;
&lt;p&gt;Mentors and guests kept arriving. On Fridays, the organisers ran a happy hour at the house, and people they'd invited arrived from Berlin in waves by train.&lt;/p&gt;
&lt;p&gt;Some of the visitors were last year's residents. They did a lot of weaving between us, and took care of people's human needs: inviting us to open up to each other, or to look after ourselves when we were pushing too hard.&lt;/p&gt;
&lt;p&gt;The house had never hosted a group this big, for this long. It had one fridge, and one standard oven.&lt;/p&gt;
&lt;p&gt;From the start, someone found masking tape lying around and labelled every kitchen cupboard, so nobody had to open each one to find a pan. Within hours, other labels appeared: &amp;quot;frozen assets&amp;quot; (on the freezer), &amp;quot;skeletons&amp;quot; (on the closet), &amp;quot;killer robots&amp;quot;. Nobody could ever find the recycling box, until it got a huge label: &amp;quot;the future hope of humanity&amp;quot;.&lt;/p&gt;
&lt;p&gt;Groceries could only be delivered twice a week and overflowed the fridge and cupboards, onto windowsills. One of us had set up a shelf for special-diet food, but if one or two people didn't read the label, food ended up anywhere anyway. Not everyone signed up to the cleaning/cooking rota, which strained the people who did, so someone moved it off a spreadsheet and onto a whiteboard in the kitchen, to help make it easy. But people got confused. The cooking schedule lived in two places, and one day one of our best cooks turned up to find it had changed. Each fix was partial, and the people who broke something weren't doing it on purpose. Different ideas of what's normal, how things should work, what's intuitive, colliding constantly.&lt;/p&gt;
&lt;p&gt;The house owners wanted to design an environment where people do good work. We were all designers of digital spaces that other people live in. And here we were tripping over each other on a cleaning rota. It felt a bit like a reality TV show.&lt;/p&gt;
&lt;p&gt;One resident had a line for it: solidarity works until someone has to do the dishes. But someone was always in the kitchen, cleaning, loading or unloading the dishwasher, whether asked or not. In the first week, he and a few others took on an evening cleaning shift that wasn't even on the rota.&lt;/p&gt;
&lt;p&gt;I took the first cooking shift, the stress test, and when not all the ingredients arrived, an Italian mentor helped me improvise a pasta Parmigiana on barbeques on the patio. I’ve run residencies like this before, and I couldn’t switch that part of my brain off. I kept pitching in, and some people started assuming I was one of the organisers when I wasn’t.&lt;/p&gt;
&lt;p&gt;By the second week, some strain was showing. One evening, around the big patio table, the organisers offered an open space for feedback. We'd arrived with different expectations, some of us for the projects and some for the people. Some were juggling day jobs. Everyone spoke with understanding and gratitude, but some of the notes were sharp: hire a facilitator, hire ops people.&lt;/p&gt;
&lt;p&gt;Mine was about the fridge. I'd been looking at the house as a system, and it seemed to me a lot of seemingly unrelated problems traced back to that one fridge. Only two deliveries a week meant the fridge was in constant 3D Tetris. Ingredients were always lost, making it hard to cook big lunches. Then we needed cooking schedules, and that took people away from other things... Really the venue should have provided this, knowing how many people they were hosting. Buying a big fridge for someone else's house seems crazy, but 500 euros would have easily saved a hundred hours across the 20 residents.&lt;/p&gt;
&lt;p&gt;Tbh I thought a lot of the feedback was a bit unfair but the organisers just listened. They didn't defend themselves, not once, even for things that weren't on them. When we asked about budget, it came out that they had hired help, on a tight budget, and had been paying for a lot of things out of their own pockets.&lt;/p&gt;
&lt;p&gt;It was their second residency.  I'd asked Riley how they chose the residents, because twenty people who'd never met clicked within days. That's really hard to do so well.  They told me they spent weeks imagining different combinations of us together in a house. What would we talk about? They know it's about people, not rubrics. And they just put in the time to get that right.&lt;/p&gt;
&lt;p&gt;To me, the thing about residencies is that if you get the people mix right, they don't need much structure. Everyone finds who they need and makes use of the proximity and time together.&lt;/p&gt;
&lt;p&gt;In the kitchen one day, I asked Janabel, a mathematician and one of the organisers, if she could express her goals for the residency in terms of group theory: what's the transformation you want here? She thought about it and said, &amp;quot;Our relationship graph goes to diameter 1.&amp;quot; Everyone in direct relationship with everyone else.&lt;/p&gt;
&lt;p&gt;They'd done this all without a big funder, because they wanted something like this to exist in the world: a place for journalists' needs to be met, for protesters to find protection, and for fabulous queer technologies to find their roots.&lt;/p&gt;
&lt;h2&gt;The cucumbers&lt;/h2&gt;
&lt;p&gt;In the evenings people went for walks. The work came along on the walks too, but more in the way you could ask about the person behind a project. One path out of the village led to an industrial cucumber farm, fifty acres under the windmills. Most of the cucumbers had overgrown to three or four kilos.&lt;/p&gt;
&lt;p&gt;There was a whole thing between the people from agricultural places and the people from supermarket places. A lot of us, me included, were nerds about agriculture without having lived it. So there were debates. I thought, those have to be zucchinis. Others said cucumbers, just not edible now. It became a game for me. I’d steer people with opposite takes toward each other and let them argue it out. It was nice to see such smart people let themselves be caught out on something trivial.&lt;/p&gt;
&lt;p&gt;By the end, newcomers were walking out to see the giant cucumbers they'd heard about, and bringing them back for a big salad for everyone.&lt;/p&gt;
&lt;h2&gt;What people carried&lt;/h2&gt;
&lt;p&gt;We were all drawn into these causes for different reasons. Look back at that round of introductions: cartels, internet shutdowns, gender-based violence, prisoners, protests. If you work on the front lines of something like that, you've been around trauma. You shoulder the pain of real people you've watched suffer, and have probably been through some shit yourself.&lt;/p&gt;
&lt;p&gt;A trans resident talked about driver's licences being revoked, and valid documents with an X gender marker suddenly not being accepted. And about cities and towns where the likelihood of hate crime was enough to plan your day around.&lt;/p&gt;
&lt;p&gt;One morning over breakfast, I realised the person I was talking with had been an international athlete, and mentioned that someone else in the house was too. He explained: if you look like me, you have to be the best before anyone will treat you with respect.&lt;/p&gt;
&lt;p&gt;There was another resident I'd been looking forward to meeting, and I didn't meet her until three or four days in. She told me about a health project she did in The Gambia, where the local team asked her to get off a bus to make room for the white people, assuming they were the only donors and the doctors. She cried while she told it, the emotion still so present.&lt;/p&gt;
&lt;p&gt;A lot of people talked about systemic privilege but her story made it hit home. She gets recruited by companies most people would work years just to interview with, and has turned them down because the reception desk, seeing her skin colour, assumed she was there to deliver something. Taken for a gig worker once, it's a story. When it happens everywhere you go, it's a drag you carry. When it happens in the lobby of a company that wants to hire you, it's a tell about what working there would be like. And there aren't many companies at that level to choose from, so standing your ground costs you. I've read Biko, I've watched Atlanta, and I still have no idea.&lt;/p&gt;
&lt;p&gt;She always found the good and made a point of sharing it. When her flight was cancelled, a customer service agent got her onto another one, and she told the whole residency Signal group about it, by name. Thirty of us spent the evening cheering on Julie, in a call center somewhere, who will never know any of us were beaming our appreciation to her.&lt;/p&gt;
&lt;p&gt;The protest organisers live with police violence as part of the work. You're trained to avoid a knee on your neck when you get arrested, but you also pick a great outfit for your arrest photo.&lt;/p&gt;
&lt;p&gt;Everyone here was carrying pain, but still bringing light.&lt;/p&gt;
&lt;h2&gt;The greenhouse&lt;/h2&gt;
&lt;p&gt;By the end of week two, a few of us took a conversation outside, to a table by the greenhouse. The others shared their stories first, and then I shared mine. It was the only time I did.&lt;/p&gt;
&lt;p&gt;If I dress a certain way, I look white. If I dress according to my ancestry, I don’t. For that trip I’d only packed t-shirts and a baseball hat, so the first way was the only way people there saw me. Someone at the residency named it for me: white-passing.&lt;/p&gt;
&lt;p&gt;My passport doesn’t pass. I know how border cops look at it, pointing at something they purposefully mispronounce. I’ve been down those hallways, to the small rooms with bad ventilation. People sat on rows of metal chairs facing a wall painted with a comically oversized government logo. Stone-faced mothers with toddlers playing on the floor.&lt;/p&gt;
&lt;p&gt;On the street, I’ve been attacked by skinheads and had to fight for my life.&lt;/p&gt;
&lt;p&gt;The mixed-race people in the house had a conversation of their own, about fractured roots: looking for your heritage and never finding it in one place. Our friend from the UN, whose parents had been displaced like mine, knew what was doing it. Whiteness.&lt;/p&gt;
&lt;p&gt;She didn’t mean skin colour. She meant whiteness as erasure: corporate norms and consumerist culture spreading around the world and washing out what’s specific about anywhere, and anyone.&lt;/p&gt;
&lt;p&gt;The search for roots is universal. I finally realised why my white friends do DNA tests and proudly tell me they’re 2.8% Irish or 1.9% Nordic. They’re feeling something that was washed out too.&lt;/p&gt;
&lt;p&gt;This erasure is a Stephen King plot: something spreading through a town, cutting everyone off from each other and where they come from.&lt;/p&gt;
&lt;p&gt;Stephen King's been writing about colonialism this whole time.&lt;/p&gt;
&lt;h2&gt;Not everything&lt;/h2&gt;
&lt;p&gt;In week three, the journalist and I settled into a loop. I'd wake up with an idea, spend the morning researching and expanding it, then find him at some point during the day and see if it held water. Phone profiles died first: work profiles get checked, they're easy to spot, and they cause suspicion. What about a real sneakernet? A slow internet of USB drives moving around the region by car, with slow routing like &lt;a href=&quot;https://en.wikipedia.org/wiki/FidoNet&quot;&gt;Fidonet&lt;/a&gt;? It had been tried, and now police look for USB keys specifically at the checkpoints they use to control movement. They plug them in and if there's anything encrypted, the bus leaves without you. What about encrypted blobs, something PGP-like but not over email? Forget it. Something like that gets terrorism charges thrown at you. Most ideas ended there: been-there-done-that, or not worth it. But some of our ideas had a shred of something useful, and those became approaches worth a try, strategies that survive all the constraints at once, from network analysis to being detained and coerced into unlocking your phone. Even floods.&lt;/p&gt;
&lt;p&gt;This whole time, a lawyer in the group had been deep in research. With us, they'd do that lawyer thing where they try to keep you out of trouble. The best defense is not to end up in court. That kinda thing. For fun, I kept bringing up Hunter S. Thompson's &lt;a href=&quot;https://en.wikipedia.org/wiki/Oscar_Zeta_Acosta&quot;&gt;activist lawyer&lt;/a&gt;, someone who gets into trouble with you so they can get you out. But they were right.  When the research was done, the lay of the land was clear. There are things governments and police do that wouldn’t stand up in court, but they know that doesn’t matter until your court date comes.  Meanwhile, there are entire categories of ways to help journalists that steer far away from the state's ability to harass or coerce.&lt;/p&gt;
&lt;p&gt;I couldn't stop thinking about another resident's project too. He'd applied with it but hadn't put it into the team formation exercise.&lt;/p&gt;
&lt;p&gt;The morning after our group introductions, he'd started a conversation with me about where we were from, and put me onto &lt;a href=&quot;https://genius.com/Langston-hughes-whos-passing-for-who-annotated&quot;&gt;Langston Hughes' &amp;quot;Who's Passing For Who?&amp;quot;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So it was kinda fun that his pet project was helping workers form unions without disclosing to anyone, including each other, that they were doing it.  He'd asked a few people, and they'd said the general version of the problem is considered impossible: the employer controls all the communication systems and all the records.&lt;/p&gt;
&lt;p&gt;He wasn't a cryptographer but had come up with one of my favourite parts early on: make it a petition, not a vote. In a vote, an employer faking submissions fakes opposition and wins. In a petition, every fake signature works against whoever faked it.&lt;/p&gt;
&lt;p&gt;If you know me, you won't be surprised to learn I thought ZK would solve it. Public and private inputs, a prover, a verifier. A &lt;a href=&quot;https://docs.semaphore.pse.dev/&quot;&gt;Semaphore&lt;/a&gt; Merkle-tree could handle membership proofs. What I hadn't spotted: Semaphore gives you anonymity within a group, but the employer holds all of the employee's information, so it can act as any employee.&lt;/p&gt;
&lt;p&gt;I kept thinking, there must be something that made this case different from the general one, one little hook that made this not impossible in this specific case. The employer controls the mail servers, the directory, the devices. Not everything though: not personal phones, not the organisers' own Signal groups, not two people meeting in person.&lt;/p&gt;
&lt;p&gt;That was enough to build on. The petition needs every employee to have one stable identifier, so nobody can sign twice. Normally you could hash something unique like an email address. But the employer just hashes the whole staff list, runs each one on the petition system, and knows who signed (and therefore who to fire). When this came up, we paraded over to Ying Tong, one of the organisers. She was in the kitchen, in the middle of cooking us all lunch. &amp;quot;We have this problem. Can I get you for five minutes?&amp;quot; She came over, sat down, drew us a little diagram, and explained &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9497.html&quot;&gt;VOPRFs&lt;/a&gt;. A VOPRF folds in a secret the employer doesn't have, and the server holding that secret never sees the email. I thought the name was hilarious, and that the idea deserved a pronounceable acronym, so I called them &amp;quot;VORPs&amp;quot;. She kept correcting me so kindly and patiently it melted my heart a little each time. So I kept calling them VORPs.&lt;/p&gt;
&lt;p&gt;Our first version was the standard pattern: publish the list of anonymised identifiers, so anyone can verify the count. Then a cryptographer pointed at the public list. The employer controls every mailbox, so it can submit as any employee and watch the list or the response. If it grows, that person hadn't signed. If it doesn't, they had. So an employer, with an idea of who signed, could verify their suspicion and deanonymise people.&lt;/p&gt;
&lt;p&gt;Another problem was proving the results were valid, to third parties like courts. Someone suggested a blockchain, for immutability and proof, recording encrypted records as they were added, then revealing them all at the end. I suggested a massive zero-knowledge proof instead, over the tally itself: every signature valid, nobody counted twice, the total is N. And the list never leaves our hands.&lt;/p&gt;
&lt;p&gt;For unionising, the NFC check-in from Little Homes turned out useful: a way for organisers to attest, in person, that someone was a real colleague, folded privately into their signature. It gave us another cryptographically provable path that the employer couldn't see or control.&lt;/p&gt;
&lt;h2&gt;Encryption considered harmful&lt;/h2&gt;
&lt;p&gt;The last few days, we were all stressing about our presentations for Demo Day.&lt;/p&gt;
&lt;p&gt;Then we got to Offline Place in Berlin, and Ying Tong and crew had made a huge effort to cook home-made food for everyone. The crowd that joined us were people from the Friday happy hours and the Casino, but now familiar faces instead of strangers. It was packed again, the front rows were people sat on the floor.&lt;/p&gt;
&lt;p&gt;The journalist team presented &amp;quot;Encryption considered harmful&amp;quot;. The main thread was simple. When you design cryptographic systems for these cases, the person in the room is exactly who you design for, which means key compromise, device compromise, network observation and metadata all matter.  The person caught &amp;quot;in the room&amp;quot; isn't out of scope, they're in the crosshairs. As far as an interrogator is concerned, the more plausible your deniability, the more plausible your guilt.&lt;/p&gt;
&lt;p&gt;Another team, &lt;a href=&quot;https://garfieldnaruto.com/&quot;&gt;Garfield-Naruto&lt;/a&gt;, had come at it from the opposite direction. They hide messages in LLM slop: text that looks like nothing, instead of an encrypted blob that looks like something. They're candid that the prototype isn't ready for the most security-critical uses yet.  I loved watching how much fun that team had the whole time, and this was the first time I saw a working demo.&lt;/p&gt;
&lt;p&gt;I could finally see the other projects I hadn't had time to catch up on. A friend had come in with a great idea: a Gini Index but for privacy access. I wanted to be part of it, and tried to nudge it along but never managed more than cheering it on. By the end I could see how much had developed in his conversations with everyone. He explained how people on low incomes in some countries can only afford old Androids that won't get security updates. He talked about the cost of privacy beyond money, like time required and language barriers.  It had really galvanised.&lt;/p&gt;
&lt;p&gt;Another project was policy work on age verification, and how easily kids get around it. Seeing it presented in research photos and findings after all our little breakfast conversations, it was suddenly tangible. And a security project for national trains: &amp;quot;You were really working on this the whole time?&amp;quot; I asked her. &amp;quot;Yeah, that's why you didn't see me in the mornings. I was working in my room.&amp;quot;&lt;/p&gt;
&lt;p&gt;I was so tired, and still, I wanted to take this all in. Everything we'd done in this short time.&lt;/p&gt;
&lt;h2&gt;Trading notes&lt;/h2&gt;
&lt;p&gt;My favourite moments were one-on-one conversations in some quiet corner of the house or the garden, lasting hours. Life, why we do what we do, the big problems. There's a melancholy in these friendships. What brought us together was our battles, and apart from those in the same cities or conference circles, we won't see each other again without real effort.&lt;/p&gt;
&lt;p&gt;That closeness is what drove us to trade notes as travellers do: what's good, what's bad, what to avoid, what signposts to look out for.&lt;/p&gt;
&lt;p&gt;When I got back home, that first show of hands stayed with me. About F-Droid. I'd arrived with a very technical, philosophical, and anti-Google view of my project. The &lt;a href=&quot;https://keepandroidopen.org/open-letter/&quot;&gt;open letters&lt;/a&gt; on this make the case top-down, in the abstract. So I started asking about the humanitarian impact of Google's developer verification by looking for real people with real stories. That pointed me to evidence about bigger numbers. Hundreds of thousands of people. Then millions. Then billions. I spent weeks on it, constantly pulled deeper as new questions opened up.  And wrote it up here: &lt;a href=&quot;/blog/google-is-taking-what-keeps-them-alive/&quot;&gt;Google is taking what keeps them alive&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Engineering problems are objective: physics and math. That's what I'm used to. Most people I met at the residency are working against adversaries. Against other people. That's messier, and it brings an angry energy. Anger's useful though: with a constructive environment to direct it, it clears a path towards something better.&lt;/p&gt;
&lt;p&gt;I'd never thought of myself as a policy person, but some residents encouraged me to dip into that world.  I'm surprised how rare it is for the people designing policy to go and find the specific cases of who's affected.  I applied for a few research grants, long shots for me, but one was accepted because of that approach.&lt;/p&gt;
&lt;p&gt;I came looking for a way back to real people and real problems. I got here thanks to a house full of wonderful strangers, and the three organisers who bet their own time and money on us.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Google is taking what keeps them alive</title>
    <link>https://voboda.com/blog/google-is-taking-what-keeps-them-alive/</link>
    <guid isPermaLink="true">https://voboda.com/blog/google-is-taking-what-keeps-them-alive/</guid>
    <pubDate>Tue, 08 Sep 2026 17:32:00 GMT</pubDate>
    <description>&lt;p&gt;Millions of people living under authoritarian governments, military occupation and drug cartels depend on apps built by people who can't send Google a passport. This month Google starts blocking them.&lt;/p&gt;
&lt;p&gt;Google's new &amp;quot;&lt;a href=&quot;https://developer.android.com/developer-verification/guides/faq&quot;&gt;developer verification&lt;/a&gt;&amp;quot;: all Android developers, not just Play Store listings, have to send it a legal name, a home address, a government ID and proof they hold their app's signing key, plus twenty-five dollars for an account that allows normal installation. It &lt;a href=&quot;https://thehackernews.com/2026/06/google-sets-sept-30-deadline-for.html&quot;&gt;starts&lt;/a&gt; in Brazil, Indonesia, Singapore and Thailand in a few weeks, and the rest of the world follows in 2027.&lt;/p&gt;
&lt;p&gt;Here is one app that has to comply.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://restofworld.org/2025/palestinians-digital-maps-west-bank-israel/&quot;&gt;Azmeh&lt;/a&gt; is a checkpoint map for the West Bank. It was written in 2015 by &lt;a href=&quot;https://www.middleeasteye.net/features/occupation-we-have-app&quot;&gt;Basel Sader&lt;/a&gt;, twenty, a law student at the Hebrew University who had been crossing those checkpoints since childhood, almost daily. His cousins were in Ramallah, his aunt and uncle in Bethlehem, and he played in the Palestinian basketball league, so the games were always in Ramallah or Bethlehem. And the kid learned to code at summer camp.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;I'm only a law student. I saw this particular problem though.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;He &lt;a href=&quot;https://www.aljazeera.com/news/2015/11/18/new-apps-help-palestinians-navigate-israeli-checkpoints&quot;&gt;said&lt;/a&gt; the app couldn't give anyone freedom of movement, but it could make things easier. It launched with two checkpoints on it. By February 2016 it had forty-seven checkpoints, an English version, a colour scale instead of open-or-closed, and eleven thousand downloads.&lt;/p&gt;
&lt;p&gt;Then Israeli military personnel treated mapping checkpoints as a security matter. Sader was harassed and &lt;a href=&quot;https://www.aa.com.tr/ar/%D8%A5%D8%B3%D8%B1%D8%A7%D8%A6%D9%8A%D9%84/%D8%A3%D8%B2%D9%85%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D9%8A%D8%B3%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D9%81%D9%84%D8%B3%D8%B7%D9%8A%D9%86%D9%8A%D9%8A%D9%86-%D8%B9%D9%84%D9%89-%D8%AA%D9%81%D8%A7%D8%AF%D9%8A-%D8%B2%D8%AD%D9%85%D8%A9-%D8%A7%D9%84%D8%AD%D9%88%D8%A7%D8%AC%D8%B2-%D8%A7%D9%84%D8%A5%D8%B3%D8%B1%D8%A7%D8%A6%D9%8A%D9%84%D9%8A%D8%A9-%D9%85%D9%82%D8%A7%D8%A8%D9%84%D8%A9/2985741&quot;&gt;threatened with lawsuits&lt;/a&gt; until he shut the app down himself, and it stayed dark for seven years. A new version came online in &lt;a href=&quot;https://www.jerusalemstory.com/en/blog/palestinian-jerusalemites-invent-apps-navigate-unpredictable-checkpoint-statuses&quot;&gt;March 2023&lt;/a&gt; under a Palestinian organisation in Jerusalem. &lt;a href=&quot;https://restofworld.org/2025/palestinians-digital-maps-west-bank-israel/&quot;&gt;Rest of World reported&lt;/a&gt; in 2025 that it tracked more than eight hundred checkpoints for about seventy thousand people. Its developers would not give their names, for fear of what Israel would do if it worked out who they were. They said they were there because they had to be, not because they wanted to be.&lt;/p&gt;
&lt;p&gt;One review explains it:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;I used to always get extremely frustrated when I reach the checkpoint and I find heavy traffic, some clashes, or worst of all, the checkpiint is closed. &amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Rakan Said has driven a minibus for twenty years. He told Rest of World:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;We are stranded for hours, sometimes from sunrise to sunset. Passengers can't reach jobs, and drivers lose their entire day's wages waiting at checkpoints.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This isn't Waze telling you there's traffic on the 101. The stretch of &lt;a href=&quot;https://www.france24.com/en/middle-east/20250923-west-bank-s-route-60-the-road-of-death-many-palestinians-cannot-avoid&quot;&gt;Route 60 that connects Ramallah and Nablus in the West Bank&lt;/a&gt; is fifty kilometres, and part of daily commutes. Since Azmeh went offline, this road has seen countless encounters with violence. Between six and nine the army closes gates so settlers can do the school run. So Palestinian traffic tends to move in waves. Another driver, twenty-seven years on that road, told France 24:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;It's forbidden to stop at gas stations. If you stop, they can shoot at you, and if you get a flat tyre, you have to keep driving until you get to a Palestinian village. If you stop for just five minutes you'll see the settlers coming.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So Palestinians needing Route 60 have to leave at half past five to be there by half past eight.&lt;/p&gt;
&lt;p&gt;Fifteen kilometres out of Ramallah that road passes Sinjil, where a woman &lt;a href=&quot;https://www.hrw.org/news/2026/08/05/israel-delaying-palestinian-ambulances-risks-lives&quot;&gt;died of cardiac arrest after being delayed at a closed military gate&lt;/a&gt;. The same report describes fifty delays to medical care, including &lt;a href=&quot;https://www.ochaopt.org/content/humanitarian-situation-report-10-july-2026&quot;&gt;an infant who died at Deir 'Ammar&lt;/a&gt;. The ambulance was allowed to pass without its passengers, and waiting on the other side of the gate the whole time. They carried the four-month-old to it on foot. The UN counted &lt;a href=&quot;https://www.ochaopt.org/content/movement-and-access-west-bank-april-2026&quot;&gt;almost a thousand checkpoints, roadblocks and other military-installed blocks&lt;/a&gt; across the West Bank at the start of the year. Knowing which gate is open makes the difference between getting to work at all, or getting to the hospital on time. Or not.&lt;/p&gt;
&lt;p&gt;Google's policy isn't aimed at Azmeh specifically. The same rule catches &lt;a href=&quot;https://f-droid.org/packages/at.h4x.amsprung/&quot;&gt;AmSprung&lt;/a&gt;, an app that tells you when the next tram leaves in Vienna, named after a Viennese phrase for being about to leave. It's made by someone who goes by &lt;code&gt;uniqx&lt;/code&gt;. It has never been in the Play Store, but Google is still demanding the developer's name, ID, and money.&lt;/p&gt;
&lt;p&gt;Let's not even ask why that's theirs to ask for. It's not the big problem.&lt;/p&gt;
&lt;p&gt;Entire populations have no government willing to give them ID. Billions have no payment method Google will accept. Plenty have both and still won't connect their identity to their app, because they know what their government will do to them.&lt;/p&gt;
&lt;p&gt;Verification is not about being listed in the Play Store. It is the condition for an app installing on a phone at all, and that affects places like this, that rely heavily on mirrors and sharing apps from person to person.&lt;/p&gt;
&lt;p&gt;Google says they're doing this to stop fraud. I will show you that it doesn't, and that they know it. I'll even show you they have better alternatives they're not using.&lt;/p&gt;
&lt;p&gt;Google makes its decisions with data, and nearly all the data it holds about apps comes from its own store. That's part of the problem. The store is the map Google works from, but it's far from a complete picture of the world of Android apps.&lt;/p&gt;
&lt;p&gt;This policy will break things that aren't on this map, so let's look at more of those places.&lt;/p&gt;
&lt;h3&gt;Health apps&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://myglucosemonitor.com/en/29-android-aps&quot;&gt;AndroidAPS&lt;/a&gt; is an open-source artificial pancreas: it reads a continuous glucose monitor, drives an insulin pump, and lets type 1 diabetics sleep through the night. It has never been on Google Play and never can be, &lt;a href=&quot;https://androidaps.readthedocs.io/nl/latest/Getting-Started/Introduction.html#why-cant-i-just-download-aaps-and-use-it-straight-away&quot;&gt;for legal reasons its own documentation spells out&lt;/a&gt;. It exists because in 2013 John Costik, a software engineer at a supermarket company in upstate New York, worked out how to read the glucose monitor attached to his four-year-old son Evan, so he could watch the numbers from home while Evan was at daycare, and then posted the code publicly. A woman called Dana Lewis saw it. She'd been diagnosed with type 1 diabetes at fourteen and was frightened of going to sleep, because the alarm on her monitor was too quiet to wake her. She and Scott Leibrand built a louder one, then kept going, and ended up with &lt;a href=&quot;https://www.theguardian.com/lifeandstyle/2018/jul/20/diabetes-experience-i-built-my-own-pancreas&quot;&gt;an artificial pancreas&lt;/a&gt;. In her words:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Having a computer make adjustments while I sleep is far safer than trying groggily to make decisions in the early hours.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;By 2018, more than 700 people were running one. If Google's rule had existed in 2013, Costik would have been limited to his own handful of devices. Registering his passport and paying a fee wouldn't have made sense for something that wasn't a product yet. So he'd have had no reason to publish the code at all, and Dana wouldn't have discovered it.&lt;/p&gt;
&lt;p&gt;There are more out there, like &lt;a href=&quot;https://www.openseizuredetector.org.uk/&quot;&gt;OpenSeizureDetector&lt;/a&gt;, which was also written by a parent to keep his epileptic child safe through the night. Actually, self-made health apps are now a standard area of study in health care; it's a normal way for companies and universities to understand what's possible and what works.&lt;/p&gt;
&lt;p&gt;They all start with a stranger publishing some code, asking nobody's permission, and it reaching somebody who was going to die without it.&lt;/p&gt;
&lt;h3&gt;Money apps&lt;/h3&gt;
&lt;p&gt;In Argentina, after years of triple-digit inflation, knowing today's black-market dollar rate is the difference between spending your pesos now or losing value by tomorrow. Nobody big built that. It's a scattering of solo developers: &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.twonomadev.dolar&quot;&gt;Dólar App Argentina&lt;/a&gt; since 2019, by someone who goes by 2nomadev, and &lt;a href=&quot;https://play.google.com/store/apps/details?id=im.outa.AmbitoDolar&quot;&gt;Ámbito Dólar&lt;/a&gt;, built and still maintained by Ariel Falduto. They just built the thing their people needed. They got on Google Play years ago, when twenty-five dollars and a working card was all you needed. No government ID.&lt;/p&gt;
&lt;h3&gt;Everyday apps&lt;/h3&gt;
&lt;p&gt;Not all of it is life and death.  &lt;a href=&quot;https://f-droid.org/packages/org.woheller69.whobird/&quot;&gt;whoBIRD&lt;/a&gt; listens and tells you which bird is singing, offline, from a little AI model that knows six thousand species. &lt;a href=&quot;https://f-droid.org/en/packages/org.woheller69.audiometry/&quot;&gt;hEARtest&lt;/a&gt; turns a phone and a pair of headphones into a hearing test, for people a long way from an audiologist. &lt;a href=&quot;https://f-droid.org/packages/org.woheller69.lavatories/&quot;&gt;LavSeeker&lt;/a&gt; shows you where the nearest public toilet is. That sounds like a joke until you have Crohn's disease in an unfamiliar city. One person makes all three, and signs the work &lt;code&gt;woheller69&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://f-droid.org/en/packages/com.uli.bokyfivavahana2/&quot;&gt;Boky Fivavahana Anglikana&lt;/a&gt; is the complete Anglican prayer book for Madagascar, in Malagasy only, maintained by one person: Tsiory Rajaonirina.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://f-droid.org/en/packages/org.kiwix.kiwixmobile.standalone/&quot;&gt;Kiwix&lt;/a&gt; puts the whole of Wikipedia on a phone for people where the Internet, or Wikipedia itself, is blocked. It's one enormous file: about sixty gigabytes without pictures, and usually gets shared on SD cards. &lt;a href=&quot;https://support.google.com/googleplay/android-developer/answer/9956427?hl=en&quot;&gt;Play restricts the SD card reading permission&lt;/a&gt; so the Google Play version makes people download Wikipedia into dedicated app storage. Since it serves people who can't access Wikipedia, but requires downloading Wikipedia, it kind of defeats the whole point. But that's the best they could do under the Google Play rules. So the people who need offline Wikipedia because they can't download it where they are? They find it, and all of these apps, on the F-Droid Store.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://f-droid.org/&quot;&gt;F-Droid&lt;/a&gt; holds four thousand apps like the five we've just seen, and &lt;a href=&quot;https://keepandroidopen.org/&quot;&gt;it cannot survive under Google's new policy&lt;/a&gt;.  The ones that are only on F-Droid, and the ones like Kiwix where the F-Droid build is the one that works, are what this policy hurts first.&lt;/p&gt;
&lt;p&gt;F-Droid catches fraudulent apps through code reviews, without asking a single developer's ID, because it builds the app itself, and signs the result with its own key. That's a stronger security model than Play's, because everyone sees every line of code rather than the name on some paperwork someone uploaded.&lt;/p&gt;
&lt;p&gt;Google's new policy requires whoever holds the signing key to register each app. F-Droid can't force thousands of upstream authors to send documents to Google, and &lt;a href=&quot;https://f-droid.org/2026/02/24/open-letter-opposing-developer-verification.html&quot;&gt;many of its contributors are pseudonymous on principle&lt;/a&gt; because being named for the software you write is dangerous where they live.&lt;/p&gt;
&lt;p&gt;Their position hasn't changed since long before any of this was contentious: software you can't inspect isn't really yours, it makes you the one being used, not the user. F-Droid built the answer, and it's worked fine for fifteen years.&lt;/p&gt;
&lt;h3&gt;Internet access from blocked countries&lt;/h3&gt;
&lt;p&gt;In June 2025, users of a popular app called v2rayNG noticed it had vanished from Google Play.&lt;/p&gt;
&lt;p&gt;v2rayNG is a proxy client. It's one of the tools people in Iran, China and Russia use to reach the internet their governments have decided they shouldn't see. Its repository has over sixty thousand stars. It's made by somebody who signs their work &lt;code&gt;2dust&lt;/code&gt; and has never published a legal name.&lt;/p&gt;
&lt;p&gt;Asked what had happened, 2dust &lt;a href=&quot;https://github.com/2dust/v2rayNG/discussions/4586&quot;&gt;answered in one sentence&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;本应用无法完成认证，被 GooglePlay 下架了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This app cannot complete the verification, so it was removed from Google Play.&lt;/p&gt;
&lt;p&gt;It wasn't a policy violation and it wasn't malware. The developer, writing in Chinese, simply refused to identify themselves to Google.&lt;/p&gt;
&lt;p&gt;A user in that same thread asked: when verification comes for direct installs too, what then? 2dust didn't say they would register. Mainland China had never depended on Google Play anyway; they'd see what actually arrived and deal with it then. 总是有办法的. There is always a way.&lt;/p&gt;
&lt;p&gt;The way is a much harder way.&lt;/p&gt;
&lt;p&gt;v2rayNG users now need three pieces of developer infrastructure. &lt;a href=&quot;https://github.com/2dust/v2rayNG/releases&quot;&gt;GitHub Releases&lt;/a&gt;, where the current build lists twenty-three separate files and the project has to link a document explaining which one you want. GPG, to check the signature and know the file wasn't swapped in transit by a mirror, an ISP or the state doing the censoring. And &lt;a href=&quot;https://github.com/ImranR98/Obtainium&quot;&gt;Obtainium&lt;/a&gt;, a third app that watches the release feed. Plenty of professional programmers have never set up GPG. And it's now the only route for a school teacher in Jammu or a cook in Shanghai.&lt;/p&gt;
&lt;p&gt;In Turkmenistan, the criminal code allows &lt;a href=&quot;https://en.turkmen.news/news/turkmen-official-behind-internet-restrictions-offers-to-pay-for-removal-of-expose/&quot;&gt;up to seven years in prison for installing circumvention software on somebody else's device&lt;/a&gt;.  Seven years. For helping a neighbour talk to their daughter in London.&lt;/p&gt;
&lt;p&gt;Meanwhile the state department that runs the blocking quietly sells access back, reportedly at fifty dollars a month for the basic tier or two thousand to remove the filtering entirely. Here, a minimum-wage worker already needs &lt;a href=&quot;https://progres.online/economy/the-state-of-the-turkmennet-in-2022-slow-expensive-and-censored/&quot;&gt;something like a fifth of their income&lt;/a&gt; on the official, censored connection.&lt;/p&gt;
&lt;p&gt;Turkmenistan isn't alone. Iran, Russia, China, Myanmar, Belarus, Turkey, Pakistan and India all punish circumvention software with prison, one way or another, which is why v2rayNG has cousin apps everywhere.&lt;/p&gt;
&lt;h3&gt;Organising against state oppression&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://kr-asia.com/myanmar-protestors-use-apps-to-boycott-military-linked-products-and-businesses&quot;&gt;Way Way Nay&lt;/a&gt; lists Myanmar businesses owned by the military so people can avoid buying from them. It passed 100,000 installs within ten days of launching after the coup, and its creator speaks to journalists only on condition of anonymity.&lt;/p&gt;
&lt;h3&gt;Journalists and their sources&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://briarproject.org/download-briar/&quot;&gt;Briar&lt;/a&gt; passes messages phone to phone over Bluetooth and wifi when the network has been cut, which is the moment a government most wants you unable to talk. &lt;a href=&quot;https://guardianproject.info/apps/&quot;&gt;ProofMode&lt;/a&gt;, from the Guardian Project, signs a photograph as it's taken so it can later be shown not to have been altered, for the person filming something that will be denied. These are tools used by journalists and their sources. They know they need to publish on Google Play and F-Droid and a plain APK, because they can't depend on any single gatekeeper.&lt;/p&gt;
&lt;p&gt;Except Google's verification policy makes it the gatekeeper in all these places.&lt;/p&gt;
&lt;h2&gt;Half the world is cut out&lt;/h2&gt;
&lt;p&gt;Google's head office is in Mountain View, California.  If you live there, asking for ID and a couple bucks doesn't seem like much.&lt;/p&gt;
&lt;p&gt;Nico Mexis is a case in point. He maintains &lt;a href=&quot;https://f-droid.org/en/packages/studip_uni_passau.femtopedia.de.unipassaustudip/&quot;&gt;StudiPassau&lt;/a&gt;, an app covering a university in Bavaria: what the canteen is serving, which room your seminar is in, the campus news. He's not a student there anymore, but he still keeps it updated. It's on F-Droid, and has been on Google Play since 2019. He had the card, and the passport was in a drawer.&lt;/p&gt;
&lt;p&gt;But actually, this policy cuts out half the world from registering their apps, and that means stopping half the world installing the specific community apps they need, on a phone they bought with their hard-earned money.&lt;/p&gt;
&lt;p&gt;It's easy to assume the world's poorest people aren't technical enough to be app developers, but that's just not true if you go look. In &lt;a href=&quot;https://www.theguardian.com/global-development/2016/aug/30/girls-india-learn-app-coding-navigate-way-out-mumbai-slum&quot;&gt;Mumbai's Dharavi&lt;/a&gt;, girls built apps for communal water queues, rubbish collection and women's safety; in &lt;a href=&quot;https://restofworld.org/2020/the-life-and-death-of-snet-havanas-alternative-internet/&quot;&gt;Havana&lt;/a&gt;, volunteers ran servers and modified software to keep a vast homemade network alive on improvised hardware; and in &lt;a href=&quot;https://www.isocfoundation.org/story/building-a-smart-hub-in-one-of-kenyas-informal-settlements/&quot;&gt;Nairobi's Mathare&lt;/a&gt;, residents who could not afford college learned development and began building websites and teaching coding inside the settlement. These are not exceptional people somehow escaping their surroundings; they are communities using software the same way people everywhere do: people learn to code, and write software to solve their problems.&lt;/p&gt;
&lt;h3&gt;No bank card&lt;/h3&gt;
&lt;p&gt;Half the world's adults do not have the payment instrument Google requires.&lt;/p&gt;
&lt;p&gt;The twenty-five dollars goes through Google Pay, which only takes bank-linked cards. It even states plainly that &lt;a href=&quot;https://support.google.com/googleplay/android-developer/answer/9875040?hl=en&quot;&gt;prepaid cards are not accepted&lt;/a&gt;. The exclusion they don't mention is worse. Across a lot of Africa and Asia, banks are not the standard. These places run on mobile money. The World Bank's 2025 Findex counts about 6 billion adults worldwide, of whom &lt;a href=&quot;https://thedocs.worldbank.org/en/doc/be6615202d1f08a25855c8ac2d615122-0050012025/related/Little-Data-Book-2025-Web.pdf&quot;&gt;roughly only 3.3 billion own an account-linked debit card&lt;/a&gt;. Half.&lt;/p&gt;
&lt;p&gt;This isn't about poverty or financial system access. Kenya has one of the highest account-ownership rates in the world, close to nine adults in ten, and mobile money runs nearly all of it. Google knows that: in Kenya it will &lt;a href=&quot;https://support.google.com/googleplay/answer/2651410?co=GENIE.CountryCode%3DKE&amp;amp;hl=en&quot;&gt;take a mobile wallet&lt;/a&gt; when you're buying an app. They just won't accept it when a developer is paying their registration fee.&lt;/p&gt;
&lt;p&gt;So for Kenya and half the world, a developer's software can't be sent or installed normally now. And Androids are the only phones most people there can afford.&lt;/p&gt;
&lt;h3&gt;No ID&lt;/h3&gt;
&lt;p&gt;The World Bank counts &lt;a href=&quot;https://blogs.worldbank.org/en/digital-development/850-million-people-globally-dont-have-id-why-matters-and-what-we-can-do-about&quot;&gt;about 850 million people&lt;/a&gt; with no ID any government will recognise, concentrated where a cheap Android phone is the only computer anyone owns. In the United States, a &lt;a href=&quot;https://www.brennancenter.org/our-work/analysis-opinion/213-million-american-citizens-voting-age-dont-have-ready-access&quot;&gt;survey&lt;/a&gt; found 20 million citizens of voting age can't readily produce any citizenship document.&lt;/p&gt;
&lt;p&gt;And documents now get stripped away as a political technique. India's National Register of Citizens &lt;a href=&quot;https://www.aljazeera.com/news/2019/8/31/india-excludes-nearly-2-million-people-from-assam-citizen-list&quot;&gt;excluded 1.9 million people&lt;/a&gt; in Assam state alone, with Human Rights Watch &lt;a href=&quot;https://www.hrw.org/report/2020/04/10/shoot-traitors/discrimination-against-muslims-under-indias-new-citizenship-policy&quot;&gt;documenting&lt;/a&gt; that tribunals declared disproportionately more Muslims foreign and struck people off over spelling differences between documents. The Dominican Republic's Constitutional Court &lt;a href=&quot;https://minorityrights.org/statelessness-in-the-dominican-republic/&quot;&gt;retroactively stripped nationality&lt;/a&gt; in 2013 from tens of thousands of people, mostly of Haitian descent, who had held Dominican papers their whole lives. At least a dozen more countries have done this recently, and it's becoming more common.&lt;/p&gt;
&lt;p&gt;If you make a government ID the condition, you've made every one of those decisions yours too.&lt;/p&gt;
&lt;h3&gt;The institutional trick&lt;/h3&gt;
&lt;p&gt;This ID policy on Google Play has created a common workaround. If you can't register as an individual or a company, you find an organisation to do it on your behalf.&lt;/p&gt;
&lt;p&gt;Look up Azmeh on Google Play today. The developer isn't Basel Sader and hasn't been for a decade. It's &lt;a href=&quot;https://burjalluqluq.org/&quot;&gt;Burj Al-Luqluq&lt;/a&gt;, a sports centre for kids in Jerusalem.&lt;/p&gt;
&lt;p&gt;It ran football, basketball and taekwondo, kindergartens, summer camps, art rooms and psychosocial support, for around 6,500 people a year. It's a Palestinian community centre in the Bab Hutta quarter of the Old City of Jerusalem, founded in 1991 on land the neighbourhood fought to keep from a planned settlement, and its buildings have faced demolition orders.&lt;/p&gt;
&lt;p&gt;So the arrangement that keeps a map of Israeli roadblocks installable on Palestinian phones is that a children's community centre, registered with the municipality of the occupying power, signs for it.&lt;/p&gt;
&lt;p&gt;Burj Al-Luqluq has long been a target. In 1989 the land was marked for a settlement, and the families of the Old City set it up as a sports and social club to stop it. In 1998 the first Palestinian Legislative Council met there.&lt;/p&gt;
&lt;p&gt;On 12 February 2026 the national security minister signed an order closing the society's sports, educational and social activities, &lt;a href=&quot;https://www.israelnationalnews.com/news/422613&quot;&gt;on police claims&lt;/a&gt; of funding from organisations linked to terrorism and incitement against the state. Five days later, the day before Ramadan began, police and intelligence agents in civilian clothes walked in, ordered everyone out, and &lt;a href=&quot;https://www.israelnationalnews.com/news/422613&quot;&gt;welded the doors and entrance gates shut&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;The order claims the association operates with funding from the Palestinian Authority. This is completely false and has no basis whatsoever.&amp;quot;&lt;/p&gt;
&lt;p&gt;Montaser Idkedek, the centre's director, &lt;a href=&quot;https://www.aa.com.tr/en/middle-east/israel-orders-closure-of-east-jerusalem-s-burj-al-luqluq-community-center-for-6-months/3832389&quot;&gt;to Anadolu&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Later he told &lt;a href=&quot;https://www.jerusalemstory.com/en/article/first-days-ramadan-jerusalem-bring-sadness-and-joy-palestinians-near-and-far&quot;&gt;Jerusalem Story&lt;/a&gt; that Jerusalem's institutions were all waiting to see what would be done to them next.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;This closure is the start of something bigger and more significant.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Azmeh's author was threatened into silence once already, in 2015, and the app's way back under Google's policy was an institutional host.&lt;/p&gt;
&lt;p&gt;This tells us a lot about Google's policy.&lt;/p&gt;
&lt;p&gt;First, that it pushes risk onto others. An organisation running taekwondo for six thousand children is now the name Google holds, the name that answers a subpoena, and the name a state reads when it wants to know who to pressure about a checkpoint map. An app it probably didn't even make.&lt;/p&gt;
&lt;p&gt;The second thing it tells us is who can do this at all. You need an institution willing to sign, which means the app has to be big enough or known enough to be worth the risk to them.&lt;/p&gt;
&lt;p&gt;The ones that clear that bar are the ones you might have heard of. &lt;a href=&quot;https://ceciliaolliveira.com/en/fogo-cruzado/&quot;&gt;Fogo Cruzado&lt;/a&gt; sends real-time gunfire alerts that reach over 400,000 people across Brazil; it started as a Google Docs spreadsheet kept by a journalist who couldn't find the stray-bullet statistics she needed for a story, and it now has a board and Amnesty behind it. &lt;a href=&quot;https://www.malaymail.com/news/world/2022/11/08/protesters-and-police-deploy-tech-in-fight-for-future-of-iran/38272&quot;&gt;Gershad&lt;/a&gt; crowdsources morality police checkpoints in Iran so a woman can walk a different street; the government blocked it within a day of launch, it spread to &lt;a href=&quot;https://backup.arabnews.com/node/2166371/middle-east&quot;&gt;100,000 people&lt;/a&gt; by sharing the app file anyway, and it has now reclaimed its Play Store listing by a nonprofit outside the country. And we saw Azmeh found a youth centre.&lt;/p&gt;
&lt;p&gt;But these are exceptions. East Jerusalem happens to carry an unusually dense layer of foreign-funded civil society, built up over decades precisely because of the political situation there. Myanmar's Sagaing region has nothing like it. Neither do the border cities of northern Mexico, or the neighbourhoods where those Argentine dollar-rate apps get made, or the island of Madagascar, where that Christian prayer book needs it.&lt;/p&gt;
&lt;p&gt;The third thing this tells us is that the workaround defeats the stated purpose completely. Verification supposedly exists so that Google knows who built and controls an app, but it accepts an organisation that does neither. Cut off that account and the app finds another host. The problem doesn't get stopped. It gets laundered.&lt;/p&gt;
&lt;p&gt;The sorting isn't between honest developers and fraudsters. It's between people who can find a legal name to stand in front of them and people who cannot.  For criminals, legal registration of an anonymous Swiss charity is easy, but here where it means something, the institution is a building that somebody else welded shut.&lt;/p&gt;
&lt;p&gt;And more to the point, the long tail of useful apps made for small communities won't find one, and until now it didn't have to. People could still install directly or use a niche app store.&lt;/p&gt;
&lt;p&gt;When Google Play made a rule about its own shelves, everyone who couldn't live with it used another channel. That was a change to their listing policy.&lt;/p&gt;
&lt;p&gt;Now Google is insisting its rules apply everywhere else. It's a change to what you're allowed to do with a phone you own.&lt;/p&gt;
&lt;h2&gt;What your name costs you&lt;/h2&gt;
&lt;p&gt;In October last year Google removed an app called Red Dot from the Play Store. Red Dot let people report sightings of US immigration agents in their neighbourhood, anonymously, with reports expiring after five hours. The decision was Google's own, not the government's: it told 404 Media it had &lt;a href=&quot;https://www.404media.co/google-calls-ice-agents-a-vulnerable-group-removes-ice-spotting-app-red-dot/&quot;&gt;not been contacted by the Department of Justice&lt;/a&gt;, and that it bans apps with a high risk of abuse and apps sharing the location of a vulnerable group. The vulnerable group they were talking about  was ICE agents.&lt;/p&gt;
&lt;p&gt;Google decides who is dangerous, too. Waze is Google's traffic app, and it assumes Palestinians are Israelis. The moment they cross back home it starts warning them they are entering a dangerous area, so the drivers &lt;a href=&quot;https://restofworld.org/2025/palestinians-digital-maps-west-bank-israel/&quot;&gt;use WhatsApp groups instead&lt;/a&gt;. In Rakan Said's own neighbourhood, Google calls him a hazard.&lt;/p&gt;
&lt;p&gt;Red Dot found a way to stay running. If you go to &lt;a href=&quot;https://iceradar.app/&quot;&gt;its website&lt;/a&gt; it tells Android users to download the APK and install it themselves, because that's the only channel left. From next year, that channel closes. The party deciding whether Red Dot's developer may register is the same party that already decided the app shouldn't exist. Google.&lt;/p&gt;
&lt;p&gt;ICEBlock is the iPhone version of the same idea. Its developer put his own name to his app. He was threatened with federal prosecution, the Attorney General named the app from a podium, and it was gone from Apple's App Store the same week. He is &lt;a href=&quot;https://www.axios.com/2025/12/08/iceblock-lawsuit-trump-apple-ban&quot;&gt;suing&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;That's what happens in a country with courts, an appeals process and a still-functioning press.&lt;/p&gt;
&lt;p&gt;Elsewhere the sequence is shorter. &lt;a href=&quot;https://www.addameer.ps/statistics/2026/08&quot;&gt;3,198 Palestinians&lt;/a&gt; are currently held under administrative detention: no charge, no trial, six-month orders renewed indefinitely, on evidence the detainee's own lawyer never sees, and with the renewal often delivered &lt;a href=&quot;https://www.addameer.ps/media/4898&quot;&gt;on the day they thought they would be released&lt;/a&gt;. The &lt;a href=&quot;https://www.ohchr.org/sites/default/files/documents/countries/opt/20240731-Thematic-report-Detention-context-Gaza-hostilities.pdf&quot;&gt;UN report&lt;/a&gt; shows how commonly relatives are detained to force a wanted person to come in. In Iran it means the Revolutionary Guard's intelligence organisation, which detains people over social media accounts and &lt;a href=&quot;https://iranhumanrights.org/2026/03/at-least-1500-arrested-in-iran-as-state-intensifies-domestic-crackdown/&quot;&gt;threatens relatives inside the country to silence people outside it&lt;/a&gt;. In Myanmar, since the cybersecurity law took effect last July, soldiers run &lt;a href=&quot;https://www.irrawaddy.com/news/burma/myanmar-junta-launches-street-phone-checks-as-cybersecurity-law-takes-effect.html&quot;&gt;street phone checks&lt;/a&gt; for VPNs and social apps. In Kashmir, they do that too, and &lt;a href=&quot;https://scroll.in/article/954711/in-kashmir-a-spree-of-arrests-for-alleged-misuse-of-social-media-and-vpns&quot;&gt;administering a WhatsApp group&lt;/a&gt; has been charged under a law carrying seven years.&lt;/p&gt;
&lt;p&gt;The sequence from &amp;quot;register&amp;quot; to &amp;quot;target list&amp;quot; is well documented. In December 2016 Iran ordered every Telegram channel administrator with more than 5,000 members to register with the Ministry of Culture. Over 700 complied. Three months later &lt;a href=&quot;https://iranhumanrights.org/2017/03/12-reformist-telegram-channel-admins-arrested/&quot;&gt;twelve of them were arrested&lt;/a&gt; and their channels deleted.&lt;/p&gt;
&lt;p&gt;Turkey prosecuted people for terrorism because they had a specific messaging app on their phone: &lt;a href=&quot;https://en.wikipedia.org/wiki/ByLock_(application)&quot;&gt;ByLock&lt;/a&gt;. After the failed coup in 2016, Turkish intelligence declared &lt;a href=&quot;https://www.sapiens.org/culture/bylcok-turkey-terrorism-evidence/&quot;&gt;all of its users members of a terrorist organisation&lt;/a&gt;: the interior ministry &lt;a href=&quot;https://nordicmonitor.com/2021/10/turkey-ratcheted-up-prosecution-of-critics-over-smart-phone-encrypted-messaging-app/&quot;&gt;charged 95,310 just for installing a chat app&lt;/a&gt;. Its own intelligence report, the one the courts used, said a third of them had never sent a single message with it, and &lt;a href=&quot;https://www.bostonreview.net/articles/umar-farooq-bylock/&quot;&gt;11,480 on the list hadn't even installed ByLock&lt;/a&gt;, but had been added by a misreading of the ISP logs that in fact proved they didn't use ByLock. Their read of the ISP logs picked up more than 10 other unrelated apps, like &lt;a href=&quot;https://www.bostonreview.net/articles/umar-farooq-bylock/&quot;&gt;some music apps, dictionaries, a used car listing&lt;/a&gt; and &lt;a href=&quot;https://tuncaybesikci.com/the-verge-how-a-secretive-unknown-smartphone-app-became-the-center-of-turkeys-post-coup-crackdown/&quot;&gt;a Muslim prayer times app&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Charges against those 11,480 were eventually dropped, but not before they were jailed. Mustafa Yaman spent six months in prison and missed his son's wedding and the birth of his first grandchild. A primary school teacher who would give &lt;a href=&quot;https://www.middleeasteye.net/news/turkeys-other-coup-victims-innocents-thrown-filthy-jails-using-app&quot;&gt;Middle East Eye&lt;/a&gt; only the name Ahmet spent eighty-seven days in one, for a call-to-prayer app he had installed during his military service because his posting was too remote to hear it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;But I will never forgive the government for what it did to me. I had absolutely nothing to do with FETO and they destroyed my life.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The prosecutions continue today.&lt;/p&gt;
&lt;p&gt;Once a list of names attached to an app exists, hostile governments gain access, and being on it becomes all the evidence they need.&lt;/p&gt;
&lt;p&gt;And when you live in places where organised crime is effectively the government, the people who can legally require Google to send a developer's name and address are the same people the app was built to keep you away from.&lt;/p&gt;
&lt;p&gt;Mexico's Secretary of Public Security, the man who ran the federal police, was &lt;a href=&quot;https://www.justice.gov/usao-edny/pr/ex-mexican-secretary-public-security-genaro-garcia-luna-sentenced-over-38-years&quot;&gt;convicted in a New York court&lt;/a&gt; of taking millions from the Sinaloa cartel. The former president of Honduras was sentenced to &lt;a href=&quot;https://www.justice.gov/usao-sdny/pr/juan-orlando-hernandez-former-president-honduras-sentenced-45-years-prison-conspiring&quot;&gt;forty-five years&lt;/a&gt; for protecting cocaine shipments while running the country. He recently got a US presidential pardon and was freed to go home.  Nobody has tried the ones who weren't extradited, and they still hold their police commands and their ministries.&lt;/p&gt;
&lt;p&gt;Google's list already exists, and you can see what's on it. Open &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.alsha3b.azmeh&quot;&gt;Azmeh's page on Google Play&lt;/a&gt;, click through to &amp;quot;App support&amp;quot; and look down to &amp;quot;About the developer&amp;quot;, and there is a person's name, an email address and a street address in Jerusalem. Google requires a developer to publish them.&lt;/p&gt;
&lt;p&gt;When it's ICE agents, their location is protected because they are a &amp;quot;vulnerable group&amp;quot;. When it's an anonymous app developer helping people in a military occupation, then their name and physical address are public information.&lt;/p&gt;
&lt;h3&gt;Should developers be expected to trust Google?&lt;/h3&gt;
&lt;p&gt;That was the Play Store.  Google says this registry will be private. But private to who? When it comes to working with governments, Google's track record is worrying.&lt;/p&gt;
&lt;p&gt;On the day of Russia's parliamentary elections, it &lt;a href=&quot;https://www.nbcnews.com/tech/tech-news/google-apple-remove-russian-opposition-app-ahead-election-rcna2065&quot;&gt;removed Alexei Navalny's tactical voting app&lt;/a&gt;. It spent two years building &lt;a href=&quot;https://theintercept.com/2018/08/01/google-china-search-engine-censorship/&quot;&gt;Dragonfly&lt;/a&gt;, a search engine for China that blacklisted terms about human rights and peaceful protest, and abandoned it only after its own staff revolted.&lt;/p&gt;
&lt;p&gt;Mostly, though, according to Google's &lt;a href=&quot;https://support.google.com/transparencyreport/answer/7347744?hl=en&quot;&gt;transparency report&lt;/a&gt;, it just answers lawful orders, and it is set up to do that at scale.&lt;/p&gt;
&lt;p&gt;The term &amp;quot;lawful&amp;quot; used here is misleading. Being lawful is not the same as being required by law. Administrative detention without charge is lawful in the West Bank. The Ministry of Culture's register was lawful in Iran. Turkey's prosecutions of ByLock users as terrorists went through its courts. Google says so itself: many of the court orders it receives do not require it to act at all, and it weighs each request and decides for itself, lawful or not.&lt;/p&gt;
&lt;p&gt;The report sorts the government requests it receives into ten kinds of requester. Police is one. Military is another. So are suppression orders, which Google describes as court orders that &amp;quot;prohibit any discussion of the order&amp;quot;, sometimes including the fact that it exists.&lt;/p&gt;
&lt;p&gt;Through all this, developers are now being required to trust that Google won't hand over their identity.  And we've seen how they decide.&lt;/p&gt;
&lt;p&gt;So Google forces a choice. Hand over your name and accept if Google shares it, or let Google choke the app you made that people depend on.&lt;/p&gt;
&lt;h3&gt;The ones that are already disappearing&lt;/h3&gt;
&lt;p&gt;We can see the trend.&lt;/p&gt;
&lt;p&gt;Way Way Nay has nowhere to go. Its creator talks to journalists only on condition of anonymity, in a country whose military the United States has formally &lt;a href=&quot;https://2021-2025.state.gov/burma-genocide/&quot;&gt;determined&lt;/a&gt; committed genocide. Registering means putting a legal name and a home address into a system that answers lawful orders at scale.&lt;/p&gt;
&lt;p&gt;Briar and ProofMode publish on Play, on F-Droid and as a plain APK, and they do it deliberately. Tools for journalists get shut off one channel at a time, so the answer is never to depend on only one. Verification puts a single, blockable check on all three.&lt;/p&gt;
&lt;p&gt;whoBIRD, LavSeeker, hEARtest and AmSprung never got onto Play at all. Kiwix is broken by Play. Shelter and Island, which box an untrusted app off from the rest of your phone, Google removed outright, and there is a longer list for anyone who goes looking. Google cut off Red Dot in October last year. And v2rayNG came off in June 2025 for who made it: sixty thousand stars, no policy violation, no malware. Just a developer who probably couldn't give their name because of where they lived.&lt;/p&gt;
&lt;h2&gt;Does it actually help the fraud victim?&lt;/h2&gt;
&lt;p&gt;The reason Google gives for doing all this is to stop fraud: a grandmother somewhere, talked into installing something that empties her bank account. That happens. And when its with apps, it basically comes down to two ways.&lt;/p&gt;
&lt;h3&gt;The Dropper&lt;/h3&gt;
&lt;p&gt;Publish a simple, normal app to the Play Store and leave it there for months. A pink rabbit-themed calculator, a PDF reader. The app works, it gets reviewed, it gets good ratings, thousands of people install it. Then push a clean update that doesn't show up in scans, and later flip a switch on your own server, and the app fetches the code that does the stealing.&lt;/p&gt;
&lt;p&gt;The whole scam is based on app store reputation. The store isn't the thing that stops it. The store is the thing that makes it work.&lt;/p&gt;
&lt;p&gt;Play has &lt;a href=&quot;https://android-developers.googleblog.com/2023/07/boosting-trust-and-transparency-in-google-play.html&quot;&gt;required identity verification&lt;/a&gt; since 2023: government ID for an individual, or a D-U-N-S number for an organisation, with the legal name and address printed on the listing.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.threatfabric.com/blogs/android-droppers-the-silent-gatekeepers-of-malware&quot;&gt;The Dropper&lt;/a&gt; recipe survives all of it intact. &lt;a href=&quot;https://www.threatfabric.com/blogs/anatsa-targets-north-america-uses-proven-mobile-campaign-process&quot;&gt;One dropper reached the top three of the US Play Store's free tools chart last year&lt;/a&gt;, with over 50,000 downloads, before the malicious update arrived six weeks after release. Kaspersky &lt;a href=&quot;https://securelist.com/malware-report-q2-2026-mobile-statistics/120948/&quot;&gt;found more of them on Play three months ago&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;The Call&lt;/h3&gt;
&lt;p&gt;The other type of app fraud doesn't depend on app-store reputation.&lt;/p&gt;
&lt;p&gt;Here's how it runs in Bangkok. Grandma gets a text message on LINE, then a phone call from somebody claiming to be the police, or the electricity company, or a parcel service.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;There's a problem with your account.&amp;quot;
&amp;quot;A delivery you didn't order.&amp;quot;
&amp;quot;A money-laundering case with your name on it.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;He is patient, he is helpful, and he stays on the line while he talks her through downloading a file and installing it. Once it's on the phone it asks for the accessibility service, allowing it to see the screen, read the codes and move the money while she's still saying thank you.&lt;/p&gt;
&lt;p&gt;A purpose-built malicious app like this would be caught inside an app store with their automated checks. What does the work is a person on the phone, building trust and talking the victim through each step.&lt;/p&gt;
&lt;p&gt;We'll call this one The Call, because the software is the smallest part of it.&lt;/p&gt;
&lt;p&gt;Singapore's cyber security agency collaborated with Google on this a few years ago.  It calls the category &lt;a href=&quot;https://www.csa.gov.sg/news-events/press-releases/google-partners-with-the-cyber-security-agency-of-singapore-to-pilot-a-new-enhanced-security-feature-to-better-protect-android-mobile-users-from-scams/&quot;&gt;malware-enabled scams&lt;/a&gt;. The police there count where the money actually moves. In &lt;a href=&quot;https://www.police.gov.sg/Media-Hub/Police-Life/2026/02/Scams-and-Cybercrime-Fell-by-Almost-a-Quarter-in-2025&quot;&gt;80 percent of reported scam cases&lt;/a&gt;, victims made the transfers themselves. They didn't even need a malicious app. The scammers never took control of the account at all.&lt;/p&gt;
&lt;p&gt;Their report explains it like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In most of these cases, the scammers didn’t gain direct control of the victims’ accounts, but manipulated victims into performing the monetary transactions by means of deception and social engineering.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Developer identity verification doesn't touch the Call, because the man on the phone directs the victim's own hands. It doesn't stop Droppers either. Google Play tried identity verification on its app store already, and it fails at the type of fraud they say they're stopping. That's the same check Google is now extending to every app on every phone, citing fraud prevention again.&lt;/p&gt;
&lt;h2&gt;Fake IDs&lt;/h2&gt;
&lt;p&gt;Let's be honest. Anyone who has ever watched a teenager buy beer at the corner store knows exactly how effective asking for ID is.&lt;/p&gt;
&lt;p&gt;But there's a deeper reason collecting ID doesn't work: a register only bites if identity is scarce, and it isn't. The US Department of Justice &lt;a href=&quot;https://www.justice.gov/opa/pr/scam-center-strike-force-takes-major-actions-against-southeast-asian-scam-centers-targeting&quot;&gt;describes syndicates&lt;/a&gt; luring workers to Thailand with offers of well-paid technical work, seizing their identification documents, and trafficking them into scam compounds. Thailand's own Technology Crime Investigation Bureau recorded mule-account arrests rising to &lt;a href=&quot;https://hardstories.org/stories/rights-suppression/they-were-trafficked-for-their-bank-accounts-and-their-faces&quot;&gt;more than six thousand&lt;/a&gt; last year, and one anti-trafficking group has documented at least 961 cases of Thais taken to Cambodia and made to surrender passport, SIM and a facial scan. The UN's IOM &lt;a href=&quot;https://www.iom.int/explainer/key-facts-human-trafficking-online-scam-operations&quot;&gt;found 300,000 people trafficked into scam compounds in South East Asia&lt;/a&gt;.  They get the ID documents along with the captured human.&lt;/p&gt;
&lt;p&gt;Google says carding every app developer will slow down the criminals. On the other hand, criminal operations that traffic thousands of humans between countries won't have trouble getting as many ID cards as they need.&lt;/p&gt;
&lt;h2&gt;Google's answers&lt;/h2&gt;
&lt;p&gt;In April, a developer went to register his app and found that somebody else had already &lt;a href=&quot;https://infosec.exchange/@muntashir/116372607911622394&quot;&gt;registered it&lt;/a&gt;. Google's registry, built to establish who owns an app, had let an impersonator claim his first. He also hit another problem: the right to an app's name goes to whichever existing key holds the most installs. That wasn't him. On F-Droid, that key is F-Droid's. On Play, it's usually Google. This is exactly what F-Droid had warned.&lt;/p&gt;
&lt;p&gt;But days later, Google had fixed it. The developer could claim his app and register it.&lt;/p&gt;
&lt;p&gt;That's how fast Google moves when it means getting more apps registered.&lt;/p&gt;
&lt;p&gt;The EFF &lt;a href=&quot;https://www.eff.org/deeplinks/2025/11/application-gatekeeping-ever-expanding-pathway-internet-censorship&quot;&gt;warned Google&lt;/a&gt; that people building Android apps to report ICE misdeeds shouldn't have to worry that Google will hand their personal information to the Department of Homeland Security. Brave &lt;a href=&quot;https://brave.com/blog/keep-android-open/&quot;&gt;explained&lt;/a&gt; that developers of privacy browsers, encrypted messengers, VPNs and tools for journalists in hostile environments would have to upload government ID to a company they have no reason to trust, and that many would simply stop. A coalition of more than seventy organisations put their names to an &lt;a href=&quot;https://keepandroidopen.org/open-letter/&quot;&gt;open letter&lt;/a&gt; making the same case.&lt;/p&gt;
&lt;p&gt;Google answered them differently. And eventually.&lt;/p&gt;
&lt;p&gt;First, for hobbyists and students who can't afford the twenty-five dollars, they created the &lt;a href=&quot;https://developer.android.com/developer-verification/guides/limited-distribution&quot;&gt;limited distribution account&lt;/a&gt; with no fee and, Google says, no government ID required. What it does require is a Google payments profile holding your legal name and address. And then the app goes on twenty phones. But that's not twenty people who can just grab your app and install it: each one has to authorise your app itself, through what Google calls &amp;quot;a secure handshake process involving QR codes or links,&amp;quot; one phone at a time. That is really a testing allowance, not a distribution channel.&lt;/p&gt;
&lt;p&gt;AndroidAPS has already &lt;a href=&quot;https://androidaps.readthedocs.io/en/latest/SettingUpAaps/AndroidDeveloperVerification.html&quot;&gt;written a help page for this&lt;/a&gt;, because according to Google, it's actually worse than the 20 users they imply. Each type 1 diabetic running it is the developer of their own build. Each now has to register with Google as a developer themselves, or learn ADB,  to keep their insulin pump talking to their glucose monitor. That's how they keep themselves alive through the night.&lt;/p&gt;
&lt;p&gt;Second, Google added an &amp;quot;advanced flow&amp;quot; so they could say phone owners may still install software of their choice.&lt;/p&gt;
&lt;p&gt;In reality it's a confusing maze, designed as a deterrent. The steps: enable developer mode, which means finding a specific unlabelled option deep in your settings and tapping it seven times. (Noting it also puts your phone in an insecure state.) Confirm that nobody is coaching you. Restart the phone. Wait twenty-four hours. Reauthenticate. Then tap through another warning. Or, you know, just install some Android developer tools, learn them, then keep updating apps over a USB cable like it's 2002.&lt;/p&gt;
&lt;p&gt;Google calls this the path for power users. Everybody who installs an app directly now has to take it. That is every v2rayNG user in China, Turkey and Turkmenistan. Everybody in the United States downloading Red Dot's APK from its website, the only channel Google left it. A teacher in Jammu, a cook in Shanghai, and every Anglican in Madagascar who wants a Christian prayer book in their own language. These are not power users. They are not technical. But now, this is what they need to do to install the same app.&lt;/p&gt;
&lt;p&gt;And grandma?  The scam was always about gaining trust and patiently talking her through steps on a phone. More steps are the only thing that's been added. The man calling her has the time and the motivation. He is probably trapped in a scam compound in Cambodia, in a room with no windows and fluorescent lights. If he can already guide grandma to download an APK, enable unknown sources and install it, he can handle developer mode and a call back tomorrow.&lt;/p&gt;
&lt;p&gt;In the end, Grandma is the reason Google gives for all this, and she's the one it doesn't save.&lt;/p&gt;
&lt;h2&gt;What Google learned from the police&lt;/h2&gt;
&lt;p&gt;Here's what gets me. Google already knows this. They've already fixed it too. Not in theory. They built the solution and ran it across Singapore, &lt;a href=&quot;https://www.csa.gov.sg/news-events/press-releases/google-partners-with-the-cyber-security-agency-of-singapore-to-pilot-a-new-enhanced-security-feature-to-better-protect-android-mobile-users-from-scams/&quot;&gt;with the same Singapore police&lt;/a&gt;, back in 2024.&lt;/p&gt;
&lt;p&gt;They looked at it technically: exactly which privileges do scam apps actually need? Reading your texts (&lt;code&gt;READ_SMS&lt;/code&gt;, &lt;code&gt;RECEIVE_SMS&lt;/code&gt;). Killing your notifications (&lt;code&gt;NOTIFICATION_LISTENER&lt;/code&gt;). Taking over your screen (&lt;code&gt;ACCESSIBILITY&lt;/code&gt;). So they blocked those four, specifically.&lt;/p&gt;
&lt;p&gt;They didn't block all direct installing. Only apps that flicked those four switches.&lt;/p&gt;
&lt;p&gt;Once the phones started checking for that combination, &lt;a href=&quot;https://blog.google/intl/en-in/products/launching-enhanced-fraud-protection-pilot-in-india/&quot;&gt;900,000 installs got stopped&lt;/a&gt; in six months in Singapore alone.&lt;/p&gt;
&lt;p&gt;None of those criminals were asked to please send their ID before committing their crime. It stopped The Call because the man on the phone had nothing to say. There was no button grandma could press for him.&lt;/p&gt;
&lt;p&gt;Google &lt;a href=&quot;https://techcrunch.com/2024/10/03/google-pilots-blocking-some-sideloaded-apps-in-india&quot;&gt;rolled it out to India&lt;/a&gt; and it showed the same, at thousand times the scale.  India logged &lt;a href=&quot;https://theprint.in/india/cybercrime-saw-24-spike-in-2025-indians-lost-rs-22495-crore-mainly-in-investment-scams/2859930/&quot;&gt;2.8 million cyber-fraud complaints last year&lt;/a&gt; (reported there as 28.15 lakh), and a standard playbook never sends a malicious app at all.&lt;/p&gt;
&lt;p&gt;It's a lot like the Singapore police explained.  Scammers posing as Paytm support talk the victim into installing a legitimate remote-support app, like &lt;a href=&quot;https://cyber.delhipolice.gov.in/Appkyc.html&quot;&gt;QuickSupport or AnyDesk&lt;/a&gt;. They use the access she grants them herself to move the money and read the codes as they arrive.&lt;/p&gt;
&lt;p&gt;Take that in. The scammers don't even need their own app.&lt;/p&gt;
&lt;p&gt;Every app they use already has verified developers, legal names, registered companies, everything Google is now demanding outside of the app store.&lt;/p&gt;
&lt;p&gt;If it doesn't stop them in the app store, it won't stop them outside it.&lt;/p&gt;
&lt;h2&gt;You can block just the bad apps&lt;/h2&gt;
&lt;p&gt;The Singapore pilot was a police collaboration. So the direct installs Google saw were the ones turning up in fraud cases. &lt;a href=&quot;https://security.googleblog.com/2024/02/piloting-new-ways-to-protect-Android-users-from%20financial-fraud.html&quot;&gt;Over 95 percent of the malware abusing those permissions arrived that way&lt;/a&gt;, which is a fact about malware. Google read it as a fact about direct installing. When you're counting fraud investigations, everybody is a criminal. So their model of a developer is that they always have something to hide.&lt;/p&gt;
&lt;p&gt;What the pilot showed Google was actually something else: that it's those four system privileges that should make an app suspect, not that it was directly installed. Most regular apps, including the life-saving ones, never touch those privilege switches.&lt;/p&gt;
&lt;p&gt;Some do: a seizure detector that has to wake a carer, a messenger built for the moment the network goes down. To block the scammers but not the good apps, there's something better to look at: app file history.&lt;/p&gt;
&lt;p&gt;Files can have global histories, known to the whole world, using something called an append-only log. It's basically a published list that can only be added to, never quietly edited, with cryptographic cross-checking so anybody can verify nobody has rewritten it. If phones can check a log of how apps were built, they know things like: how long has this exact one been public? How many versions have there been? What permissions did each of them ask for?&lt;/p&gt;
&lt;p&gt;Against that, the Call fails. Scam apps are usually built fresh for each victim, so the file is new every time and the lists of known-bad files have never seen it. That is what makes them invisible to a blocklist. It is also what gives them away to an append-only log, because an app built yesterday has no history at all.&lt;/p&gt;
&lt;p&gt;Combine that with a block on those four dangerous app permissions. Google can make it so an app with no public track record doesn't get any of them. Period.&lt;/p&gt;
&lt;p&gt;There's nothing the scammer can tell grandma to do to get them. But &lt;code&gt;uniqx&lt;/code&gt; and Tsiory Rajaonirina both get those capabilities if they need them, because their builds are old, public and unflagged.  The moment an app asks for a dangerous permission it never had before, that takes a new release, and the new release is published to the log. After two years, if a PDF reader starts wanting the accessibility service to read your screen, that gets flagged immediately.&lt;/p&gt;
&lt;p&gt;So there's a better place to put the friction: the 24-hour delay, the anti-coaching question, those should be used when activating a dangerous capability.  Google knew this from the Singapore pilot in 2024.&lt;/p&gt;
&lt;p&gt;Instead, it's decided to bolt all of this complication to anyone who doesn't register on Google Pay, instead of just the app permissions that actually get abused.&lt;/p&gt;
&lt;h3&gt;The hard parts&lt;/h3&gt;
&lt;p&gt;By now, a technical reader will have some good questions about these logs. How do new versions restart the access timers? What about an app that declares dangerous capabilities from day one, the way droppers already do? What about code injected at runtime, which never touches a build? What gets logged, and how do you stop the log being spammed? Should revocations be public, and if Google can issue them quietly, how is that different from Google deciding what gets blocked today?&lt;/p&gt;
&lt;p&gt;These all have good answers, and this isn't the essay for them. They belong to the people who have spent a decade working on exactly this, at a conference run by a company that has already solved the same problem once, for the entire web.&lt;/p&gt;
&lt;p&gt;If you can guess which company this is, you owe me 25 bucks.&lt;/p&gt;
&lt;h3&gt;Who gets to look&lt;/h3&gt;
&lt;p&gt;Google itself built something called Certificate Transparency, a decade ago, covering every website on the internet.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://certificate.transparency.dev/&quot;&gt;Certificate Transparency&lt;/a&gt; started because one certificate company, registered and well documented as it was, had issued false certificates used to break into Gmail accounts in Iran.&lt;/p&gt;
&lt;p&gt;It requires every website certificate to be published to append-only public logs. When your browser visits a new website, it check its certification against the log, so a bad one can't be issued quietly. The logs are cross-checked by different operators so mis-issuance is visible to everyone, and this kind of visibility turned out to be enough: Symantec, then a major issuer of certificates on the internet, was caught issuing them improperly often enough that the browsers stopped trusting it, and it left the business.&lt;/p&gt;
&lt;p&gt;Anyone can check the logs, not just Google. Anyone can run a monitor, and the people with the most to lose do. A company watches the logs for certificates issued in its own name and finds out within hours if somebody else has gained access to one. That's the whole design. Certificate Transparency doesn't ask, or need, anyone to see everything. It goes the other way, making it impossible for anyone to do anything invisibly, and then lets the people with the most to lose do the looking.&lt;/p&gt;
&lt;p&gt;Apply that to Thailand, one of the four countries where this new ID policy starts. Thai banking fraud runs on impersonation, an app wearing a real bank's name and icon. Under a public log the bank could watch for imitations of its own product: its real package names, signing keys and icon files are all in the log, so an app that has just appeared, looks almost exactly like the real one but has no history behind it -- that's something a script can find.&lt;/p&gt;
&lt;p&gt;Google has less reason to chase Thai-language impersonation than the banks themselves, that have to reimburse the victims. The Bank of Thailand and ThaiCERT could watch the whole category, in Thai, in near real time. And that's before the cross-checking that banks, security researchers and NGOs could do across borders to catch international fraud.&lt;/p&gt;
&lt;p&gt;It could do what it does with website security certificates, and let everyone look.&lt;/p&gt;
&lt;h3&gt;And Google made this for itself&lt;/h3&gt;
&lt;p&gt;Here's the last kicker. Once again, Google already built an append-only log system for Android apps.&lt;/p&gt;
&lt;p&gt;In May this year Google shipped &lt;a href=&quot;https://blog.google/security/bringing-binary-transparency-to-the-android-ecosystem/&quot;&gt;binary transparency for Android&lt;/a&gt;. Its own production apps, released after 1 May, now get an entry in a public append-only ledger. Google's framing: a signature is a certificate of origin, binary transparency is a certificate of intent. Google's own words on the design:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It's built so that no party, including Google, can change the software authorised for your device without creating a public record.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is the correct principle, written four months before it shipped the opposite for everybody else.&lt;/p&gt;
&lt;p&gt;For its own software: no single party should decide unaccountably what runs on your phone, not even Google.&lt;/p&gt;
&lt;p&gt;For everybody else's: Google decides, and the price of admission for any app developer is their passport.&lt;/p&gt;
&lt;h3&gt;Everyone else doing this&lt;/h3&gt;
&lt;p&gt;The people building these systems meet at the &lt;a href=&quot;https://transparency.dev/&quot;&gt;transparency.dev&lt;/a&gt; conference, which Google started and hosted at its London office in 2024.&lt;/p&gt;
&lt;p&gt;The same idea is already protecting some of the people this policy endangers, journalists. &lt;a href=&quot;https://freedom.press/tech/news/webcat-a-tamper-evident-seal-for-the-open-web/&quot;&gt;WEBCAT&lt;/a&gt; comes from the Freedom of the Press Foundation, a small nonprofit who make SecureDrop.  That's the system the Washington Post, the Guardian and dozens of other newsrooms use to receive documents from anonymous sources (and one I've learned a lot from on my own projects). Those newsrooms trust a handful of people to protect the identity of a source against a state that wants it. WEBCAT extends the principle to web apps: a browser checks that the code it's about to run is the code the developers signed, before running it, and can see the history of the web app. WEBCAT &lt;a href=&quot;https://www.youtube.com/watch?v=8ZJqV_zog7s&quot;&gt;presented at Google's transparency summit&lt;/a&gt; last year.&lt;/p&gt;
&lt;p&gt;Sigstore, a Google-backed project, is now how &lt;a href=&quot;https://github.blog/security/supply-chain-security/introducing-npm-package-provenance/&quot;&gt;npm&lt;/a&gt; and &lt;a href=&quot;https://blog.pypi.org/posts/2024-11-14-pypi-now-supports-digital-attestations/&quot;&gt;PyPI&lt;/a&gt;, the two largest public collections of reusable code in the world, let a developer prove a release came from where it claims to.&lt;/p&gt;
&lt;p&gt;Sigstore is worth a moment, because it shows the middle ground exists: it ties a signature to an identity, but that identity can be an email address or an account rather than a state document, and that link goes into a public log instead of a private database at Google.&lt;/p&gt;
&lt;p&gt;It works, it's proven, and no ID cards are involved.&lt;/p&gt;
&lt;h2&gt;So why is Google doing this?&lt;/h2&gt;
&lt;p&gt;Google spent six years rebuilding Chrome's extension platform, and the version that arrived can't do what a content blocker needs. &lt;a href=&quot;https://thenextweb.com/news/chrome-manifest-v3-ublock-origin-content-blockers-disabled&quot;&gt;uBlock Origin's forty million users&lt;/a&gt; lost the full version in 2024, and Google cited security. Ad blockers cost Google money. Draw your own conclusion.&lt;/p&gt;
&lt;p&gt;I'm sure people argued against it inside Google and lost, and I'd bet the same fight for binary transparency over developer ID was fought and lost.  Because commercial incentives usually win those fights.&lt;/p&gt;
&lt;p&gt;I don't think this is a conspiracy. It's a company behaving the way companies behave.  Google runs a store and sells advertising, and the Play Store and the &lt;a href=&quot;https://9to5google.com/2026/07/15/google-play-store-third-party-android-app-store-changes-july/&quot;&gt;other licensed stores&lt;/a&gt; are among its biggest money-makers: &lt;a href=&quot;https://www.sec.gov/Archives/edgar/data/1652044/000165204426000012/googexhibit991q42025.htm&quot;&gt;Google Services makes almost $350 billion per year&lt;/a&gt;. When it has a distribution layer, it consolidates that control in ways that protect its revenue and reduce its legal exposure. Each of those decisions, once made public, comes wrapped in the language of user safety.&lt;/p&gt;
&lt;p&gt;App stores are businesses. Governments offer access to their markets.&lt;/p&gt;
&lt;p&gt;What's different now is that to squeeze more control out of a platform, Google has to put people's lives at risk. And this time, it can't pretend a government is forcing it.&lt;/p&gt;
&lt;p&gt;Google has better options. It has the people who pushed Certificate Transparency into the browser, the people who shipped Binary Transparency for Android in May, and the people who host the conference on this entire class of technologies.&lt;/p&gt;
&lt;p&gt;Larry Page and Sergey Brin wrote this in &lt;a href=&quot;https://www.sec.gov/Archives/edgar/data/1288776/000119312504142742/ds1a.htm#toc59330_1&quot;&gt;their founding letter&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Google users trust our systems to help them with important decisions: medical, financial and many others. Our search results are the best we know how to produce. They are unbiased and objective... We believe it is important for everyone to have access to the best information and research, not only to the information people pay for you to see.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That describes responsibility.&lt;/p&gt;
&lt;p&gt;Billions of people later chose Android, and paid for the hardware themselves, at a price that is months of their income. Note the phrase above: &amp;quot;not only to the information people pay for you to see.&amp;quot; Now, by blocking apps they don't control, they are blocking that information.&lt;/p&gt;
&lt;p&gt;Google had a human rights program with oversight running up to Alphabet's board, the board the founders still sit on. In 2020 the board wrote civil and human rights explicitly into that committee's charter. In October 2025 it &lt;a href=&quot;https://www.sec.gov/Archives/edgar/data/1652044/000121465926005268/o429268px14a6g.htm&quot;&gt;took it out&lt;/a&gt;, and told shareholders that leaving it out lets its committees be &amp;quot;nimble and flexible&amp;quot;. Though almost a year later, &lt;a href=&quot;https://about.google/company-info/human-rights/&quot;&gt;Google's public page&lt;/a&gt; still says that Human Rights Program exists.&lt;/p&gt;
&lt;p&gt;There is still something left from this in Google's Code Of Conduct, a phrase as a final note: &lt;a href=&quot;https://en.wikipedia.org/wiki/Don%27t_be_evil&quot;&gt;&amp;quot;...don't be evil, and if you see something that you think isn't right – speak up!&amp;quot;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;The apps we'll never see&lt;/h3&gt;
&lt;p&gt;Azmeh's last update went out in July 2025. It was a big update, improving a bunch of screens and adding a much-requested comments feature. Three weeks later the app opened to a blank page. No checkpoints listed. Fourteen months later, it still hasn't been fixed, and they never shared an explanation. They just disappeared.  The Play listing still carries a person's name and a street address in Jerusalem.&lt;/p&gt;
&lt;p&gt;Every app you read about here was someone writing software for a problem they were standing in themselves. Costik was a supermarket engineer whose son had diabetes. Azmeh's author was a twenty-year-old law student in a city full of checkpoints. Those girls in a Mumbai slum built a system so more people could have water. Most software like this has hundreds, maybe thousands of users, but it's most needed where nobody is counting. Usually, where nobody can count them.&lt;/p&gt;
&lt;p&gt;The cost is that half the world loses the ability to make these apps for each other. Not just the ones they've made, the ones they will make. They have no payment method Google will take, or no ID card, or a good reason not to trust Google with it.&lt;/p&gt;
&lt;p&gt;They will have no reason to write software, because the only devices everyone in their community owns won't accept what they make.&lt;/p&gt;
&lt;p&gt;When their apps go dark, like Azmeh, they won't make the news.  If they disappear, nobody will count them, but we can count them now. This cuts off billions of people. That's billions with a B, no matter how you spell &lt;a href=&quot;https://en.wikipedia.org/wiki/Googol&quot;&gt;googol&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We can't know how many lives will end at closed checkpoint gates, armed raids, cartel firefights, or for that matter, late-night insulin emergencies. But consider this: Azmeh, Doroob (a similar map app), Gershad, Way Way Nay and Fogo Cruzado are all apps people use to make life-and-death decisions.  That's five apps, and they've helped close to a million people between them. We can't see all the other ones, but it's reasonable to think they protect many, many millions more.&lt;/p&gt;
&lt;p&gt;Rakan Said is still stuck in a line at a gate somewhere in the West Bank, unable to see whether it is open.&lt;/p&gt;
&lt;p&gt;But who knows? &lt;code&gt;uniqx&lt;/code&gt; might send their passport, change app stores, and the Vienna tram app keeps working.&lt;/p&gt;
&lt;p&gt;Then Google can tell themselves everything is fine.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Your browser has fully verified this page, except for the page itself</title>
    <link>https://voboda.com/blog/webpage-hijacks/</link>
    <guid isPermaLink="true">https://voboda.com/blog/webpage-hijacks/</guid>
    <pubDate>Sun, 14 Jun 2026 12:49:00 GMT</pubDate>
    <description>&lt;p&gt;You come home and the kitchen isn't right.&lt;/p&gt;
&lt;p&gt;Cleaner, maybe? Your mug sits exactly where you left it, but the light through the window is off. You stand there holding the cup, turning slowly. Everything is where it should be and yet none of it is yours. You take a sip, trying to figure out what isn't right, and realise you don't know what you're drinking.&lt;/p&gt;
&lt;p&gt;It's warm, but &lt;em&gt;it isn't tea.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is how a domain hijack works. Right door. Identical furniture. But not your place.&lt;/p&gt;
&lt;p&gt;On your screen it works a little more quietly. You type your bank's address, or click the bookmark you've used for years. The page loads. The padlock is there. The logo, the layout, the wobble on the login button: all perfect, because they copied all of it. But when you type your password in, you've just given it to a hacker.&lt;/p&gt;
&lt;p&gt;For a bank, that kind of breach is bad but survivable; the real ledger is still on their servers, and they can hand your money back. For local-first and p2p apps it's an unrecoverable disaster. The whole point of what a lot of us are building is to push keys and data all the way down to the user, so the company can't betray you. Remove the company that could betray you and you also remove the one that could save you. A hijack here doesn't leak a session. It takes the keys, all the data, and there's no one who can make it right.&lt;/p&gt;
&lt;p&gt;There's a technical problem underneath it: you can do every piece of web security correctly (valid certificate, perfect TLS, integrity-checked scripts) and none of it matters, because we don't control the domain registrar. The attacker tricks the registrar, changes the domain name to point to their server, and bypasses all the security.&lt;/p&gt;
&lt;p&gt;It's strange. All security checks in your browser but none of them check: is this the right server, or just one that answers to the name?&lt;/p&gt;
&lt;p&gt;A domain hijack is just one way in. A compromised build pipeline, a poisoned dependency, a CDN serving something extra, an insider pushing one commit. They all end the same way, with code running in your browser that the developers never wrote. Which is strange, because your browser is perfectly capable of refusing that. Extension code is hash-verified before it runs. So is a mobile app.&lt;/p&gt;
&lt;p&gt;But the page sitting right next to the extension, in the same browser, gets no such check?&lt;/p&gt;
&lt;p&gt;Suspicious.&lt;/p&gt;
&lt;h2&gt;The blind spot&lt;/h2&gt;
&lt;p&gt;The closest thing we have is &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Security/Defenses/Subresource_Integrity&quot;&gt;Subresource Integrity (SRI)&lt;/a&gt;. The page lists a hash for every script, stylesheet, and image it pulls in; the browser checks each fetch and refuses anything that doesn't match. A compromised CDN delivers tampered JavaScript, the hash fails, the code never runs.&lt;/p&gt;
&lt;p&gt;It works. But it verifies every ingredient the page brings in, not the page itself. The kitchen is the root HTML, the document listing all those hashes, and it has no hash check of its own.&lt;/p&gt;
&lt;p&gt;Why not? To answer that you have to ask, where would you put a hash of the page?&lt;/p&gt;
&lt;p&gt;You can't put the hash in the page itself, because it has to go somewhere the attacker can't change. It can't go in DNS either, as we've just seen. A hijacker who can redirect your domain can just swap your real hash for their fake one.&lt;/p&gt;
&lt;p&gt;DNSSEC (the SEC stands for security) is a way to sign DNS records with a cryptographic key, but it has the same problem. Because with DNSSEC the way you check the key is to ask the registrar. Yep, the same registrars that get hijacked.  So if the attacker tricks your domain registar, say by claiming the domain name is there's and emailing a picture of a fake ID (yep, that works), then attacker just signs as you.&lt;/p&gt;
&lt;p&gt;So we need some way to check that the records themselves really come from the people who own the site, that don't depend on the webserver or the DNS records.&lt;/p&gt;
&lt;h2&gt;The boring fix&lt;/h2&gt;
&lt;p&gt;What about this? Do what SRI does, but for the DNSSEC keys that signed the DNS records. Hash them the first time, check against it after. If those keys ever change, someone else is signing.  Get out. Don't open any drawers. Don't drink anything.&lt;/p&gt;
&lt;p&gt;This is Trust On First Use (TOFU), and it's already used everywhere.  SSH, the standard way to log into servers, hands you a host key the first time you connect; after that, a mismatch screams at you. Signal does the same with safety numbers.&lt;/p&gt;
&lt;p&gt;The problem is very few sites use DNSSEC because it was kind of a mess when it started. But we can maybe still use the TOFU idea for DNS records themselves?&lt;/p&gt;
&lt;p&gt;A browser extension can do this in two layers. Pin the DNS records on first sight, check them on every visit after. And use the same records to carry a content hash for the key pages, so the documents that need security get SRI protection down to their root.&lt;/p&gt;
&lt;h2&gt;DNS pinning is possible&lt;/h2&gt;
&lt;p&gt;The hard part is people. DNS records legitimately move all the time: CDNs, CNAME chains, cache TTLs, even DNS resolver disagreement. False positives train people to click through. You see that same old security warning which turned out not to be problem last time, you just click whatever button let's you through next time.&lt;/p&gt;
&lt;p&gt;This is starting to get useful because nothing here requires the website operator to do anything.  A user can just install this kind of checker, and get protection against their bank or whatever other site from being hacked.&lt;/p&gt;
&lt;p&gt;The thing to get right is the pinning policy. Strong enough to work. Lenient enough that it doesn't cry wolf.&lt;/p&gt;
&lt;p&gt;So I've started measuring it. Some domains rotate records every minute as a matter of course. Others haven't changed in years.  Turns out they cluster by what kind of website they are. Global consumer sites behave one way, banks another, messaging services another, and the static hosts that local-first apps deploy to are the most stable of the lot, almost never changing. Pinning policy can be written per cluster rather than per domain, which is what makes the false-positive rate workable.&lt;/p&gt;
&lt;p&gt;You don't flag every change, just the changes that are inconsistent with that type of domain.&lt;/p&gt;
&lt;h2&gt;Transparency logs&lt;/h2&gt;
&lt;p&gt;There's still a gap though. Your first visit, when there's no history to compare against yet. That's where a transparency log comes in. A public, append-only record of what a domain should serve, so you know if anything's changed before you go inside.&lt;/p&gt;
&lt;p&gt;The pattern already runs under every HTTPS connection you make. Your browser trusts a few hundred Certificate Authorities to vouch that a domain is who it says it is. In 2011 a Dutch one, &lt;a href=&quot;https://en.wikipedia.org/wiki/DigiNotar&quot;&gt;DigiNotar&lt;/a&gt;, was broken into and used to issue a fraudulent certificate, which was then used to expose the Google Mail accounts of hundreds of thousands of people in Iran. One compromised ceritificate issue, out of the hundres anywhere, was enough to impersonate anyone. &lt;a href=&quot;https://certificate.transparency.dev/&quot;&gt;Certificate Transparency&lt;/a&gt; was Google's answer: every certificate a CA issues gets published in an append-only log that anyone can audit, so a forged one can't be issued quietly.&lt;/p&gt;
&lt;p&gt;It was a good idea. It went through a standards process, went live, and it caught things.&lt;/p&gt;
&lt;p&gt;Except it made Google the gatekeeper. Anyone can run a log. Cloudflare runs one, Let's Encrypt runs one. But a log is only worth running if Chrome accepts it, and Chrome accepts the logs on a list Google's own programme maintains. The mechanism that was supposed to make that unnecessary, log operators communicating with each other to confirm they're all being shown the same log, never shipped. It had some technical challenges, but really it was bogged down in multi-year standards negotiations, and that let Google just say, &amp;quot;that's fine, we can just control everything, thanks.&amp;quot;&lt;/p&gt;
&lt;h2&gt;I'd been circling this for a while&lt;/h2&gt;
&lt;p&gt;For a year I'd been building zKal: ZK proofs that let people prove things like attendance, eligibility or reputation, without the data ever leaving their device. The EUDI wallet's privacy promises, except actually kept. I've since &lt;a href=&quot;/blog/parking-zkal/&quot;&gt;parked it&lt;/a&gt;, but the cryptography we developed lives on.&lt;/p&gt;
&lt;p&gt;I worked on it with Mircea, a Metamask core dev who also built &lt;a href=&quot;https://veramo.io/&quot;&gt;Veramo&lt;/a&gt;, an open source library that makes identity data portable so people aren't locked to one provider. Two timezones apart, Jitsi call, Excalidraw open, our own shorthand for crypto operations scrawled across the canvas.&lt;/p&gt;
&lt;p&gt;We kept figuring out things that people said were impossible. Full key custody and rotation with no seed phrase. Restoration on a device with no server. Moving data between wallets with no reconfiguration.&lt;/p&gt;
&lt;p&gt;I always needed a concrete use case to design against. I'd run scenarios and permutations, looking for simple designs. Mircea was usually three moves ahead, designing for a gotcha I couldn't see yet.&lt;/p&gt;
&lt;p&gt;He kept steering me back to one thing. I'd hand him a clean, practical answer; he'd point at something and scrunch his forehead. &lt;em&gt;&amp;quot;There! Domain-rooted security again.&amp;quot;&lt;/em&gt; And send me back.&lt;/p&gt;
&lt;p&gt;Sometimes it felt like he was Mr. Miyagi-ing me.&lt;/p&gt;
&lt;p&gt;DNS hijacks felt out of scope. Until Berlin.&lt;/p&gt;
&lt;h2&gt;Berlin&lt;/h2&gt;
&lt;p&gt;I flew in, and we spent the day walking the parks, jumping between topics. I kept circling something that bugged me. Some explorations would dead-end at the same wall: &lt;em&gt;&amp;quot;that's why everyone ships wallets as browser extensions.&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I didn't want to accept it.&lt;/p&gt;
&lt;p&gt;Extensions are clunky, their app stores are sketchy, and it felt like we keep dumping a whole app into a sandbox just because the sandbox was the only thing with verified code. I wanted to know where the actual security boundaries were, between the app, the wallet, the storage, instead of shoving everything behind one wall.&lt;/p&gt;
&lt;p&gt;In your browser, extension code is hash-verified. The actual webpage sitting next to it isn't. Integrity for extensions, integrity for subresources, and nothing for the page that contains them. That suspicion started.&lt;/p&gt;
&lt;p&gt;I was already staring at the answer without seeing it: the verification chain I wanted could be bootstrapped from an extension. One small check, watching the page from its secure extension sandbox. Does this domain, this page, hash to what it should?&lt;/p&gt;
&lt;p&gt;Mircea's eyes lit up. &amp;quot;That's actually a great idea. It's something that should really be built into browsers.&amp;quot;&lt;/p&gt;
&lt;p&gt;I was almost annoyed. I remember thinking: &lt;em&gt;I wish the browser people had already sorted this out, so I could get back to the fun wallet stuff.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Then I went looking&lt;/h2&gt;
&lt;p&gt;So I built it, an extension that pins DNS records, and then worked my way backwards through the technical question I'd skipped.&lt;/p&gt;
&lt;p&gt;But there was a bigger question I couldn't shake. If this should be a native browser feature, how does that even happen?&lt;/p&gt;
&lt;p&gt;I know people on W3C committees. I've watched the sausage get made, and I've read the &lt;a href=&quot;https://fy.blackhats.net.au/blog/2024-04-26-passkeys-a-shattered-dream/&quot;&gt;autopsies&lt;/a&gt; of how standards bodies consistently ruin good proposals, because the big players in the room all have a business model to protect.&lt;/p&gt;
&lt;p&gt;So I looked at Let's Encrypt, &lt;a href=&quot;https://opensource.com/business/16/8/lets-encrypt&quot;&gt;the one org that got past both the standards process and the certificate cartel&lt;/a&gt; and changed what the whole web does by default. They now run their own transparency logs on &lt;a href=&quot;https://sunlight.dev/&quot;&gt;Sunlight&lt;/a&gt;, a deliberately simple CT log design, and &lt;a href=&quot;https://www.sigsum.org/&quot;&gt;Sigsum&lt;/a&gt;, a minimal transparency log built so that trust doesn't accumulate anywhere in particular.&lt;/p&gt;
&lt;p&gt;Then Mircea found WEBCAT. &lt;a href=&quot;https://github.com/freedomofpress/webcat&quot;&gt;WEBCAT&lt;/a&gt; comes from the Freedom of the Press Foundation, and it's further along. A working extension, built on Sigsum, that verifies a site's manifest carries signatures from developers the site owner has named. Their client is the website operator; their users are journalists and whistleblowers, people who will do real work for real safety and who are targeted by people with big budgets. Their enrolment even includes a cooldown before changes take effect, so a stolen domain can't be quietly re-enrolled. It's amazing work, and they'd already found most of the answers I was looking for.&lt;/p&gt;
&lt;p&gt;This led me, ironically, to Google's transparency conference talks, where I discovered WEBCAT was leading the way for a new standard called WAICT.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/waict-wg&quot;&gt;WAICT&lt;/a&gt;, Web Application Integrity, Consistency and Transparency, is a draft specification with Cloudflare and Mozilla in it: hash every file a site serves into a manifest, commit the manifest to a transparency log witnessed by independent parties, have the browser refuse anything that doesn't match. It's a good draft. The problem is we've just established what the big players do to good drafts, so I'm not holding my breath. But Cloudflare &lt;a href=&quot;https://blog.cloudflare.com/improving-the-trustworthiness-of-javascript-on-the-web/&quot;&gt;describe the goal&lt;/a&gt; as app-store-grade security for web applications without a central gatekeeper.  That's a world I'd like to see.&lt;/p&gt;
&lt;p&gt;All these assume the website operator opts in. That's the part I'm wrestling with. It's the right assumption for a newsroom and the wrong one for the bank my mother uses, because it requires the website operator to cooperate and do helpful things. Website developers are not exactly known for being  cooperative, and banks are not known for being helpful.&lt;/p&gt;
&lt;p&gt;Protecting someone who uses sites that will never opt in lets me relax constraints the others can't. I can let domain lookups leak, for instance, since they leak through DNS lookups anyway. (Besides, &lt;a href=&quot;https://coniks.cs.princeton.edu/&quot;&gt;CONIKS&lt;/a&gt; gives us a way to make those lookups private later.) Operator-first and end-user-first: same wall, different sides.&lt;/p&gt;
&lt;h2&gt;So why isn't this solved&lt;/h2&gt;
&lt;p&gt;It has been tried. For over a decade. I watched a lot of it.&lt;/p&gt;
&lt;p&gt;The DNS pinning primitive I'm making has a famous, and crazy, granduncle. HPKP, HTTP Public Key Pinning, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Public-Key-Pins&quot;&gt;shipped in Chrome in 2015&lt;/a&gt;. A site could pin its keys and the browser would refuse anything else.&lt;/p&gt;
&lt;p&gt;Setting it up correctly was hard. You had to pin a backup key you weren't using yet, keep it safe for as long as the policy lasted, and get the rotation windows to line up with certificates that expire on their own schedule. Get any of that wrong and the browser does exactly what you told it to: refuse the site. With nothing you can change from the server, because the server is the thing being refused.&lt;/p&gt;
&lt;p&gt;The protocol itself wasn't well designed, and website operators kept footgunning themselves. They pinned themselves off their own sites. &lt;a href=&quot;https://www.smashingmagazine.com/be-afraid-of-public-key-pinning/&quot;&gt;Smashing Magazine, an advice site for web developers, did it to themselves&lt;/a&gt; with a year-long policy. And HPKP created a new kind of attack, too. If a hacker can get into a web server even briefly, they pin keys the owner doesn't have, and then hold the site to ransom.&lt;/p&gt;
&lt;p&gt;Some people argued for fixing it: better tooling, safer defaults, a way to recover. Chris Palmer's &lt;a href=&quot;https://groups.google.com/a/chromium.org/g/blink-dev/c/he9tr7p3rZ8/m/eNMwKPmUBAAJ&quot;&gt;intent to deprecate&lt;/a&gt; went out in October 2017 instead, and pointed operators at Certificate Transparency, which didn't really solve the same problem but was &lt;a href=&quot;https://developer.chrome.com/blog/chrome-67-deps-rems&quot;&gt;considered safer because you could recover from your own mistakes&lt;/a&gt;. Chrome deprecated HPKP in 2018 and removed it in 2019. Firefox never finished shipping it; Safari and Edge never started.&lt;/p&gt;
&lt;p&gt;Same plot as before. The mechanism that let a site defend itself was removed. What replaced it was Certificate Transparency, enforced by browser policy that Google controls.&lt;/p&gt;
&lt;h2&gt;Browsers are dead, long live the browsers&lt;/h2&gt;
&lt;p&gt;To put anything new in a browser you needed the standards bodies and the big vendors to play along, and by then it was clear enough what that game does to anything threatening their app store or advertising revenue. They don't fix these problems because they sell the app store as the fix.&lt;/p&gt;
&lt;p&gt;So if you wanted to change what a browser checks, you had to build your own browser.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://dat.foundation/&quot;&gt;Dat and Beaker&lt;/a&gt; gave you a peer-to-peer web with a browser you could install and a data model that travelled with you. Elegant, self-contained, still admired. Paul Frazee wrote it, and before that the first Secure Scuttlebutt client. When he stepped back he was &lt;a href=&quot;https://indieweb.org/Beaker_Browser&quot;&gt;clear about where it broke&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;The challenge was that Beaker apps had no backend. If you want to build 100% client-side SPAs, you need something akin to a Firebase: a toolkit of databases, users/identity, and networking. We took a lot of shots at building that, but struggled to create APIs which matched the browser's security and page-based runtime model.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There's domain-rooted security again. Mircea's spiritual ancestor, speaking.&lt;/p&gt;
&lt;p&gt;Paul's the CTO at Bluesky now, where the answer is peer-to-peer structures on a federated network: portability kept, but with servers instead of peer to peer.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ssbc.github.io/ssb-db/&quot;&gt;Scuttlebutt&lt;/a&gt; built a whole social world that worked off-grid. Gossip protocols, cryptographic identities, the works. Rabble ran Planetary on it, then moved to Nostr, and &lt;a href=&quot;https://www.nos.social/blog/pivoting-protocols&quot;&gt;his account of why&lt;/a&gt; is worth reading whole:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;I was never building tools just for solarpunk anarchists.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Which meant building for communities where he wouldn't feel at home. He lists what came out of people hitting the same limits: earthstar, p2panda, moderator, chatternet, nostr, farcaster, and the at_protocol.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://remotestorage.io/&quot;&gt;remoteStorage&lt;/a&gt; tried to prise your data loose from the app that held it, so an app could be swapped without losing the notes you took in it. The pattern was good enough that &lt;a href=&quot;https://solidproject.org/&quot;&gt;Solid&lt;/a&gt; picked up the same thread years later. It had Tim Berners-Lee, Inventor Of The World Wide Web, behind it.  But almost no app adoption.&lt;/p&gt;
&lt;p&gt;And people are still building new browsers. &lt;a href=&quot;https://peersky.p2plabs.xyz/&quot;&gt;Peersky&lt;/a&gt; and a handful of others have some of what I've been describing baked in from the ground up. But &lt;em&gt;decentralization&lt;/em&gt; is not a word that makes a normal person change browsers, and so far every one of them has found the same small, technical, already-convinced audience.&lt;/p&gt;
&lt;p&gt;None of these died of bad cryptography. Some are really well designed and are still running today.&lt;/p&gt;
&lt;p&gt;So there's a different problem.&lt;/p&gt;
&lt;h2&gt;The hubris&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;I love these people, they're a team who can force silicon, lithium, and code to bend political reality. But I cannot stand the compromises we have made in the name of this hubris.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That's Cade Diehm, the same Cade who &lt;a href=&quot;/blog/parking-zkal/&quot;&gt;helped me with zKal&lt;/a&gt;. He was on the team in Hawai'i in January 2015 while Signal was being finished, arguing that phone numbers were the wrong identifier: &lt;a href=&quot;https://newdesigncongress.org/en/pub/who-will-remember-us-when-the-servers-go-dark/&quot;&gt;&lt;em&gt;&amp;quot;This app is going to be used by people escaping intimate violence. Their abusers know their phone numbers. You need to let them in with pseudonyms.&amp;quot;&lt;/em&gt;&lt;/a&gt; He describes Signal's founder, Moxie Marlinspike, rolling the interface back with a shrug, insisting instead that address-book discovery work as smooth as butter. It was the first time he met someone who could &amp;quot;look at the risk and simply not see it&amp;quot;.&lt;/p&gt;
&lt;p&gt;Cade was right, and after a decade it's obvious. Usernames finally arrived in Signal in 2024. Even the people putting real cryptography in ordinary people's hands can miss what their compromises cost, because the people who pay aren't in the room. That's the hubris I'm trying to avoid.&lt;/p&gt;
&lt;h2&gt;Meanwhile, on your phone&lt;/h2&gt;
&lt;p&gt;You stand in your kitchen, mug in hand, and ask yourself if it's really yours. Your kitchen answers you, yes. You're comforted, somehow, even though something in you knows your real kitchen doesn't talk.&lt;/p&gt;
&lt;p&gt;Except this time it's not some website, it's your one itself. And the one who's tricking you isn't a hijacker, it's Google itself. Plot twist!&lt;/p&gt;
&lt;p&gt;And Google is now requiring every Android developer to register with them personally, with government ID and twenty-five dollars, before their apps can install at all. It starts in September, in four countries, through the app stores. By 2027 it covers all apps on certified devices, which is &lt;a href=&quot;https://developer.android.com/developer-verification&quot;&gt;nearly every Android phone on earth&lt;/a&gt;, outside China.&lt;/p&gt;
&lt;p&gt;Same move, third time. Take out the thing that let people check for themselves, then keep the list of who's allowed to be checked. I've stopped being surprised by it, and I don't think that's an improvement.&lt;/p&gt;
&lt;h2&gt;What's actually possible&lt;/h2&gt;
&lt;p&gt;You write an app. You sign it with your own key. You send it to a friend, or put it on a website, and their browser checks it against a public log that nobody owns. The same integrity guarantee an app store gives, but no need for the store.&lt;/p&gt;
&lt;p&gt;Who made it, who has looked at it and what they found, travelling with the app instead of sitting in one company's database. No permission, from anyone.&lt;/p&gt;
&lt;p&gt;The pieces exist. Sunlight and Sigsum are running. WAICT is being drafted by people who ship browsers. WEBCAT has done the most work. They built something that works today. The pinning layer needs nobody at all. That's what I've built, and it runs against domains that have never heard of it.&lt;/p&gt;
&lt;p&gt;What I'm exploring now is the rest: reputation without a five-star rating database, where quiet signals like usage and drop-off tell the real story. Key theft and recovery, where sharding and a delay before a handover takes effect buy the time to catch attackers. And false positives low enough that a warning still makes you stop the tenth time you see it.&lt;/p&gt;
&lt;h2&gt;What are the right questions?&lt;/h2&gt;
&lt;p&gt;Which brings me back to Cade in that Signal mansion. Ten years ago you had to guess which trade-off you could afford. The tech surveillance of today was only on the horizon.&lt;/p&gt;
&lt;p&gt;Whole ecosystems saw it coming though. They wrote the apps, ran the servers, onboarded their friends, and now have ten years of experience seeing what actually worked. Even if it was just for niche communities.&lt;/p&gt;
&lt;p&gt;Those are lessons I want to learn from.&lt;/p&gt;
&lt;p&gt;The big questions I'm left with aren't just technical. They're more like: what is adoption even supposed to look like for something whose whole selling point is that nobody owns it? And what to do about the fact that every institution positioned to help has a reason not to?&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Parking zKal: lessons learned</title>
    <link>https://voboda.com/blog/parking-zkal/</link>
    <guid isPermaLink="true">https://voboda.com/blog/parking-zkal/</guid>
    <pubDate>Tue, 19 May 2026 07:45:00 GMT</pubDate>
    <description>&lt;p&gt;The best place to start is Brewster Kahle's feedback to me when I was in Berlin:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;This isn't just a cryptography toy for tech events. Activists need this. If they see it, they'll use it for real. You have to get it right.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Then he asked really good questions about the security model — how the ZK proofs worked, where trust assumptions lived, what happened if the server was compromised, what happened if an attacker faked events.&lt;/p&gt;
&lt;p&gt;I loved the hard questions. I couldn't stop smiling on the inside. Finally someone understood what I'd been working on for a year! And it was someone who knew what worked - the founder of Internet Archive and Alexa Internet.&lt;/p&gt;
&lt;p&gt;I'm glad I had good answers too.  It boosted my self-confidence,  realising my work was able to pass a serious bar.&lt;/p&gt;
&lt;p&gt;This was an unconference session c-base — that spaceship discovered under Berlin, turned into a hackerspace. The first time I was there, I saw the massive array of LED-lit recycled bottles, radiating warmth. Later I noticed the tea station. Community infrastructure. Care. Since then, it's felt like a kind of spiritual home to me.&lt;/p&gt;
&lt;p&gt;Talking to Brewster there about Ethereum hackathons and ZK proof privacy — then about people whose privacy needs are life-or-death — it felt misplaced.&lt;/p&gt;
&lt;p&gt;Originally, I thought zKal was something I could build as a gift to the DoD team, something I could do to give back. Standing here at c-base, I realised this was something else.&lt;/p&gt;
&lt;h2&gt;Lesson 1: I built on the wrong question&lt;/h2&gt;
&lt;p&gt;Two years ago, at ethBerlin, I'd asked ligi a question: &amp;quot;What DoD problem do you wish you'd solved by now?&amp;quot;&lt;/p&gt;
&lt;p&gt;Great hackathon question. It surfaced something real: their calendar privacy mattered to them.&lt;/p&gt;
&lt;p&gt;But a suicidal product question. There were reasons it hadn't been solved already.  Those reasons would bear down on zKal too.&lt;/p&gt;
&lt;p&gt;I should have been helping solve problems they were putting energy into solving too.&lt;/p&gt;
&lt;h2&gt;Lesson 2: I missed the train&lt;/h2&gt;
&lt;p&gt;After the hackathon, ligi said they might even try zKal at Devcon in Thailand. There was an open door.&lt;/p&gt;
&lt;p&gt;I couldn't get there.&lt;/p&gt;
&lt;p&gt;I remember staying up all night hacking, taking breaks for baby feedings. The math of babies:  At 3AM, two hands aren't enough but four hands make things easy.&lt;/p&gt;
&lt;p&gt;I had a flight to Devcon. I couldn't get on it. My family needed me at home. But doors ligi could open wouldn't stay open forever.&lt;/p&gt;
&lt;p&gt;Once I had time to commit seriously, I wanted to give it a real shot. I asked if it was still useful. Yes. But the lack of excitement was clear. &amp;quot;Let's talk at CCC&amp;quot; — the door still open a crack. A kindness.&lt;/p&gt;
&lt;p&gt;But the message underneath: Sorry, I don't have time for this now.&lt;/p&gt;
&lt;h2&gt;Lesson 3: I planted the seed in unstable ground&lt;/h2&gt;
&lt;p&gt;Even if I'd asked the right question and hit the timing perfectly — the organisations I was trying to plant in couldn't support it.&lt;/p&gt;
&lt;p&gt;Zupass support was intermittent at first, and eventually it was quietly abandoned. No commits. Support channel dead. ligi and I both loved it, and their new direction with the underlying POD2 framework.  I offered to maintain Zupass myself. Didn't matter. They weren't interested.&lt;/p&gt;
&lt;p&gt;You might know this smell: when orgs go opaque, it's usually infighting behind the scenes.&lt;/p&gt;
&lt;p&gt;DoD had become disillusioned with Berlin Blockchain Week. They politely describe it as too &amp;quot;corporate&amp;quot;. What I read in the situation is the broader cultural schism in Ethereum between FOSS values and crypto-bro mercenaries. The practical situation: DoD controls the event listing website, but its a legacy obligation put into maintenance mode.&lt;/p&gt;
&lt;p&gt;The DoD partnership with DWebCamp was rushed, broken from the start imho. DoD thought it would mean less work; it was pitched as a chance to curate a stage with their deep connections. Instead they're carrying the operational roles, plus managing a collaboration beset with different priorities, decision-making structures, and operational stacks. And doing the curation. All while being called &amp;quot;the local partner&amp;quot; in public.&lt;/p&gt;
&lt;p&gt;Again, I figured I'd push through.  The alternative was admitting I'd been building something nobody really wanted. I rationalised it with ethics: &lt;em&gt;do what you can to help the cause.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The smell test for next time: No straight answers? Contributions getting ignored or trapped in political cross-fire?  These are not the organisations  where a new tool plants adoption roots.&lt;/p&gt;
&lt;h2&gt;Lesson 4: I mistook principle signalling for adoption choices&lt;/h2&gt;
&lt;p&gt;A few days after c-base, I spent the afternoon with Cade Diehm. We walked around green suburban parks and coffee shops on a sunny day, while he laid bare &lt;a href=&quot;https://newdesigncongress.org/en/pub/the-great-convergence-and-its-discontents/&quot;&gt;the brutal mechanics of surveillance totalitarianism&lt;/a&gt;.  He's observing a setup for something worse than what we see today.&lt;/p&gt;
&lt;p&gt;It put some things in context:&lt;/p&gt;
&lt;p&gt;I've heard from more than one person that the web3privacy (now rebranded &amp;quot;Neo Cypherpunk&amp;quot;) organizers call privacy &amp;quot;just a meme&amp;quot; behind closed doors. The fact that they still use Luma after two years of being asked to stop backs that up. &lt;strong&gt;They're literally handing a list of every activist in attendance to a US server -- a package deal that comes with FISA warrants, Palantir and ICE targeting.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It explains why the real activists in Berlin steer clear from them.&lt;/p&gt;
&lt;p&gt;In my conversations with DWebCamp and DoD, nobody wanted to give decision-making power over tool choice away — not even to the teams using those tools. DWeb had been burned by alpha tools before and felt they had enough tooling changes to contend with already. DoD had to take a hard line to get dWebCamp to switch Google Docs and Zoom to decentralised alternates. (Why were these still being used in 2026?)  They gave up on the Cloudflare issue, which blew up badly when a few weeks of 404s showed the whole community they were using one of the most centralised hosting platforms in the world. In such a tug-of-war, it was no wonder nobody wanted to stick their neck out to try something new.&lt;/p&gt;
&lt;p&gt;This meant that for me, every time I asked about goals or what operational functionally was needed somewhere, calendars or otherwise, the answer was avoided. Instead, it was always about power dynamics: &amp;quot;We'll need keep this decision ourselves,&amp;quot; or &amp;quot;You'll have to ask someone else.&amp;quot;&lt;/p&gt;
&lt;p&gt;This was even the answer after they asked me to take responsibility for their unconference.  I volunteered happily, but said we needed to look at goals first, then design to those.  And I needed authority over tool choice to meet those needs.  That wasn't on the table.&lt;/p&gt;
&lt;p&gt;I learned Holochain and Ink &amp;amp; Switch, builders I look up to, had tried contributing before. The dweb team wasn't happy with the results, and I was regularly asked to pass judgement on them, when all I wanted to do was learn from their past experience. I didn't know whose fault it was, but it was another warning sign of a difficult environment.&lt;/p&gt;
&lt;p&gt;At that point, I bowed out.&lt;/p&gt;
&lt;p&gt;I can understand the time pressures of running events, and how you just grab last year's version and update it.  Lock-in is a powerful force, even for dWebCamp, who are personally feeling those same totalitarian trends back home in the US.&lt;/p&gt;
&lt;p&gt;But clear out all the reasons why and why not, look past the principles and rationalisations to the user behaviour alone. When have they actually made the space to change tools?  What does it take to trigger a change?&lt;/p&gt;
&lt;p&gt;I wasn't able to see actual adoption behaviour I could connect to.&lt;/p&gt;
&lt;h2&gt;Lesson 5: I confused entry taxes with real needs&lt;/h2&gt;
&lt;p&gt;A simple Node.js app on a small server could remove Ethereum events from big tech infrastructure entirely. hi.events has a one-click install and Pretix is tried-and-true.  But that's not the latest tech, so nobody's interested.&lt;/p&gt;
&lt;p&gt;ligi had originally suggested ZK proofs because that was the hackathon theme. It felt overkill, but I took it on, and started believing that ZK would be worth the long-term benefits. It ended up being 10X to 20X the time and complexity to build on. Time I didn't have.&lt;/p&gt;
&lt;p&gt;What I should have kept clear: ZK was an entry tax.The price of fitting Ethereum's frontier tech preferences, not the price of solving calendar or privacy problems.&lt;/p&gt;
&lt;p&gt;Like the entry taxes of selling to banks — procurement, compliance, risk reviews, year-long cycles — stuff that isn't part of the core offer, but still needs to be there.  The difference is Ethereum's status currency is novelty, not stability.&lt;/p&gt;
&lt;p&gt;That became obvious when DoD shifted to Bluesky — completely open attendance data instead of private. I went right along, and started working out how tack merkle roots into Bluesky event updates.&lt;/p&gt;
&lt;p&gt;But let's be honest with ourselves.&lt;/p&gt;
&lt;p&gt;When we say, &amp;quot;we need privacy-preserving identity infrastructure,&amp;quot; what we're not saying out loud is, &amp;quot;we want to use whatever feels like the next big thing.&amp;quot;&lt;/p&gt;
&lt;p&gt;In this way, the Ethereum community's instinct to dogfood frontier tech also functions like chasing hype.&lt;/p&gt;
&lt;p&gt;Ligi pushed me toward Zupass, and I'm still grateful. The ZK patterns I designed from there — proof projectors, portable-data wallet design, in-browser security models, the density index — those are real. And the're useful far beyond conference calendars.&lt;/p&gt;
&lt;p&gt;Both things are true. ZK produced patterns that matter for a more serious class of privacy user. But it was too high an entry fee to a small community like Ethereum conferences.&lt;/p&gt;
&lt;p&gt;And back to Lesson 2, my time constraints.  I took on a drag factor with Zupass that was really high, and it was more than I could afford.&lt;/p&gt;
&lt;h2&gt;Letting go is a form of persistence&lt;/h2&gt;
&lt;p&gt;When I was planning on coming to Berlin for that unconference, Afri told me, &amp;quot;Don't come for zKal. Come to be with us.&amp;quot;&lt;/p&gt;
&lt;p&gt;I love how he can speak high truths in short syllables.&lt;/p&gt;
&lt;p&gt;DoD brings together a community that matters to me and to the world. It was a great week in Berlin.&lt;/p&gt;
&lt;p&gt;zKal will return to its simpler version, and we'll use it for &lt;a href=&quot;https://infinite.build/&quot;&gt;The Infinite Build&lt;/a&gt;.  I'm glad I built my cryptography muscles on a real-life problem.&lt;/p&gt;
&lt;p&gt;I'm excited about having the ZK mechanisms in my toolbelt for whatever comes next.  These explorations opened a lot of paths outside of events, some about collaboration at scale, and some about the security problems that affect all browser-based apps.&lt;/p&gt;
&lt;p&gt;I can see DoD keep up the fight for their principles, but feel their energy slipping. I'm sad there's no way I can help.&lt;/p&gt;
&lt;p&gt;Better to try different paths than keep sliding back down the same one.  There are many roads to where we want to go.&lt;/p&gt;
&lt;p&gt;I keep reminding myself that, and every time I do, it feels like a relief.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Sessions without cookies</title>
    <link>https://voboda.com/blog/hdk-sessions/</link>
    <guid isPermaLink="true">https://voboda.com/blog/hdk-sessions/</guid>
    <pubDate>Wed, 08 Apr 2026 13:53:00 GMT</pubDate>
    <description>&lt;p&gt;The standard session model: user logs in, server stores state, server decides what you're allowed to do.&lt;/p&gt;
&lt;p&gt;Structurally incompatible with privacy.&lt;/p&gt;
&lt;p&gt;I've been working on something better, called HDK Sessions.&lt;/p&gt;
&lt;p&gt;Cookies were the original sin. Once you have a persistent identifier for each browser, building a profile behind it costs nothing. We hoarded data, built profiles, and found ourselves in the surveillance economy. (Lou Montulli built cookies in 1994 so MCI could offload e-commerce state to the browser. But the &lt;a href=&quot;https://digitalcontentnext.org/blog/2020/11/16/to-understand-where-the-cookie-is-headed-lets-look-at-its-history/&quot;&gt;very first deployment&lt;/a&gt; was Netscape's own site tracking returning visitors. Montulli &lt;a href=&quot;https://en.wikipedia.org/wiki/HTTP_cookie&quot;&gt;protested&lt;/a&gt; when ad networks co-opted the technology. His own employer ignored him, then sold to a media company built on eyeballs. Funny how that worked out.)&lt;/p&gt;
&lt;p&gt;So HDK Sessions asks: can we get what we need from server-state but without storing any personal data on the server at all? Authentication, access control, personalisation?&lt;/p&gt;
&lt;p&gt;Turns out, yes.&lt;/p&gt;
&lt;p&gt;HDK Sessions uses modern cryptography to let users carry their own session state, which is encrypted, tamper-proof, and forgotten by the server the moment each request is done.&lt;/p&gt;
&lt;p&gt;But the real win isn't the crypto. It's what you stop storing.&lt;/p&gt;
&lt;p&gt;Don't store what the user did:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{ visited: [&amp;quot;/lesson-1&amp;quot;, &amp;quot;/lesson-2&amp;quot;] }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Store what they're entitled to:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{ entitlements: [&amp;quot;lesson-3-open&amp;quot;] }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You already know where your access gates are and how you'll assess them. You just do those assessments as they occur rather than historically.&lt;/p&gt;
&lt;p&gt;It's actually easier. Even in complex cases, you're composing entitlements rather than doing complex ACLs or database queries prone to edge-case leaks. The instinct to hoard user data is the problem, not the protection. Letting go of what you don't need turns out to simplify everything downstream.&lt;/p&gt;
&lt;h2&gt;How it works&lt;/h2&gt;
&lt;p&gt;Your browser generates its own random ID. On each request, it sends that ID, a request counter, and an encrypted blob of your session state.&lt;/p&gt;
&lt;p&gt;The server holds one root key. From that key, your ID, and the counter, it derives a unique encryption key for that specific request (using Heirarchical Deterministic Keys), decrypts the blob, processes your request, re-encrypts, and sends the new blob back.&lt;/p&gt;
&lt;p&gt;Then forgets. EAch visit is processed once, transiently, to derive the state, then discarded.&lt;/p&gt;
&lt;p&gt;Nothing stays on the server. You don't need a database.&lt;/p&gt;
&lt;p&gt;The blob travels back and forth in HTTP headers, not a static cookie. You can open DevTools and verify this. No cookies.&lt;/p&gt;
&lt;p&gt;And this isn't just cookies with a different header. The architecture centres around proving entitlements and rights that evolve, not collecting personal data.&lt;/p&gt;
&lt;p&gt;The big insight I had was that to invert keypairs from the usual sense; the server has the private keys for the encrypted blobs. This allows you to protect the payload from visibility and tampering, making the system behave with the same security properties was ask of cookies and server-side data.  But the custody of the data stays with the user.  They can delete their own personal data without even asking permission.&lt;/p&gt;
&lt;p&gt;HDK Sessions are also just a better technical choice. Beyond privacy, HDK Sessions gives you things the cookie model doesn't:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Architectural Minimalism:&lt;/strong&gt; In many cases, this removes the need for your app to have a database altogether. Your server just needs to store a secret root key. Fewer moving parts. Way simpler devops.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compartmentalised Breach Impact:&lt;/strong&gt; Per-request key rotation means a leaked key exposes exactly one request, not your entire session. Replay protection is structural. A blob encrypted at counter N can't substitute for counter N+1.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dual Breach Requirement:&lt;/strong&gt; A server breach gets the root key but not your blobs. A device breach gets your blobs but not the root key. An attacker needs both. That's meaningfully better than a database breach, where the server holds everything, and that everything contains personal data.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Where you might still want a database&lt;/h2&gt;
&lt;p&gt;There are cases where HDK Sessions don't replace server-side storage.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Header size limits.&lt;/strong&gt; The encrypted blob travels as an HTTP header. Practical limits across CDNs and proxies sit around 8KB. A typical entitlement-based session runs 200–500 bytes, so this isn't binding in practice. But if your state outgrows the header, and you don't want to purge (the library has a provision for cleanup), then your alternative is to keep encrypted user state server-side.  The decryption key can still live in the HDK session payload, so the data is still only accessible by the server on client action. A little server storage, and the user still controls when it's accessed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compliance and financial data.&lt;/strong&gt; For shopping carts, payment processors like Stripe handle the sensitive data. But some compliance requirements mean you keep records. Here, you can (and probably should) use a distinct anonymised ledger, not a user profile.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Social and relational data.&lt;/strong&gt; Data that changes state between user interactions, like messaging, collaboration, social graphs, either needs decentralised systems (Bluesky, blockchains, p2panda, etc.) or a server database.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The point isn't that databases are bad. It's that if you're keeping a server database just for session state, you're making your life hard and making privacy hard.&lt;/p&gt;
&lt;p&gt;HDK Sessions are for the large class of applications that adopted server-side profiles not because they needed them, but because cookies made them the default.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I've built a &lt;a href=&quot;https://gitlab.com/voboda/hdk-sessions/&quot;&gt;SvelteKit library&lt;/a&gt; if you want to try it, and you can see it in action at &lt;a href=&quot;https://onelineforyourmind.com/&quot;&gt;One Line For Your Mind&lt;/a&gt; (&lt;a href=&quot;https://gitlab.com/voboda/onelineforyourmind&quot;&gt;source&lt;/a&gt;). The &lt;a href=&quot;https://gitlab.com/voboda/hdk-sessions/-/blob/main/DESIGN.md?ref_type=heads&quot;&gt;full design rationale&lt;/a&gt; covers the trade-offs honestly — including what this doesn't guarantee.&lt;/p&gt;
&lt;p&gt;I'd love to hear your thoughts.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>The Density Index</title>
    <link>https://voboda.com/blog/density-index/</link>
    <guid isPermaLink="true">https://voboda.com/blog/density-index/</guid>
    <pubDate>Mon, 06 Apr 2026 13:52:00 GMT</pubDate>
    <description>&lt;p&gt;My first Ethereum conference was 20,000 people, sprawled across Amsterdam.&lt;/p&gt;
&lt;p&gt;I had a game plan. Find the venues where someone was putting in effort for a great experience — not big-name speakers or swag, but comforts like good food, and communal spaces away from the megaphones.  Because when an event works, it's because the people in it are at their best. Learning, conversation, connections. All of those depend on the state of the people in the room.&lt;/p&gt;
&lt;p&gt;That lead me to 0xPARC's Dark Forest conference.&lt;/p&gt;
&lt;p&gt;After the talks, we've all seen small crowds form around speakers. People waiting their turn to get answers in a topic they care about. The speaker's coming down from nerves, just wants a bottle of water, and the whole conference environment isn't built for this moment to be good. But it's where you can find the meaningful questions, thoughtful expert answers, and deep conversations.&lt;/p&gt;
&lt;p&gt;And if it's your topic too, it's where you find your people.&lt;/p&gt;
&lt;p&gt;I hit it off with a bunch of game developers.&lt;/p&gt;
&lt;p&gt;The Amsterdam tourist district was a drunken, crypto merch explosion. I wondered how many were setting themselves up to get pickpocketed, or worse.&lt;/p&gt;
&lt;p&gt;What struck me about the whole Blockchain Week experience was the exclusive events. Tickets sold out on the event pages. Bouncers at the door. Then you'd get inside and find a mostly empty room. Like clubs that keep a line outside to look full.&lt;/p&gt;
&lt;p&gt;A group of us figured out a better way. Check which events your friends were at. Show up. They'd come to the door, maybe grab the organiser, who'd be happy to let in people vetted by their community. No tickets needed.&lt;/p&gt;
&lt;p&gt;I had to be missing something.  Crypto was supposed to be about economic design, and nobody had solved this economic design problem they were all living through every summer?&lt;/p&gt;
&lt;h2&gt;The design problem&lt;/h2&gt;
&lt;p&gt;Blockchain Weeks have &lt;a href=&quot;/blog/proof-projectors/&quot;&gt;a no-show problem&lt;/a&gt;. RSVPs are free options, organisers compete on hype, and the events that could really move people forward get lost in the noise. Years later, I'm building &lt;a href=&quot;https://github.com/voboda/zKal&quot;&gt;zKal&lt;/a&gt;, and the &lt;a href=&quot;/blog/proof-projectors/&quot;&gt;Proof Projector architecture&lt;/a&gt; it uses gives you a privacy-preserving way to publish aggregate signals from private attendance proofs.&lt;/p&gt;
&lt;p&gt;It's a crpytophraphic pattern. It doesn't tell you &lt;em&gt;what&lt;/em&gt; to aggregate. And that turns out to be the harder question.&lt;/p&gt;
&lt;p&gt;But the constraint helps by bringing the design challenge into clearer focus.&lt;/p&gt;
&lt;p&gt;When you can't see raw attendance history — because privacy — you have to ask: what's the thing across all this data that tells you something real?&lt;/p&gt;
&lt;p&gt;It breaks down into two specific functions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Projector Function: What single, anonymous number comes out of an individual's private history?&lt;/li&gt;
&lt;li&gt;Aggregation Function: How do you combine those so they're useful to others in the community?&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;What the weight needs to capture&lt;/h2&gt;
&lt;p&gt;If you've run meetups or conferences for some time, you've seen a general progression.&lt;/p&gt;
&lt;p&gt;First, someone's checking out the scene. Is this a place for me? They're scanning the topics, the vibe, the people. Big-name speakers help here — trustworthy authorities who high-level the current issues, a fast track to understanding what matters.&lt;/p&gt;
&lt;p&gt;Then they start applying what they've learned. Their needs shift. They want practitioners who are various distances ahead of them on their specific path. Too many big names actually get in the way at this point. They become noise to a signal that's about practicalities — projects working and learning in public, people who've been building for six months or a few years and have hard-won things to share.&lt;/p&gt;
&lt;p&gt;The crypto ecosystem is full of these people, but the conference structure very rarely surfaces them. I'd argue this is the one of the big reason we have a chasm between many with deep interest and only a few succeeding projects. (The other is over-funding kills projects, but that's another thing altogether.)&lt;/p&gt;
&lt;p&gt;On the other side, you get the committed communities. Specialised workshops, cohort programs, or just small rooms of people around hands-on practical topics — seemingly niche but major unlocks for anyone in that space.&lt;/p&gt;
&lt;p&gt;A good weight function should reflect where someone is in this progression, and match them to events where they'll get the most out of it.&lt;/p&gt;
&lt;h2&gt;The formula&lt;/h2&gt;
&lt;p&gt;zKal is a self-hosted ticketing platform, but you can host for an entire community of events.  The tickets are private ZK proofs, and the fun part is how tickets can get released in phases.  A phase is for people who have been before (they need an attendance proof) or who've been to related events, and then there's open access.  Event hosts choose the amount of tickets and timelines for each phase.&lt;/p&gt;
&lt;p&gt;When someone proves eligibility for a ticket, the proof carries properties derived from private inputs, their prior event attendance: recency, event type, event size. Enough to generate a single weight. Not unique, not traceable.&lt;/p&gt;
&lt;p&gt;Only the weight enters the aggregate layer. The person doesn't.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;participant_weight = recency × trust × size_normalization&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Recency&lt;/strong&gt; uses exponential decay — weight halves every 12 months since attendance. Recent engagement matters more, but older participation still contributes. Nobody gets permanently locked in or locked out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Trust&lt;/strong&gt; reflects how often a prior event is cited &lt;strong&gt;as an access credential by other events&lt;/strong&gt; in the ecosystem. It's bounded between 0.33 and 0.66 on an S-curve — starts increasing after 2 independent citations, saturates after 6. This prevents any single anchor event from monopolising reputation while rewarding events the ecosystem organically values.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Size normalization&lt;/strong&gt; is the inverse of the prior event's RSVP count. Smaller, more focused gatherings carry stronger signal.&lt;/p&gt;
&lt;p&gt;The event's public score is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Density Index = mean(participant_weights)&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The Density Index is a single public number per event, visible in realtime on the calendar. It tells you how likely this event is to have a high density of people who actually care about its topic.&lt;/p&gt;
&lt;p&gt;That's the model I started with. Grounded in years of running meetups and conferences, encoded into math. The question was whether the math would agree with the experience — and where it would break.&lt;/p&gt;
&lt;h2&gt;Breaking it&lt;/h2&gt;
&lt;p&gt;I vibe-coded a scenario simulator and threw two years of blockchain week event listing data at it. No historical attendance records existed, only event listings — so the exercise was about ranging assumptions across scenarios and looking for where the model fell apart.  Each run would push a different set of permutations; event hosts playing the Density Index game, and participants reacting to it.&lt;/p&gt;
&lt;p&gt;I kept running it, scanning for outcomes that looked wrong or broke free from what the incentives were supposed to do.&lt;/p&gt;
&lt;p&gt;Running it again and again and again.&lt;/p&gt;
&lt;h3&gt;Under-curation&lt;/h3&gt;
&lt;p&gt;The first thing that broke was the obvious way to game the system. Event hosts can select relevant events for theirs, which give early access and up your event's Density Index.&lt;/p&gt;
&lt;p&gt;Hosts that want to attract big crowds can just select a large number of other events for early access to their — or cherry-pick attendees from the biggest or most exclusive events. The simulations showed an optimal range of 3–4 relevant intake events, with an inflection point around 5. Go beyond that and you're not curating, you're harvesting.&lt;/p&gt;
&lt;p&gt;So the Density Index gets a &lt;strong&gt;curation penalty&lt;/strong&gt; — an S-curve centered at 5 listed qualifying events. The farther from that range, the steeper the cost.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Density Index = mean(participant_weights) × curation_penalty&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The limit forces choosiness --  picking the right people for your event rather than mainstream or &amp;quot;in-group&amp;quot; event.&lt;/p&gt;
&lt;p&gt;The modeling was about finding the right shape for the penalty — where to set the inflection point, how steep to make the curve.&lt;/p&gt;
&lt;h3&gt;Collusion&lt;/h3&gt;
&lt;p&gt;The curation fix surfaced a deeper problem.&lt;/p&gt;
&lt;p&gt;A related event adds weight to yours through the trust factor — but that relationship can be faked. Two organisers list each other as qualifying access events, fake a bunch of attendances, and points go up for both.&lt;/p&gt;
&lt;p&gt;Mutual cross-listing for free score. Vouching rings. Circular amplification.&lt;/p&gt;
&lt;p&gt;But responding to this with typical collusion detection is tricky.&lt;/p&gt;
&lt;p&gt;In crypto events ecosystem, there are natural cliques. Polkadot events have their specific crowd. The ZK chains are kind of the same people, competing with each other but sharing a core community. DAOs and the pro-social funding crowd are another cluster. They form organically around shared interests. Some of that is unhealthy: siloed knowledge, exclusive in-groups that atrophe.  But a lot of that is healthy. Tight relationships, internal jargon and mental models. That's how communities cohere.&lt;/p&gt;
&lt;p&gt;Separate from these cliques, there's a small network of event marketing people who work across the better-funded projects. They co-promote constantly, and it produces a sameness across events — similar lineups, similar sponsors, similar vibes. This creates a form of de facto collusion, &lt;a href=&quot;https://en.wikipedia.org/wiki/Horizontal_integration&quot;&gt;horizonal integration&lt;/a&gt; for conference visibility. Not great, but it's how the conference industry works. This shouldn't necessarily be penalised unless it can be empirically demonstrated that those events have weaker communities.&lt;/p&gt;
&lt;p&gt;So the model needed to reward two things at once: a returning core community (which shows your event is good and your community is strong enough that attendees will find great conversations easily) &lt;em&gt;and&lt;/em&gt; genuine openness — pulling in diverse groups based on topic-interest rather than who-you-know access. True inclusiveness, not in-grouping.&lt;/p&gt;
&lt;p&gt;Then it needed to penalise the gaming layer without punishing the organic collaboration underneath.&lt;/p&gt;
&lt;p&gt;The answer was a steep &lt;strong&gt;anti-collusion penalty&lt;/strong&gt; when two events cite each other above 40% mutual overlap.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Density Index = mean(participant_weights) × curation_penalty × anti_collusion_penalty&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As an event host, you can collaborate broadly. But the Index rewards you for having a distinct community core &lt;em&gt;and&lt;/em&gt; for drawing in people from genuinely different communities. Not for trading favours with three friends to look exclusive.&lt;/p&gt;
&lt;h3&gt;Scarcity and sorting&lt;/h3&gt;
&lt;p&gt;The penalties had a side effect I noticed when I looked at the scenarios qualitatively.&lt;/p&gt;
&lt;p&gt;When early access is limited — for both hosts granting it and participants earning it — exposing the right events increased demand for them, and that demand moved scarcity to them. Anchor events got more exclusive too. And participants started self-selecting into topics that actually mattered to them.&lt;/p&gt;
&lt;p&gt;This maps to the progression I described earlier. The newcomer checking out the scene gravitates toward big-name events — broad, authoritative, good for orientation. But someone who's been applying skills for a while, who needs practitioners and practical work, starts gravitating toward the focused rooms where those people are. The Density Index was matching &lt;em&gt;the-events-you-want-now&lt;/em&gt; with &lt;em&gt;the-events-you-can-get-into-first&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The model was shifting high scores away from large general events toward focused rooms with strong community stickiness — with the exception of anchor events that the whole ecosystem genuinely draws from. The design was encoding the sorting that conferences have never managed to produce: people finding the rooms that match where they actually are, not where the hype tells them to be.&lt;/p&gt;
&lt;p&gt;Whether this plays out in practice is the experiment. But the simulations showed the mechanism — expose quality, distribute scarcity, and people sort themselves toward depth over time.&lt;/p&gt;
&lt;h3&gt;Small samples&lt;/h3&gt;
&lt;p&gt;One practical problem: early-stage events with fewer than about 10 signups were wildly volatile. A few strong attendees could spike a score. A few early signups with no history could crater it.&lt;/p&gt;
&lt;p&gt;The fix is Bayesian shrinkage toward the ecosystem mean for events under 30 RSVPs — a weighted blend of the event's raw Density and the network baseline, stabilising scores until there's enough data to trust them.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Density Index = mean(participant_weights) × curation_penalty × anti_collusion_penalty × baysian_shrinkage_factor&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Without it, your newest events will be the noisiest, with the least trustable score.  And we want the opposite effect, to help people find the small but good events that are right for them.&lt;/p&gt;
&lt;p&gt;Those are where the strongest connections and relationships form.&lt;/p&gt;
&lt;h2&gt;The new game this creates&lt;/h2&gt;
&lt;p&gt;Right now, event organisers play one game: maximise RSVPs, compete on hype. The currency is attention. Free drinks, big-name speakers, aggressive cross-sponsorship. It degrades into out-spending, not out-performing.&lt;/p&gt;
&lt;p&gt;The Density Index creates a second game. Your event has a public score — a signal of whether your attendees actually show up, how strong your community core is. That score gets you featured on the calendar. That score tells someone with five choices to pick you.&lt;/p&gt;
&lt;p&gt;Returning members become your most valuable asset. You start winning by focusing on building your own community snowball effect, which means serving them better over time.&lt;/p&gt;
&lt;p&gt;It shifts the intake goals towards &lt;em&gt;which&lt;/em&gt; communities you invite, not just how many people you get through the door.&lt;/p&gt;
&lt;p&gt;The cynical version of this game still exists. A competitive event will notice that pulling their strongest competitors' community members spikes their weight. Two friendly organisers will notice that mutual cross-listing earns free points.&lt;/p&gt;
&lt;p&gt;But I'm hoping we can still tip them towards a better one.&lt;/p&gt;
&lt;p&gt;When your score compounds with genuine retention — people who came last time, brought a friend, came back again — you stop optimising for footfall and start optimising for your community members' success. You want the kind of attendee who'll be building on what they learned six months later. Who'll introduce two people who end up collaborating. Who'll come back because last time mattered.  Because when you have a room full of those people, your newcomers meet the people they need to to succeed for themselves.&lt;/p&gt;
&lt;p&gt;That's a different conference than the one everyone's been building. It's a different conference week than anyone's ever seen.&lt;/p&gt;
&lt;p&gt;Whether the score makes enough organisers play the second game to shift the ecosystem — or whether the edge cases eat it first — is the question worth finding out.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Proof Projectors</title>
    <link>https://voboda.com/blog/proof-projectors/</link>
    <guid isPermaLink="true">https://voboda.com/blog/proof-projectors/</guid>
    <pubDate>Sun, 05 Apr 2026 13:31:00 GMT</pubDate>
    <description>&lt;p&gt;Everyone's focused on what ZK proofs hide. We're missing what they can usefully reveal.&lt;/p&gt;
&lt;p&gt;Reputation, attendance, commitment, these used to require surveillance infrastructure. We're rightly moving away from that.&lt;/p&gt;
&lt;p&gt;But those signals served real purposes. Communities need legibility to coordinate: is this restaurant safe to eat at, is this contractor reliable, did people actually show up, is this neighborhood getting the services it was promised.&lt;/p&gt;
&lt;p&gt;ZK proofs now let us rebuild those public signals without the surveillance.  Privacy and transparency are not opposites anymore.&lt;/p&gt;
&lt;p&gt;I've been working on a system that does this for a specific problem, and the architecture generalizes, so I thought it was worth sharing. (And the gotchas too.)&lt;/p&gt;
&lt;h3&gt;I call the pattern a Proof Projector.&lt;/h3&gt;
&lt;p&gt;A Proof Projector is a system that takes privately held proofs and emits public, verifiable signals about a group, a state, or an aggregate — without revealing the underlying personal data. It separates what individuals prove from what the system publishes.&lt;/p&gt;
&lt;p&gt;That makes it broad enough for attendance, reputation, eligibility, coordination metrics, and other cases where you want social legibility without a surveillance graph.&lt;/p&gt;
&lt;h2&gt;The RSVP Problem&lt;/h2&gt;
&lt;p&gt;I got &lt;a href=&quot;/blog/the-third-floor-at-ethberlin/&quot;&gt;pulled into this problem&lt;/a&gt; by Ligi and Afri, some of the organisers of ethBerlin and Protocol Berg. They're the anchor events of Berlin Blockchain Week.&lt;/p&gt;
&lt;p&gt;At Blockchain Weeks, no-shows are a big problem. RSVPs are free options. Collecting them is rational. Organizers compensate by inflating capacity, competing on hype, stacking events against each other.&lt;/p&gt;
&lt;p&gt;High-signal rooms — round-table dinners, technical meetups, problem-solving groups, reading clubs, even the good workshops — get washed away under the hype.&lt;/p&gt;
&lt;p&gt;And the big events suffer too. The whole system optimizes for attention, not cohesion. You ping between events, feeling like the party moved somewhere else just before you arrived. And there are amazing talks given to echoey rooms that could've been buzzing with great people and projects. When you're back on a plane, you're somehow less connected than you hoped. Ethereum's flagship event in Thailand was badly affected by this — Devcon itself had empty rooms. Everyone was guessing which side event was the hot one, and the sad reality was people were stuck in Bangkok traffic for the whole week.&lt;/p&gt;
&lt;p&gt;A fix is making demonstrated participation matter. Signalling which events have sign ups from people who actually show up about those topics. It makes the game less about raw numbers, and more about knowing all the right people will be there when you show up.&lt;/p&gt;
&lt;p&gt;I've been attempting to do that with &lt;a href=&quot;https://github.com/voboda/zKal&quot;&gt;zKal&lt;/a&gt;, a privacy perserving community calendar I hacked last ethBerlin.&lt;/p&gt;
&lt;h2&gt;The Proof Projector&lt;/h2&gt;
&lt;p&gt;We want data to be transparent, composable. But we want claims about data to be verifiable without revealing the data itself. Most systems pick one. Proof Projection makes you separate them into two layers.&lt;/p&gt;
&lt;p&gt;Shine a light onto a wall, over dozens of complex, overlapping 3D shapes and they cast a single 2D silhouette. You can clearly see the outline, but it's physically impossible to reverse-engineer the exact geometry of any single shape hiding inside the mass.&lt;/p&gt;
&lt;p&gt;A Proof Projector creates that structural asymmetry. The objects are our complex personal histories, represented mathematically as high-dimensional polynomials inside a zero-knowledge circuit. The public information is the shadow on the wall, reduced to a one-dimensional number.&lt;/p&gt;
&lt;h3&gt;The proof layer&lt;/h3&gt;
&lt;p&gt;At the personal layer, we use &lt;a href=&quot;https://zupass.org&quot;&gt;Zupass&lt;/a&gt; and the &lt;a href=&quot;https://pod.org/&quot;&gt;POD system&lt;/a&gt;. The user holds their private history, credentials, and attendance data entirely in their own wallet.&lt;/p&gt;
&lt;p&gt;When qualifying for access to a new event, they emit only a zero-knowledge proof about a specific property of that history, using selective disclosure through the &lt;a href=&quot;https://pod.org/z-api/queries&quot;&gt;Z-API query system&lt;/a&gt;. They prove they hold a valid attendance proof matching a qualifying event, without revealing which event, when, or any linkable identifier.&lt;/p&gt;
&lt;p&gt;The issuer only verifies that you're eligible for a ticket at a given access phase: the first tickets are open to prior attendees, then to attendees of related events. The ticket issuer doesn't need to know who you are, and they don't need to store any record of you other than ticket inventory for each event. You just tally that one more spot was taken.&lt;/p&gt;
&lt;p&gt;With this design, you don't need a central database of ticket holders.  No personal identity data needs to exist anywhere, other than the attendance proofs the user keeps in their own wallet and never reveals.&lt;/p&gt;
&lt;p&gt;For each signup, the Projector Function produces a single number, a weight, that's projected into the aggregate layer.&lt;/p&gt;
&lt;p&gt;Only the weight enters the aggregate layer. The person doesn't.&lt;/p&gt;
&lt;h3&gt;The aggregate layer&lt;/h3&gt;
&lt;p&gt;The aggregate layer is public, designed for transparency. That's why it never sees personal data.&lt;/p&gt;
&lt;p&gt;The weights it receives get committed to a public record so anyone can verify them and the indexes that are calculated based on them. For immutability, you could use Merkle-rooted attestations on ATPROTO or something like Ethereum Attestation Service.&lt;/p&gt;
&lt;p&gt;Those weights are then combined through an aggregate function to produce the public index. This means each event's signup quality score can be reconstructed from the public signup stream. Individual attendance histories cannot.&lt;/p&gt;
&lt;h3&gt;The Projector Function&lt;/h3&gt;
&lt;p&gt;The pattern works because the two layers don’t leak into each other.&lt;/p&gt;
&lt;p&gt;You have to get clear on what needs to be provable, and to whom, then define the link between layers.&lt;/p&gt;
&lt;p&gt;The Projector Function does that.  It sits at the boundary between the two layers: it accepts a ZK proof from the personal layer, verifies it, derives a single anonymous value from it, and emits that value into the public layer.&lt;/p&gt;
&lt;p&gt;Absolutely nothing else crosses the boundary.&lt;/p&gt;
&lt;p&gt;In zKal's case, participants need to prove attendance to prior events to request tickets. Event hosts need signup stats they can actually rely on. The public needs to verify claims about the commitment of their ticket holders, to sense which events will have a solid community.&lt;/p&gt;
&lt;p&gt;All of that goes in the public layer.&lt;/p&gt;
&lt;h2&gt;zKal&lt;/h2&gt;
&lt;p&gt;For Berlin Blockchain Week, I built zKal. It's an events calendar with ticketing built in, except the tickets are all ZK Proofs using Zupass.&lt;/p&gt;
&lt;p&gt;Whoever hosts a zKal instance, whether EF or any local community group, becomes a ticket issuer for their whole community, which can both integrate platforms like Luma as backends, or replace them. Either way, this moves an ecosystem into zero-knowledge anonymous tickets, and lets the whole ecosystem see useful data that helps it improve.&lt;/p&gt;
&lt;p&gt;In this role as calendar and ticket issuer, zKal mediates between private individual interactions and public aggregate data. That's where the Proof Projector pattern does its work.&lt;/p&gt;
&lt;p&gt;The zKal instance publishes anonymized signup events that include the specific event and a single weight expressing the value of that person's signup to the event. The weight is higher if they have a good attendance history for this event, or related topics.&lt;/p&gt;
&lt;p&gt;The crucial property is that you can't connect the outputs back to the inputs; the math discards information. It's one-way by construction.&lt;/p&gt;
&lt;h3&gt;Trust model&lt;/h3&gt;
&lt;p&gt;A future version could use a recursive ZK Proof system, like o1 Lab's &lt;a href=&quot;https://o1-labs.github.io/proof-systems/kimchi/overview&quot;&gt;Kimchi&lt;/a&gt;, so the issuer publishes a ZK proof that they checked the ticket applicant's ZK proofs correctly. That would mean full cryptographic verification from public data all the way back to the individual (and still private) attendance proofs: fully &amp;quot;trustless&amp;quot;. (Zupass doesn't use Kimchi, or support this kind of true recursion.)&lt;/p&gt;
&lt;p&gt;But since each layer can have different trust assumptions, a simpler version is possible.&lt;/p&gt;
&lt;p&gt;I rely on a Verifiable Credential from the issuer. That makes the calendar host an issuer for event reputation in their ecosystem, with the same trust model as any VC system. The event hosts or attendees always provide proof to the issuer, and the ticket issuer verifies it and then signs attestations for public record.&lt;/p&gt;
&lt;p&gt;In this simpler version, we only trust the issuer to attest they did the eligibility check honestly.&lt;/p&gt;
&lt;p&gt;So we have ZK proofs to protect personal data and issue tickets. And VCs for event stats and quality metrics.&lt;/p&gt;
&lt;h2&gt;What a Proof Projector Must Guarantee&lt;/h2&gt;
&lt;p&gt;The Proof Projector pattern doesn't get you off the hook on correlation attacks. While the cryptographic proofs can't be reverse-engineered, observing the output values and timing of the Projector can leak metadata.&lt;/p&gt;
&lt;p&gt;We need to carefully manage the frequency and granularity of what gets projected. For the pattern to hold, three properties are required:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;ZK proofs with private inputs.&lt;/strong&gt; The proof must be generated from data that never leaves the user's device.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Non-unique outputs.&lt;/strong&gt; The value emitted into the public layer must not be unique to the individual. The output set needs to be small enough that any given value is plausibly shared by many participants.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Non-correlatable outputs.&lt;/strong&gt; Patterns across outputs can re-identify people. Some approaches help here: minimizing the possible output set (fewer distinct values means more cover), selecting among eligible inputs privately (ideally randomly), obfuscating timing with batcheing and/or random delays.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In zKal, we don't know which matching tickets a participant selected to compute their weight. That's chosen deterministically (the highest weight attendance proof you have), which isn't randomly, but at least chose from a private set of options.&lt;/p&gt;
&lt;h2&gt;The Density Index&lt;/h2&gt;
&lt;p&gt;There's still a catch. The Proof Projector gives you the architecture. It doesn't tell you what to project or how to aggregate.&lt;/p&gt;
&lt;p&gt;Choosing privacy sharpens that question rather than dodging it. When you can't see raw attendance history, you're forced to ask: what's the minimum signal, derived from private inputs, that still tells you something real? What aggregate function produces a public number worth acting on?&lt;/p&gt;
&lt;p&gt;In our case, how can visible participation history actually shift which events rise, which communities cohere, which rooms fill with the people who matter to each other?&lt;/p&gt;
&lt;p&gt;That's a design problem in its own right. It's part incentive mechanism, part community scoring, part game theory. My answer to it for the RSVP Problem is a whole other ball of wax, &lt;a href=&quot;/blog/density-index/&quot;&gt;The Density Index&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Use the pattern&lt;/h2&gt;
&lt;p&gt;Private and transparent aren't opposites. The trick is separating the layers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Individuals prove properties about their history without revealing it.&lt;/li&gt;
&lt;li&gt;The system publishes aggregate commitments that anyone can verify and recompute.&lt;/li&gt;
&lt;li&gt;No central registry required.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When you want social legibility without a surveillance graph, if you're working with attendance, reputation, eligibility, or coordination, see if Proof Projectors get you there.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>The Anti-App</title>
    <link>https://voboda.com/blog/the-anti-app/</link>
    <guid isPermaLink="true">https://voboda.com/blog/the-anti-app/</guid>
    <pubDate>Fri, 03 Apr 2026 10:56:00 GMT</pubDate>
    <description>&lt;p&gt;Most meditation apps are content apps with calming aesthetics. They want you coming back daily, consuming more. It's a business model thing.&lt;/p&gt;
&lt;p&gt;A good meditation teacher &lt;a href=&quot;https://the-wanderling.com/headspace_calm.html&quot;&gt;does the opposite&lt;/a&gt; — they teach you to sit comfortably, in silence, with yourself.&lt;/p&gt;
&lt;p&gt;The goal is your independence, not your retention.&lt;/p&gt;
&lt;p&gt;I started with that goal.  Around that time, I was learning about different schools of meditation, and the Buddhist and Ayurvedic histories that brought them to us.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20220811064314/https://www.angelfire.com/electronic/awakening101/mumonkan.html&quot;&gt;Koans&lt;/a&gt; stood out.&lt;/p&gt;
&lt;p&gt;Koans are the Rinzai Zen practice of sitting with paradoxical phrases that resist logical answers.  They have roots that run through much of East Asian Buddhism.&lt;/p&gt;
&lt;p&gt;Some people say &amp;quot;koan study&amp;quot; but this feels like a misnomer to me. The idea isn't to study them or unlock them like riddles.  It's to just sit with them, in meditation or in regular life. To let them be with you, and let them go at the same time. (&lt;em&gt;Grasping&lt;/em&gt; is this whole thing in Buddhism.)&lt;/p&gt;
&lt;p&gt;The underlying impression I got from Rinzai is that we don't need to &lt;strong&gt;earn&lt;/strong&gt; enlightenment, per se.&lt;/p&gt;
&lt;p&gt;Some ants work their whole lives toward the fruit. Others sit under the tree and let it fall. The Rinzai masters say we are all already enlightened! It's just we have trouble noticing it!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://onelineforyourmind.com/&quot;&gt;One Line For Your Mind&lt;/a&gt; was inspired by this. Each session offers a single line, the kind of thing that feels just beyond the reach of logic, something you sit with rather than solve. It lets you respond, only to play with the fallacy of responding.&lt;/p&gt;
&lt;p&gt;Three to five clicks. Then it tells you, enough.&lt;/p&gt;
&lt;p&gt;Go.&lt;/p&gt;
&lt;p&gt;Be.&lt;/p&gt;
&lt;p&gt;I built the first version years ago.&lt;/p&gt;
&lt;p&gt;At one point, I added a notification.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;Your next session is ready.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It felt wrong though. If the thing has value, people will return on their own terms.  I removed it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;Your next session will be here waiting for you.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Turns out &lt;em&gt;not&lt;/em&gt; doing the things 'apps' are supposed to was better for 'retention'.&lt;/p&gt;
&lt;p&gt;Around 3-4% of cold users — people who found it through social media, not searching for a meditation app — kept coming back.  That was about four times higher than bigger meditation apps at the time.&lt;/p&gt;
&lt;p&gt;No notifications, no email signup, no streak mechanic.&lt;/p&gt;
&lt;p&gt;Just the thing itself.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Meeting where AI eyes can't follow</title>
    <link>https://voboda.com/blog/meeting-where-ai-eyes-cant-follow/</link>
    <guid isPermaLink="true">https://voboda.com/blog/meeting-where-ai-eyes-cant-follow/</guid>
    <pubDate>Wed, 01 Apr 2026 16:36:00 GMT</pubDate>
    <description>&lt;p&gt;I applied to the &lt;a href=&quot;https://community-privacy.github.io/&quot;&gt;Community Privacy Residency&lt;/a&gt;, and the &lt;a href=&quot;https://community-privacy.github.io/2025-projects/&quot;&gt;past projects&lt;/a&gt; reminded me of a cryptographic exploration I come back to every once in a while, just for fun.&lt;/p&gt;
&lt;h2&gt;What if people walking the same path through content on the internet could find each other, without profiles, sign-ups, or any server watching?&lt;/h2&gt;
&lt;p&gt;Visit the same pages in the same sequence, and you're in a chatroom together. Like recognising a familiar face on the train home from a conference, and starting a conversation.&lt;/p&gt;
&lt;p&gt;A true shared secret can't emerge from a deterministic function of public inputs, &lt;a href=&quot;https://www.zkdocs.com/docs/zkdocs/protocol-primitives/fiat-shamir/&quot;&gt;right?&lt;/a&gt; You always need random private inputs for keys, &lt;a href=&quot;https://docs.network.human.tech/overview/what-is-human-network-what-are-human-keys&quot;&gt;right?&lt;/a&gt; Well, sorta.&lt;/p&gt;
&lt;p&gt;But this is slightly different. You could build a rendezvous scheme where shared movement plus costly derivation makes it impractical for an attacker to occupy every possible location.&lt;/p&gt;
&lt;p&gt;Let's call it a &lt;em&gt;cost-asymmetric anonymous rendezvous protocol&lt;/em&gt; because that sounds smart.&lt;/p&gt;
&lt;p&gt;It's probably impossible, but it's been a fun driver for me to explore cryptographic primitives that don't get much attention — a lot of paths outside the current ZK/blockchain world that seem left unexplored.&lt;/p&gt;
&lt;h2&gt;V1: The Hackathon&lt;/h2&gt;
&lt;p&gt;Ephemerant v1 was a &lt;a href=&quot;https://github.com/voboda/ephemerant&quot;&gt;Mina Protocol hackathon entry&lt;/a&gt;. It was my first time learning about zero-knowledge proofs, and for the first few days I just couldn't get anything to work. I assumed I just wasn't smart enough.&lt;/p&gt;
&lt;p&gt;Towards the end, I realized, after the community folks escalated my questions, that a lot of the underlying library actually hadn't been built.&lt;/p&gt;
&lt;p&gt;So I dropped the actual ZK proofs and worked with what the library &lt;em&gt;did&lt;/em&gt; have: &lt;a href=&quot;https://www.poseidon-initiative.info/&quot;&gt;Poseidon hashes&lt;/a&gt;. I tried to build something that felt ZK-ish: a system where your browsing path generates a chain of hashes, and only someone who walked the same path could produce the same chain. No personal data shared, no central authority. Just matching hashes.&lt;/p&gt;
&lt;p&gt;Then I remembered William Gibson's Neuromancer. A self-aware AI recruits and manipulates humans to carry out a plan they barely understand. The &amp;quot;matrix&amp;quot; — his networked cyberspace — is where AIs locate, probe, and manipulate targets by intercepting their activity. Hackers use encryption, proxying, dead channels, air-gaps — but these only buy temporary concealment. A determined AI with node-level access generally wins.&lt;/p&gt;
&lt;p&gt;It's like the Byzantine Generals problem, except against an AI dragnet.&lt;/p&gt;
&lt;p&gt;Ephemerant asks: what if the human connections themselves were unfindable, not just protected by encrypting what's inside them, but by making the address something only shared experience can produce?&lt;/p&gt;
&lt;p&gt;This was way funner than saying &amp;quot;educational cohorts,&amp;quot; so I ran with it.&lt;/p&gt;
&lt;p&gt;It was enough to win a prize. Which I never collected, because they required KYC to pay out. A zero-knowledge chain demanding you reveal your identity to receive a prize for a privacy tool. Sometimes the irony writes itself.&lt;/p&gt;
&lt;p&gt;But the problem stayed with me. With generative AI getting cheaper and more capable every month, the question became real: could you actually build this, and could it survive an AI attacker that can impersonate  humans and never sleeps?&lt;/p&gt;
&lt;h2&gt;&amp;quot;I Am The Attacker In Every Room&amp;quot;&lt;/h2&gt;
&lt;p&gt;Let's define the problem with some math. Picture a site with 20 pages. An attacker can scrape the site, then can compute every possible path permutation and generate every possible key. For a path of 2 pages, that's 380 permutations. For 3 pages, 6,840. An AI scraper runs through all of them, generates all the keys, joins every possible room, and waits silently for any activity to observe.&lt;/p&gt;
&lt;p&gt;The v1 design has no defence against this. The hashes are fast to compute. An attacker with a laptop could cover a small site in seconds.&lt;/p&gt;
&lt;h2&gt;Making each hash hurt&lt;/h2&gt;
&lt;p&gt;I just had a question - how could I increase the defenders' advantage, making it harder for an attacker to run permutations while cheap enough for a regular user to use this from a phone?&lt;/p&gt;
&lt;p&gt;The first thing I learned about was memory-hard hash functions. Argon2 and scrypt are designed so each computation demands not just CPU time but a large block of RAM that can't be shared across parallel operations.&lt;/p&gt;
&lt;p&gt;I decided to blindly trust &lt;a href=&quot;https://community.bitwarden.com/t/pbkdf2-vs-argon2-which-is-better/59187&quot;&gt;this post I found in an internet forum&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Argon2 was specifically crafted to fix the inherent flaws of compute bounded key derivation functions like pbkdf2. With pbkdf2, you can double your iterations, which will double the time you have to wait to unlock your vault, but also double the time an attacker will take to crack your password (if they have your masterpasswordhash). In contrast to this, argon2 is not just compute-bounded but also memory bounded. This means that - for the same unlock time for you - password cracking will be significantly slower for an attacker attempting to crack your password on a GPU or ASIC, because an attacker cannot run as many instances of argon2 in parallel on a GPU, as they could with PBKDF2 due to memory limitations.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Quick napkin math&lt;/h2&gt;
&lt;p&gt;With Argon2 set to 512 MB memory cost and 0.5 seconds per computation on a single thread, the numbers for a 20-page site shift:&lt;/p&gt;
&lt;p&gt;For 3-page paths (6,840 permutations): ~57 minutes of sequential computation, ~3.4 TB of total memory. For 5-page paths (1.86 million permutations): ~10.8 days, nearly a petabyte of memory.&lt;/p&gt;
&lt;p&gt;That's not nothing. But for 3-page paths, 57 minutes is still within reach for a motivated attacker with cloud resources.&lt;/p&gt;
&lt;h2&gt;What a VDF adds (and why Argon2 isn't enough)&lt;/h2&gt;
&lt;p&gt;I thought this was a pretty clever idea for a while.&lt;/p&gt;
&lt;p&gt;Then I realized I'd missed the point altogether.&lt;/p&gt;
&lt;p&gt;Even with Argon2's parallelism set to 1, each individual computation is single-threaded, but nothing stops an attacker from running thousands of them at once on different path permutations. Duh!&lt;/p&gt;
&lt;p&gt;And with an FPGA, this might be really easy.&lt;/p&gt;
&lt;p&gt;This led me to &lt;a href=&quot;https://blog.trailofbits.com/2018/10/12/introduction-to-verifiable-delay-functions-vdfs/&quot;&gt;Verifiable&lt;/a&gt; [Delay](](&lt;a href=&quot;https://storage.ghost.io/c/a6/22/a6222a4e-2e35-45bd-99bd-553de64e73e7/content/files/2018/601.pdf&quot;&gt;https://storage.ghost.io/c/a6/22/a6222a4e-2e35-45bd-99bd-553de64e73e7/content/files/2018/601.pdf&lt;/a&gt;) &lt;a href=&quot;https://crypto.stanford.edu/~dabo/pubs/papers/VDFsurvey.pdf&quot;&gt;Functions&lt;/a&gt;. A VDF requires a fixed number of truly sequential steps (like repeated squaring in an RSA group) that cannot be parallelized no matter what hardware you throw at them.&lt;/p&gt;
&lt;p&gt;Both Verifiable Delay Functions (VDFs) and Argon2 use deliberate computational effort to secure systems, but they achieve completely different cryptographic goals. VDFs are designed to enforce a strict time delay that cannot be sped up by parallel processing, yet their results can be verified almost instantly. In contrast, Argon2 is a memory-hard key derivation function built to defend passwords against brute-force attacks by making the computation expensive in both time and memory, but verifying an Argon2 hash takes the exact same effort as computing it.&lt;/p&gt;
&lt;p&gt;Don't worry if you're confused too. I needed to ask an AI to explain this to me:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Feature&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Verifiable Delay Functions (VDFs)&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Argon2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Primary Goal&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Delay&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Password hashing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Enforce a &lt;a href=&quot;https://crypto.stanford.edu/~dabo/pubs/abstracts/VDF.html&quot;&gt;prescribed sequential delay&lt;/a&gt; while producing an output that is &lt;a href=&quot;https://crypto.stanford.edu/~dabo/pubs/abstracts/VDF.html&quot;&gt;efficiently and publicly verifiable&lt;/a&gt;; common applications include &lt;a href=&quot;https://crypto.stanford.edu/~dabo/pubs/abstracts/VDF.html&quot;&gt;randomness beacons and leader election&lt;/a&gt;.&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9106.html&quot;&gt;Password hashing&lt;/a&gt; and &lt;a href=&quot;https://github.com/P-H-C/phc-winner-argon2&quot;&gt;password-based key derivation&lt;/a&gt;; RFC 9106 also includes &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9106.html&quot;&gt;proof-of-work applications&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Parallelism&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Sequential&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Parallelizable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://crypto.stanford.edu/~dabo/pubs/papers/VDFsurvey.pdf&quot;&gt;Sequential by design&lt;/a&gt;: the delay function must take time &lt;a href=&quot;https://crypto.stanford.edu/~dabo/pubs/papers/VDFsurvey.pdf&quot;&gt;even on a parallel computer&lt;/a&gt;. Some proof-related work can be parallelized, but the core delay remains the sequential bottleneck.&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9106.html&quot;&gt;Parallelizable by design&lt;/a&gt;: Argon2 aims at &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9106.html&quot;&gt;effective use of multiple computing units&lt;/a&gt;, and its parallelism degree is the &lt;a href=&quot;https://github.com/P-H-C/phc-winner-argon2/blob/master/include/argon2.h&quot;&gt;number of parallel threads&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Resource Bottleneck&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Compute&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Dominated by &lt;a href=&quot;https://crypto.stanford.edu/~dabo/pubs/papers/VDFsurvey.pdf&quot;&gt;sequential serial work&lt;/a&gt;; in common RSA-group VDFs this is repeated squaring, and concrete hardware work focuses on &lt;a href=&quot;https://www.vdfalliance.org/news/open-vdf-asic-introduction&quot;&gt;low latency modular squaring&lt;/a&gt;.&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9106.html&quot;&gt;Memory-hard&lt;/a&gt;: Argon2 is explicitly a &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9106.html&quot;&gt;memory-hard function&lt;/a&gt; with tunable &lt;a href=&quot;https://github.com/P-H-C/phc-winner-argon2/blob/master/include/argon2.h&quot;&gt;memory cost&lt;/a&gt;, plus time and parallelism parameters.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Verification Speed&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Asymmetric&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Symmetric&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://crypto.stanford.edu/~dabo/pubs/abstracts/VDF.html&quot;&gt;Asymmetric&lt;/a&gt;: evaluation requires the delay, while verification is fast; the original paper says its constructions achieve an &lt;a href=&quot;https://crypto.stanford.edu/~dabo/pubs/abstracts/VDF.html&quot;&gt;“exponential gap between evaluation and verification time”&lt;/a&gt;.&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Verification is ordinary &lt;a href=&quot;https://github.com/P-H-C/phc-winner-argon2/blob/master/include/argon2.h&quot;&gt;password checking against an encoded string&lt;/a&gt; containing the &lt;a href=&quot;https://github.com/P-H-C/phc-winner-argon2/blob/master/include/argon2.h&quot;&gt;parameters, salt, and hash&lt;/a&gt;; there is no separate VDF-style succinct proof.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Hardware Resistance&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Parallel processing&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Specialised hardware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Resists &lt;a href=&quot;https://crypto.stanford.edu/~dabo/pubs/papers/VDFsurvey.pdf&quot;&gt;parallel speedup&lt;/a&gt;, but &lt;a href=&quot;https://www.vdfalliance.org/news/open-vdf-asic-introduction&quot;&gt;custom low-latency hardware&lt;/a&gt; can still reduce wall-clock time; that is why VDF hardware projects optimize modular-squaring latency.&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Raises the cost of &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9106.html&quot;&gt;GPU and ASIC attacks&lt;/a&gt; by making attackers pay heavily for memory: the reference implementation says Argon2d is &lt;a href=&quot;https://github.com/P-H-C/phc-winner-argon2&quot;&gt;highly resistant against GPU cracking attacks&lt;/a&gt;, and the spec says Argon2 increases the &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9106.html&quot;&gt;time-area product for ASIC-equipped adversaries&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Replacing Argon2 with a VDF gives an attacker using a Field-Programmable Gate Array (FPGA) a massive advantage. The attacker's objective is not to compute one path faster than the user, but to compute thousands of possible path permutations to discover all active chatrooms. Because standard VDFs have a tiny memory footprint, an attacker can program a single FPGA to house thousands of independent VDF-evaluating circuits without facing a physical memory bandwidth bottleneck.&lt;/p&gt;
&lt;p&gt;I'd just met ArticMine, the Monero developer, at CCC. He'd told me all about their &lt;a href=&quot;https://www.getmonero.org/resources/moneropedia/randomx.html&quot;&gt;RandomX&lt;/a&gt; algorithm that uses &lt;strong&gt;ALL CPU instructions&lt;/strong&gt; making specialised hardware like ASICs pointless.&lt;/p&gt;
&lt;p&gt;I looked at him like &lt;a href=&quot;https://www.nowverybad.com/wp-content/uploads/bill_and_teds_excellent_adventure_still1.jpg&quot;&gt;Bill and Ted look at Rufus&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;&amp;quot;Whoa, you can do that?&amp;quot;&lt;/h2&gt;
&lt;p&gt;That somehow made things click.&lt;/p&gt;
&lt;p&gt;So what about both? Chaining a VDF &lt;em&gt;before&lt;/em&gt; the Argon2 hash? Each permutation would cost real, non-negotiable wall-clock time &lt;em&gt;plus&lt;/em&gt; memory. Two different bottlenecks: single-threadedness and RAM.&lt;/p&gt;
&lt;p&gt;This is one of those beginners' mind things: either it's something useful an outsider sees, or it's completely dumb for reasons I don't understand yet...&lt;/p&gt;
&lt;p&gt;It felt like a weird idea that comes from &lt;a href=&quot;/blog/playing-with-cryptography/&quot;&gt;staring at the properties&lt;/a&gt; of two primitives rather than their intended use cases. They have opposing parallelism models — why would you chain them?  Could you even?&lt;/p&gt;
&lt;p&gt;Later, when I could ask an LLM to run this research for me, I learned people already do:&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://en.wikipedia.org/wiki/Chia_Network&quot;&gt;Chia blockchain&lt;/a&gt; (founded by the creator of Bittorrent, Bram Cohen) did something similar with Proof of Space (storage-hard, like Argon2 is memory-hard) chained with a VDF to prevent attackers from instantly simulating alternate histories. The principle is the same: force the attacker to pay in &lt;em&gt;two different physical resources&lt;/em&gt; that can't substitute for each other. It was an alternative to Proof of Work and Proof of Stake consensus systems.&lt;/p&gt;
&lt;p&gt;The IETF's recent draft &lt;a href=&quot;https://datatracker.ietf.org/doc/html/draft-condrey-rats-pop-protocol-03&quot;&gt;&amp;quot;Proof of Process&amp;quot; protocol&lt;/a&gt; is a way of verifying a document was created by a human, not an AI.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It introduces Proof of Biological Space-Time (PoBST) to enforce temporal monotonicity and Cross-Domain Constraint Entanglement (CDCE) to bind behavioral entropy (human jitter) and physical state (thermodynamics) to the document's evolution.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It combines VDFs with Argon2id specifically to create multi-layered constraints: temporal ordering from the VDF, memory-bandwidth bottlenecking from Argon2.&lt;/p&gt;
&lt;p&gt;So the combination isn't totally novel. What might be novel — or might be naive — is applying it to this specific problem: making path-hash computation expensive enough to deter permutation attacks while staying cheap enough for a single honest user on a phone. The parameters are very different from blockchain consensus, and I haven't found anyone doing exactly this.&lt;/p&gt;
&lt;p&gt;Which either means there's a gap, or there's a reason nobody bothers.&lt;/p&gt;
&lt;p&gt;I might have stumbled on this same cool combination, but I'm no Bram Cohen.&lt;/p&gt;
&lt;h2&gt;Time windows&lt;/h2&gt;
&lt;p&gt;Onto the next problem. Time.&lt;/p&gt;
&lt;p&gt;An attacker can pre-compute hashes at leisure, then wait for people to show up.&lt;/p&gt;
&lt;p&gt;The obvious approach: include the current hour (as hours since epoch) in the hash input. Different hour, different hashes. So an attacker would have to repeat their work every hour.&lt;/p&gt;
&lt;p&gt;But this has two problems. First, the edge case: at 2:01, a hash generated at 1:55 won't match one from 2:05. So, each client needs to compute hashes for both the current and previous hour.&lt;/p&gt;
&lt;p&gt;Second, and more interesting: hours since epoch are predictable. An attacker can still pre-compute next hour's and all of tomorrow's and next year's hashes. It's more work, but still possible.&lt;/p&gt;
&lt;p&gt;This is where I found the &lt;a href=&quot;https://spectrum.ieee.org/nist-quantum-random-number-generator&quot;&gt;NIST Randomness Beacon&lt;/a&gt; — a service that publishes cryptographically random values every 60 seconds.&lt;/p&gt;
&lt;p&gt;By including each minute's beacon value in the hash input, you bind computation to real-world time. The attacker can't run ahead because next minute's value doesn't exist yet.&lt;/p&gt;
&lt;p&gt;It also gives you a sliding window of one hour, adjusting every minute.&lt;/p&gt;
&lt;p&gt;The trade-off: honest users now generate 60 hashes per path segment (one per minute of the sliding window). At two page visits per minute, that's 120 hashes per minute. The Argon2 parameters have to come down to stay feasible on a phone — 64 MB memory, time cost of 1, single-threaded.&lt;/p&gt;
&lt;p&gt;Even with lighter parameters, an attacker trying all 3-page paths across 60 minutes faces 410,400 hash computations at ~700ms each (VDF + Argon2). Roughly 80 hours of sequential work per attempt window.&lt;/p&gt;
&lt;p&gt;Maybe we'd be better off sticking to two one-hour hashes (current and previous) using the NIST on-the-hour beacon value.&lt;/p&gt;
&lt;p&gt;I should note: the NIST beacon is a single point of trust. Alternatives exist — drand, blockchain block hashes — each with its own trust model.&lt;/p&gt;
&lt;p&gt;And again, I ask myself, why not combine a few? Say, &lt;a href=&quot;https://www.drand.love/&quot;&gt;drand&lt;/a&gt;'s beacon and Bitcoin's latest blockhash, for example. The difference in time windows would be an issue, but that's more of an implementation engineering problem than a cryptography one.&lt;/p&gt;
&lt;h2&gt;Finding each other without a server&lt;/h2&gt;
&lt;p&gt;If there were action movies about computer programming, &amp;quot;it's just an engineering problem&amp;quot; is what you'd hear a character say before dying a slow, painful, and totally predictable death.&lt;/p&gt;
&lt;p&gt;Real life brings up real constraints.&lt;/p&gt;
&lt;p&gt;And in real life, all of this is useless without a way to compare hashes. Say each client produces 120 hashes per minute.  They need to find anyone in the network with a match.&lt;/p&gt;
&lt;p&gt;Broadcasting everything to everyone falls apart fast. At 1,000 users, each client would check 120 hashes against 120 × 999 incoming hashes per minute, about 14 million comparisons. At 100,000 users, 1.4 billion.&lt;/p&gt;
&lt;p&gt;Okay, using hourly hashes instead of minutely would help but there'd still be a scaling issue eventually. And the wonderful thing about these nerd-snipe explorations is you can let yourself get recursively nerd-sniped. It led me to more wonderful stuff:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/python/bloom-filters-introduction-and-python-implementation/&quot;&gt;Bloom filters&lt;/a&gt;&lt;/strong&gt; compress a client's hash set into a fixed-size bit array (~8 KB). Instead of broadcasting 120 raw hashes, you broadcast the filter. Other clients test their hashes against it in constant time per check. False positives happen (the filter might say &amp;quot;maybe&amp;quot; when the answer is &amp;quot;no&amp;quot;), but false negatives never do. A potential match triggers a direct hash exchange to confirm.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Domain-hash clustering&lt;/strong&gt; reduces who you talk to. Each visited domain gets hashed, and clients form gossip groups by domain. You only exchange Bloom filters with peers who've visited similar sites in the last hour. If someone hasn't visited any of your domains, they can't share your path. No point exchanging data.&lt;/p&gt;
&lt;p&gt;With both mechanisms, the estimated load at 1,000 users is about 880 KB of bandwidth and 6 seconds of CPU per minute per client. At 100,000 users, assuming gossip reaches about 1,000 relevant peers, roughly 8 MB bandwidth and 60 seconds of CPU. That means the CPU is continuously running on a mobile device, so that's way beyond a practical maximum.&lt;/p&gt;
&lt;p&gt;And clustering means most real scenarios involve far fewer relevant peers. Intuitively, there's a bunch of observability problems this creates.&lt;/p&gt;
&lt;h2&gt;Still more questions&lt;/h2&gt;
&lt;p&gt;Here's where I've left the exploration. I'll have more fun later, and discover new things with these questions:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Bloom filter attack surface.&lt;/strong&gt; Broadcasting Bloom filters across the gossip network might itself create the attack vector. If an AI agent can collect Bloom filters from every cluster, it can test pre-computed hashes against them without ever joining a room — just listening to the gossip layer. The Bloom filter is meant to reduce bandwidth, but it might also reduce the attacker's work. Will domain clustering make this even worse? Do the Bloom filters need their own layer of protection?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gossip bootstrapping.&lt;/strong&gt; The network needs seed nodes. Domain clustering assumes enough users to form meaningful clusters. Won't this create a separate attack surface?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The mobile computation budgeting is way off.&lt;/strong&gt; 120 VDF+Argon2 computations per minute at 700ms each is 84 seconds of work per minute. That's more time than there is in a minute. Something has to give — fewer hashes, lighter parameters, background processing that runs behind real-time. Or probably a fundamentally different approach to the time windows.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;VDF implementation is non-trivial.&lt;/strong&gt; RSA-based VDFs require a trusted setup. Getting this wrong doesn't just reduce security — it can break the whole construction. I've participated in various ceremonies before, but just as a good citizen. This is another category I can explore with a fun use case driving my curiosity.&lt;/p&gt;
&lt;p&gt;I'm deep in the Dunning-Kruger well. I'm a coder that learns about cryptography as a black box (though I like to rip open the box and poke at the math to try to understand it.) So when something feels easy, alarm bells ring.&lt;/p&gt;
&lt;p&gt;If you see something wrong, I'd genuinely like to know.&lt;/p&gt;
&lt;h2&gt;Silly, but it matters&lt;/h2&gt;
&lt;p&gt;There's a dystopian version of the internet where every space is indexed by default — where walking through content leaves traces that get aggregated, correlated, sold, trained on models that are used against us. I think we're in that timeline.&lt;/p&gt;
&lt;p&gt;Ephemerant is an experiment in the opposite direction: spaces that exist only because of shared movement, that dissolve when the movement passes, that can't be mapped by anyone who wasn't walking the same path.&lt;/p&gt;
&lt;p&gt;The engineering is hard. The attack model is unforgiving. The math might not work (yet). But the core idea feels like something worth building toward: that shared experience could produce shared secrets, without anyone in the middle.&lt;/p&gt;
&lt;p&gt;The finite game is getting the cryptography right.&lt;/p&gt;
&lt;p&gt;The infinite game is enabling the people who share a path to be the only ones who decide on it.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>The Third Floor at ethBerlin</title>
    <link>https://voboda.com/blog/the-third-floor-at-ethberlin/</link>
    <guid isPermaLink="true">https://voboda.com/blog/the-third-floor-at-ethberlin/</guid>
    <pubDate>Sat, 28 Mar 2026 12:03:00 GMT</pubDate>
    <description>&lt;p&gt;ethBerlin is full of rooms you have to find yourself.&lt;/p&gt;
&lt;p&gt;At the back of the third floor there's a big, quiet room with good light and big windows. You can really focus here. The food's a long way off, so people bring back fruit and water to share.&lt;/p&gt;
&lt;p&gt;I'm there with SDP — Social Dist0rtion Protocol — making one of their treasure hunt games for the hackathon. Ronan's beside me. He made hardhat-deploy. He regularly does things with Solidity that nobody else thought possible, and he wins hackathons the way some people finish crosswords. I'm the opposite: a novice, learning to code again after years away. We became friends because we both stubbornly choose Svelte over React.&lt;/p&gt;
&lt;p&gt;One of the hackathon tracks is &amp;quot;meta&amp;quot; — hack the hackathon itself. So I find Ligi, one of the organisers, and ask him: what's the one thing that's been bugging you since last year?&lt;/p&gt;
&lt;p&gt;His answer: they're stuck on a Google Calendar backend. Again.&lt;/p&gt;
&lt;p&gt;They know they want open, privacy-respecting calendars, but they're locked in, and changing platforms always gets pushed back for the constant urgencies you deal with.&lt;/p&gt;
&lt;p&gt;So I start building an anonyming calendar frontend thing with Zupass, the ZK ticketing platform, gating access. Three days of fighting JavaScript. Zupass is built for React. Svelte is ESM, and the CJS/ESM incompatibilities in Zupass are brutal — so I have to cut into it, finding the pieces I need to pull out.&lt;/p&gt;
&lt;p&gt;At one point I've been stuck for hours on a module problem I'm too embarrassed to ask for help with. Especially not Ronan who's sat beside me— the man builds frameworks for fun. But during a casual check-in, he clocks that I'm stuck and just helps.&lt;/p&gt;
&lt;p&gt;I meet a dad on the third floor. I have a new baby at home. He tells me about Diaper Free — blows my mind. We talk about parenting between hacking sessions. At one point, he helps me find something in Zupass too.&lt;/p&gt;
&lt;h2&gt;Five Minutes Left&lt;/h2&gt;
&lt;p&gt;Between running the SDP game and hacking, I'm up for three days straight. Pretty sure this is only possible because of my new dad superpowers.&lt;/p&gt;
&lt;p&gt;We get down to the final hours. I joke to Ronan: &amp;quot;you're gonna end up making a new framework instead of shipping your game.&amp;quot; He grins. He'd actually done exactly that.&lt;/p&gt;
&lt;p&gt;We say: let's just submit whatever we've got. Neither of us think we have a hope, but at least we'll have a record that says we were here.&lt;/p&gt;
&lt;p&gt;I've been peeling back Zupass's abstraction layers all weekend. With an hour left, I decide to cut to the root. Implement PSE's Semaphore library directly. Clean. It works. Just no UX.&lt;/p&gt;
&lt;p&gt;A minute left. I don't have a name. I tell Ronan. He looks at me, in a French way, and says in his French accent: &amp;quot;well Zkal of course, with a zk.&amp;quot;&lt;/p&gt;
&lt;p&gt;I'm chatting with friends at the auditorium door when my name gets called. I place first in the meta track and I don't believe it.  When I walk to the stage, I feel like I'm tuning into someone else's body from another dimension.&lt;/p&gt;
&lt;p&gt;Then the dad's team wins a prize for their social game.&lt;/p&gt;
&lt;p&gt;And Ronan wins in smart contracts.  Of course he does.&lt;/p&gt;
&lt;p&gt;I genuinely wanted to make something useful for DoD, not win a hackathon. So I commit to getting it done.&lt;/p&gt;
&lt;p&gt;The hackathon wraps up. DoD does rounds, doing shots with the hackers. I catch a conversation with Afri, another organiser, worried about the no-show problem — how competitive side events and RSVP inflation had even affected ethBerlin that year.&lt;/p&gt;
&lt;p&gt;Then I go home. New baby. Difficult situation. A bunch of logistics collapsing at once. Zkal stays a priority in my head, but time is a thing I don't have.&lt;/p&gt;
&lt;h2&gt;That Slow Squeek is The Sound of Doors Closing&lt;/h2&gt;
&lt;p&gt;We stay in touch. Each time something shifts, I reach out to Ligi, take on the new direction. Their calendar privacy problem evolves into the RSVP problem — no-shows are ruining blockchain weeks everywhere.&lt;/p&gt;
&lt;p&gt;But the doors start closing, one by one. I can't make it to Thailand for Devcon. Part of my prize was a ticket. Ligi had wanted to use Zkal there. That stings doubly.&lt;/p&gt;
&lt;p&gt;At another point, Ligi asks for Bluesky integration. Somehow.&lt;/p&gt;
&lt;p&gt;This whole time, I know I need to carve out reliable, regular time every weeo to take responsibility for a real app. When I finally have it, it's almost a year later. I check in with Ligi.&lt;/p&gt;
&lt;p&gt;Is this still useful?&lt;/p&gt;
&lt;p&gt;He says yes, let's talk at CCC.&lt;/p&gt;
&lt;p&gt;So I get to work.&lt;/p&gt;
&lt;p&gt;The calendar idea has grown into something else. A real answer to the RSVP Problem. &lt;a href=&quot;/blog/designing-for-both-privacy-and-transparency/&quot;&gt;A whole cryptography architecture.&lt;/a&gt; An indexing system for events to have a public quality signal — a score built from how many attendees have real attendance history — without anyone's identity touching the public layer.&lt;/p&gt;
&lt;p&gt;But the Zupass dev channels are a ghost town. Docs are out of date — they're building a new POD2 library. I dig into the codebase myself, trace the paths I need through 50k lines of code.&lt;/p&gt;
&lt;p&gt;I push through because DoD matters.&lt;/p&gt;
&lt;p&gt;At CCC, Ligi tells me they might bring DWebCamp to Berlin instead of doing ethBerlin this year. He sees Zkal as the schedule layer.&lt;/p&gt;
&lt;p&gt;A few months later: the DWebCamp organisers are against it. They're embedded in centralised platforms — sched.com, Google Docs. DoD's hands are already full making the collaboration work with Pretix and Cryptpad.&lt;/p&gt;
&lt;p&gt;DWebCamp is a five-day glamping event with ticket prices to match.  When people pay, the RSVP problem solves itself. At least for the organisers of the paid event. If you paid 800 EUR for a ticket, you're not likely to flake out.&lt;/p&gt;
&lt;p&gt;It's the right move for DoD. New opportunities for DWeb and Berlin. Plus, they've been burning hard for years, holding together a community that matters to the whole ecosystem.  This helps share the load.&lt;/p&gt;
&lt;p&gt;The downside is that a lot of the regular ethBerlin community won't be able to afford it.&lt;/p&gt;
&lt;p&gt;And the RSVP problem Zkal was built to solve isn't a DoD problem anymore.&lt;/p&gt;
&lt;p&gt;I figure I've worked on this seriously for almost half a year, I should give it one last shot.  I get on a plane to Berlin for the DWebCamp setup event, an unconference.&lt;/p&gt;
&lt;p&gt;Besides, I just want to give back to DoD, and I can see they've still go so much on their plates.  I've run lots of unconferences before, and I see signs their prep isn't happening, so I offer to help. Even to organise it if they need.&lt;/p&gt;
&lt;h3&gt;A lucky break&lt;/h3&gt;
&lt;p&gt;A DoD organiser reaches out on Matrix, and through the conversation I realise — she's from the same team as the dad from the third floor. The one who told me about Diaper Free. The people I'd hacked alongside, whose Devconnect tickets I'd shared when I won more than I needed.  It turns out they later built Meerkat — a Zupass-based Q&amp;amp;A system.&lt;/p&gt;
&lt;p&gt;There's one problem that was nagging at me. The whole system runs on attendance history, and at launch, nobody has any.  My ideas all revolved around DoD and other event organisers bootstrapping old attendance history.&lt;/p&gt;
&lt;p&gt;But if someone participated in Q&amp;amp;A at any Ethereum talk in the last two years, Meerkat could have the historical attendance proofs zkal needed.&lt;/p&gt;
&lt;h3&gt;Back to Berlin&lt;/h3&gt;
&lt;p&gt;I get invited to help run the unconference the day before, while I'm packing my bags for the airport.&lt;/p&gt;
&lt;p&gt;At the unconference post-drinks, I'm thinking about something Ligi had mentioned earlier that day: that zkal could improve the unconference part of DWebCamp.  I try to talk to a DWeb team member about what they actually use in sched.com — which features matter, what I should be thinking about. He'd turned up after the unconference, not realising I'd helped see it through.&lt;/p&gt;
&lt;p&gt;He waves me off. Says they're going with Pretix, too many competing services to look at. There are other people he clearly wants to meet so the conversation dies. He's not listening when I explain the reason they're going with Pretix is Ligi, that he also asked me for zKal — or that zKal could work as a Sched replacement compatible with Pretix.&lt;/p&gt;
&lt;p&gt;A few days after the unconference, Ligi finally has time to catch up with me about zkal, and sees everything that's been built. The DWeb collab is already straining with DoD's use of decentralised tooling. But zkal could replace their centralised form system for the Berlin Blockchain Week site.&lt;/p&gt;
&lt;p&gt;He just needs to bring that to others at DoD.&lt;/p&gt;
&lt;p&gt;He says he'll get back to me.&lt;/p&gt;
&lt;p&gt;That was almost a month ago.&lt;/p&gt;
&lt;h2&gt;Nice-to-Have&lt;/h2&gt;
&lt;p&gt;I know it's nothing personal, and I know I missed my chance to respond their needs at first, but also I can't ignore the facts.&lt;/p&gt;
&lt;p&gt;Organising events and communities is demanding, and &amp;quot;fix our calendar&amp;quot; never quite gets the time it needs between all the rest.&lt;/p&gt;
&lt;p&gt;But the RSVP problem persists. The people in the woods at DWebCamp won't feel it. Everyone else at Berlin Blockchain Week will.&lt;/p&gt;
&lt;p&gt;Cypherpunk™ is now gentrified. An empty aesthetic. The corpo Blade Runner vibe is a punk rock jacket at H&amp;amp;M.&lt;/p&gt;
&lt;p&gt;Most &amp;quot;privacy&amp;quot; events are run on centralised platforms with shitty T&amp;amp;Cs (&lt;em&gt;cough&lt;/em&gt; Luma &lt;em&gt;cough&lt;/em&gt;), promoting speakers with bios on X.&lt;/p&gt;
&lt;p&gt;Their talk just doesn't match their walk.&lt;/p&gt;
&lt;p&gt;They actually push privacy-interested people into the surveillance graph, by forcing them to engage in those tools to participate.&lt;/p&gt;
&lt;p&gt;But they play the hype game well, to position themselves as leaders.&lt;/p&gt;
&lt;p&gt;The community that actually leads pro-privacy tooling &lt;strong&gt;in practice&lt;/strong&gt; is getting pushed to the fringes.&lt;/p&gt;
&lt;p&gt;We know there's no need -- and no excuse -- for Luma and Discord if you're a privacy advocating event.&lt;/p&gt;
&lt;p&gt;I'm worried we'll disintegrate now, without ways to find each other.&lt;/p&gt;
&lt;h2&gt;Better Games&lt;/h2&gt;
&lt;p&gt;I'm talking to a friend at SDP. SDP are the crew doing the treasure hunt games with at ethBerlin, back when this whole thing started.&lt;/p&gt;
&lt;p&gt;We're looking at zkal and the idea of calendars for blockchain week that surface small focused meetups through verified attendance — and something clicks.&lt;/p&gt;
&lt;p&gt;Finding the right events is a treasure hunt, it just doesn't feel fun right now.&lt;/p&gt;
&lt;p&gt;You know how etherscan.deth.net works? Take any etherscan.net contract link, add &lt;code&gt;deth.&lt;/code&gt; in the domain, and you get an IDE with the contract loaded.&lt;/p&gt;
&lt;p&gt;What if you could do that with Luma?&lt;/p&gt;
&lt;p&gt;Take any &lt;code&gt;luma.com&lt;/code&gt; event link, swap in a shadow domain, and get a page listing companion meetups — the focused, ten-person-at-a-bar gatherings that the main event doesn't care about.&lt;/p&gt;
&lt;p&gt;You can also use your Meerkat proofs, and more hidden meetups reveal themselves.&lt;/p&gt;
&lt;p&gt;The people who've been showing up to related things get first access. Everyone else can see how many verified attendees have already committed. Berlin Blockchain Week becomes a game of discovering the rooms that matter to you, not an over-stuffed fomo calendar.&lt;/p&gt;
&lt;p&gt;It doesn't need to be championed through DoD channels. Doesn't need anyone's permission. A game that solves the RSVP problem by making finding the right room fun.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;/blog/designing-for-both-privacy-and-transparency/&quot;&gt;architecture&lt;/a&gt; is there. The concept needs collaborators — people who run meetups in Berlin, people who've never hosted but care about a topic enough to book a table at a restaurant for people to trade notes on it. I've organised plenty of meetups. I'll personally support anyone who wants to try.&lt;/p&gt;
&lt;h2&gt;Third Floors For Everyone&lt;/h2&gt;
&lt;p&gt;I keep coming back to the third floor.&lt;/p&gt;
&lt;p&gt;How we shared fruit because the food was far away. How Ronan helped me with a problem I was too proud to ask about. How a conversation about diapers turned out, a year later, to be the missing piece.&lt;/p&gt;
&lt;p&gt;That's what good community infrastructure produces. Not the serendipity itself — the conditions for it. DoD created those conditions by carefully creating an accessible space, and inviting a high density of like-minded people into it.&lt;/p&gt;
&lt;p&gt;zkal can still help people build those conditions at a small scale, around topics that matter to them.&lt;/p&gt;
&lt;p&gt;There won't be an ethBerlin this year, but we can still create the same rooms.&lt;/p&gt;
&lt;p&gt;Whether it works depends on whether enough people want the same thing.&lt;/p&gt;
&lt;p&gt;I think they do. I just need help to find them.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Why does 2600 need St. John's?</title>
    <link>https://voboda.com/blog/does-2600-need-st-johns/</link>
    <guid isPermaLink="true">https://voboda.com/blog/does-2600-need-st-johns/</guid>
    <pubDate>Tue, 23 Dec 2025 08:06:00 GMT</pubDate>
    <description>&lt;p&gt;It might seem strange that St. Johns University is evicting the &lt;a href=&quot;https://2600.com/&quot;&gt;2600&lt;/a&gt;'s conference after years of collaboration.&lt;/p&gt;
&lt;p&gt;I met Mitch Altman at a small soldering workshop I randomly found at my co-working space.  I didn't know he was kind of a hacker celebrity.&lt;/p&gt;
&lt;p&gt;We spent that afternoon walking around the city.  He told me about &lt;a href=&quot;https://en.wikipedia.org/wiki/Chaos_Communication_Congress&quot;&gt;CCC&lt;/a&gt;, encouraged me to share my work as a talk.&lt;/p&gt;
&lt;p&gt;We talked about getting bullied at school. I told him about when I was a teenager, convincing my parents to let me bus across the city to a mall food court where the 2600 meetup happened. I'd sit with trenchcoat-wearing nerds, with their schematics and Cinnabons, catching maybe half of what was discussed. But they gave me tips, encouraged me to start my BBS.&lt;/p&gt;
&lt;p&gt;That's 2600. They show up, they teach whoever wants to learn, they're kind to strangers. When I finally made it to CCC years later, Mitch didn't remember me—he meets thousands of people. But he was still the same warm and kind man, respecting this other soul standing in front of him.&lt;/p&gt;
&lt;p&gt;This is the community that St. John's has decided to evict? Why?&lt;/p&gt;
&lt;p&gt;Their official reason was &amp;quot;alignment with values and mission.&amp;quot;&lt;/p&gt;
&lt;h2&gt;It started when &lt;a href=&quot;https://2600.com/content/hope-conference-banned-st-johns-university&quot;&gt;someone complained about a pamphlet left on a table by a random conference attendee&lt;/a&gt;.&lt;/h2&gt;
&lt;p&gt;They didn't complain to 2600, they went straight to the university president. After years of collaboration, the university didn't contact 2600, instead apparently doing a secret investigation where the accused couldn't defend themselves, then pointing fingers based on vague, moral accusations.&lt;/p&gt;
&lt;p&gt;Most people would accept if St. John's just said: &amp;quot;We're a religious institution, some leaders got uncomfortable with some of the edgier elements that 2600 attracts, so we're deciding to part ways.&amp;quot; That's at least honest.  Instead of this, we'd be celebrating the years of St. John's support.&lt;/p&gt;
&lt;h2&gt;I doubt it was actually about 2600 at all.&lt;/h2&gt;
&lt;p&gt;Many universities have gutted great programs with weak reasons. The sad truth: they're collateral damage from internal power struggles.&lt;/p&gt;
&lt;p&gt;St. John's cancelled &lt;a href=&quot;https://www.torchonline.com/news/2025/10/15/2025-tip-off-cancelled/&quot;&gt;their fun basketball event&lt;/a&gt;, and &lt;a href=&quot;https://www.campusreform.org/article/st-johns-university-sparks-controversy-abolishing-columbus-day-recognition/26589&quot;&gt;Columbus Day&lt;/a&gt;, not just 2600's conference. Three major cancellations in a year? Smells like political fallout.&lt;/p&gt;
&lt;p&gt;We've all seen how protests are discredited by planting violent agitators, or taking things out of context.  Same playbook. The pamphlet was just convenient pretext.&lt;/p&gt;
&lt;p&gt;The real reason is probably one provost accidentally hit reply-all with a snarky comment last year, started a feud, and they've been cancelling each other's favorite events ever since.  The poor communication liaison has to write it up as &amp;quot;for student engagement&amp;quot; and &amp;quot;alignment with values&amp;quot;.&lt;/p&gt;
&lt;p&gt;I kid you not. This happens &lt;a href=&quot;/blog/healthy-forks/&quot;&gt;all the time&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Whether it's infighting, lack of due process, or just letting their fears get the better of them, St. John's methods are theirs to reflect on.&lt;/p&gt;
&lt;h2&gt;The problem worth solving for us is that 2600 is having trouble shifting venues.&lt;/h2&gt;
&lt;p&gt;Hosting can be cut off for many other reasons - renovations, financial trouble, leadership changes. Maybe the administration building gets destroyed in fire and brimstone one day.  Who knows.&lt;/p&gt;
&lt;p&gt;Universities (at least good ones) compete for access to communities of practice.&lt;/p&gt;
&lt;p&gt;In London, UCL, Imperial, and Kings actively seek out technical specialty groups. Oxford and Cambridge have such a rivalry they'd compete for something like this.  Go tell a Cambridge prof about a great event at Oxford, and you'll get a lesson in how the British do polite insults.&lt;/p&gt;
&lt;p&gt;Student bodies benefit from learning from people at the forefront of their fields. Universities want what 2600 does.&lt;/p&gt;
&lt;p&gt;And here's 2600 in New York, a city full of great universities.&lt;/p&gt;
&lt;h2&gt;I'd love to see 2600 answer with what it already does best: community.&lt;/h2&gt;
&lt;p&gt;Student clubs hosting cool meetups across New York campuses, with 2600 help. 2600 workshops on digital health, cybersecurity, the things they've been teaching for decades. It'd show which clubs and faculties get excited, which are organized enough to &lt;em&gt;literally&lt;/em&gt; open doors.&lt;/p&gt;
&lt;p&gt;With active relationships with multiple universities, the &lt;a href=&quot;/blog/node-connector-perspective/&quot;&gt;frame&lt;/a&gt; shifts from &amp;quot;we need to find a venue&amp;quot; to &amp;quot;which university makes the most sense this year?&amp;quot;&lt;/p&gt;
&lt;p&gt;The big HOPE conference could even rotate campuses, reaching more student communities.&lt;/p&gt;
&lt;p&gt;Mitch gave an afternoon to a stranger. 2600s encouraged a kid to keep going. That person's here now, giving that encouragement back. The universities know they need you. You're already doing all the right things.&lt;/p&gt;
&lt;p&gt;This isn't a setback, it's a dislodgement towards something better. HOPE is getting an upgrade.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Federated systems need better affordances</title>
    <link>https://voboda.com/blog/better-affordances-for-federated-systems/</link>
    <guid isPermaLink="true">https://voboda.com/blog/better-affordances-for-federated-systems/</guid>
    <pubDate>Fri, 19 Dec 2025 14:16:00 GMT</pubDate>
    <description>&lt;p&gt;Ploum wrote about PixelFed &lt;em&gt;&lt;a href=&quot;https://ploum.net/2025-12-04-pixelfed-against-fediverse.html&quot;&gt;sawing off the branch that the Fediverse is sitting on&lt;/a&gt;&lt;/em&gt;. He describes a kind of misuse of the protocol: PixelFed only delivers posts with images to followers.&lt;/p&gt;
&lt;p&gt;This is arguably a response to Instagram, but he makes a good point:&lt;/p&gt;
&lt;h2&gt;In the Fediverse, if a poster publishes text, they expect followers to receive that message.&lt;/h2&gt;
&lt;p&gt;Followers likewise expect to receive posts, but they might not realize they're only receiving posts with images.&lt;/p&gt;
&lt;p&gt;Ploum argues this means the Fediverse should have certain approaches to moderation to prevent such protocol violations.&lt;/p&gt;
&lt;p&gt;But there's a deeper problem than respecting the protocol or determining appropriate moderation.&lt;/p&gt;
&lt;h2&gt;The fundamental issue is the assumption that users have a moral obligation that matches the app or protocol creator's intentions.&lt;/h2&gt;
&lt;p&gt;I'm not talking about political ideology. I'm talking about something more mundane.&lt;/p&gt;
&lt;p&gt;With ActivityPub's federated server architecture, we place the moral obligation on the user to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Find a server&lt;/li&gt;
&lt;li&gt;Participate in the decentralized aspects of the system&lt;/li&gt;
&lt;li&gt;Understand the system's implications&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What actually happens?&lt;/h2&gt;
&lt;p&gt;Most people sign up to the big main server. They're not immoral. We've just  designed these systems to imitate the centralized ones they're used to.&lt;/p&gt;
&lt;p&gt;Their expectations come along with that imitation. They expect to sign up quickly, and get their toots a-tootin'!&lt;/p&gt;
&lt;p&gt;We developers saw centralized systems and recognized we needed decentralized backends to make the world better. I absolutely believe that's true.&lt;/p&gt;
&lt;h2&gt;But we didn't take responsibility for going farther than that.&lt;/h2&gt;
&lt;p&gt;When we talk about &lt;em&gt;respecting the protocol&lt;/em&gt;, we're talking about respecting a set of affordances that we haven't modified from the centralized systems themselves.&lt;/p&gt;
&lt;h2&gt;We need to design new affordances for decentralised social.&lt;/h2&gt;
&lt;p&gt;To be clear in my language, from the point of view of affordance theory:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Affordances:&lt;/strong&gt; When you present a person with an object, they can look at it, interact with it, and learn what's possible. You can look at something and know if it's liftable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Signifiers:&lt;/strong&gt; These tell you &lt;em&gt;how&lt;/em&gt; to use an affordance. We see these in design systems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A box with a single handle on top signifies: lift with one hand&lt;/li&gt;
&lt;li&gt;A box with two hand-shaped holes on either side signifies: heavier, lift with both hands&lt;/li&gt;
&lt;li&gt;A hamburger menu (three lines) signifies: there's a menu under here&lt;/li&gt;
&lt;li&gt;A heart under something indicates everyone will see a heart-count go up.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When we look at what went wrong with centralized systems that we wanted to avoid, much of it comes down to misuse of user data, but I think more so:&lt;/p&gt;
&lt;h2&gt;Centralised systems encourage users to behave badly for themselves&lt;/h2&gt;
&lt;p&gt;For example, what happens when you have followers and follower counts?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;People want to raise that number&lt;/li&gt;
&lt;li&gt;You get large controlling accounts&lt;/li&gt;
&lt;li&gt;You magnify the divide between people who speak and people who consume&lt;/li&gt;
&lt;li&gt;You get influencers&lt;/li&gt;
&lt;li&gt;You get people paying influencers to gain access to their followers and reputation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It all stems from the follower count. From the &lt;strong&gt;visibility placed&lt;/strong&gt; on knowing who your followers are, being able to enumerate them—even if you remove the number.&lt;/p&gt;
&lt;h2&gt;Medium was Ev's answer to Twitter's user behavior&lt;/h2&gt;
&lt;p&gt;We needed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;More discourse&lt;/li&gt;
&lt;li&gt;People able to express nuanced and complicated thoughts&lt;/li&gt;
&lt;li&gt;So, long form content&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Otherwise, we'd fall into retweeting headlines without reading anything.&lt;/p&gt;
&lt;p&gt;But that happened anyway.  Medium inherited all the other problems. Not only followers, but also the title, the headline.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What did we get?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Playing to the world of writing good headlines&lt;/li&gt;
&lt;li&gt;The rise of Buzzfeed-style &amp;quot;one weird trick&amp;quot; headlines&lt;/li&gt;
&lt;li&gt;Social media bubbles and the negative effects on political discourse&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To be fair, this wasn't just Medium.  This was during the rise of Facebook and Open Graph.&lt;/p&gt;
&lt;p&gt;But Medium, in spite of trying to do better, chose affordances that reinforced this pattern:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;People retweet/reshare a headline that makes them angry&lt;/li&gt;
&lt;li&gt;They believe it because it matches things they already believe&lt;/li&gt;
&lt;li&gt;They share immediately without reading the article&lt;/li&gt;
&lt;li&gt;Others receive it with social proof: &amp;quot;If this person is sharing it, it must be valid&amp;quot;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Headlines will spread faster than anything else in the protocol. We can't control that.&lt;/p&gt;
&lt;p&gt;This isn't a one-sided political problem.  It's a problem of the networks we choose, the communication networks, and the affordances and signifiers we choose to participate with.&lt;/p&gt;
&lt;p&gt;As app developers, they're affordances that &lt;strong&gt;we choose to recreate&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;ActivityPub set up an alternative to centralized systems and solved a lot.&lt;/p&gt;
&lt;h2&gt;But decentralising isn't enough.&lt;/h2&gt;
&lt;p&gt;Ploum argues you should follow the protocol in its entirety because that's the user's expectation. There's undeniable truth to that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We should do right by users' expectations.&lt;/li&gt;
&lt;li&gt;We shouldn't mislead them.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Are we making it the user's responsibility when it's ours?&lt;/h2&gt;
&lt;p&gt;Our sign-up mechanics don't reflect the ease of expectations users have for signing up, combined with the difference of &amp;quot;go find yourself a community that is a server.&amp;quot;&lt;/p&gt;
&lt;p&gt;We're asking them  behave in ways where the integrity of the system depends on doing something, but giving them ambiguous directions.&lt;/p&gt;
&lt;p&gt;We've also put the onus on server operators, who, if we're being honest, are second-class citizens in the ActivityPub world. It is not easy to run Fediverse servers. We haven't put the same effort into making it turnkey to run servers cheaply and without maintenance as we have into being a user.&lt;/p&gt;
&lt;h2&gt;Yet our decentralization properties completely depend on these.&lt;/h2&gt;
&lt;p&gt;When I compare different networks—ActivityPub, Bluesky, Nostr, Farcaster—you see quite different decentralization properties. You have a different way of putting the onus on the user in each case.&lt;/p&gt;
&lt;p&gt;We start by recreating the signifiers users are used to, because that's how they know &amp;quot;this is like that other thing&amp;quot;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We make it look like Twitter with a like and a retweet&lt;/li&gt;
&lt;li&gt;Or like Instagram with images&lt;/li&gt;
&lt;li&gt;Or like TikTok with swipeable videos&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Those signifiers tell users:&lt;/strong&gt; &amp;quot;Here's a handle on top. You can lift it with one hand.&amp;quot; We're telling users to expect the same thing.&lt;/p&gt;
&lt;p&gt;The signifiers are the same. And so are most of the affordances, just with an extra aspect of decentralization added that they don't really understand yet.&lt;/p&gt;
&lt;h2&gt;Have we done the full steps of changing the design toward the behavior we're aiming for?&lt;/h2&gt;
&lt;p&gt;Back to Medium, I've always been interested in: &lt;strong&gt;What does long-form writing look like without the problematic affordances?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A though experiment. What if:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There are no titles or headlines&lt;/li&gt;
&lt;li&gt;There is no &amp;quot;list of headlines&amp;quot; or &amp;quot;card with title and description.&amp;quot; These fields don't exist at the protocol level. (You can use headings in what you write, but they're no longer a special feature.)&lt;/li&gt;
&lt;li&gt;The interface is simply a feed of streams of consciousness writing, one post after the next&lt;/li&gt;
&lt;li&gt;The only way you could refer to somebody is quote them&lt;/li&gt;
&lt;li&gt;You don't separate &amp;quot;comment&amp;quot; from &amp;quot;post&amp;quot; in your underlying ontology&lt;/li&gt;
&lt;li&gt;You just say &amp;quot;here's where you've been quoted, go read&amp;quot;&lt;/li&gt;
&lt;li&gt;You're dropped into a stream of consciousness&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sure, you'd see lots of people just taking a quote and sharing the quote without context.&lt;/p&gt;
&lt;p&gt;The only way you know somebody has interacted with you is they've quoted you. They quote this and they keep writing.&lt;/p&gt;
&lt;h2&gt;Now we don't have followers in the same sense.&lt;/h2&gt;
&lt;p&gt;You could still follow people and follow their streams of consciousness, but:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No follow count. No list of follows. It's not the obvious target or game for people to play.&lt;/li&gt;
&lt;li&gt;Discovery isn't through a reshare, it's through quoting.&lt;/li&gt;
&lt;li&gt;Similarly, the only way for you to see that people are reading your stuff is that they quoted you, or emailed you.&lt;/li&gt;
&lt;li&gt;It encourages a different kind of writing. Share your thoughts and move on.  You don't even need to think in &amp;quot;full posts&amp;quot;, which is freeing.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;There are better affordances &lt;em&gt;asking&lt;/em&gt; to be protocolized.&lt;/h2&gt;
&lt;p&gt;We see bloggers everywhere, asking for &lt;a href=&quot;https://manuelmoreale.com/thoughts/how-to-converse-online&quot;&gt;replies by email&lt;/a&gt;. They don't want to &amp;quot;build engagement&amp;quot; but actually just meet interesting people and get into genuine conversations. They want &lt;a href=&quot;https://manuelmoreale.com/thoughts/blogs-don-t-need-to-be-so-lonely&quot;&gt;to be in relation with each other&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So, what if our Medium Without The Mistakes simply allowed that instead?  Private replies. Co-authored feeds. Let those affordances lead.&lt;/p&gt;
&lt;p&gt;This could give rise to very different communication, something more personal and less performative.&lt;/p&gt;
&lt;p&gt;I shared this with Manu (linked above, who also &lt;a href=&quot;https://manuelmoreale.com/thoughts/on-open-protocols&quot;&gt;responded to Ploum&lt;/a&gt; and he pointed out that the profile and feed themselves are the problem. He contrasted forums, which put our attention on discussion threads, not profiles and feeds.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Sure, you technically did have a profile page on forums, but I suspect most people never even bothered checking them. Because your profile on a forum wasn’t really relevant in the context of that digital space. You learned about people through discussions. You see the same usernames popping up and over time you learn things about them.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Every interaction has a well defined starting point and it’s not just one big stream. Plus discussions on forums could stretch for weeks and months and sometimes even years.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This was said in a broader context: Manu was making a case that social media itself isn't healthy.  I asked him how he considers his blog being different from Medium.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;RSS is entirely personal and private. You make your feed. There’s no vitality inside an RSS feed. There’s no reposting, no boosting, no metric driven surfacing of content. You get everything that’s posted and that’s it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This leads right back to the question: which affordances are we reproducing?&lt;/p&gt;
&lt;p&gt;If we choose to take away just one things, say images or reshares, that's a different set.  A different kind of object we're providing. A different animal that encourages different behaviour. But we can't just focus on the one feature we're adding or dropping, it's the aggregate of capabilities we're making possible for that matters.&lt;/p&gt;
&lt;p&gt;We're not just decentralising, our goal is deeper: making deeply user-centric alternatives for pro-social behavior.&lt;/p&gt;
&lt;p&gt;If we're thinking terms of effects on psychology and individual relationships that we create, that means responsibility for set of affordances we provide.&lt;/p&gt;
&lt;p&gt;That's how we'll get the world we're building this stuff for.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Volunteering at the Critical Decentralisation Cluster</title>
    <link>https://voboda.com/blog/volunteer-cdc-39c3/</link>
    <guid isPermaLink="true">https://voboda.com/blog/volunteer-cdc-39c3/</guid>
    <pubDate>Thu, 18 Dec 2025 06:58:00 GMT</pubDate>
    <description>&lt;h2&gt;*➡️ tldr We need help to operate the CDC! &lt;a href=&quot;https://notes.infinite.build/s/3_w2D_kru&quot;&gt;Please volunteer here&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Last year's &lt;a href=&quot;https://events.ccc.de/category/39c3/&quot;&gt;CCC&lt;/a&gt; was beautiful chaos. At the &lt;a href=&quot;https://decentral.community/39C3/&quot;&gt;CDC Habitat&lt;/a&gt;, &lt;code&gt;dllud&lt;/code&gt; and &lt;code&gt;parasew&lt;/code&gt; from &lt;a href=&quot;https://riat.at/&quot;&gt;RIAT&lt;/a&gt; spun a hurricane together: coordinating 46 talks, a workshop track, 15 assemblies cat herded, thousands of people finding their way through the habitat each day, more watching on streams. With a handful of helpers, they made it work, but it was heavy on everyone.  Constant pinballing from one need to the next.&lt;/p&gt;
&lt;p&gt;When everybody showed up to help with teardown, we felt the love! This year, we'd like to distribute that support across all four days.  Many hands will make for light work.&lt;/p&gt;
&lt;p&gt;I'm hoping we can give the guys more of an orchestra conductor's position. Guiding the music. Coordinating instead of reacting. Having time to eat!&lt;/p&gt;
&lt;h2&gt;How you can help&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;👷🏾 Habitat Build/Teardown&lt;/strong&gt;
Our conductors will have just driven a van from Vienna with the habitat kit. Instead of them chasing people around after a long trip, we'll try a queue of volunteers ready for tasks. An MQ but for helping hands! Show up, get directed, complete task, repeat.  A lot of the tasks are little puzzles. A fun way to make friends.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;During CCC, there are a few shifts we need covered each day:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;🧑🏽‍💻 Info Desk&lt;/strong&gt;
Review the day's schedule, read about the assemblies, know where they are. And then, hang out at the desk and let people approach you.  The few questions that come up often turn into nice little conversations.  I met some really interesting people at the Infodesk last year.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;📽️ Stage Technician&lt;/strong&gt;
Keep the stage and streaming running, help speakers plug in laptops, make sure audio works before talks start.  We'll show you through the setup. It's really just monitoring and  occasional troubleshooting. Some AV experience useful.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;💝 CDCB (Critically Decentralized Care Bear)&lt;/strong&gt;
Circulate and make sure everyone's okay. Offer water and fruit, those little reminders for self-care we all forget in the neon light. Be available to help the organisers find things or people when they have to focus elsewhere. It's a nice way to get to know different habitat contributors and assemblies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;🎤 Emcee On-Call List&lt;/strong&gt;
The Salazar brothers do a great job emceeing, but last year Diego got sick and had to push himself.  Having a few on-call backups will be a nice relief if needed.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Example Schedule (TBC)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Day 1: Dec 26 (Setup)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Build Up: 6+ people (12:00-18:00)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Days 2–4: Dec 27–29 (Stage &amp;amp; Content Ops)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Info Desk: 4 shifts (10:00–13:30, 13:00–16:30, 16:00–19:00, 18:30-22:00)&lt;/li&gt;
&lt;li&gt;Carebear: 4 shifts (10:00–13:30, 13:00–16:30, 16:00–19:00, 18:30-22:00)&lt;/li&gt;
&lt;li&gt;Stage Tech: 2 shifts (13:30–17:00, 16:30–20:00)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Day 5: Dec 30 (Teardown)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Teardown: 10+ people (16:00–19:00)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;➡️Jump in⬅️&lt;/h2&gt;
&lt;p&gt;We're self-organising. Head over to the &lt;a href=&quot;https://notes.infinite.build/s/3_w2D_kru&quot;&gt;infopage&lt;/a&gt; From there, join our Signal group and sign yourself up to shifts.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>A node/connector perspective</title>
    <link>https://voboda.com/blog/node-connector-perspective/</link>
    <guid isPermaLink="true">https://voboda.com/blog/node-connector-perspective/</guid>
    <pubDate>Sun, 14 Dec 2025 15:19:00 GMT</pubDate>
    <description>&lt;p&gt;Most of our coordination failures don’t come from conflict. They come from our containers.&lt;/p&gt;
&lt;p&gt;Companies, foundations, DAOs.&lt;/p&gt;
&lt;p&gt;We build them. Then step inside. We say they’re about guidance, but an org chart isn’t a map. It’s a mold.&lt;/p&gt;
&lt;h2&gt;People don’t use orgs. They serve them.&lt;/h2&gt;
&lt;p&gt;Attention and effort drift toward fixtures: boards, treasuries, governance.  The work bends toward meetings. Toward process. Success becomes more and more defined as positions held.&lt;/p&gt;
&lt;p&gt;When the shape stops working, we don’t question the container. We reshape it. A flatter hierarchy, or a top-down projection of the same structure—circles instead of branches.&lt;/p&gt;
&lt;p&gt;A node-connector graph flips the unit of design: from boxes to relationships. You design for a single person, their goals and their connections.&lt;/p&gt;
&lt;h2&gt;You let the shape emerge.&lt;/h2&gt;
&lt;p&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 900 520&quot; width=&quot;100%&quot; height=&quot;auto&quot; preserveAspectRatio=&quot;xMidYMid meet&quot; style=&quot;display:block;max-width:100%;&quot; role=&quot;img&quot; aria-label=&quot;Force-directed style node-edge graph&quot;&gt;&lt;defs&gt;&lt;style&gt;.edge{stroke:#fff;stroke-opacity:.75;stroke-width:3.4;stroke-linecap:round;}.node{fill:#fff;}&lt;/style&gt;&lt;/defs&gt;&lt;g&gt;&lt;line class=&quot;edge&quot; x1=&quot;118&quot; y1=&quot;192&quot; x2=&quot;176&quot; y2=&quot;138&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;118&quot; y1=&quot;192&quot; x2=&quot;214&quot; y2=&quot;218&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;176&quot; y1=&quot;138&quot; x2=&quot;247&quot; y2=&quot;152&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;214&quot; y1=&quot;218&quot; x2=&quot;247&quot; y2=&quot;152&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;247&quot; y1=&quot;152&quot; x2=&quot;308&quot; y2=&quot;198&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;308&quot; y1=&quot;198&quot; x2=&quot;266&quot; y2=&quot;248&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;266&quot; y1=&quot;248&quot; x2=&quot;214&quot; y2=&quot;218&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;266&quot; y1=&quot;248&quot; x2=&quot;184&quot; y2=&quot;276&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;184&quot; y1=&quot;276&quot; x2=&quot;144&quot; y2=&quot;238&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;144&quot; y1=&quot;238&quot; x2=&quot;118&quot; y2=&quot;192&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;247&quot; y1=&quot;152&quot; x2=&quot;336&quot; y2=&quot;134&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;308&quot; y1=&quot;198&quot; x2=&quot;366&quot; y2=&quot;226&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;266&quot; y1=&quot;248&quot; x2=&quot;334&quot; y2=&quot;268&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;336&quot; y1=&quot;134&quot; x2=&quot;366&quot; y2=&quot;226&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;334&quot; y1=&quot;268&quot; x2=&quot;366&quot; y2=&quot;226&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;366&quot; y1=&quot;226&quot; x2=&quot;438&quot; y2=&quot;184&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;366&quot; y1=&quot;226&quot; x2=&quot;428&quot; y2=&quot;268&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;438&quot; y1=&quot;184&quot; x2=&quot;486&quot; y2=&quot;144&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;438&quot; y1=&quot;184&quot; x2=&quot;504&quot; y2=&quot;214&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;428&quot; y1=&quot;268&quot; x2=&quot;504&quot; y2=&quot;214&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;486&quot; y1=&quot;144&quot; x2=&quot;546&quot; y2=&quot;172&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;504&quot; y1=&quot;214&quot; x2=&quot;546&quot; y2=&quot;172&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;546&quot; y1=&quot;172&quot; x2=&quot;586&quot; y2=&quot;234&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;504&quot; y1=&quot;214&quot; x2=&quot;586&quot; y2=&quot;234&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;546&quot; y1=&quot;172&quot; x2=&quot;616&quot; y2=&quot;138&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;586&quot; y1=&quot;234&quot; x2=&quot;644&quot; y2=&quot;266&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;616&quot; y1=&quot;138&quot; x2=&quot;674&quot; y2=&quot;182&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;616&quot; y1=&quot;138&quot; x2=&quot;704&quot; y2=&quot;154&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;674&quot; y1=&quot;182&quot; x2=&quot;704&quot; y2=&quot;154&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;704&quot; y1=&quot;154&quot; x2=&quot;742&quot; y2=&quot;214&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;674&quot; y1=&quot;182&quot; x2=&quot;742&quot; y2=&quot;214&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;742&quot; y1=&quot;214&quot; x2=&quot;784&quot; y2=&quot;176&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;742&quot; y1=&quot;214&quot; x2=&quot;804&quot; y2=&quot;244&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;784&quot; y1=&quot;176&quot; x2=&quot;804&quot; y2=&quot;244&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;176&quot; y1=&quot;138&quot; x2=&quot;366&quot; y2=&quot;226&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;247&quot; y1=&quot;152&quot; x2=&quot;438&quot; y2=&quot;184&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;308&quot; y1=&quot;198&quot; x2=&quot;504&quot; y2=&quot;214&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;266&quot; y1=&quot;248&quot; x2=&quot;428&quot; y2=&quot;268&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;336&quot; y1=&quot;134&quot; x2=&quot;546&quot; y2=&quot;172&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;366&quot; y1=&quot;226&quot; x2=&quot;616&quot; y2=&quot;138&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;438&quot; y1=&quot;184&quot; x2=&quot;674&quot; y2=&quot;182&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;504&quot; y1=&quot;214&quot; x2=&quot;704&quot; y2=&quot;154&quot;/&gt;&lt;line class=&quot;edge&quot; x1=&quot;586&quot; y1=&quot;234&quot; x2=&quot;742&quot; y2=&quot;214&quot;/&gt;&lt;/g&gt;&lt;g&gt;&lt;circle class=&quot;node&quot; cx=&quot;118&quot; cy=&quot;192&quot; r=&quot;7&quot;/&gt;&lt;circle class=&quot;node&quot; cx=&quot;176&quot; cy=&quot;138&quot; r=&quot;7&quot;/&gt;&lt;circle class=&quot;node&quot; cx=&quot;247&quot; cy=&quot;152&quot; r=&quot;7&quot;/&gt;&lt;circle class=&quot;node&quot; cx=&quot;308&quot; cy=&quot;198&quot; r=&quot;7&quot;/&gt;&lt;circle class=&quot;node&quot; cx=&quot;266&quot; cy=&quot;248&quot; r=&quot;7&quot;/&gt;&lt;circle class=&quot;node&quot; cx=&quot;214&quot; cy=&quot;218&quot; r=&quot;7&quot;/&gt;&lt;circle class=&quot;node&quot; cx=&quot;184&quot; cy=&quot;276&quot; r=&quot;7&quot;/&gt;&lt;circle class=&quot;node&quot; cx=&quot;144&quot; cy=&quot;238&quot; r=&quot;7&quot;/&gt;&lt;circle class=&quot;node&quot; cx=&quot;336&quot; cy=&quot;134&quot; r=&quot;7&quot;/&gt;&lt;circle class=&quot;node&quot; cx=&quot;366&quot; cy=&quot;226&quot; r=&quot;7&quot;/&gt;&lt;circle class=&quot;node&quot; cx=&quot;334&quot; cy=&quot;268&quot; r=&quot;7&quot;/&gt;&lt;circle class=&quot;node&quot; cx=&quot;438&quot; cy=&quot;184&quot; r=&quot;7&quot;/&gt;&lt;circle class=&quot;node&quot; cx=&quot;428&quot; cy=&quot;268&quot; r=&quot;7&quot;/&gt;&lt;circle class=&quot;node&quot; cx=&quot;486&quot; cy=&quot;144&quot; r=&quot;7&quot;/&gt;&lt;circle class=&quot;node&quot; cx=&quot;504&quot; cy=&quot;214&quot; r=&quot;7&quot;/&gt;&lt;circle class=&quot;node&quot; cx=&quot;546&quot; cy=&quot;172&quot; r=&quot;7&quot;/&gt;&lt;circle class=&quot;node&quot; cx=&quot;586&quot; cy=&quot;234&quot; r=&quot;7&quot;/&gt;&lt;circle class=&quot;node&quot; cx=&quot;616&quot; cy=&quot;138&quot; r=&quot;7&quot;/&gt;&lt;circle class=&quot;node&quot; cx=&quot;674&quot; cy=&quot;182&quot; r=&quot;7&quot;/&gt;&lt;circle class=&quot;node&quot; cx=&quot;644&quot; cy=&quot;266&quot; r=&quot;7&quot;/&gt;&lt;circle class=&quot;node&quot; cx=&quot;704&quot; cy=&quot;154&quot; r=&quot;7&quot;/&gt;&lt;circle class=&quot;node&quot; cx=&quot;742&quot; cy=&quot;214&quot; r=&quot;7&quot;/&gt;&lt;circle class=&quot;node&quot; cx=&quot;784&quot; cy=&quot;176&quot; r=&quot;7&quot;/&gt;&lt;circle class=&quot;node&quot; cx=&quot;804&quot; cy=&quot;244&quot; r=&quot;7&quot;/&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/p&gt;
&lt;p&gt;Networks are already everywhere, hiding under containers.&lt;/p&gt;
&lt;p&gt;Reading a Dalton Trumbo biography, I realized the film studios weren’t the rigid hierarchies I’d imagined. They look solid from the outside. But really, only their facades are distinct. Behind them is a different story.&lt;/p&gt;
&lt;p&gt;Trumbo was one of Hollywood’s top screenwriters when studios started blacklisting suspected communists in 1947. The studios made an example of him. His name vanished from the credits.&lt;/p&gt;
&lt;p&gt;But the work didn’t stop.&lt;/p&gt;
&lt;p&gt;The King Brothers—small, pragmatic producers—kept him writing under borrowed names. Scripts moved quietly, hand to hand.&lt;/p&gt;
&lt;p&gt;For a decade, Trumbo worked day and night, because that’s what writers do when the world tells them to stop. Under the blacklist, he actually got more work, and employed more and more writers.&lt;/p&gt;
&lt;p&gt;The pretense finally collapsed when two directors, Kirk Douglas and Otto Preminger, decided for themselves. They credited him openly. The blacklist lost its grip, if it ever had one.&lt;/p&gt;
&lt;p&gt;You can see how film production actually lives on a mesh of relationships. The crews form and dissolve like tidepools: the same grips who’ve pulled cable together in the rain, the same camera ops who can read each other’s eyebrows across a set. Directors pull in their writers, their actors, to suit their styles.&lt;/p&gt;
&lt;p&gt;The hierarchy is temporary scaffolding.
The relationships are the real structure.&lt;/p&gt;
&lt;h2&gt;Venture Capital also runs on a node-graph.&lt;/h2&gt;
&lt;p&gt;Beneath any VC brand, you find a sequence of numbered funds. Each fund has its own lifecycle—raise, deploy, return, close. Each has its own general partners, each with their own web of founder relationships.&lt;/p&gt;
&lt;p&gt;Every experienced founder knows this. It’s not the firm that matters. It’s the partner. The person. &lt;em&gt;Their&lt;/em&gt; connections.&lt;/p&gt;
&lt;p&gt;Accelerators look like programs with curriculum, a mentor pool, office hours and a Demo Day, but under the hood, it's really that each founder's unique situation activate a specific set of relationships. The accelerator opens a network to cherry pick.&lt;/p&gt;
&lt;p&gt;A partner checks in. Listens. Notices where things are stuck.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;I know someone who's been through this. She’ll get it. I'll intro you.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Usually it’s not a mentor or a trainer.
It’s another founder, still in motion.&lt;/p&gt;
&lt;p&gt;Two people who should know each other finally do.
And the problem softens, or disappears entirely.&lt;/p&gt;
&lt;p&gt;The real value isn’t instruction. It’s introduction.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Container thinking&lt;/em&gt;: &amp;quot;Our program tells you what to do.&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Connector thinking&lt;/em&gt;: &amp;quot;Let’s talk every week and open doors.&amp;quot;&lt;/p&gt;
&lt;h2&gt;Once you see this, you also notice networks that trap themselves in containers.&lt;/h2&gt;
&lt;p&gt;Bankless Academy was a few seasons in.&lt;/p&gt;
&lt;p&gt;The ambition was large—teach crypto clearly, responsibly—but the output was thin. Two finished courses. Each one twenty slides long. Every new season reopened the same question: why is this taking so long?&lt;/p&gt;
&lt;p&gt;The DAO's treasury had increased pressure, now threatening budget cuts openly.&lt;/p&gt;
&lt;p&gt;On the weekly call, the budget was always on screen.&lt;/p&gt;
&lt;p&gt;In DAOs with seasonal budgets, the last proposal writers effectively own the project. That season it was the illustrators and a developer. So the call focused on them.&lt;/p&gt;
&lt;p&gt;The coordinator pushed the plan forward, assigned tasks, kept momentum.  The writing budget had dried up, but they still needed a dictionary of cryptocurrency terms. He took it upon himself, and crowdsourced definitions from everyone on the call.&lt;/p&gt;
&lt;p&gt;Meanwhile, in the sidebar, a different conversation was happening.&lt;/p&gt;
&lt;p&gt;A few instructional designers were asking the questions that make or break a course:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Where are learners actually getting confused?&lt;/li&gt;
&lt;li&gt;What do they think they understand, but don’t?&lt;/li&gt;
&lt;li&gt;What not to explain yet?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Those messages scrolled by while the main call stayed on budget. The illustrators were negotiating scope. The hour was almost up. Someone asked for another week. The coordinator nodded.&lt;/p&gt;
&lt;p&gt;After the call, I messaged one of the people from the sidebar.&lt;/p&gt;
&lt;p&gt;He turned out to be the person who designed Intel’s training material for retail staff. He knew how to explain complex CPU architecture to a teenager at Best Buy.&lt;/p&gt;
&lt;p&gt;He just wanted to help, he didn't care about getting paid.&lt;/p&gt;
&lt;p&gt;He came to the next call. And the next.&lt;/p&gt;
&lt;p&gt;Each time, the same rhythm. Budget first. Assignments. Not enough time. He stayed in the sidebar.
After the third call, he &lt;a href=&quot;/blog/contributor-churn/&quot;&gt;didn’t come back&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;No one pushed him out.
No one decided he wasn’t useful.&lt;/p&gt;
&lt;p&gt;The structure just created scarcity where none was required.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Container-thinking&lt;/em&gt; says: &amp;quot;Here’s the plan. Assign people.&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Connector-thinking&lt;/em&gt; says: &amp;quot;Here’s the goal. Work in public. Share with each other.&amp;quot;&lt;/p&gt;
&lt;h2&gt;When containers break down, reform becomes an endurance contest.&lt;/h2&gt;
&lt;p&gt;People with talent leave first.  Why grind it out when they have better options?&lt;/p&gt;
&lt;p&gt;The people who stay are increasingly the ones who prize the position itself. The work grows careful, then brittle. Momentum slows.&lt;/p&gt;
&lt;p&gt;This isn’t malice.&lt;/p&gt;
&lt;p&gt;It’s gravity.&lt;/p&gt;
&lt;p&gt;Persistent structures accumulate weight. Decisions bend toward it.&lt;/p&gt;
&lt;h2&gt;In security, Defense-in-Depth means layers that make the attacker’s job too costly to bother with.&lt;/h2&gt;
&lt;p&gt;If they can get over the moats, walls, spikes, they then discover you can drop cow poop on them.&lt;/p&gt;
&lt;p&gt;It works—until the castle is taken.&lt;/p&gt;
&lt;p&gt;A node-graph behaves differently.&lt;/p&gt;
&lt;p&gt;Maybe you've been in a group chat when one or two people stink up the room.  A multi-day rant or two people beefing.&lt;/p&gt;
&lt;p&gt;Everyone goes quiet.&lt;/p&gt;
&lt;p&gt;You see a few people typing… but never sending.&lt;/p&gt;
&lt;p&gt;Then someone else sends a dm to a friend about something else. Another group chat starts around that.&lt;/p&gt;
&lt;p&gt;People drift across.&lt;/p&gt;
&lt;p&gt;From the &lt;em&gt;container view&lt;/em&gt;, it looks like a split.&lt;/p&gt;
&lt;p&gt;From the &lt;em&gt;network view&lt;/em&gt;, it’s just rebalancing flows. Each node is able to reroute as needed.&lt;/p&gt;
&lt;p&gt;The relationships &lt;a href=&quot;/blog/healthy-forks/&quot;&gt;stay intact&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Ephemerality is defense-in-depth for networks.&lt;/h2&gt;
&lt;p&gt;Permanent structures create leverage points: treasuries, roadmaps, permissions, charters. They attract attention. They imply control. They invite protection.&lt;/p&gt;
&lt;p&gt;A castle concentrates value, so someone will always try to control the gate.&lt;/p&gt;
&lt;p&gt;A node-graph behaves differently. Force your way into any point and the relationships just route around you.&lt;/p&gt;
&lt;p&gt;Once we let go of controlling the shape, we escape from assuming we need &lt;a href=&quot;https://theopenmachine.net/transmissions/foto&quot;&gt;insides and outsides&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We get a different design question. Not: &amp;quot;What structure would serve this goal?&amp;quot; But:&lt;/p&gt;
&lt;h2&gt;&amp;quot;How do we give people agency over the connections they need?&amp;quot;&lt;/h2&gt;
&lt;p&gt;Containers always collapse into politics.
Connectors create space for emergence.&lt;/p&gt;
&lt;p&gt;A connector is anything that makes the right connection cheap, and in the hands of the individual: an introduction, a thread, a forkable workspace, a lightweight way to reroute when things jam.&lt;/p&gt;
&lt;p&gt;We need better connectors.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Keeping contributors</title>
    <link>https://voboda.com/blog/contributor-churn/</link>
    <guid isPermaLink="true">https://voboda.com/blog/contributor-churn/</guid>
    <pubDate>Thu, 11 Dec 2025 10:33:00 GMT</pubDate>
    <description>&lt;p&gt;Open-source culture rewards a funny kind of stoicism.  We're supposed to bang our head against something for a week before filing a bug report.&lt;/p&gt;
&lt;p&gt;Then we see FOSS projects and devrel programs designed like corporate tech support. Layers of escalation. Ticket systems.&lt;/p&gt;
&lt;p&gt;The healthier pattern? &lt;strong&gt;Stuck → get eyes on it, fast.&lt;/strong&gt; Anyone who's pair-programmed has felt how this keeps you in flow! Problems seem to melt away as fast as they appear.&lt;/p&gt;
&lt;p&gt;But we can't just drop that pattern into FOSS culture. We need to make places that enable vulnerability. Where asking for help counts as a contribution. Because it is. Someone else learns too.&lt;/p&gt;
&lt;p&gt;If you look at contributors as if they're product users, you'll see horrible churn. We take in people already motivated enough to use and contribute, then spit most them out frustrated. Or failing silently.&lt;/p&gt;
&lt;p&gt;Repos and devrel rooms feel intimidating or cold. But meet a maintainer at a conference? Usually warm and open to help however they can.&lt;/p&gt;
&lt;p&gt;The problem's in between: tools built around issues, or processes, or projects.  Not contributors.&lt;/p&gt;
&lt;p&gt;Discord makes help requests disappear in the scroll. GitHub shows you issue #1234, not &amp;quot;this person tried three times and gave up.&amp;quot;  The people disappear, the tickets remain.&lt;/p&gt;
&lt;p&gt;It tells people: Figure it out yourself. Be worthy before you speak.&lt;/p&gt;
&lt;p&gt;Then on the other side, project maintainers feel alone, struggling to attract help.&lt;/p&gt;
&lt;p&gt;What's stopping us from making &amp;quot;I helped someone get unstuck&amp;quot; count more than &amp;quot;I closed an issue?&amp;quot; From making active contributors more visible than open issues? From tracking &amp;quot;time to first response from a human?&amp;quot;&lt;/p&gt;
&lt;p&gt;We're friendly and willing! We need to make our tools that reflect that.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Healthy forks</title>
    <link>https://voboda.com/blog/healthy-forks/</link>
    <guid isPermaLink="true">https://voboda.com/blog/healthy-forks/</guid>
    <pubDate>Wed, 10 Dec 2025 15:50:00 GMT</pubDate>
    <description>&lt;blockquote&gt;
&lt;p&gt;&amp;quot;I'm really really angry. And I'll not say more, I don't want to right now, I'll regret it later.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That's from a GitHub &lt;a href=&quot;https://github.com/hackmdio/codimd/issues/1219#issuecomment-611714410&quot;&gt;issue&lt;/a&gt; about naming.&lt;/p&gt;
&lt;p&gt;Not code architecture. Not licensing. Just what to call the project.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hedgedoc.org/history/&quot;&gt;The story&lt;/a&gt; could be an opera. Hackpad was sunsetting after its acquisition, and HackMD emerged as an open source alternative. The HackMD core team commercialized a fork of their own project, labelling the open version HackMD CE. After a while, the community took over the open version.  It was going a different direction so they renamed it CodiMD to avoid confusion, and eventually forked to a new repo outside of the HackMD Github account. You could feel the tension through issue comments and half-written PR descriptions—small technical notes carrying the weight of a breakup. Meanwhile, the HackMD team kept maintaining their open version, but also decided to call keep the CodiMD name.  Fights also broke out over who represented the &amp;quot;real&amp;quot; project, which forks to take seriously, who could relicense. By the time the community maintainers finally fled to the fourth name, &lt;em&gt;HedgeDoc&lt;/em&gt;, you could see everyone was exhausted.&lt;/p&gt;
&lt;p&gt;Repos fork easily, by design.&lt;/p&gt;
&lt;p&gt;But our social layers around them can't handle it.&lt;/p&gt;
&lt;p&gt;Blowups are more and more the norm. Open/LibreOffice, Ethereum Classic, XEmacs, Core/Libre/Canoeboot. Or the long, smoldering feuds: Wikipedia edit wars, Bitcoin Core maintainer beefs.  Even Grandmaster Linus Torvalds &lt;a href=&quot;https://linux.slashdot.org/story/24/11/25/0427242/flamewar-leads-to-declining-of-bcachefs-pull-requests-during-linux-613-kernel-development-cycle&quot;&gt;loses&lt;/a&gt; &lt;a href=&quot;https://itsfoss.com/news/linux-kernel-bcachefs/&quot;&gt;energy&lt;/a&gt; to it. He invented Git and  &lt;a href=&quot;https://www.geeksforgeeks.org/git/how-git-changed-open-source/&quot;&gt;decentralised code repos,&lt;/a&gt; so if even he's caught up in this, it's everywhere.&lt;/p&gt;
&lt;h2&gt;What would healthy forks need?&lt;/h2&gt;
&lt;p&gt;I keep coming back to three characteristcs:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Non-exclusive:&lt;/strong&gt; people can participate in multiple branches&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-resourcing:&lt;/strong&gt; avoiding existential threats&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Continuous:&lt;/strong&gt; divergence happens in small increments, as normal evolution&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you have these three at the same time, the whole orientation shifts. You stop thinking about &amp;quot;how do we fix this organization,&amp;quot; and start thinking &amp;quot;how does everyone find the what they need right now.&amp;quot;&lt;/p&gt;
&lt;h2&gt;The pattern isn't just in open-source.&lt;/h2&gt;
&lt;p&gt;In a builder program I joined, the weekly Zoom calls always began the same way: a grid of faces, the host cheerfully setting the agenda, and after an hour-long webcast, it was time for the Q&amp;amp;A before the breakout rooms.&lt;/p&gt;
&lt;p&gt;A few California startup founders took the mic, confidently dropping buzzword and polished jokes. The &amp;quot;I'm here to crush it, bro&amp;quot; types.  They were hunting for technical co-founders, and Silicon Valley taught them that dominating meetings gave them visibility. So they brought that culture with them.&lt;/p&gt;
&lt;p&gt;You could watch the introverted developers recoil in real time. Shoulders tensed. People muted themselves and started working on something else. Nobody said, &amp;quot;this isn’t working,&amp;quot; but each week, I noticed a couple more faces were missing.&lt;/p&gt;
&lt;p&gt;Finding a tech founder wasn't a bad thing.  Some of the devs wanted to be found.&lt;/p&gt;
&lt;p&gt;The problem was structural.&lt;/p&gt;
&lt;p&gt;The environment wasn't built for the diverse needs it attracted.&lt;/p&gt;
&lt;p&gt;One day someone suggested, &amp;quot;maybe we can choose our own breakout groups?&amp;quot; But the organizers resisted. They were proud of their matchmaking. They didn’t know their matches correlated with the highest dropout rates. They couldn’t feel the friction because they weren’t in it.&lt;/p&gt;
&lt;h2&gt;The deeper issue was nobody could modify the space to meet their needs.&lt;/h2&gt;
&lt;p&gt;After enough gentle lobbying, the organizers enabled free-choice breakout rooms. A tiny experiment.  For the first minute, it was madness. You could see everyone popping in and out of rooms like they were testing doorways. You could see games of cat-and-mouse, or people jumping back-and-forth in indecision.&lt;/p&gt;
&lt;p&gt;To the organizers, it felt chaotic, unprofessional, embarrassing.&lt;/p&gt;
&lt;p&gt;To the participants, it was the first breath of oxygen.  They were optimising for themselves, reconnecting with someone who'd opened up last time, or someone who they'd noticed spoke their language.&lt;/p&gt;
&lt;p&gt;I remember thinking: this is all anyone wanted. To find their people. Not &lt;em&gt;find a team,&lt;/em&gt; not &lt;em&gt;choose a track.&lt;/em&gt; Just people they can relate to.&lt;/p&gt;
&lt;p&gt;The breakout room scramble became a fun game that people looked forward to, part of the culture. It felt more like walking into a local cafe, saying hi to a bunch of people, and choosing who to sit with. After being able to connect a few times, people started meeting on their own. Which, ironically, is what the organisers had always hoped for.&lt;/p&gt;
&lt;p&gt;Healthy forks, right in front of us.&lt;/p&gt;
&lt;h2&gt;We know this stuff, but keep getting in our own way.&lt;/h2&gt;
&lt;p&gt;Mina was the first blockchain project to use ZK proofs at the protocol level. Its architects and crypographers are deeply respected in technical circles.&lt;/p&gt;
&lt;p&gt;But four years in, they hadn't really shipped a usable production chain. The org structure kept getting in the way.&lt;/p&gt;
&lt;p&gt;Minacon was an unconference I organised for them—three days where participants had equal control of the agenda. Each day's schedule started with an open grid of parallel rooms with 45-minute sessions. Anyone could propose anything. No speakers list. No speakers room. No VIP treatment. The message was: &lt;em&gt;we all have something to learn from another.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Mina's mobile-device proving had been at a stand-off.  It needed app builders, cryptographers, and library maintainers to coordinate. Different orgs, different incentives. Months of forum threads—arguing, not seeing eye to eye.&lt;/p&gt;
&lt;p&gt;But five of them in a room for 20 minutes, showing code, seeing what each was up against? It was simple once it came down to practicalities. Instead of fighting over on/off-device ideology, they each saw they could unlock each other. And they quite happily did.&lt;/p&gt;
&lt;h3&gt;The answer wasn't one or the other, it was both.&lt;/h3&gt;
&lt;p&gt;Then there were the two orgs running forked nodes, locked in a cold war for years. Communication had always been routed through managers who treated their roadmaps like chessboards—every feature, a pawn to box the other side in. This made &amp;quot;Feature Parity&amp;quot; into a way to exert pressure, but also an uncatchable moving target.&lt;/p&gt;
&lt;h2&gt;Once the builders were in the same room, they understood each other.&lt;/h2&gt;
&lt;p&gt;Turns out, both dev teams had wanted the same thing for years but were always forced back by their managers. Their technical debt accumulated, and each dev team though it was coming from the other org. This revelation freed both sides to cut loose, and move towards their common goal.&lt;/p&gt;
&lt;p&gt;Forums, boards, devrel—they actually cut off relationships and filtered the wrong information. It wasn't the people in them, it was the structure getting in the way.  People just needed to connect directly.&lt;/p&gt;
&lt;p&gt;That 3-day unconference took two months of prep. I called every participant in advance so they'd feel okay proposing sessions. Checking in on what they were stuck on. Making sure everyone knew who else they needed and affected before day one.&lt;/p&gt;
&lt;p&gt;That was 95% of the effort.&lt;/p&gt;
&lt;p&gt;The execs and architects had expected to route their agendas through me, to secure a keynote or other special placement. I’d playfully tell them: &amp;quot;People will really love that topic. Propose a session on it at 9am on day one.&amp;quot;&lt;/p&gt;
&lt;p&gt;For the unconference to work, it had to stay neutral tool for connections to form and grow, a place where each individual was in full control of their experience. Everyone had a lot to achieve in that short time. It was there to serve &lt;em&gt;their&lt;/em&gt; goals.&lt;/p&gt;
&lt;p&gt;When divergence becomes painful, it’s usually because the structure stopped responding to the people inside it. Requests get dismissed as &amp;quot;edge cases,&amp;quot; problems accumulate, and eventually the only release valve is a dramatic split.&lt;/p&gt;
&lt;p&gt;The unconference approach let everyone choose where they wanted to participate, and  gave everyone unconditional, direct access to who they needed.&lt;/p&gt;
&lt;h2&gt;Giving people what they need can dissolve conflicts. Who knew?&lt;/h2&gt;
&lt;p&gt;I've experimented with this in other ways: people pulling each other into temporary clusters, then drifting apart again.&lt;/p&gt;
&lt;p&gt;I’ve started a POC called Fusion: a lightweight way to find collaborators through quick left/right swipes down a list of people. It uses MPC cryptography so small groups can form around everyone’s yes/no choices without revealing them. Private, low-friction, ephemeral formation. Not an org or group you have to maintain—just the right people, right now.&lt;/p&gt;
&lt;p&gt;Fission is the opposite: letting groups split without rupture. It's a take on Moloch DAOs, but inspired by the failed NounsDAO forks.&lt;/p&gt;
&lt;p&gt;MolochDAO's orignal RageQuit design was meant to incentivise understanding and discourse, because minorities couldn't be forced by simple majority. If they didn't like a proposal, they could exit with their share, so better to get their input first. Ragequit in a NounsDAO structure had the opposite effect, amplifying divisiveness, forcing the dissenters out into the cold. Don't like it? Take a walk. The remaining members also suffered, because they saw massive treasury depletion.&lt;/p&gt;
&lt;p&gt;With Fission, a failed proposal can trigger a gentle &lt;em&gt;amoebic&lt;/em&gt; split: a minority can still fund their idea in a new DAO while continuing to belong to the original one. A non-exclusive fork. No winner-take-all pressure. No exodus required. And divergence doesn't get suppressed or built up over time.&lt;/p&gt;
&lt;h2&gt;The social side of forks can be as undramatic as a git branch.&lt;/h2&gt;
&lt;p&gt;Fusion and Fission are based on social games I've tried in different builder groups.&lt;/p&gt;
&lt;p&gt;They worked, so the next step is tool-ifying them. When the tool's in your hand, you don't need fell the need to wait for programs or orgs to serve you.  We can start connecting as needed from wherever we are, introducing healthy forks where they're needed.&lt;/p&gt;
&lt;h2&gt;We can design for healthier forks.&lt;/h2&gt;
&lt;p&gt;When I look elsewhere for healthy forks, I see real-world examples in film, VC, conferences, academia...&lt;/p&gt;
&lt;p&gt;People pick up collaborators as they need them, drop into parallel efforts, and let the structure emerge from whatever they choose to work on. Resources flow to activity.&lt;/p&gt;
&lt;p&gt;These are places where nodes connecting and detaching are the real structure behind thin institutional labels and super-imposed hierarchies.&lt;/p&gt;
&lt;p&gt;That builder group? Sadly it fizzled out.  Turns out one of the company owners was doing most of the work, and when he couldn't agree with the other, he just found another job. They kept it quiet, both names stayed on the site, but the program spiralled.&lt;/p&gt;
&lt;h2&gt;I keep in touch with some dev friends I’ve met at hackathons and conferences.&lt;/h2&gt;
&lt;p&gt;We recently started &lt;a href=&quot;https://infinite.build&quot;&gt;a weekly hangout call&lt;/a&gt;. People joined because we were already talking, or because I mentioned someone they should meet.&lt;/p&gt;
&lt;p&gt;It's the builder group I always wanted for myself. People with passion projects and always learning random new stuff.&lt;/p&gt;
&lt;p&gt;Some of them suspected I had a big, master plan behind it, and that's kind of true? Really it's more of a speculative thesis.  I wonder if we might co-develop these connection tools to see what &amp;quot;program&amp;quot;, if any, emerges.&lt;/p&gt;
&lt;p&gt;Still, we have unanswered questions:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How do we launch a without implying an organizer-participant heirarchy?&lt;/strong&gt;  Even the faint suggestion of a central host leads people to wait for permission. I want affordances that say, &amp;quot;it's yours, make it what you need it to be.&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How do we help builders surface blockers early?&lt;/strong&gt;  Open-source culture rewards stoicism: the heroic week of hair-pulling before writing a bug report. (Because of our assumptions about accessibility to help.) The healthier pattern is &lt;strong&gt;stuck → get eyes on it.&lt;/strong&gt; Anyone who's pair-programmed has felt this. It requires norms around vulnerability, and a culture where asking for help is treated as a contribution, an opportunity for others to learn too.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How do we make FUBU real from day one?&lt;/strong&gt; If first participants don't just use the tools, but make them, then they own it as much as me. That's the the deep pattern with healthy forks: people designing their own tools into their own experience.&lt;/p&gt;
&lt;p&gt;I'm open for ideas, and honestly, we're having fun sharing our own projects already.  It's just that I think we'll have &lt;em&gt;more&lt;/em&gt; fun if any of this works.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Herman's Send tool</title>
    <link>https://voboda.com/blog/horuspass-send/</link>
    <guid isPermaLink="true">https://voboda.com/blog/horuspass-send/</guid>
    <pubDate>Sun, 30 Nov 2025 20:26:00 GMT</pubDate>
    <description>&lt;p&gt;&lt;a href=&quot;https://horuspass.com/send&quot;&gt;HorusPass Send&lt;/a&gt; is another find while exploring Bearblog.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://herman.bearblog.dev/&quot;&gt;Herman Martinus&lt;/a&gt; built BearBlog, and has an inspiring &lt;a href=&quot;https://herman.bearblog.dev/projects/&quot;&gt;projects page&lt;/a&gt;. There's something energizing  watching someone just... keep putting cool things into the world. And Send isn't just one of those things, it's also a &lt;a href=&quot;/blog/playing-with-cryptography/&quot;&gt;thoughtful application of cryptography&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Here's a little tool that lets you share a secret — a password, an API key, a confession of love — that can only be read once. After the recipient opens it, it's gone. Poof.&lt;/p&gt;
&lt;p&gt;The server generates two tokens. Token A goes in the URL you share as a query parameter. Token B stays on the server. You need both to encrypt or decrypt. When the recipient clicks the link, the server hands over Token B — then deletes it. The browser decrypts the message.&lt;/p&gt;
&lt;p&gt;It's kind of the same as writing your password on a sheet of paper, but ripping it in half and hiding both halves in different places.  If someone finds one, you're still safe.&lt;/p&gt;
&lt;p&gt;The thing here is that the server is writing the password, not you, and giving you one half.  You have to trust it deleted the half it gave you, right?&lt;/p&gt;
&lt;p&gt;Not quite.&lt;/p&gt;
&lt;p&gt;Here's what you're &lt;em&gt;not&lt;/em&gt; trusting: that the server saw your encrypted message.&lt;/p&gt;
&lt;p&gt;Even if the server has the keys, it doesn't have the lockbox. The ciphertext passes from sender to recipient in the URL fragment: everything after the &lt;code&gt;#&lt;/code&gt;. Browsers don't send those fragments to servers.&lt;/p&gt;
&lt;p&gt;Why not generate both tokens in the browser and send one to the server?  Then the server never sees the full key. That opens up another problem: the server would be storing data submitted by users, which opens it up to abuse — people uploading arbitrary content, not just random tokens. This could be even abused by bots, and Herman already has &lt;a href=&quot;https://herman.bearblog.dev/the-frustration-loop/&quot;&gt;enough&lt;/a&gt; &lt;a href=&quot;https://herman.bearblog.dev/agressive-bots/&quot;&gt;fun&lt;/a&gt; &lt;a href=&quot;https://herman.bearblog.dev/messing-with-bots/&quot;&gt;messing with them&lt;/a&gt;. Why invite more trouble.&lt;/p&gt;
&lt;p&gt;There's more sophisticated cryptography. You can generate keys that are &lt;em&gt;born split&lt;/em&gt; — where no single party ever holds the complete key, even at creation.  The browser and server could each contribute randomness in a process cryptographers call &amp;quot;ceremonies&amp;quot; because they like to sound mysterious.  Both sides random inputs combine in a way that produces key shares, and neither would ever see the full key. This is the world of &lt;em&gt;threshold cryptography&lt;/em&gt; and &lt;em&gt;multi-party computing&lt;/em&gt;. Pretty interesting to learn, but also more complex to build.&lt;/p&gt;
&lt;p&gt;The beautiful thing about Herman's design: none of that is really necessary, since the ciphertext never hits the server anyway.&lt;/p&gt;
&lt;p&gt;I wrote before about &lt;a href=&quot;https://etherplay.io/&quot;&gt;Ronan&lt;/a&gt;'s &lt;a href=&quot;/blog/playing-with-cryptography/&quot;&gt;commit-reveal games&lt;/a&gt; and the question he keeps asking: &amp;quot;Why do I need anything else?&amp;quot; HorusPass is the same insight.&lt;/p&gt;
&lt;p&gt;What I really like: Herman's explanation on the site is fast and clear. Four bullet points and you understand what's happening. No jargon, no mystique. He wants you to see how it works.&lt;/p&gt;
&lt;p&gt;That's a breath of fresh air for me. And it's the same ethos as the tool itself — serving a clear need using regular cryptographic primitives in a practical way. Just like writing your password across two sheets of paper.&lt;/p&gt;
&lt;p&gt;The smart way is often the simple way.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Robert's Pink Friday theme</title>
    <link>https://voboda.com/blog/pink-friday/</link>
    <guid isPermaLink="true">https://voboda.com/blog/pink-friday/</guid>
    <pubDate>Sun, 30 Nov 2025 19:30:00 GMT</pubDate>
    <description>&lt;p&gt;I found Robert Birming's &lt;a href=&quot;https://robertbirming.com/pink-friday-bear-theme/&quot;&gt;Pink Friday&lt;/a&gt; scrolling through bearblog's &lt;a href=&quot;https://bearblog.dev/discover/&quot;&gt;discover page&lt;/a&gt;  (I'm new around here, so taking a stroll.) It's a fun answer to Black Friday shopping madness.&lt;/p&gt;
&lt;p&gt;The whole theme itself is delightful, but what caught my attention was the typography.&lt;/p&gt;
&lt;p&gt;Robert's body definition: &lt;code&gt;1.075rem&lt;/code&gt;, &lt;code&gt;line-height: 1.66&lt;/code&gt;, &lt;code&gt;letter-spacing: 0.01em&lt;/code&gt;, &lt;code&gt;max-width: 640px&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Getting all these to work together is the the heart of readability, and it's hard!  Ever watched someone's eyes while they read different sites? Notice their cadence changing. It's a tiny thing, almost imperceptible, with huge effect. Reading speed, comprehension, even perceived tone, can all change massively.&lt;/p&gt;
&lt;p&gt;Web typography gets harder when you have to make it work across different screen sizes and devices.&lt;/p&gt;
&lt;p&gt;Then, there's boss mode: system fonts only, no custom typefaces to lean on.&lt;/p&gt;
&lt;p&gt;The only other person I've seen nail this is &lt;a href=&quot;https://manuelmoreale.com/typography-and-spacing-in-css&quot;&gt;Manuel Moreale&lt;/a&gt;. And Robert does it in elegantly light CSS.&lt;/p&gt;
&lt;p&gt;I accepted his gift for my new Bear Blog, though I cherry-picked just the well-tuned typeface definitions since I like the default Bear theme too.&lt;/p&gt;
&lt;p&gt;Then I read more of his blog.  Discovered Robert's a home inspector, not a web designer?&lt;/p&gt;
&lt;p&gt;His day job shows up in his writing. A homeowner &lt;a href=&quot;https://robertbirming.com/go-easy-on-yourself/&quot;&gt;cries during an inspection&lt;/a&gt;, not from bad news, but self-blame. Robert's response: &amp;quot;Go easy on yourself. You're doing the best you can.&amp;quot; He draws parallels between &lt;a href=&quot;https://robertbirming.com/blog-your-home/&quot;&gt;fixing a house and building a blog&lt;/a&gt;: move in, hang a picture, take one step at a time. He notices how people sometimes &lt;a href=&quot;https://robertbirming.com/no-phone-calls/&quot;&gt;enjoy being right&lt;/a&gt; more than solving the problem.&lt;/p&gt;
&lt;p&gt;It has the same spirit as the early UX researchers who came up as ethnographers. Their approach was slow, quiet observation. Watching how people moved through their day, spotting what &lt;a href=&quot;https://www.goodreads.com/work/quotes/21548406-hidden-in-plain-sight-how-to-create-extraordinary-products-for-tomorrow&quot;&gt;hides in plain sight&lt;/a&gt;. Like how every home has that landing zone by the door where pockets empty out.  A tiny ritual that crosses cultures.&lt;/p&gt;
&lt;p&gt;In Indian homes, they saw that power cuts were constant, so they added flashlights to phones. Studying how non-literate users handled interfaces built for Western audiences.  They learned the fix wasn’t  'addressing illiteracy' and swapping text for icons, it was recognising that people usually memorise their way through menus. The solution was ruthless simplicity in their own product decisions: fewer options, fewer buttons. That really human approach produced the Nokia 1100, still the best-selling phone ever made.&lt;/p&gt;
&lt;p&gt;Robert seems to do the same naturally. He steps into homes, pays attention to how people actually act and feel, and spots what overloads them and what genuinely helps. That empathy.&lt;/p&gt;
&lt;p&gt;No wonder he can make an expressive pink website so readable.&lt;/p&gt;
&lt;p&gt;I'm glad I found Bear Blog. It attracts like-minded builders using simple stacks, thinking about longevity and meaningful human connection. I feel somehow among my people here, and I'm eager to learn.&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Playing with cryptography</title>
    <link>https://voboda.com/blog/playing-with-cryptography/</link>
    <guid isPermaLink="true">https://voboda.com/blog/playing-with-cryptography/</guid>
    <pubDate>Fri, 21 Nov 2025 15:27:00 GMT</pubDate>
    <description>&lt;p&gt;Maybe &lt;a href=&quot;https://dspace.mit.edu/bitstream/handle/1721.1/148953/MIT-LCS-TM-125.pdf?sequence=1&amp;amp;isAllowed=y&quot;&gt;Mental Poker&lt;/a&gt; is a good way to start this blog.  It's a paper that changed the way I see things.&lt;/p&gt;
&lt;p&gt;The paper appeared in 1978. The Cold War was on and the U.S. still classified cryptography as &amp;quot;munitions.&amp;quot;  Shamir, Rivest, and Adleman were perfecting public-key cryptography. They'd later turn their discovery into RSA Data Security Ltd to put those keys in everyone's hands. The NSA pressured them to stop (though not every US agency agreed) and if the RSA trio hadn't been so defiant, only governments would have encryption today. No HTTPS, no online shopping, no private messaging. The internet would be just surveillance and ads.&lt;/p&gt;
&lt;p&gt;So here they were, the godfathers of cryptography, with a dorky puzzle about card games and MODEMS?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Can two potentially dishonest players play a fair game of poker without using any cards—for example, over the phone? This paper provides the following answers:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;1 No. (Rigorous mathematical proof supplied.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;2 Yes. (Correct and complete protocol given.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And then, with a straight face:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You might find it an interesting challenge to attempt to find, on your own, a method for playing Mental Poker, before reading on.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I found the paper last year. I was halfway through a course on the math behind zero-knowledge proofs. I’d implemented Diffie–Hellman. I knew the machinery of public-key systems. Still, I thought, &amp;quot;They're talking to the masters, not someone like me.&amp;quot;&lt;/p&gt;
&lt;p&gt;The surprise was that their solution hinged on a basic primitive I already knew as a beginner—just used in a way I had never considered.&lt;/p&gt;
&lt;p&gt;It got me thinking about everything else.&lt;/p&gt;
&lt;h2&gt;Why do cryptographic primitives get boxed in?&lt;/h2&gt;
&lt;p&gt;Key pairs become “encrypt messages.”&lt;/p&gt;
&lt;p&gt;HD keys become “wallet accounts.”&lt;/p&gt;
&lt;p&gt;Commit–reveal is some toy protocol from the 80s that we say is for auctions, but hardly gets used outside of classrooms.&lt;/p&gt;
&lt;p&gt;It's funny how fast we turn a mathematical structure into a product category.&lt;/p&gt;
&lt;p&gt;My friend Ronan is a regular hackathon winner. Whatever framework comes out, he dives in and learns it. But when he sits down to build his games, he keeps coming back to a simple commit-reveal.&lt;/p&gt;
&lt;p&gt;When he asks, “Why do I need anything else?” he’s not being dismissive; he’s noticing that we're not using the simpler things we already have.&lt;/p&gt;
&lt;p&gt;The story with hashes shows the same thing. They were first used in databases for storage integrity. Then someone realized you could use them as proof-of-work and build distributed ledgers. Suddenly, data distribution can depend on verifiable math instead of trusting institutions. Blockchains.&lt;/p&gt;
&lt;p&gt;Blockchains didn't require new cryptography. They required seeing hashes for what they really do.&lt;/p&gt;
&lt;h2&gt;Long division as cryptography&lt;/h2&gt;
&lt;p&gt;I like explaining cryptography without the mystique. You can think about it like long division. A remainder is a one-way move.  When the result of an operation is a remainder, you’ve thrown information away, you can't reconstruct the original.&lt;/p&gt;
&lt;p&gt;That’s the heart of most modern cryptography. Functions that run easily forward, and not back.&lt;/p&gt;
&lt;p&gt;Encryption?  I give you the remainder (the encrypted text), but you can't work out the number I started with (the unencrypted text) unless you know the secret number I divided by (the key).&lt;/p&gt;
&lt;p&gt;Hashes seem more complex. How do you get that random looking data from a line of text, in a predictable way? Instead of that tangle of logic gates, you can just think of it like a remainder (the hash) changing when the numerator (the input text) changes.&lt;/p&gt;
&lt;p&gt;When you see a complex cryptographic system, you don’t need to internalize every algebraic detail. Swapping it out for remainders helps you understand what's going on.&lt;/p&gt;
&lt;h2&gt;Seeing what it can do&lt;/h2&gt;
&lt;p&gt;A hash gives you proof some data hasn't changed. A key pair lets you make something only accessible to one recipient, or prove it came from its source.  HD key generation lets you predictably create unlimited keys from a single secret number. Commit-reveal lets you lock in a choice now, prove it later.&lt;/p&gt;
&lt;p&gt;It takes a bit of time, but strip away the jargon and you’re left with properties: one-wayness, opacity, verifiability, predictability, timing.&lt;/p&gt;
&lt;p&gt;Those are building materials.&lt;/p&gt;
&lt;p&gt;Once you see them as material rather than prepackaged products, you start noticing all the uses that weren’t in the original manuals.&lt;/p&gt;
&lt;h2&gt;Sessions without tracking&lt;/h2&gt;
&lt;p&gt;Here's something I've been playing with.&lt;/p&gt;
&lt;p&gt;User tracking exists because, in many cases, servers need to connect isolated page requests to specific users.  So we got cookies, and with cookies we also got session IDs, user profiles, knowing what users have done. This let us make more useful websites for users. But decades after, we saw that servers don’t stop hoarding user data, and that turned septic.  GDPR appeared to try and fix that.  A legal fix.&lt;/p&gt;
&lt;p&gt;HD (hierarchical deterministic) key generation gives us another way.&lt;/p&gt;
&lt;p&gt;A browser generates its own random identifier. The server treats that identifier the same way an account number gets used with a seed phrase: a way to get a new set of encryption keys, just for that user, and just for that request.&lt;/p&gt;
&lt;p&gt;On the server side, the only things you keep are the browser’s random ID and a counter for each request. No user data at all.&lt;/p&gt;
&lt;p&gt;The server encrypts whatever state it needs. Authentication data, rate-limit counters, feature flags, and sends the encrypted blob back to the browser to store locally.&lt;/p&gt;
&lt;p&gt;Each page request, the server uses its root key, the user's random ID, and the counter, to get the decryption key it needs to decrypt the data.  Then it re-encrypts what it needs with the next key pair, and sends it back to the browser.&lt;/p&gt;
&lt;p&gt;No cookies. No &amp;quot;we value your privacy&amp;quot; pop-ups tricking us into clicking the wrong thing.&lt;/p&gt;
&lt;p&gt;Servers can still customize content, enforce access limits, respond to user context.  But the users data stays safe and encrypted, in their own custody on their own device. They can delete it all themselves.&lt;/p&gt;
&lt;p&gt;This privacy win isn't theoretical. It's structural.&lt;/p&gt;
&lt;p&gt;HD key generation has existed since 2012. GDPR arrived in 2018. The tools to avoid surveillance-grade storage were sitting in plain sight; we just didn’t think to use them this way.&lt;/p&gt;
&lt;h2&gt;The real work is play&lt;/h2&gt;
&lt;p&gt;Mathematicians keep inventing new cryptography. Elliptic curves, homomorphic encryption, zero-knowledge proofs.  We're getting breakthrough after breakthrough that genuinely expand what’s possible. But going from a modern ZKP course back to this old paper made something obvious: we're still just scratching at what the early primitives can do.&lt;/p&gt;
&lt;p&gt;The limiting factor isn't the crytography itself. It's that we don't understand what we already have. Maybe we tell ourselves it's too hard, maybe marketing people and academic experts make it sound harder.&lt;/p&gt;
&lt;p&gt;Joera—another friend—has been building a publishing system for journalists. Not just proof of authorship; actual author control. A writer can revoke access to their work after publication, or move it elsewhere, and the proof structure follows them. No platform lock-in. No hostage situations disguised as CMSs.&lt;/p&gt;
&lt;p&gt;I’m working on a cryptographic ticketing system for conferences, trying to solve the RSVP problem. Everyone signs up for a bunch of events but attends one, which leaves organizers guessing and events half-empty. Cryptographic tickets can turn this fomo into a positive signal game, all without surveillance.&lt;/p&gt;
&lt;p&gt;A bunch of us &lt;a href=&quot;https://infinite.build/&quot;&gt;hang out weekly&lt;/a&gt;. We're in chat helping each other on our projects, showing each other cool stuff, thinking out loud. We play with the primitives we have.&lt;/p&gt;
&lt;p&gt;Most people think of Mental Poker as a fun aside—the RSA trio goofing around. Nerd-sniping us with a niche puzzle about modems and poker.&lt;/p&gt;
&lt;p&gt;But rereading it now, it feels like they were leaving a message in the margins: the space of possible applications is much wider than we think.  We just need to ask, “What else can this do?”&lt;/p&gt;
&lt;p&gt;RSA were trying to show us that we already have what we need. They weren't making in-jokes for cryptography nerds, they were inviting us to play too.&lt;/p&gt;
</description>
  </item>
</channel>
</rss>
