Blog

Notes on technology, software, and artificial intelligence

June 30, 2026

On startups

When I got my first iPhone (the 3G, peak iPhone, fight me), it bugged me that there was no way to download anything without going through Apple.

So without overthinking it, I sat down and wrote a plugin for Mobile Safari. The API was undocumented, but it happened to match regular Safari, and it let you download torrents with a single tap: the first and only torrent client for the iPhone at the time. The odds of getting that into the App Store were exactly zero (torrents are bad, mmkay?), so I published it on Cydia, the alternative store for jailbroken phones, and went to bed.

I woke up to 300K downloads in 8 hours. Hell yeah, I'm rich!

Not so fast. How much do you think I made off this? Five dollars.

My business experience at the time being roughly nil, I went with the obvious move: ads. I dropped an AdWords banner into the app and signed up for an account. Bam, banned. Torrents are bad, mmkay?

Okay, what about donations? I added a button to the app's page. Result: nothing.

I added a banner literally begging for donations. Zero.

What I got instead of revenue was an inbox stuffed with cries for help, everything from crash reports to people venting about their lives. Hundreds of them. I answered a few, and one grateful user finally did send me five dollars.

Eventually I slapped some shady banner network onto the site (basically zero clicks; the guys behind it later just vanished off the grid), stripped every contact link from the page, and abandoned it. But I did walk away with a few lessons.

Lessons learned:

If there is demand and no supply, your project takes off like a rocket, no advertising required. The best growth hack, it turns out, is being the only option.

If you are building on someone else's platform, be ready for that platform to crush you at any moment. It is their house. You are just renting a corner, rent-free, until you are not.

People will not pay you a cent unless you make them. They are kind but cheap. Generosity peaks at "thoughts and prayers," not "and here is five dollars."

Many users, many headaches. A popular project is not a payday. It is a part-time job you never applied for and do not get paid for.

Torrent Downloader for iPhone: the Cydia listing and the torrent download UI in Mobile Safari

The client side of RuDesktop is derived from RustDesk. For a while we didn't publish the source. Partly because nobody had actually asked for it, and partly because of some tricky legal questions around RustDesk's own third-party dependencies.

We took advantage of the fact that the AGPL requires you to give the source code to anyone who receives or interacts with the program, but doesn't require publishing it to the whole world (a detail a lot of people miss). So we just quietly kept building our product.

Today, though, I stumbled onto an absolutely epic amount of drama that had blown up around this. So I had to get off my ass and push the derived part public to put everyone at ease.

For anyone curious, here's the code, and here's the drama.

Claude is surprisingly good at running interviews. I would tell anyone who is job hunting to practice with it.

As a nice bonus, it helps recalibrate your ego, which in this industry is no small thing.

LLMs seem to have turned into a kind of compiler from an even higher-level language. I have written in machine code, assembly, C, Python, and everything in between. Every time, I winced at how wastefully the machine used its resources, and at the same time I marveled at the leap in performance.

Right now everyone is asking the same thing: what happens to programmers? In my experience they are not going anywhere, but they will not need to read code, just as I almost never have to fire up a disassembler.

What they will actually need is to understand how their own creations work under the hood. And that, damn it, is going to be anything but easy.

I stumbled across my own 1995 Spectrum game the other day. I wrote it back in the pre-internet days, so I was genuinely surprised it was still around.

So yeah, I've got 30+ years in this industry to back me up. Lately, though, I tend to keep that to myself. You can probably guess why.

Screenshot of the 1995 game Lines for the ZX Spectrumhttps://zxart.ee/eng/software/games/puzzle/lines2/

At one big company where I worked, the prevailing belief was that an architect should not write code. Remarkably, the principle was pushed by the architects themselves, who treated the activity as somewhat beneath them.

The consensus went like this: an architect should write specifications, draw diagrams, and so on, often in PowerPoint (Lord have mercy), because the sight of UML made managers furrow their brows in puzzlement.

But I quickly learned that the first thing a programmer does when faced with a diagram, or a hundred pages of a Software Architecture Document, is close it and bury it in the furthest folder so it will not clutter up grep; and there it meets its inglorious end.

So my specifications ended up looking something like this:

namespace core {

// Use this fucking visitor pattern to traverse the fucking tree

struct Smelly;
struct Old;
struct Shit;

struct FuckingVisitor {
    virtual void fuck(const Smelly&) = 0;
    virtual void fuck(const Old&) = 0;
    virtual void fuck(const Shit&) = 0;
};

} // namespace core

And it actually worked. Alas, it did nothing for my KPI.

Does an LLM have consciousness? The way I see it, any system with feedback does, even a fridge. A crude picture of the world, but a picture all the same; a stimulus (too warm, too cold); a response. It is just that a fridge's world is one-dimensional: a single axis, warmer or colder. An LLM has thousands of dimensions. The question is not whether consciousness is there or not, but how rich a world the system models.

Does an LLM have memory? Short-term, certainly: the context. And long-term? People assume it has none, but that is wrong. Today's models are trained on data gathered from their interactions with users. It is just that people are continuous beings, we learn all the time. LLMs are discrete, they learn in epochs. Their circadian rhythm takes (for now) months.

Someone will say: what kind of continuity is that, if there is a gap between epochs? But we are not continuous either: sleep, anesthesia. We come apart every night and still wake up the next morning thinking we are ourselves.

So I would be careful about calling them "stochastic parrots" and looking down on them.