A feed to think with

The first night I got access to move.nl I spent four hours reading apartment listings and went to bed at one in the morning.

I built a tool to watch the market so I do not have to. The decision is still mine.

The feed was “filtered” — budget, a couple of postcodes — but filtered the way a firehose is filtered when you put your thumb over the end. Every listing still had to be opened, read, judged. Energy label here, VvE contribution there, is it on a busy road, what’s the onderhoud, does it actually have a bathtub or just a photo of a shower. The broad filter handed me volume. What I needed was signal.

I do not do this for a living, exactly. But somewhere along the way it became my default: when I have a question, I build a small tool to answer it — moldable development, if you want a name for it. So building one here was the obvious move. The tool was not the start, though. The start was a plan.

A while back I read Good Planning, Bad Planning and turned its four-layer model into a swamp extension — good-planning — a self-contained state machine for a strategic choice: the funded commitments, the assumptions under them, the tripwires that tell you an assumption is breaking. I had been reaching for that shape for a while. I track progress on a kanban board like everyone else, and kanban boards are too manual and hold none of the context that makes a card mean anything. A state machine holds the context. It knows what it is for.

I used good-planning first to understand my own cashflow and my limits — what I could actually commit to, where the edges were. That mattered more than any listing. Once I knew the shape of the decision, the apartments were just instances to test against it. The same instinct ArcKit gives me when I need to think through something complicated is that it asks the questions I would forget to ask. It is the same instinct behind issue-lifecycle, another swamp extension, which drives work to done without me babysitting it. You can externalize the thinking into something that holds state, and stop carrying it in your head.

So I turned to move.nl — a perfectly good website and a perfectly useless feed for reasoning. The part I still find a little magic is how I got in. I did not reverse-engineer the auth by hand. I did one normal login in the browser, exported the session as a HAR — a full network capture, cookies and redirects and all — and handed the file to Claude. It read the Keycloak silent-SSO flow straight out of the capture and built it into a swamp model, token auto-renewal included, so the thing logs itself back in and keeps running. I never read a line of the auth code. I gave it a recording of my browser doing it once, and described what I wanted out the other end.

The model — move-dossier — pulls my whole saved search into structured data. It has about fifty fields per listing: type, year, energy label, VvE bijdrage, €/m², bathtub yes/no, floorplans, even the bid deadlines and notary clauses parsed out of the free-text description. The feed is data now, not a wall of ads.

Then I enriched it. The things that actually matter about a place are the things you cannot see in the listing: the buurt, the crime rate, the income mix, the sale history, the energy profile of the street. A second swamp model — nl-property-intel — takes one address and fans out to half a dozen Dutch public sources to fetch exactly that, built to shrug off a dead scraper instead of falling over. One address in, one clean dossier out.

Then came the filtering, and this is the part that mattered most: I encoded my requirements as code, once. A bathtub is required. The energy label must be C or better. The apartment cannot be on a busy road — with the specific Amsterdam streets I will not live on listed by name. The onderhoud must be at least Goed. The VvE must be healthy. The requirements stopped living in my head, where they drift and get tired at midnight, and started living in the model, where they do not.

The last move was about attention. I started with real-time email for every new ad the moment it posted. I killed it; those go to a folder I never open now. The whole pipeline — pull, enrich, filter — runs on a cron once an hour. But the ping is rare. Only about 8% of Amsterdam apartments even have a bathtub, and that is before energy label, road, onderhoud, and VvE. A listing that clears all of it is scarce: a ping lands maybe once every few days, and when it does, it has already passed every bar I care about. Its floorplan is included. One rare ping that cleared every filter is worth more than a hundred daily emails that cleared two. The signal went up; the noise went to a folder.

Here is the uncomfortable part. With the dossier, the enrichment, and the planning model, I had most of the information my makelaar and my hypotheek adviser were giving me. The numbers, the comparisons, the “is this reasonable” — I could generate that myself. The tooling quietly replaced a good chunk of what I was paying two professionals for. It replaced most of it. It did not replace the part that counts when it is close.

What they have that I cannot scrape is experience and connections — the read on a street that is not in any dataset, the call that gets a viewing, the deal that gets done. That is what I am actually paying for. The information was never the scarce thing.

And that is the honest shape of it. The tool does not choose. It builds me a clean surface to reason on — a feed I can think with instead of drown in. What I like and do not like about a place I still find by looking, slowly, in person: the cramped ceiling, the noise off the road, the way light falls in a room that no floorplan can tell you.

The machine watches the market so I do not have to. The deciding is still mine. That was always the point.