<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://mmlado.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://mmlado.com/" rel="alternate" type="text/html" /><updated>2026-10-05T15:13:36+00:00</updated><id>https://mmlado.com/feed.xml</id><title type="html">mmlado</title><subtitle>walleteer. Air-gapped wallets that do not phone home.</subtitle><author><name>Mladen Milankovic</name></author><entry><title type="html">Keycards for a building nobody can renovate</title><link href="https://mmlado.com/blog/keycards-for-a-building-nobody-can-renovate/" rel="alternate" type="text/html" title="Keycards for a building nobody can renovate" /><published>2026-09-29T00:00:00+00:00</published><updated>2026-09-29T00:00:00+00:00</updated><id>https://mmlado.com/blog/keycards-for-a-building-nobody-can-renovate</id><content type="html" xml:base="https://mmlado.com/blog/keycards-for-a-building-nobody-can-renovate/"><![CDATA[<blockquote>
  <p>Note: Points in this article are valid at the time of publication. If you're coming from the future... Hi, future! Take everything here with a grain of salt.</p>
</blockquote>

<p>During a crypto event I got a Logos fanzine from someone I can now call a friend. I dropped it into a bag and didn't pay much attention to it. Some time passed and we met again, and talked properly this time. He told me to read the fanzine he gave me. I did, and it hooked me, though I didn't act on it. I had a steady job. Why rock the boat.</p>

<p>Then, my mom died, and I was looking at my own clock and the choices I'd made. Less than two months later I was on the EthBelgrade stage <a href="https://www.youtube.com/watch?v=waByT_FUTQo">telling my story</a>, telling the audience they don't need to ask for permission, and the target audience was me, all along. The ideas from that fanzine had been sitting in the back of my mind for years, and they all came out at once. Steady wasn't enough anymore. I joined the cypherpunk movement, and I didn't ask for permission.</p>

<p>Keycard pulled me in. The card in the title: a smartcard wallet where the key is made in the card and stays there. I wrote it a Python SDK, then a Nim one. Then Keycard Shell came out, a signing device built around the card, and I had an idea: an old phone could be the shell. <a href="https://github.com/mmlado/keycard-pal/">Keycard Pal</a> was born.</p>

<p>I was looking for proof that my new freelancer life could work, by earning just a cent from something. Logos' λPrize opened with two Keycard-related entries, <a href="https://github.com/logos-co/lambda-prize/blob/master/solutions/LP-0009.md">LP-0009</a> and <a href="https://github.com/logos-co/lambda-prize/blob/master/solutions/LP-0010.md">LP-0010</a>, which were right up my alley... and I snatched them! I tried to compete for other prizes too, and the tech drew me in. I sent in proposals for two of Logos' Requests for Proposals, RFP-001 and RFP-002, the admin and freeze authority. I knew these set a base that many programs on the Logos blockchain would build on.</p>

<p>I have been doing this long enough to see the bigger prize. Not two libraries. A system where anyone can write one without touching SPEL, the framework Logos programs are built with. That system is now part of SPEL, and <a href="https://docs.logos.co/lez/extensions/build-a-spel-extension-library">how to write a library</a> is in the docs.</p>

<h2 id="the-mall">The mall</h2>

<p>Modern malls have card readers on their doors. Some doors open only for the owner's keycard, and the owner is whoever swiped first on opening day. There are doors, a store for example, that anyone's card opens, including the owner's. The owner can give their keycard to someone else, and they become the new owner of the building. The keycard can also be destroyed. Then those doors never open again and the mall is a public space without an owner. This is the first library, admin authority.</p>

<p>The builder can also install a lockdown system. Every door gets a lock by default, and the builder picks the ones that do not. Some doors don't need protection, and some must stay open, for example, the one in front of the lockdown release button. The owner can hire a security chief. The moment a visitor looks wrong, the chief can lock down every door that has the locking mechanism. Nobody gets in, not even the owner. The chief can also be picky and ban specific people instead of locking everything. A ban can be lifted, but the building never forgets. Nothing on this chain can be erased, so the name stays in the register with a line through it, for anyone to read. The security chief can leave, and let the owner pick a new chief. They can also stay on duty after the owner destroys their own keycard. That is on purpose. Somebody still has to watch the public floor. This is the second library, freeze authority.</p>

<p>Why give the mall an owner at all, and why let the owner walk away? Two things I want, and they pull against each other. As a user of a blockchain I want immutability. When I stake a token, I want all the information I need to make that decision, and I want the underlying mechanism to stay as it is. I don't want to join another Discord server, just to hear when something changes. As a dev I know a program is not finished on the first day. Nobody ships the final version on day one.</p>

<p>The owner is there for the program's early days, when it needs someone who can act fast, without a vote. Once a community forms around the project, the owner can let go, renounce, destroy their keycard, and leave the program to whatever rules the community runs it by. If the program doesn't have a mechanism to continue, the admin authority can transfer the rights to an account another program controls, a vote or a multisig with its own rules, instead of renouncing. If there is neither, no mechanism in the program and no hand-off, the values are final. That is the promise.</p>

<p>Freeze authority carries no such weight. It is a duty, not a promise, and whoever holds it can walk away whenever they want. When the cracks show, it is the last brake left. Pull it, the mall is locked. Nobody pulls it, the mall gets looted. Which doors get a lock is the builder's call.</p>

<p>The two libraries fill different roles, and their renounces are deliberately opposite. Admin renounce must be permanent, or the promise is worthless. Freeze renounce leaves the post empty, it does not seal it. A security post nobody can ever fill again is the emergency. As long as an owner still exists, the owner can seat a new chief at any time, even while the mall is locked down. That recovery runs through the owner, so it dies with the owner.</p>

<h2 id="when-cracks-appear">When cracks appear</h2>

<p>Immutable cuts both ways, and on the Logos blockchain it cuts harder. There's no renovation. Not by the owner, not by anyone. Renovation was never the owner's job.</p>

<p>On the Logos blockchain a fixed program is a new program with a new address. The crack stays where it was.</p>

<p>What happens next depends on two decisions, one made when the program was written and one made when the owner left. If the security post was kept, the chief pulls the lockdown, and nobody walks into it. If the builder marked the exit doors as ones that stay open during a lockdown, people leave with what they came in with and build a new mall next door, with a fixed wall. That is a migration, not a walk. Bring boxes. The new mall opens with no owner at all, and if it uses the same open initialize as the first one, whoever swipes the first keycard becomes the owner. I come back to that race, and how to close it, in the advice below.</p>

<p>If the exits are not there, then yes, everyone is stuck, and there is nobody to call. That is not a flaw the library can fix. It is the price of rules that cannot change under your feet. This is the bargain every one of us makes, every time.</p>

<p>One more thing, and this one bites. If the owner has already destroyed their keycard, nobody can hire a new chief, and a locked building with no chief stays locked. Locked, no chief, no owner. That is forever, and on the Logos blockchain forever means forever.</p>

<p>Which is why the owner's last decision is the one that matters. The security post can only be reassigned by the owner, so whoever holds it when the keycard is destroyed is the last chief the building will ever have. A community-run program should hand that post to the community itself, a program account it controls, not one person's keycard.</p>

<h2 id="the-person-on-the-list">The person on the list</h2>

<p>Why would someone who just told you not to ask for permission build a door that locks people out? Because the lock is not part of the chain. A builder chooses to install one, and on this chain a mall that opens without locks stays without locks. And every ban is public, forever. That is one more reason to hand the security post to a community, and the best reason I know to think twice before you install the lock at all.</p>

<h2 id="how-it-was-built">How it was built</h2>

<p>The mall is a program on the Logos blockchain. The city, the place for the programs, is the LEE (Logos Execution Environment). SPEL is the framework the builder uses to put up the mall. In LEE information is stored in accounts, and every account is owned by a program. If you worked with Solana this will be familiar. The program that pulls a library in, I call the consumer. A gate is what hangs on a door. In code it is a marker, an attribute you put on the module or on a function, and at build time the framework wires the library's check into whatever you marked. The build checks the wiring: that the marker is in the right place and that the accounts it names are the ones the library declares. Whether the check turns the right caller away, you only find out at runtime. The build can't tell you. The review section below is the proof.</p>

<p>The RFP came in three milestones. The hardest part fell between the second and the third. The plan was one program account per library, each with its own initialize. Then someone in the Discord suggested one account for all of the program's parameters. Simple to say, hard to do, because the data is plainly byte-serialized into the account. To read or write its own field, a library would have to know the layout of the whole account and leave the rest untouched. I did not go that far. What shipped is the plain version: every library declares the byte range it uses inside the shared account, and the build refuses two ranges that overlap. It shipped as one of two modes. A library can also get an account of its own, and the mall below uses that mode, which is why its call passes <code>admin_config</code> and <code>freeze_config</code> as two accounts. The whole-layout problem is still open. What I would like to see in LEE is TLV, tag, length, value, the layout Solana already uses for its token extensions. Find your tag, take your bytes, ignore the rest.</p>

<p>During implementation, <a href="https://github.com/0x-r4bbit">r4bbit</a> hit a problem with the token program's mint authority and <a href="https://gist.github.com/0x-r4bbit/ead1077de7b5ab6a5ed67b8b6a69f5bc">wrote it up</a>. I read his notes with the admin library open. Same problem, sitting right there. The original design had the caller pass in the account of the new admin. But in LEE the caller is itself passed into the function as a parameter, and LEE rejects the same account appearing twice. So the most common case, a caller naming themselves as admin, was impossible as specified. The fix was simple: initialize now self-designates the caller as the authority. I tried three other shapes before this one. Why each one lost is in <a href="https://github.com/mmlado/spel-admin-authority/blob/main/docs/adr/0005-self-election-via-caller.md">ADR-0005</a>, the design note for that decision. I ran it end to end on a local node. The node rejected transfer-to-self with the exact duplicate-id error the whole decision rested on. And at acceptance the RFP asks for one thing here: the authority is set at initialization. Self-election sets it.</p>

<p>What surprised me was the framework itself. Everything a library does has to work in three places: the macro expansion, and the two IDL generators, which produce the interface description for callers and parse the plain source without expanding the macros. Three places, three ways to get it wrong. The same machinery is what amazes me. Rust's macros and Cargo's metadata carry the whole library system: a library declares in its manifest what it gates and what it injects, and the framework reads that at build time and generates the code into the consumer's binary. I expected to need a runtime or a change to the LEE. I needed neither.</p>

<p>Everything up to the next heading is code, simplified. It shows the libraries. It is not the rabbit hole.</p>

<figure>
<a href="/assets/keycards/floorplan.png"><img src="/assets/keycards/floorplan.png" alt="Floor plan of the mall. Four doors: open and set_rent carry the owner's keycard reader, set_rent and shop carry the lockdown lock, open and leave are exempt from the lockdown." /></a>
<figcaption>The mall as a floor plan. Four doors, and what hangs on each.</figcaption>
</figure>

<p>Here is the mall, in code. Two lines in Cargo.toml bring the libraries in:</p>

<pre><code class="language-toml">admin-authority = { git = "https://github.com/mmlado/spel-admin-authority.git", tag = "v0.1.2" }
freeze-authority = { git = "https://github.com/mmlado/spel-freeze-authority.git", tag = "v0.1.3" }
</code></pre>

<p>Two markers on the module install the keycard readers and the lockdown wiring. The owner's first swipe, the injected initialize, is not in the listing. The framework generates it. Every door is a function, and what you put on the door is what it checks:</p>

<pre><code class="language-rust">#[lez_program]
#[admin_authority]  // the owner's keycard
#[freeze_authority] // the lockdown wiring
mod mall {
    // Opening day, after the owner's first swipe. Owner only, and exempt from
    // the lockdown because the lockdown system is installed right after.
    #[require_admin]
    #[freeze_exempt]
    #[instruction]
    pub fn open(config) { ... }

    // A door only the owner's keycard opens. Locks down with the rest.
    #[require_admin]
    #[instruction]
    pub fn set_rent(config, rent) { ... }

    // A door anyone's card opens. Locks down with the rest, and a
    // banned visitor is turned away here.
    #[instruction]
    pub fn shop(config) { ... }

    // The exit. The builder marked it to stay open during a lockdown.
    #[freeze_exempt]
    #[instruction]
    pub fn leave(config) { ... }
}
</code></pre>

<p>The framework adds the accounts each gate needs to every door, so a caller passes the keycard reader and the lockdown state along with the door's own accounts. A stranger at the owner's door:</p>

<pre><code class="language-rust">let err = mall::set_rent(admin_config, stranger, freeze_config, freeze_account, config, 42);
assert!(matches!(err, Err(SpelError::Unauthorized { .. })));
</code></pre>

<p>The whole project, with the lockdown, the ban, and the destroyed keycard as tests, is at <a href="https://github.com/mmlado/spel-blog-mall">spel-blog-mall</a>.</p>

<h2 id="the-review">The review</h2>

<p>The loop was simple. I wait, comments arrive, I fix. From the reviewers' side it was thorough. They pinned the exact commit and framework revision, ran the full test suite, compiled the sample programs, and replayed my committed command-line walkthrough until it matched byte for byte. Then they read what the crate promised and counted what it shipped. <a href="https://github.com/mmlado/spel-freeze-authority/pull/1#pullrequestreview-4740339227">Five of seven is not a passing grade.</a> That review checked the deliverables against the RFP. It is not a security audit, and neither library has had one.</p>

<p>The finding that taught me the most was small on the page. The per-account freeze gate looked for the signer by the parameter's name. Name that parameter anything else in your program and the framework quietly injected a stand-in with the name it expected. The gate checked the stand-in. The real caller walked straight through. Everything compiled, the tests were green. Green is a mood, not a verdict. One line in a review: it blocks a frozen key, not a frozen principal. The fix reshaped how every gate finds the accounts, by the role and not by the name. <a href="https://github.com/mmlado/spel-freeze-authority/pull/1#pullrequestreview-4785969760">I added a self-test</a> so the accounts a library declares it injects can never again drift from what the generated wiring accepts. It never reached a tagged release.</p>

<p>The bug had passed silently. Python has one rule about that, and the review made it the rule for the rest of the work: "<a href="https://peps.python.org/pep-0020/">Errors should never pass silently. Unless explicitly silenced.</a>"</p>

<p>A big thank you to the Logos review team. Their testing and comments are all over these libraries. And to <a href="https://github.com/danisharora099">danisharora099</a> separately, who stuck with it from the first milestone to the last and kept finding the next thing to fix.</p>

<h2 id="for-the-builders">For the builders</h2>

<p>The admin library is barely out of development and the lending protocol that won <a href="https://github.com/logos-co/rfp/issues/141">RFP-008</a> already lists it as a dependency. That made me grin. It was the whole point. I built the libraries so nobody else would have to. One proposal in, and the bet already holds. And now I'm on the hook. The gates I wrote are permanent. If I got something wrong, their program carries it forever.</p>

<p>The advice below is what I owe for that, with a date on it. <strong>If you read this a year from now, check it still holds.</strong></p>

<p>First, the race from the migration story. Logos deployment transactions carry only bytecode, no instructions, so deploy and initialize cannot be one transaction, and the chain records no deployer to check against. That much is the platform. The rest is a choice I made: the injected initialize is open, and whoever calls it first becomes the admin. Send it as your very next transaction. Before you tell anyone the address. Before you post on X. That narrows the window, it does not close it, and once the owner is set, it is set. The freeze library went the other way, its initialize requires the admin's signature, so the security post cannot be raced. If you want the closed version for admin today, do not use the injected initialize: call the library's bootstrap helper from your own initialize handler and assert the caller against an address you compile in.</p>

<p>Admin renounce is permanent. Anything behind an admin gate with no other way in is final. In a lending protocol that could be the rate model. You better be damn sure this is what you want before you destroy that keycard.</p>

<p>Have a test that calls each gated function as a stranger and expects a rejection, <a href="https://github.com/mmlado/spel-admin-authority/blob/main/admin-authority-sample/src/main.rs">the admin sample ships one to copy</a>. If the stranger gets in, you shipped a decoration.</p>

<p>Deploying is signing your name on a building nobody can renovate, so check that what you are about to sign is what you meant. Look at the generated IDL for every function and type, and run <code>cargo expand</code> to see the code after the framework has expanded it, because that is what you are actually signing. It was the most useful tool I had during development.</p>

<p>The rest of the rules, transfer, renounce, and which doors the lockdown skips, are in the docs for <a href="https://docs.logos.co/lez/extensions/admin-authority">admin authority</a> and <a href="https://docs.logos.co/lez/extensions/freeze-authority">freeze authority</a>.</p>

<h2 id="after-the-contract">After the contract</h2>

<p>A program you deploy on these libraries today is never touched, and nothing I do later can reach it. New versions may need changes on your side. That is what the version number is for. This doesn't mean development has stopped. I have a pile of ideas for these two, written down as design notes between milestones, on my own clock. The contract ended at the last milestone. The work didn't. I'm not done with these two.</p>

<p>The code is MIT/Apache-2.0, on GitHub: <a href="https://github.com/mmlado/spel-admin-authority">admin-authority</a> and <a href="https://github.com/mmlado/spel-freeze-authority">freeze-authority</a>. Open an issue. Complain, suggest, argue. If you want a first contribution that is small and matters, <a href="https://github.com/mmlado/spel-freeze-authority/issues/13">here is one</a>. The freeze library names the three admin instructions it leaves ungated as plain strings in its manifest, and nothing checks that they still match what the admin library ships. A single test closes that gap, and there is one of the same shape in the crate to copy from.</p>

<p>The framework side <a href="https://github.com/logos-co/spel/pull/257">landed upstream</a> on 11 September. The libraries move to it with the next SPEL release, and then I go back to the issue list.</p>

<h2 id="your-turn">Your turn</h2>

<p>Cypherpunks don't need permission to build. But it helps when the ecosystem tells you what it needs and gives grants for building it, and Logos does both. The RFPs are listed at <a href="https://github.com/logos-co/rfp">github.com/logos-co/rfp</a>, and new ones are coming. Pick one where the requirements read like something you can build, and tell them how you would build it.</p>

<p>Things that I've learned the expensive way. Link everything: a merged PR beats a paragraph about the merged PR. Answer the reviewer's questions in the proposal, before the reviewer asks them. The proposal also holds your time commitment and price, and both count when they pick a winner.</p>

<p>If you'd rather start small, build a toy with the admin and freeze libraries. If the libraries get in your way, that's exactly the feedback I crave.</p>

<p>There is also the <a href="https://github.com/logos-co/lambda-prize">λPrize</a> list, where prizes come in sizes and the small ones are a way into the ecosystem. That is the door I came through.</p>

<p>I was looking for proof that the freelancer life could work by earning a cent. It worked. The keycard readers are ready. Go build a mall. Your turn.</p>]]></content><author><name>Mladen Milankovic</name></author><summary type="html"><![CDATA[Two libraries give a Logos program an owner and an emergency brake, on a chain where nothing can be patched. How they were built, what the review caught, and what to check before you deploy on them.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://mmlado.com/assets/keycards/hero.jpg" /><media:content medium="image" url="https://mmlado.com/assets/keycards/hero.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Code Against the Machine</title><link href="https://mmlado.com/blog/code-against-the-machine/" rel="alternate" type="text/html" title="Code Against the Machine" /><published>2025-06-06T00:00:00+00:00</published><updated>2025-06-06T00:00:00+00:00</updated><id>https://mmlado.com/blog/code-against-the-machine</id><content type="html" xml:base="https://mmlado.com/blog/code-against-the-machine/"><![CDATA[<figure><img width="1024" height="577" src="/assets/code-against-the-machine/slide-1.jpg" alt="Title slide: Code Against the Machine. A timeline: 2011 BTC mining, 2013 sells last BTC, 2017 first ETH, 2019 Ethereum enthusiast, 2023 EthBelgrade." /></figure>

<blockquote>
  <p>“Privacy is necessary for an open society in the electronic age.” — Eric Hughes</p>
</blockquote>

<p>GM</p>

<p>A friend once told me to buy a better graphics card to run a program that "created monetary value." I wasn’t new to distributed computing (think Seti@home), but this was different: 2011 Bitcoin mining. I tinkered, sold BTC on shady IRC chats via PayPal for $10–$20 a coin, and cashed out my last coins in 2013 when BTC was at ~$100, at my fiancée’s suggestion. "It’s a tidy profit," she said. We bought coal for the winter. First I warmed my room with GPU heat. Second, with that coal. Third, I warmed up to the idea of a decentralized future. No turning back.</p>

<p>In 2017, I mined again—this time Ethereum. Programmable money blew my mind. I sold for profit, but the real win was the rabbit hole.</p>

<p>Fast-forward to 2019: work handed me a crypto wallet project. Turns out, I was the only one who could decode the cryptic "crypto thingy" (yes, I still use that term unironically—it’s not a bug, it’s a feature). I dove into cryptography, consensus mechanisms, and blockchain fundamentals. Hooked again.</p>

<p>I joined EthBelgrade as a speaker in 2023 and became a volunteer, helping wherever the chaos needed me. Today, I’m here to connect a few dots—and dig into why I’m still here, knee-deep in this weird, wild blockchain world.</p>

<h2 id="cypherpunks--rebels-with-a-cause">Cypherpunks – Rebels with a Cause</h2>

<figure><img loading="lazy" width="1024" height="577" src="/assets/code-against-the-machine/slide-2.jpg" alt="Slide: Cypherpunks, Rebels with a Cause. Tim May, Crypto Anarchist Manifesto (1988). Eric Hughes, A Cypherpunk's Manifesto (1993). Phil Zimmermann, PGP (1991). Today: ProtonMail, GrapheneOS, YubiKey." /></figure>

<blockquote>
  <p>“A specter is haunting the modern world—the specter of crypto anarchy.” <br />
— Timothy C. May</p>
</blockquote>

<p>Long before I read a manifesto, I was already living the cypherpunk ethos. I encrypted emails. I encrypted my phone before it was the default. Experimented with custom ROMs. Guarded keys with YubiKeys—no clue a movement existed. Privacy wasn’t a buzzword; it was muscle memory.</p>

<p>But what even is privacy? <br />
It’s the right to selectively share—to control what parts of your identity you reveal, and to whom. Autonomy. Boundaries. The digital equivalent of closing a door.</p>

<p>Then I discovered them:</p>

<ul>
  <li>Tim May, who skipped coding to write <a href="https://theanarchistlibrary.org/library/timothy-c-may-crypto-anarchist-manifesto.muse">The Crypto Anarchist Manifesto</a>—arguing math could replace institutions.</li>
  <li>Eric Hughes, who defined digital privacy in <a href="https://cdn.nakamotoinstitute.org/docs/cypherpunk-manifesto.txt">A Cypherpunk’s Manifesto</a> and launched the mailing list that organized a revolution.</li>
  <li>Phil Zimmermann, who put strong crypto in everyone’s hands via PGP, because “privacy is a right.”</li>
</ul>

<p>Their work isn’t history—it’s tooling.</p>

<ul>
  <li>ProtonMail’s PGP guts.</li>
  <li>GrapheneOS on my phone.</li>
  <li>YubiKeys guarding my keys (yes, still).</li>
</ul>

<p>Cypherpunks don’t die. They compile.</p>

<h2 id="technoanarchists--architects-of-the-ungovernable">Technoanarchists – Architects of the Ungovernable</h2>

<figure><img loading="lazy" width="1024" height="577" src="/assets/code-against-the-machine/slide-3.jpg" alt="Slide: Technoanarchists, Architects of the Ungovernable. Mesh nets and darknets as blueprints. Ethereum's programmability, ideals to tools. Everyday tactics: camera cover, cash, ProtonMail." /></figure>

<blockquote>
  <p>“I come from Cyberspace, the new home of Mind.” <br />
— John Perry Barlow</p>
</blockquote>

<p>Anarchy isn’t lawlessness—it’s a system where we write the rules. Technology doesn’t just enable this; it demands it. Decentralization is the techno-anarchist’s lifeblood: spreading responsibility across nodes, resisting co-option by governments, and replacing hierarchies with voluntary coordination.</p>

<p>Programmable blockchains? They’re not just infrastructure. They’re immutable constitutions—governance rules etched in code, enforced by math, not intermediaries. Trust isn’t granted; it’s provable.</p>

<p>But this isn’t about abstract protocols. It’s a hands-on rebellion:</p>

<p>Paying with cash to opt out of surveillance. End-to-end encryption to reclaim privacy. Sliding my phone camera cover—because my hardware, my rules.</p>

<p>When I worked on a client’s hardware wallet—I realized securing keys isn’t just engineering. It’s a political manifesto. Every line of code, every soldered chip says: This is mine. This is mine. This is mine.</p>

<p>The future isn’t built by institutions. It’s forged by people who code, solder, and vote—with their own hands.</p>

<h2 id="bitcoin--the-spark-not-the-fire">Bitcoin – The Spark, Not the Fire</h2>

<figure><img loading="lazy" width="1024" height="577" src="/assets/code-against-the-machine/slide-4.jpg" alt="Slide: Bitcoin, The Spark, Not the Fire. Privacy preserving. Censorship-resistant, permissionless. Limited programmability. A 'not your keys, not your coins' meme." /></figure>

<blockquote>
  <p>“What is needed is an electronic payment system based on cryptographic proof instead of trust.” <br />
— Satoshi Nakamoto</p>
</blockquote>

<p>Bitcoin taught me ownership isn’t a privilege—it’s a right. With just a seed phrase, I held absolute control over my value. It kept my identity private, hid my assets in plain sight, and let me transact without begging for permission. No bank could censor it. No institution could gatekeep it.</p>

<p>But that was all it wanted to be—a base layer for money. Static. Predictable. I left because Bitcoin’s simplicity felt limiting—I craved novelty, experimentation, and the thrill of building beyond money.</p>

<p>Ethereum was the spark. Suddenly, code could enforce trust. Smart contracts could replace intermediaries. Yes, most still use it for “money 2.0”—but for someone who speaks its language, the potential is limitless: DeFi, DAOs, NFTs, privacy tools… the list grows daily.</p>

<p>Selling my BTC still stings when I see its price today. But the real ROI wasn’t in the coins—it was in the decentralized values I had absorbed along the way: self-sovereignty, resistance to control, and the belief that systems should serve people, not the other way around.</p>

<p>Bitcoin gave me freedom. Ethereum gave me a canvas.</p>

<h2 id="ethereum--where-ideals-become-tools">Ethereum – Where Ideals Become Tools</h2>

<figure><img loading="lazy" width="1024" height="577" src="/assets/code-against-the-machine/slide-5.jpg" alt="Slide: Ethereum, Where Ideals Become Tools. A Venn diagram of censorship resistance, identity and credentials, and governance and DAOs, with Ethereum in the middle. Smart contracts, world computer, scalability with L2 and ZK." /></figure>

<blockquote>
  <p>“Ethereum is a decentralized platform that runs smart contracts...” <br />
— Ethereum Foundation documentation</p>
</blockquote>

<p>And while Bitcoin lit the match. Ethereum built the forge—a lab where ideology meets code. While Bitcoin stayed a spark, a perfect, unchanging base layer, Ethereum became the place to ask the hard question: Can decentralized infrastructure replace institutions? Spoiler: Not yet, but we’re building.</p>

<p>The techno-anarchists dreamed of a “world computer,” a shared machine where anyone could deploy trustless apps. Ethereum delivered—but with limits. Scalability bottlenecks choked throughput, driving fees so high they became gatekeepers in disguise. Access had its own flaw: “Pay-to-play” wasn’t freedom. You needed ETH just to use ETH. Ethereum’s core wasn’t broken, but it was unfinished—a monolith straining under its own ambition.</p>

<p>So the system broke itself apart. The endgame? Specialized layers. Ethereum’s core became the settlement layer, anchoring security while Layer 2s—rollups—took the strain of transactions. Modular upgrades turned scarcity into abundance, infinite scalability without sacrificing the decentralized bedrock.</p>

<p>But access wasn’t the only flaw. The account model was a glass house—every balance, transaction, and pattern visible to all. That’s where Zero-Knowledge Proofs stepped in. ZKPs let you prove a computation is valid without revealing its inputs. ZK-EVMs are already here, turning Ethereum’s transparency into selective opacity. Soon, you’ll validate ownership without exposing your holdings, execute trades without leaking strategies.</p>

<p>And then there was the pay-to-win problem. Ethereum’s latest upgrade fixed it: EIP-4337 lets any token pay gas fees. No ETH? No problem. Someone else can sponsor your actions, turning “pay-to-play” into “pay-with-anything.”</p>

<p>Ethereum isn’t a product. It’s a movement—a living system rewriting its own code. Sharding, ZKPs, state rent—each upgrade a step toward a future where openness, scalability, and privacy aren’t trade-offs but defaults. The decentralized world computer isn’t finished. It’s alive. And like fire, it only grows when we all add fuel.</p>

<h2 id="post-state-futures--a-values-audit">Post-State Futures – A Values Audit</h2>

<figure><img loading="lazy" width="1024" height="577" src="/assets/code-against-the-machine/slide-6.jpg" alt="Slide: Post-State Futures, A Values Audit. DAOs and governance as unstoppable social contracts. Risks of token plutocracy and forks. Low voter turnout." /></figure>

<blockquote>
  <p>“A DAO is an entity that lives on the Internet and exists autonomously” <br />
— Vitalik Buterin</p>
</blockquote>

<p>DAOs aren’t just governance tools—they’re the techno-anarchist lab where social contracts get compiled into smart contracts. The dream? Communities govern themselves, bypassing hierarchies. The reality? Most are still prototypes, crashing into edge cases like legal systems, incentive design, and human ambition.</p>

<p>Governments don’t know what to do with DAOs, so they shoehorn them into 20th-century legal buckets: LLCs, corporations, trusts. Suddenly, experiments in self-governance become paperwork compliance. The revolution gets a CFO.</p>

<p>Unbalanced tokenomics? Power concentrates. A few whales = de facto board of directors. DAOs meant to democratize control often replicate the very systems they’re trying to replace.</p>

<p>Even when DAOs hold votes, turnout is often shockingly low. Why?</p>

<ul>
  <li>Apathy: Token holders prioritize price over protocol.</li>
  <li>Complexity: Governance proposals are dense, technical, or poorly communicated.</li>
  <li>Incentive gaps: Voting doesn’t always reward participation—or punish apathy.</li>
</ul>

<p>Low turnout isn’t just a bug; it’s a systemic risk. A tiny faction can dictate outcomes, turning “decentralized” decisions into plutocratic referendums.</p>

<p>Here’s the hack: Forking is the immune system of decentralized governance. If a DAO goes off the rails, communities can split, take the code, and try again. No court rulings. No board votes. Just a git clone and a manifesto.</p>

<p>I voted on AIP-1. 76% said no. The decision was already made. The vote? A rubber stamp for a centralized team’s roadmap. No grassroots movement. No open debate. Just a token holder poll to legitimize a decision that has already been made.</p>

<p>Was it a failure? Depends on your lens. The DAO didn’t die. It learned: decentralization isn’t a checkbox—it’s a process.</p>

<p>DAOs aren’t the endgame. They’re the alpha software for self-sovereign communities. They’ll break. They’ll get rekt by greed, inertia, or regulation. But as long as forking exists, the techno-anarchist dream stays alive: Code as governance. Power to the people. Always beta.</p>

<h2 id="the-tension--idealism-vs-reality">The Tension – Idealism vs. Reality</h2>

<figure><img loading="lazy" width="1024" height="577" src="/assets/code-against-the-machine/slide-7.jpg" alt="Slide: The Tension, Idealism vs. Reality. Concentrated economic coercion. VPN, Tor and end-to-end encryption protect everyone. Tools trade-off. A distracted-boyfriend meme: me, crypto, bank." /></figure>

<blockquote>
  <p>“Security is always a trade-off. ... I call them ‘dual-use’ technologies.” <br />
— Bruce Schneier</p>
</blockquote>

<p>Now that crypto’s reached a wider audience, many see only “number go up”—not the ideas beneath blockchains. Big players with deep pockets could exploit this. Imagine a threat like:</p>

<p>“I see you have a nice blockchain here. It’d be a shame if its value crashed tomorrow.”</p>

<p>Suddenly, decentralization isn’t just about resisting governments—it’s about resisting economic coercion from entities that treat protocols like poker chips.</p>

<p>Bruce Schneier once said: security always involves trade-offs. VPNs, Tor, end-to-end encryption—these tools protect me, sure. But they also protect criminals. That doesn’t mean we surrender privacy. It means we choose our battles. Using privacy tech doesn’t imply guilt. It implies agency.</p>

<p>We make these trade-offs daily. Last weekend, I paid cash for coffee at 7 in the morning. Got 20 small bills back instead of 4 large ones—register didn't have big notes. Swiping a card would’ve been easier. Faster. Cleaner. But it would’ve created a digital breadcrumb. Every choice chips away at anonymity.</p>

<p>Even building this deck was a trade-off. Yes, it was written with an AI assistant. Not because I’m lazy—I could’ve rambled for days without one. But for brevity and clarity? A must. The model I used remembers me—it learned my voice, gave sharper answers. I could’ve used a “privacy-first” AI that forgets everything, but it would’ve been slower, blander. Less… me.</p>

<p>I’m only human. I fumble privacy—sometimes I prioritize convenience. But I keep my “world settings” as low as possible: minimal tracking, no biometrics, no centralized logins.</p>

<p>Here’s the confession: I’m not building the tools I wish existed. I’ve dreamed of them for years—privacy-first protocols, decentralized infrastructure, systems that protect users by default. But I’ve chosen a different path: family, career obligations, and the inertia of “good enough” solutions.</p>

<p>I’ve spent my energy on client projects, on code that pays the bills—not on revolutionizing privacy. And now? Time is a luxury I can’t afford.</p>

<p>But here’s the thing: It’s not too late for you.</p>

<p>I’m asking you—the builders—to take what I’ve stumbled through and run further. To plant trees under whose shade you may never sit. Because the post-state future isn’t about any one person. It’s about all of us writing code, forking protocols, and making trade-offs that tip the balance toward freedom.</p>

<p>Because…</p>

<h2 id="fork-the-future">Fork the future</h2>

<figure><img loading="lazy" width="1024" height="577" src="/assets/code-against-the-machine/slide-8.jpg" alt="Slide: Fork the future. Build like the future depends on you. Because it does. A QR code to my privacy tool recommendations." /></figure>

<blockquote>
  <p>Cypherpunks write code.<br />
— Eric Hughes</p>
</blockquote>

<p>Back in the day, when my crypto story began, I never imagined I’d stand here—asking you to build the future. But here we are.</p>

<p>Build like the future depends on you. Because it does.</p>

<p>Ask yourself:</p>

<p>Do your tools expand human agency—or replicate old hierarchies?</p>

<p>Do they guard privacy by default—or demand trust in centralized systems?</p>

<p>Act now. Install one privacy-protecting app tonight. <a href="https://paragraph.com/@mmlado/privacy-aware">Scan this QR code</a> from my recommendations—tools I’ve vetted, tested, and use daily.</p>

<p>Start small. Take one step. Then build on it.</p>

<p>And never give privacy away easily. Every time you trade it for convenience, ask: Is this price worth it?</p>

<p>The post-state future isn’t a revolution—it’s a thousand incremental choices. You’re not just coding features. You’re writing freedoms.</p>

<p>Because in the end, the future belongs to those who code it.</p>]]></content><author><name>Mladen Milankovic</name></author><summary type="html"><![CDATA[The post-state future isn't a revolution, it's a thousand incremental choices. You're not just coding features. You're writing freedoms.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://mmlado.com/assets/code-against-the-machine/slide-1.jpg" /><media:content medium="image" url="https://mmlado.com/assets/code-against-the-machine/slide-1.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>