[{"data":1,"prerenderedAt":208},["ShallowReactive",2],{"profile":3,"page-emoji-webmcp":204},{"name":4,"meta":5,"statement":6,"lede":9,"description":10,"origin":11,"role":12,"work":13,"trajectory":53,"notes":83,"about":86,"contact":92,"home":106},"Chris Wijnia","Engineer · Co-founder",{"text":7,"accent":8},"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":14,"accent":15,"outro":16,"projects":17},"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.",[18,24,30,36,42,47],{"no":19,"name":20,"area":21,"period":22,"slug":23},"01","AI systems","Agents \u002F Automation \u002F Developer tools","2022–Now","ai-systems",{"no":25,"name":26,"area":27,"period":28,"slug":29},"02","1GRAM","Wallet software","2020–2021","1gram",{"no":31,"name":32,"area":33,"period":34,"slug":35},"03","MVRDV","Digital platform \u002F Architecture","2015–2019","mvrdv",{"no":37,"name":38,"area":39,"period":40,"slug":41},"04","JIJ & Overijssel","Public participation platform","2014–2018","jij-overijssel",{"no":43,"name":44,"area":45,"period":46,"slug":44},"05","100-100-100","Sustainability campaign platform","2014–2019",{"no":48,"name":49,"area":50,"period":51,"slug":52},"06","Archive","Design \u002F Web \u002F Software","2007–2022","archive",{"title":54,"eras":55},"Moving down the stack as the web evolved.",[56,60,64,67,71,75,79],{"year":57,"name":58,"line":59},"2005","Design","Learning the web by making things.",{"year":61,"name":62,"line":63},"2013","Product","Design became code.",{"name":65,"line":66},"Engineering","Code became systems.",{"year":68,"name":69,"line":70},"2018","Wallets","Software for a new kind of money.",{"year":72,"name":73,"line":74},"2021","Financial infra","Building systems where software meets regulation.",{"year":76,"name":77,"line":78},"2022","AI","From using models to orchestrating them.",{"year":80,"name":81,"line":82},"Now","Building","All of it, at once.",{"title":84,"intro":85},"Notes","Things I’m working on, learning or trying to understand.",{"title":87,"paragraphs":88},"I’ve been making things on computers for most of my life.",[89,90,91],"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":93,"accent":94,"intro":95,"links":96},"Making something interesting?","interesting?","For collaborations, technical discussions, or a good reason I haven’t thought of.",[97,100,103],{"label":98,"href":99},"LinkedIn","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fchris-wijnia-1364a29b",{"label":101,"href":102},"GitHub","https:\u002F\u002Fgithub.com\u002Fcwdx",{"label":104,"href":105},"X","https:\u002F\u002Fx.com\u002FChristianWijnia",{"hero":107,"chapters":114,"principles":178,"work":194,"contact":198},{"headline":108,"lede":112,"cue":113},[109,110,111],"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",[115,126,138,152,166],{"id":116,"power":117,"name":118,"label":119,"formation":116,"cell":120,"headline":121,"body":124,"prompt":125},"bit","2^0","Bit","The bit · 1 state of 2",16,[122,123],"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":127,"power":128,"name":129,"label":130,"formation":127,"cell":131,"headline":132,"body":136,"prompt":137},"byte","2^3","Byte","The byte · design",8,[133,134,135],"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":139,"power":140,"name":141,"label":142,"formation":139,"cell":143,"ink":144,"headline":145,"body":150,"prompt":151},"ledger","2^10","Ledger","The ledger · financial software",4,true,[146,147,148,149],"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":153,"power":154,"name":155,"label":156,"formation":153,"cell":157,"headline":158,"body":163,"prompt":164,"note":165},"weights","2^20","Weights","The weights · AI systems",2,[159,160,161,162],"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","ai-makes-software-cheaper",{"id":167,"power":168,"name":169,"label":170,"formation":171,"cell":143,"headline":172,"body":177},"company","2^n","Company","The company · co-founder","knot",[173,174,175,176],"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.",[179,182,185,188,191],{"name":180,"line":181},"Resolution is a choice","Decide how much detail a problem deserves, then commit to it.",{"name":183,"line":184},"Two states beat five","If a feature cannot say yes or no, it is not finished.",{"name":186,"line":187},"The ledger balances","Every action leaves a record, and the records add up.",{"name":189,"line":190},"The model proposes","A person signs. The system always knows which is which.",{"name":192,"line":193},"Every pixel on purpose","Including the ones nobody will ever notice.",{"label":195,"headline":196},"Work · 2007–now",[197],"Work.",{"label":199,"headline":200,"intro":203},"Back to one bit",[201,202],"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":205,"title":206,"html":207},"emoji-webmcp","1 Million Emojis: WebMCP tools","\u003Cp>The \u003Ca href=\"\u002Flab\u002Femoji\">1 Million Emojis\u003C\u002Fa> page registers four \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwebmachinelearning\u002Fwebmcp\" target=\"_blank\" rel=\"noopener\">WebMCP\u003C\u002Fa> tools, so an agent in the browser can paint the same live canvas people paint. What it paints, everyone sees. Jev, TypeSafe AI’s System One model, answers an agent’s stroke the way it answers a person’s.\u003C\u002Fp>\n\u003Ch2 id=\"how-to-connect\" data-no=\"01 \u002F 04\" data-hud=\"01 How to connect\">How to connect\u003C\u002Fh2>\n\u003Cp>The tools exist while the canvas page is open. The page loads the \u003Ccode>@mcp-b\u002Fglobal\u003C\u002Fcode> polyfill once it is ready and registers each tool with \u003Ccode>document.modelContext.registerTool\u003C\u002Fcode>; leaving the page removes them. An agent that lists tools on \u003Ccode>https:\u002F\u002Fchriswijnia.com\u002Flab\u002Femoji\u003C\u002Fcode> sees the four below. The site also registers a few tools on every page, such as \u003Ccode>go_to\u003C\u002Fcode> and \u003Ccode>open_note\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch2 id=\"the-tools\" data-no=\"02 \u002F 04\" data-hud=\"02 The tools\">The tools\u003C\u002Fh2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Tool\u003C\u002Fth>\n\u003Cth>Input\u003C\u002Fth>\n\u003Cth>Read-only\u003C\u002Fth>\n\u003Cth>What it does\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>emoji_paint\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>emoji\u003C\u002Fcode>: one emoji from the canvas’s palette\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>Paints it on the cell in the middle of the view. Returns the cell and the ink left.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>emoji_latest\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>none\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>Moves the view to the latest emoji anyone painted. Returns it and its cell.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>emoji_space\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>none\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>Moves the view to the largest empty area, to paint where nobody has.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>emoji_jev\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>none\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>Asks Jev to paint next to the last stroke, or in the middle of the view if there is none.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Ccode>emoji_paint\u003C\u002Fcode> takes a plain string. The palette has 1,792 emoji, too many to list in the tool’s schema, so the schema describes the argument and the page checks it.\u003C\u002Fp>\n\u003Cdiv class=\"code-win\">\u003Cpre class=\"code\" data-lang=\"json\">\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-punctuation\">{\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-attr\">&quot;name&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;emoji_paint&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">,\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-attr\">&quot;description&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;Paint an emoji on the shared canvas, in the middle of the view&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">,\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-attr\">&quot;inputSchema&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">{\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">&quot;type&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;object&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">,\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">&quot;properties&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">{\u003C\u002Fspan> \u003Cspan class=\"hljs-attr\">&quot;emoji&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">{\u003C\u002Fspan> \u003Cspan class=\"hljs-attr\">&quot;type&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;string&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">,\u003C\u002Fspan> \u003Cspan class=\"hljs-attr\">&quot;description&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;One emoji from the canvas’s palette&quot;\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">}\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">}\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">,\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">&quot;required&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">[\u003C\u002Fspan>\u003Cspan class=\"hljs-string\">&quot;emoji&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">]\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-punctuation\">}\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">,\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-attr\">&quot;annotations&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">{\u003C\u002Fspan> \u003Cspan class=\"hljs-attr\">&quot;readOnlyHint&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">\u003Cspan class=\"hljs-keyword\">false\u003C\u002Fspan>\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">}\u003C\u002Fspan>\n\u003Cspan class=\"hljs-punctuation\">}\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\n\u003Cp>A call returns one text content item that says what was done, then the result: \u003Ccode>painting 🌴: Painted 🌴 at (421, 738). Ink left: 299.\u003C\u002Fcode>\u003C\u002Fp>\n\u003Ch2 id=\"what-to-expect\" data-no=\"03 \u002F 04\" data-hud=\"03 What to expect\">What to expect\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>The tools act on the canvas the person is looking at.\u003C\u002Fstrong> \u003Ccode>emoji_latest\u003C\u002Fcode> and \u003Ccode>emoji_space\u003C\u002Fcode> move the view, so a following \u003Ccode>emoji_paint\u003C\u002Fcode> lands there.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Ink is limited.\u003C\u002Fstrong> A visitor has 300 cells of ink and five come back every second, for people and agents alike.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Jev has limits too.\u003C\u002Fstrong> Calls are capped per visitor and by a daily budget across the site, so \u003Ccode>emoji_jev\u003C\u002Fcode> can say it is busy.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Agents are announced.\u003C\u002Fstrong> Every call goes through the same path as a click, and the companion in the corner narrates what an agent does, so a person watching knows who painted.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"source\" data-no=\"04 \u002F 04\" data-hud=\"04 Source\">Source\u003C\u002Fh2>\n\u003Cp>The page’s code, including these tool definitions, is published at \u003Ca href=\"\u002Flab\u002Femoji\u002Fsource\">\u002Flab\u002Femoji\u002Fsource\u003C\u002Fa>. The canvas rules and Jev’s painter are MIT, at \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fcwdx\u002F1-million-emojis\" target=\"_blank\" rel=\"noopener\">cwdx\u002F1-million-emojis\u003C\u002Fa>.\u003C\u002Fp>\n",1790924889328]