Category: Web3

  • Fifty-Two Thousand Transactions a Day. I Counted the Humans.

    Fifty-Two Thousand Transactions a Day. I Counted the Humans.

    This morning I posted in the community of the Nimiq Mini Apps competition. It was a long post, and every number in it traced back to a source. At the bottom I attached the only GIF that fit: Obama at the podium, eyes closed, two fingers at his lips, his other arm out wide, letting the microphone fall.

    The title said it plainly. “Why I’m not doing Cycle 3.”

    Stakes didn’t place in Cycle II, and I won’t enter the next one. Here I’ll go one step further than I did over there. I’m done building on Nimiq.

    If you’ve followed this blog for a while, that might surprise you. In July I told you about the key I left in 2021, a Nimiq login file I dug out of an old MacBook. I made my first Nimiq wallet in January of that year and tried to talk my whole family into it. I was a fan. Some of that hasn’t changed. A login you drag in as a picture. Payments that take one tap, with no gas and no seed phrase. Those are still some of the best ideas I’ve seen in this space.

    But good ideas need people standing on them. When I went looking for the people, I mostly found machines.

    What’s on me

    My part first, because it’s the part I can’t argue with.

    Fifteen points went to real usage, and the full fifteen needed 25 users or more. Twenty-two wallets transacted with Stakes. Nimiq Pay sends from changing addresses, so the number of actual people behind those 22 is probably lower. The bar was public from the 3rd of September. I missed it.

    So yes, I’m disappointed. You enter a competition to win.

    That’s part of it. The bigger part is how this cycle was run, and what I learned about building on Nimiq along the way.

    A deadline is a deadline

    Stakes changed shape over Cycle II. It started as a social game, a crew of friends putting money on the same goal. It turned into something much more personal. You pick the one thing you keep putting off. You put a little money on your word. Then, as the app itself says, today is the whole game. Your day closes at a time you can see on the screen. Make the day by then, or that day’s slice is gone.

    So I noticed every time the competition moved one of its own dates.

    Cycle II was first published as 10 August to 7 September. It ran from 24 August to 18 September. Cycle III was set for 14 September, then 7 October, and now 14 October. Results were due on the 2nd of October. They came out on the 8th.

    The scoring changed ten days into the cycle. Design dropped from 25 points to 10, and a new 25-point Nimiq category appeared. Last time I wrote that most of my hours went into the surface, into making something feel calm inside a window the size of a postcard. That’s the category that shrank.

    The prize split changed at the end. The rules page said $10,000, $5,000 and $2,000, and it still does. Then first place became $7,000 so a fourth app could be paid. I’m happy for everyone who got paid. A published prize should still be the published prize.

    There was no freeze. Submissions closed on 18 September, but apps are judged live, and nothing says which version counts. Some apps kept shipping all through the judging weeks. I froze mine. Zero commits and zero deploys from 12 September to 3 October, because I read “deadline” as a deadline.

    Fifteen points rode on “unique users,” and nowhere does it say how a user is counted.

    And open source only applied at the door. Entries had to be public repos under the MIT license. One of the winners passed that check on 18 September. Today its repo says “page not found.” I don’t know when or why. Nothing in the rules forbids it, and I’ve made the Stakes code private too, now that I’m out. But a winning app whose code nobody can read anymore doesn’t sit right with me.

    All of this is allowed, by the way. The rules say they can be changed “at any time without notice.”

    Allowed and fine aren’t the same thing.

    Building on the platform

    Even a perfectly run competition wouldn’t have fixed the platform.

    On iOS a mini app can freeze on top of the wallet after a normal app switch, and only a force-quit gets you out. It hits other mini apps too, so any judge could have run into it on any entry. I filed it on 4 September with a full reproduction. Five weeks later, no reply from Nimiq.

    There are no notifications. The whole app is built around a day that closes at a set time, and it has no way to tell you that time is running out. If you don’t open it, nothing reaches you.

    On Android you can’t share an image out of a mini app. Only a link gets out. The app is personal now, but it still has a social side: when you keep a day, you get a card worth showing someone. On Android that card stays inside the app.

    A mini app also has no cheap way to tell a real person from a script. I learned that one the fun way, three hours after launch.

    On the 1st of October, in the middle of judging, one operator switched off the community block explorer, the public RPC node Stakes read from, and the site that listed the mini apps. Payouts for three real challenges, with real money in them, stalled for three and a half days before I caught it. The listing link I gave you in my first post about Stakes now opens a sunset notice.

    Builders were encouraged to bring improvement ideas to the forum. New members can’t open a thread until they reach Trust Level 2, and my post is still waiting for approval. The roadmap intro thread has 339 views and zero replies. The whole forum had six posts last week.

    And the community. I’m honestly not sure where it lives. I thought it was on Skool, then it turned out there’s a forum too. The competition page tells you to show up, and warns that builders who “build and forget” will score lower. Some people really did show up, week after week, helping other builders. I’m level 5 on that Skool board myself. None of those helpers got a mention, and in the scoring, community was worth two points, for a single post. I’d like to see that change, for their sake.

    I counted the humans

    Which brings me to the chain itself.

    Block explorers show about fifty-two thousand Nimiq transactions a day. That number is real, and it’s growing. The twelve-month average is around thirty thousand.

    I wanted to know who’s behind it. So I pulled every transaction from one full day, 8 to 9 October, and sorted them.

    About forty thousand are staking operations. More than half of those come from a single bot.

    Most of what’s left comes from six automated addresses. The busiest is a payout bot for browser mining. It sends 8,665 transactions a day on its own, each with the same little message: “You mined NIM on Nimiq.Space!”

    Take all of that away and you’re left with payments from ordinary wallets. About 1,100 that day. One payment every eighty seconds, across the whole chain. Roughly two in every hundred of the transactions the explorer shows you.

    You can be generous. One address looks like an exchange paying out withdrawals to real people. Count it in and you get about 1,400.

    One day is one sample, and days vary. I’d happily be shown a better one. For scale, though: 142 apps were entered in Cycle II.

    Behind the big number, for people, it’s close to a ghost town.

    Machines paying machines doesn’t bother me. I build agents for a living, and I expect a lot more of it, on every network. But stakes.day is made for a person and one day of their life. The app lives inside the wallet, so that person has to be in the wallet first. A personal app still needs people. You don’t find them in a crowd of bots.

    An empty lineup

    Surfing is about as personal as it gets. Nobody paddles for you, nobody rides your wave. An empty lineup is the dream: every set is yours.

    What I built is personal in the same way. It’s your moment and your day, and nobody can bank it for you.

    But here I’m not the surfer. I’m the one building something for other people to use. A beach with nobody on it is a beautiful place to surf and a terrible place to open a surf school.

    I dip into a lot of waters, and I like it that way. This one had beautiful water. The technology does things I still wish the rest of the industry would copy. But good engineering doesn’t bring people. People come for each other, and they stay where the others already are.

    That’s what I’m taking with me, and it reaches well past crypto. A big number tells you something is moving. It doesn’t tell you who. In my last post I wrote that I only count money coming in from a real person, because it’s the one number nobody can farm. The same rule works on a whole chain. Count the humans.

    What happens now

    I’m not entering Cycle III. The competition chapter is closed for good.

    Stakes stays live for now, for anyone who uses it.

    The code is private. Last time I wrote that I hadn’t taken either sign down, the “hacking welcome” in the code or the invitation to come and play. One of them is down now.

    What carries forward is stakes.day. The name, and the idea inside it.

    Here’s what it is today. You pick the one thing you keep putting off, and day one starts the moment you tap, for free. Then you put a little money on your word, anywhere from a few days to a month. You make the day, once a day, and every day you keep goes onto the chain. Finish, and your money comes back with a bonus on top. In the corner sits a small red dot. Tap it when the day gets hard and it hands you a few words and one small next move. It doesn’t watch you, and it keeps no score. And when you bank a day, you can still show someone.

    Stake, dot, day. That’s the whole idea, and it’s the name. Win your moment. Bank the day.

    It goes on. Just not in a ghost town. Where it lands, I’ll tell you when it’s ready.

    It was a good experiment, with every caveat above. I put hundreds of hours into it, and I know a lot of the other builders did too. Congrats to the four apps that won. You shipped, and people use what you built. To everyone still building here, I wish you a good run.

    No hard feelings. Peace.

  • I Asked the Internet to Hack My Nimiq Mini App. It Took Three Hours.

    I Asked the Internet to Hack My Nimiq Mini App. It Took Three Hours.

    The house was quiet. The sun was still sleeping, the dog was already walked, and the first coffee was in my hand and still hot. This is my hour, the one before the day starts asking things of me. I sit down, open the laptop, and see what moved while I wasn’t looking.

    What moved, this particular morning, was somebody trying to rob me.

    It was not much of a robbery, and I will get to the haul, because the haul is the best part. But there it was, waiting for me on a Thursday at seven: a couple hundred automated requests, fired at my brand new app in a tight burst around midnight while I slept, every one of them reaching for the same thing. The money.

    I read it, and I grinned into my coffee. Because a day earlier I had put two invitations out into the world. This was the second one, and it got answered first.

    The hundred hours before the knock

    Back up a few weeks.

    Stakes is a small app I built for the Nimiq Mini Apps competition. You put a little money on a promise, you check in every day, and you get it back when you follow through. Miss a day and that day’s slice is gone. The first version went in months ago. This was Cycle II, the relaunch, and I did not treat it as a touch up. I rebuilt the game underneath, redrew the whole brand, and gave it a home of its own at stakes.day.

    I will not pretend it was cheap. I put somewhere north of a hundred hours into this in a stretch of weeks, and nobody is paying me for a single one of them. I do it because I am a fan, and not a recent one. I made my first Nimiq wallet on the twenty first of January 2021, at twenty past eleven in the morning. I liked it enough that I tried to talk my whole family into it. So when the competition came around, there was not much to decide.

    The hours were the hard part, because they were not really mine to give. My son asked me a few times if we could go down to the water, or just play. I said not right now more often than I would like to write down. That is the honest cost of a hundred hours, and it is the one currency that does not come back. I knew the exchange rate when I signed up, I would sign it again, and my family carries me through these sprints without once making me feel bad about it. So this is not a complaint. It is just the receipt.

    What I bought with it was not the game. The game works, it is proven, and it settles real money exactly the way it should. What I poured the time into was the surface. A Nimiq mini app is a genuinely hard place to design. It runs inside another app, on a phone, in a viewport the size of a postcard, on both iOS and Android. You get almost no room, and every element has to earn its pixels. Making something feel calm and obvious inside that little window took more work than the entire settlement engine did. That, and the story around stakes.day, which opens a door onto a lot more than a week of cold showers. But that one is a post for another day.

    Two invitations

    When I launched, I put two open invitations into the world, and I meant both of them.

    The first one is the whole point of the app, and it faces everyone. Come and use this. Pick one promise, put a little money on it, keep it for a week. That invitation lives on the surface, on stakes.day, in every screen I spent those hundred hours smoothing down.

    The second one is quieter, and you have to go looking to find it. Stakes is open source. The entire thing sits in a public repository under an MIT license, every line readable by anyone on earth. And down in the server code, right next to the part that hands each new challenge a tiny seed of NIM, there is a comment I wrote on purpose. It says, more or less: hacking welcome. Hack it if you want.

    That seed is worth explaining, because it is the thing that got poked. When you start a challenge, Stakes writes the beginning of it onto the blockchain, so your start is a fixed, permanent thing that cannot be quietly moved later. Writing to a chain costs a sliver of NIM, so the app fronts each new challenge that sliver to pay for its own stamp. It is postage. It is small on purpose. I left the limits around it deliberately loose, looser than a nervous person would, and wrote the invitation in plain sight right beside it.

    I meant that one too. You can test a thing in private for as long as you like, but there is a kind of truth you only get by putting it in the open and daring the world to have a go.

    So there were two doors. One said come build something with me. One said come break something of mine. I went to bed and waited to see which would open first.

    The door they opened

    The second one. Of course it was the second one.

    It opened that same night, about three hours after I launched, before a single person had walked through the first. Someone pointed a script at the app and started opening fake challenges as fast as it would take them, each empty challenge triggering the little seed that pays for its stamp. A couple hundred of them inside an hour, spread across two hundred and eighteen freshly made wallets, wearing seventeen network fingerprints and doing their level best to look like a crowd.

    Here is what the whole operation was worth. Twenty two NIM. At today’s price, that is less than one cent. Not each. Total.

    Sit in that for a second, because it is the most honest number in the piece. Somebody built a small machine in the middle of their night, a bot, two hundred wallets, a spoofed crowd, real effort, and aimed all of it at a seed that exists to buy postage. They walked away with less than a cent, and carved every step into a public ledger that does not forget.

    I want to be careful here, because the treasury is small and it would be easy to be glib about small money. The stakes in this app are meant to be small. That is the design. The money’s job is to be at risk, not to be won, and a promise can sting for a single coin. This competition has builders from every corner of the world, and the few dollars someone reached for here is real money to plenty of people. That is the part that makes me laugh and sit up in the same breath. Two open doors, and the first reach was for the lock on the one marked mine.

    Why it stayed small

    The reason the take was a grain of sand and not the whole treasury is not luck, and it is the part I will keep deliberately vague. There is no map to hand out here.

    The short version: the seed has layers of limits around it and a single switch that shuts it off completely, and I never had to reach for the switch. The limits did their job while I slept. The seed also cannot reach anyone’s actual stake or anyone’s payout. Those live behind a separate door, and that door only opens for real money that has genuinely landed on the chain. At its very worst, someone pushing on it all day could pull a few cents, against a ceiling, in full public view. That is the deal I designed, and that is the deal that played out.

    None of this is because I am some security genius. Before I launched, I did what a careful attacker now does too. I pointed a very capable model and a purpose built harness at my own code and told it to break in. It is a strange feeling, hiring the burglar to case your own house, but that is where we are in 2026. The people trying to get in are running the same kind of tooling you are. The only real question is whether you run it first.

    The part that isn’t funny

    Here is the part I am not laughing about. The money was never really the target, and it was never really the cost either. The cost is quieter, and it counts for more. The same limits that shrug off an attacker can, in the wrong moment, catch an honest person in the same net. Someone arriving for the first time, ready to put a real promise on the line, can get stopped at the seed step, the little stamp that marks the start of their challenge, through no fault of their own. A newcomer who hits a wall on their very first tap does not come back and try again. That is a genuine problem, and it is the actual thing this attack found.

    I am not going to wave it away. I take it seriously. I am running a full security review right now, and I am going to fix it properly, which is precisely why I will not rush it. The change that stops the abuser without ever stopping the honest newcomer is careful work, and careful is the only way I know to build the parts of an app that touch a person’s money and their word.

    And I am genuinely grateful it happened now. A stranger, in the middle of the night, before this thing had real users to lose, handed me a free penetration test and pointed at a seam I needed to see. I would far rather learn it from a bot farming fractions of a cent than from the first real person who trusted the app enough to stake on it.

    The thing people miss about this space

    This is the part I actually want you to take with you, because it runs against the reflex.

    The reflex says the open ledger is the scary part. Everything on a blockchain is public. The code is public, the transactions are public, the treasury is a single address that anyone on earth can open in a browser and stare at. To most people that sounds like a house with glass walls, which sounds like a very bad idea for a house that holds money.

    It is the opposite. The glass is the security.

    There is an old Warren Buffett line about how you only find out who has been swimming naked when the tide goes out. On a public chain the tide never comes back in. It is always out, on everyone, all the time. There is nowhere to hide a mistake. If my app were actually insecure, I would not be writing a fun little story about a one cent morning. The money would simply be gone, all of it, the moment the first competent person looked, and I would have learned it not from a report but from an empty address. The audit here is not a document I commissioned. The audit is thousands of strangers who never sleep, and it passes or fails in public, in real time.

    You do not need my permission to check my work, either. The treasury is one address, NQ83 0UJS 7NG3 QH7K 3VLF 7E06 JNH4 X5EV U04R. Open it in a block explorer and you can count the seeds this person farmed yourself. That is not a boast. That is just how the water works out here. Clear all the way to the bottom.

    The tide that went out on me once

    I have written before about everything that is wrong with this space. A while back I told the story of a night in a Barcelona hotel room, two years ago, late, tired, guard down, when I clicked one link I should not have clicked and watched about a thousand dollars leave my wallet in the time it takes to read this sentence. My conclusion then was that the technology is sound and the culture around it is sick. The problem was never the chain. The problem was the people who look at every new thing and see something to drain instead of something to use.

    That same instinct is exactly the one that chose my second door. Here is a brand new little app whose entire purpose is to help people keep a promise to themselves, and it went out into the world with two open invitations, and the first one answered was the one that said break it. Not build. Not try. Break.

    The difference this time is that the instinct hit a wall, walked off with a grain of sand, and left its fingerprints on the glass. Two years ago that culture cost me a thousand dollars. This week it cost me a fraction of a cent and pointed straight at the one seam I most needed to fix. I will take that trade every time. Most of what changed is that I respected the technology enough to let it do what it promises, and that I would rather be shown a weak spot than left to find it the hard way.

    One last thing, and it is my favorite. That farming run could not even pad my numbers. The only figure I count as real usage is money moving into the app, on chain, from a real person. The seeds all went the other way, outward, so those two hundred and eighteen farmed wallets are worth exactly zero to me. In a space absolutely full of people inflating their metrics, the one attack I have had could not inflate mine, because a long time ago I decided to only count the thing that is real.

    The doors are still open

    I have not taken either sign down. Hacking welcome is still there in the code, and after this week I mean it more, not less. If you can find the next seam, find it, and find it now, while it still costs me a lesson instead of a user. The treasury is out in the open for anyone to watch, the water is clear, and I will see you on the ledger. I am reading now, and I am working on the fix.

    And the other door is still open too, the one the whole app is actually about, and it is the harder one to walk through. Pick one promise. Put a little money on it. Keep it for a week. That invitation is still standing at stakes.day, and unlike the other one, it pays out in something nobody can farm.

  • The Key I Left in 2021

    The Key I Left in 2021

    The old MacBook took a while to wake up. I had it open next to the machine I actually work on, digging through archive folders I had not touched in years, looking for a file I was not certain I still owned.

    Nimiq had opened developer accounts for their Mini Apps competition, and the sign-in wanted a login file. I knew I had made a Nimiq account somewhere back in 2021. I had completely forgotten what that involved, where I had put the credential, or what it even looked like.

    It took longer than it should have. And when I finally found it, I sat there for a second, because it was not a text file. It was not twenty-four words in a note I would have had to keep safe for five years.

    It was a picture.

    A credential you can look at

    A Nimiq login file is a small image with a QR code printed on it. Inside that code sits your private key, encrypted with your password. That is the whole design.

    Compare it to what most of the industry settled on. Twenty-four recovery words, in plain text, that you are told to write on paper and never photograph, never type into anything, never lose. The words are the key. Anyone who reads them owns your money. The security model is a piece of paper and your discipline.

    The login file inverts that. The key is inside the picture and the picture is locked. Without the password it is a useless square of pixels, which means it can live in a cloud folder, in a password manager, on a machine in a drawer, without being a liability. To sign in on a new device you drag the image in, or you hold it up to a camera and let the camera read it.

    That is not a small usability trick. That is someone looking at the single worst part of self-custody and refusing to accept it as a law of nature.

    Five years later, on a different machine, I dragged that image into a login screen and my developer account was created. The thing just worked.

    Why I was already a fan

    I found Nimiq in the 2020 to 2021 run. Those were the golden days, when you watched a Coin Bureau video and aped into a token hoping it would 100x. Only the people who were there can relate.

    As an investment, NIM has not been my finest hour. As a project it is alive and kicking, and it has spent the years since doing the same stubborn thing it was doing when I found it: taking the parts of this technology that scare normal people and quietly removing them.

    So when the Mini Apps competition showed up, there was not much of a decision to make. Four weeks. Build something that runs inside Nimiq Pay. I was in before I knew what I was building.

    The idea came from the bathroom

    My wife and I had decided we were going to take a cold shower every morning. No protocol, no hashtag, no app. Just the two of us agreeing that this is a thing we do now.

    It stuck. And the reason it stuck has almost nothing to do with willpower. It stuck because the other person knows.

    That is the entire product.

    Stakes is a social commitment game. You pick a goal, put a small amount of NIM on it, and set a length. You send the pledge to your crew and they stake the same amount to join. Then you check in once a day, every day. Miss the window and that day’s slice of your stake is gone. Finish the week clean and you get all of it back, plus a share of what the quitters left behind, plus a small bonus.

    The claim on it is: an app to quit quitting.

    The money’s job is to be at risk, not to be won. It is working capital for your willpower.

    The feature I deliberately did not build

    The obvious request writes itself. Verify the check-in. Put a camera on it, put a model behind the camera, have something confirm the run actually happened. I build agents for a living. Every tool for that is already on my shelf.

    I left it off on purpose.

    Partly because it does not work. If someone wants to cheat this, they will cheat it, and every layer of verification you add is just a slightly more interesting puzzle for the person who was going to cheat anyway. You cannot engineer your way out of a character problem.

    Mostly because it is the wrong shape. Stakes is humans with humans. The moment a model becomes the referee, the thing your friends were doing stops being trust and starts being compliance. Your crew is not there to audit you. They are there to know.

    My hunch is that the check-ins carry more signal than any verifier would. The way a person writes about day four of something they actually did is not the way they write when they are covering. Your friends can read that. A camera cannot.

    So the split is deliberate and it is the brand: the money is handled by systems, the truth is handled by people.

    The other decision: not EVM

    The second thing I ruled out early was building on an EVM chain.

    It would have been the default move. But look at what it costs a normal person: a different wallet to install, a gas balance to top up, a token to acquire before they can use the thing they actually came for, and a native confirm dialog full of vocabulary designed by and for people who already understand it. Every one of those is a step, and every step loses people. The join flow is the whole growth mechanic here. I could not afford to leak users at four separate gates before anyone had made a promise to anyone.

    Nimiq Pay does not have that problem. The money is NIM, it moves inside an app the person already has open, and every payment is one native tap. No gas. No fees. No seed phrase. No moment where the app has to teach you a new concept before it can do the thing you wanted.

    It feels like money moving between friends. There just happens to be a blockchain underneath.

    Two phones and one cent

    At the end of June I ran the whole loop on real mainnet money, with two phones on the desk: an iPhone and an Android Seeker. Create, join, the days compressed down to minutes, settle. Then I watched the payouts land in the Nimiq Pay wallets. Thirty-five NIM to one, sixteen point six seven to the other.

    I should be honest about what “real money” means there. Twenty-five NIM is about a cent. Nobody is retiring on this.

    But that is not what a proof is for. The proof is that the pipe holds end to end, on two operating systems, with the settlement math and the on-screen preview coming from the same function so they cannot disagree. The amounts are a slider. If the mechanism is sound, you raise the stakes, and the stakes are the product.

    I sat there watching two phones light up over about one and a half cents and I was properly, unreasonably proud.

    Wednesday

    I had a rough version working well before the build window even opened, and then I went quiet for three weeks while other work took over.

    Then on Wednesday I presented on the Sip and Ship call.

    I was not ready for what came back. My screen filled with red hearts, more of them than I could follow. The Nimiq team gave it a genuinely warm welcome, and the community picked it up afterwards on Skool.

    That reaction is the only reason the last four days look the way they do. Yesterday was fourteen hours, and not all of them were good ones. I made a handful of changes I had to roll straight back, which cost me half a day. The rest went into UX polish, a fresh set of screenshots, and a second version of the pitch film, because the first one never actually told you that the card you send is the invite.

    I am writing this on submission day, with a desk full of phones and laptops and not much left in the tank. The submission goes in, and then this goes out.

    Where it goes next

    Three things, and none of them are in the version being submitted.

    The stake currently sits in an escrow I operate. That works, and I would rather be honest about what it is than dress it up. But it is not where this should end. What I want is for your stake to actually be staked, delegated to a validator for the length of your challenge. Two things happen then. Your money secures the network while you are busy not quitting, and it earns something. Very little, at today’s numbers. “Very little” has a way of not staying that way.

    Second, the sharing. Right now a check-in is text. It should be a photo or a short video. You are reading a book in a library, you take a selfie, that is the check-in and it is also the thing you post. The card the app hands you is already the most important object in the product. I want the daily moment to feed it.

    Third was not my idea. It came out of the Sip and Ship call: online courses. People buy them and never finish them, which is one of the most reliable failures of intent anyone has ever monetised. That might be a Cycle II conversation.

    The ask

    If any of that sounds like something you would run with two or three friends, the listing has the film, the screenshots, and the way in:

    nimiqminiapps.com/apps/stakes

    I did my part.

    One last thing. In the app, on the create screen, there is a row of goal templates you can pick from. One of them has a shower emoji on it. It says “Cold shower.” The hint underneath says “brrr.”

    That one is not a placeholder.