[{"data":1,"prerenderedAt":247},["ShallowReactive",2],{"notes":3,"profile":42,"note-one-person-many-agents":245},[4,13,21,29,36],{"slug":5,"title":6,"topic":7,"status":8,"published":9,"summary":10,"minutes":11,"href":12},"one-person-many-agents","One person, many agents, and a phone","Systems","published","2026-10-01","How I run many coding agents across a Mac and a rented Linux box from my phone, and the parts you need to build the same.",3,"\u002Fnotes\u002Fone-person-many-agents",{"slug":14,"title":15,"topic":16,"status":8,"published":17,"summary":18,"minutes":19,"href":20},"developer-tools-for-normal-teams","Developer tools for normal teams","AI","2026-09-24","Every team using AI is about to hit problems software teams solved years ago. The fix is the same four tools, in plainer clothes.",4,"\u002Fnotes\u002Fdeveloper-tools-for-normal-teams",{"slug":22,"title":23,"topic":24,"status":8,"published":25,"updated":17,"summary":26,"minutes":27,"href":28},"ai-makes-software-cheaper","AI makes software cheaper. Systems thinking becomes more valuable.","Software","2026-09-23","Models make code cheap to write. They don’t make systems cheap to own, and that gap is where the valuable work moves.",2,"\u002Fnotes\u002Fai-makes-software-cheaper",{"slug":30,"title":31,"topic":32,"status":8,"published":25,"updated":33,"summary":34,"minutes":27,"href":35},"jev-tiny-models-strange-interfaces","Jev, tiny models and strange new interfaces","Experiments","2026-09-26","Small, fast models that pick one option from a fixed set don’t chat. They decide, and that invites interfaces that don’t look like chat at all.","\u002Fnotes\u002Fjev-tiny-models-strange-interfaces",{"slug":37,"title":38,"topic":39,"status":8,"published":25,"updated":17,"summary":40,"minutes":27,"href":41},"when-software-becomes-an-actor","What finance looks like when software becomes an actor","Finance","When software can act on money, not just record it, the hard questions stop being technical and become about permission and accountability.","\u002Fnotes\u002Fwhen-software-becomes-an-actor",{"name":43,"meta":44,"statement":45,"lede":48,"description":49,"origin":50,"role":51,"work":52,"trajectory":98,"notes":127,"about":130,"contact":136,"home":150},"Chris Wijnia","Engineer · Co-founder",{"text":46,"accent":47},"I build software that holds up.","holds up.","I work out what’s worth building next.","Dutch engineer and co-founder. I work out what’s worth building next.","Netherlands","Product \u002F R&D",{"title":53,"accent":54,"outro":55,"projects":56},"A few things I’ve worked on.","worked on.","The work has changed a lot over the years. The habit of making things hasn’t.",[57,63,69,75,81,87,92],{"no":58,"name":59,"area":60,"period":61,"slug":62},"01","Agio Digital","Financial software \u002F Compliance","2021–Now","agio-digital",{"no":64,"name":65,"area":66,"period":67,"slug":68},"02","AI systems","Agents \u002F Automation \u002F Developer tools","2022–Now","ai-systems",{"no":70,"name":71,"area":72,"period":73,"slug":74},"03","1GRAM","Wallet software","2020–2021","1gram",{"no":76,"name":77,"area":78,"period":79,"slug":80},"04","MVRDV","Digital platform \u002F Architecture","2015–2019","mvrdv",{"no":82,"name":83,"area":84,"period":85,"slug":86},"05","JIJ & Overijssel","Public participation platform","2014–2018","jij-overijssel",{"no":88,"name":89,"area":90,"period":91,"slug":89},"06","100-100-100","Sustainability campaign platform","2014–2019",{"no":93,"name":94,"area":95,"period":96,"slug":97},"07","Archive","Design \u002F Web \u002F Software","2007–2022","archive",{"title":99,"eras":100},"Moving down the stack as the web evolved.",[101,105,109,112,116,120,123],{"year":102,"name":103,"line":104},"2005","Design","Learning the web by making things.",{"year":106,"name":107,"line":108},"2013","Product","Design became code.",{"name":110,"line":111},"Engineering","Code became systems.",{"year":113,"name":114,"line":115},"2018","Wallets","Software for a new kind of money.",{"year":117,"name":118,"line":119},"2021","Financial infra","Building systems where software meets regulation.",{"year":121,"name":16,"line":122},"2022","From using models to orchestrating them.",{"year":124,"name":125,"line":126},"Now","Building","All of it, at once.",{"title":128,"intro":129},"Notes","Things I’m working on, learning or trying to understand.",{"title":131,"paragraphs":132},"I’ve been making things on computers for most of my life.",[133,134,135],"I grew up in the Netherlands and built my first websites at thirteen.","I like small teams, ambitious projects, good engineering and people who can disagree without making it tedious. I still enjoy opening an empty repository and figuring something out.","I work internationally. Outside work I train Muay Thai and like [chess](\u002Flab\u002Fchess), which I played competitively in Zwolle and taught to primary-school children there. I also build things that occasionally have no sensible commercial purpose.",{"title":137,"accent":138,"intro":139,"links":140},"Making something interesting?","interesting?","For collaborations, technical discussions, or a good reason I haven’t thought of.",[141,144,147],{"label":142,"href":143},"LinkedIn","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fchris-wijnia-1364a29b",{"label":145,"href":146},"GitHub","https:\u002F\u002Fgithub.com\u002Fcwdx",{"label":148,"href":149},"X","https:\u002F\u002Fx.com\u002FChristianWijnia",{"hero":151,"chapters":158,"principles":219,"work":235,"contact":239},{"headline":152,"lede":156,"cue":157},[153,154,155],"Every system","is one bit,","repeated.","Chris Wijnia is a Dutch engineer and co-founder. He works on financial software and AI systems.","Scroll to scale up",[159,170,182,195,207],{"id":160,"power":161,"name":162,"label":163,"formation":160,"cell":164,"headline":165,"body":168,"prompt":169},"bit","2^0","Bit","The bit · 1 state of 2",16,[166,167],"Yes.","Or no.","Approve the payment or hold it. Trust the answer or ask again. Ship the pixel or move it one to the left. Everything I build ends in a decision small enough to fit in one bit. The work is making sure it is the right one.","Flip the bit. This page has two states.",{"id":171,"power":172,"name":173,"label":174,"formation":171,"cell":175,"headline":176,"body":180,"prompt":181},"byte","2^3","Byte","The byte · design",8,[177,178,179],"Eight bits","make a","letter.","I started in design, placing pixels one at a time until a shape read as a word. Software is built the same way: from the smallest unit up.","Flip a bit. Make a letter.",{"id":183,"power":184,"name":185,"label":186,"formation":183,"cell":19,"ink":187,"headline":188,"body":193,"prompt":194},"ledger","2^10","Ledger","The ledger · financial software",true,[189,190,191,192],"Money is","the least","forgiving","data type.","In financial software nothing is probably right. No rounding error is too small to matter, and no state is allowed to drift. Every debit meets its credit. Every action leaves a record that adds up, today and in the audit years from now.","Simulated ledger",{"id":196,"power":197,"name":198,"label":199,"formation":196,"cell":27,"headline":200,"body":205,"prompt":206,"note":22},"weights","2^20","Weights","The weights · AI systems",[201,202,203,204],"A million","decisions,","none made","on purpose.","A model is a vast field of numbers nobody set by hand. Useful, and never quite certain. I build the part around it: where it may act alone, where it has to ask, and how anyone can check afterwards what it did and why.","Confidence",{"id":208,"power":209,"name":210,"label":211,"formation":212,"cell":19,"headline":213,"body":218},"company","2^n","Company","The company · co-founder","knot",[214,215,216,217],"A company","is a system","with people","inside.","A company runs on what good software runs on: clear states, clean interfaces, and nothing that only works as long as someone remembers.",[220,223,226,229,232],{"name":221,"line":222},"Resolution is a choice","Decide how much detail a problem deserves, then commit to it.",{"name":224,"line":225},"Two states beat five","If a feature cannot say yes or no, it is not finished.",{"name":227,"line":228},"The ledger balances","Every action leaves a record, and the records add up.",{"name":230,"line":231},"The model proposes","A person signs. The system always knows which is which.",{"name":233,"line":234},"Every pixel on purpose","Including the ones nobody will ever notice.",{"label":236,"headline":237},"Work · 2007–now",[238],"Work.",{"label":240,"headline":241,"intro":244},"Back to one bit",[242,243],"Send","one bit.","Building something where a wrong answer costs money, or where a machine’s answer has to be trusted? Tell me in a line. I will answer in more than one bit.",{"slug":5,"title":6,"topic":7,"status":8,"published":9,"summary":10,"minutes":11,"href":12,"html":246},"\u003Cp>Most of my code is now written by agents, and most of my day is spent deciding which ones get to keep going. That only works if I can do it from anywhere, including a phone, without any of them reaching something they shouldn’t. If you want the same, this is the shape of it and the parts it is made of.\u003C\u002Fp>\n\u003Ch2 id=\"two-machines-one-private-network\" data-no=\"01 \u002F 06\" data-hud=\"01 Two machines, one private network\">Two machines, one private network\u003C\u002Fh2>\n\u003Cp>The Mac does anything that needs a secret: the env files, the dev servers, the browser for UI work. A rented Linux server does the rest. It is a 16-core box on a one-week trial for a few euros, it runs headless builders that need no credentials, and it has its own logins, so nothing is copied over from the Mac.\u003C\u002Fp>\n\u003Cp>Both sit on a private Tailscale network. The server’s firewall drops all public traffic; only the tailnet reaches it. Two small pages are served to the tailnet and nowhere else: a report page and the agent board.\u003C\u002Fp>\n\u003Cfigure class=\"mermaid-embed not-prose\">\u003Cfigcaption class=\"mermaid-state mono-label\">Diagram\u003C\u002Ffigcaption>\u003Cpre class=\"mermaid-src\">flowchart TB\n  P[&quot;Phone&lt;br\u002F&gt;Moshi · RustDesk · browser&quot;] --&gt; T((&quot;Tailscale&lt;br\u002F&gt;private&quot;))\n  T --&gt; MAC\n  T --&gt; LIN\n  subgraph MAC[&quot;Mac · holds the secrets&quot;]\n    I[&quot;Inbox steward&quot;] --&gt; S[&quot;Scrum master&quot;]\n    B1[&quot;Builders&quot;]\n    V[&quot;Dev servers&lt;br\u002F&gt;board · reports&quot;]\n    S ~~~ B1 ~~~ V\n  end\n  subgraph LIN[&quot;Linux worker · no secrets&quot;]\n    B2[&quot;Headless builders&quot;]\n    L2[&quot;Its own logins&lt;br\u002F&gt;Claude · GitHub&quot;]\n    B2 ~~~ L2\n  end\n  MAC --&gt; G[&quot;GitHub&lt;br\u002F&gt;cards · checks · reviews&quot;]\n  LIN --&gt; G\n  G --&gt; Q{&quot;One gate&quot;}:::lit\n  Q --&gt;|proven| D[&quot;Dev branch&quot;]\n  Q --&gt;|needs me| O[&quot;Me&quot;]\n\u003C\u002Fpre>\u003C\u002Ffigure>\n\u003Ch2 id=\"one-session-orchestrates\" data-no=\"02 \u002F 06\" data-hud=\"02 One session orchestrates\">One session orchestrates\u003C\u002Fh2>\n\u003Cp>Every agent is a Claude Code session in herdr, a terminal multiplexer that shows whether each one is working, idle, done or blocked, on either machine.\u003C\u002Fp>\n\u003Cp>One long-running session never writes product code. It is the scrum master, and everything goes through it: it reads the board, starts builders, passes decisions along, merges what is proven and writes a hand-off note for when I come back. A second session, the inbox steward, reads mail, calendar and chat without touching them and reports to the scrum master, so I hear about what needs me from one place.\u003C\u002Fp>\n\u003Ch2 id=\"github-is-the-feedback-loop\" data-no=\"03 \u002F 06\" data-hud=\"03 GitHub is the feedback loop\">GitHub is the feedback loop\u003C\u002Fh2>\n\u003Cp>Triage is most of the job. Issues become cards on a GitHub Project with five columns, and a card is ready only when it says what done means and how to prove it. A builder claims one with a lease, works in its own git worktree, and opens a pull request.\u003C\u002Fp>\n\u003Cp>From there the checks do the talking. CI, tests, linters and review comments, from people and from review bots, are what a builder reads and answers before anyone looks. The gate fits in one line: green checks, no open review threads, no protected paths touched, the right base branch. Anything that touches production, money, or an action an agent was refused comes to me, and a refused action is never retried by another agent.\u003C\u002Fp>\n\u003Ch2 id=\"the-machine-is-code-too\" data-no=\"04 \u002F 06\" data-hud=\"04 The machine is code too\">The machine is code too\u003C\u002Fh2>\n\u003Cp>Nothing on the workstation is set up by hand. One skill installs it: Ghostty and herdr, Hunk for diffs, Lazygit, Neovim, Raycast, Nerd Fonts, Tailscale and Moshi. Another sets herdr to a baseline. Any change made live also lands in the skill, so running it again rebuilds the same machine. It looks like this site: Departure Mono on an amber theme, with amber kept for one thing, an agent’s state.\u003C\u002Fp>\n\u003Ch2 id=\"build-your-own\" data-no=\"05 \u002F 06\" data-hud=\"05 Build your own\">Build your own\u003C\u002Fh2>\n\u003Col>\n\u003Cli>Put the machines on a tailnet and close everything else: \u003Ca href=\"https:\u002F\u002Ftailscale.com\u002Fkb\u002F1193\u002Ftailscale-ssh\" target=\"_blank\" rel=\"noopener\">Tailscale SSH\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Ftailscale.com\u002Fkb\u002F1312\u002Fserve\" target=\"_blank\" rel=\"noopener\">Tailscale Serve\u003C\u002Fa> for pages only you can open. Relax SSH check mode for the agent user, or every agent waits for your approval at once.\u003C\u002Fli>\n\u003Cli>Rent a worker by the week (\u003Ca href=\"https:\u002F\u002Fwww.hetzner.com\u002Fcloud\" target=\"_blank\" rel=\"noopener\">Hetzner Cloud\u003C\u002Fa>) and give it its own logins rather than your secrets.\u003C\u002Fli>\n\u003Cli>Run agents in \u003Ca href=\"https:\u002F\u002Fcode.claude.com\u002Fdocs\" target=\"_blank\" rel=\"noopener\">Claude Code\u003C\u002Fa> inside \u003Ca href=\"https:\u002F\u002Fherdr.dev\" target=\"_blank\" rel=\"noopener\">herdr\u003C\u002Fa>, one \u003Ca href=\"https:\u002F\u002Fgit-scm.com\u002Fdocs\u002Fgit-worktree\" target=\"_blank\" rel=\"noopener\">git worktree\u003C\u002Fa> each.\u003C\u002Fli>\n\u003Cli>Make the board the source of truth: \u003Ca href=\"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fissues\u002Fplanning-and-tracking-with-projects\" target=\"_blank\" rel=\"noopener\">GitHub Projects\u003C\u002Fa>, driven with the \u003Ca href=\"https:\u002F\u002Fcli.github.com\" target=\"_blank\" rel=\"noopener\">GitHub CLI\u003C\u002Fa>, and merges held to \u003Ca href=\"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fpull-requests\u002Fcollaborating-with-pull-requests\u002Fcollaborating-on-repositories-with-code-quality-features\u002Fabout-status-checks\" target=\"_blank\" rel=\"noopener\">required status checks\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>Steer from the phone with \u003Ca href=\"https:\u002F\u002Fgetmoshi.app\" target=\"_blank\" rel=\"noopener\">Moshi\u003C\u002Fa> for terminals and \u003Ca href=\"https:\u002F\u002Frustdesk.com\" target=\"_blank\" rel=\"noopener\">RustDesk\u003C\u002Fa> in direct IP mode for the desktop.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2 id=\"open-questions\" data-no=\"06 \u002F 06\" data-hud=\"06 Open questions\">Open questions\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>How many agents can one person review before the review becomes the bottleneck?\u003C\u002Fli>\n\u003Cli>Which decisions can safely move from “ask me” to the gate, and how would I know when one shouldn’t have?\u003C\u002Fli>\n\u003Cli>Is a second remote worker worth it, or does it just move the waiting somewhere else?\u003C\u002Fli>\n\u003C\u002Ful>\n",1790826807462]