Something went wrong. Try again.
[READ-ONLY] Mirror of https://github.com/quarterback/dev-site. dev-site-five-kappa.vercel.app
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215<!doctype html><html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /><link rel="icon" href="/favicon.svg" type="image/svg+xml" /><link rel="icon" href="/favicon.png" type="image/png" sizes="any" /><title>Ron Bronson | Building tools for the speculative present</title><meta name="description" content="Ron Bronson builds software for people and AI agents: developer tools, agent skills, MCP integrations, and experimental apps." /><link rel="canonical" href="https://ronbronson.dev/" /><meta property="og:type" content="website" /><meta property="og:site_name" content="Ron Bronson" /><meta property="og:title" content="Ron Bronson" /><meta property="og:description" content="Ron Bronson builds software for people and AI agents: developer tools, agent skills, MCP integrations, and experimental apps." /><meta property="og:url" content="https://ronbronson.dev/" /><meta property="og:image" content="https://ronbronson.dev/assets/social-card.png" /><meta property="og:image:width" content="1200" /><meta property="og:image:height" content="630" /><meta property="og:image:alt" content="Ron Bronson beside the words Problems Are Designed, with a workshop photo and a content schema check." /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="Ron Bronson" /><meta name="twitter:description" content="Ron Bronson builds software for people and AI agents: developer tools, agent skills, MCP integrations, and experimental apps." /><meta name="twitter:image" content="https://ronbronson.dev/assets/social-card.png" /><link rel="preload" as="font" type="font/woff2" href="assets/fonts/gallery/PPNeueMontreal-Extrabold.woff2" crossorigin /><link rel="stylesheet" href="assets/workshop.css" /><link rel="stylesheet" href="assets/runthrough.css" /><script>try { if (localStorage.getItem("rb-theme") === "coffee") document.documentElement.setAttribute("data-theme", "coffee"); } catch (e) {}</script><script>try{if(sessionStorage.getItem("rb-dissolve")){document.documentElement.classList.add("dissolving");setTimeout(function(){document.documentElement.classList.remove("dissolving")},1000)}}catch(e){}</script><script src="assets/dissolve.js" defer></script></head><body><div class="w-wrap">
<!-- ══════════ FRONT PAGE (5 November 2026) ══════════ ".dev as proof of work, the workshop", from the design canvas. Recent projects as alternating screenshot rows, other projects in two columns, the rooms Ron has run, the tools, and a colophon. Styles in assets/workshop.css; project pages keep slabs.css. --> <header class="top"> <div class="top__in g"> <a class="top__name" href="#top">Ron Bronson</a> <nav aria-label="Main navigation"><a href="projects.html" data-dissolve="room">Projects</a><a href="https://ronbronson.design">Design</a><a href="https://blog.ronbronson.dev">Blog</a><a href="#contact" data-contact>Contact</a><span class="sw" role="group" aria-label="Colour theme"><button type="button" class="sw--snow" data-theme-pick="snow" aria-pressed="true" aria-label="Snow theme" title="Snow"></button><button type="button" class="sw--coffee" data-theme-pick="coffee" aria-pressed="false" aria-label="Coffee theme" title="Coffee"></button></span></nav> </div> </header>
<main>
<section class="g hero hero--split" id="top" aria-labelledby="h"> <div class="hero__text"> <h1 id="h" class="hero__stand">Building tools for the speculative present</h1> <p class="hero__now">Founder and CEO of <a href="https://vloora.com">Vloora</a>, a startup building the plumbing of the agentic web; <a href="https://taubmancollege.umich.edu/faculty/directory/ron-bronson/">Assistant Professor of Practice in Urban Technology</a>, University of Michigan; Nonresident Senior Fellow, Global Office of Public Delivery.</p> </div> <figure class="hero__ph"><img src="assets/dev-ron-mic.jpg" alt="Ron speaking into a handheld microphone, wearing a yellow shirt" width="1400" height="933" /></figure> </section>
<section class="g sec rt" id="under-the-hood" aria-label="Coalition game and content model"> <p class="rt__lede"><a href="https://blog.ronbronson.dev/3mz4xx5bvhk2v">Coalition</a> is a Persistent Browser Based Game (PBBG) built in HTML5, the goal of the game is to escape before your character is captured.</p> <p class="rt__intro">In developing a text-heavy game with AI agents, I needed a system that kept in-game help text, narrative text and game rules all separate.</p> <p class="rt__intro">Based on design systems & style guides, I wanted a way to integrate my own editorial rules into the game while only having it impact the sections I wanted.</p> <div class="rt__grid" id="runthrough"> <figure class="rt__phone"> <video muted playsinline preload="metadata" poster="assets/coalition/runthrough-poster.webp" width="430" height="932" aria-label="One run of Coalition, from the title screen to the first stop"> <source src="assets/coalition/runthrough.mp4" type="video/mp4" /> <source src="assets/coalition/runthrough.webm" type="video/webm" /> <img src="assets/coalition/runthrough-poster.webp" alt="Coalition on a phone: the house at Portô Venla, the clock, and the first moves." /> </video> </figure> <button type="button" class="rt__play" aria-pressed="false" style="grid-column: 1">Play</button> <div class="rt__side"> <div class="rt__note" aria-live="polite"><b>0:00 · The title</b><p>Every line comes from one catalog, not the code.</p></div> <ol class="rt__chapters" aria-label="Chapters"> <li><button type="button" data-t="0" data-title="The title" data-note="Every line comes from one catalog, not the code."><time>0:00</time><span>The title</span></button></li> <li><button type="button" data-t="7.5" data-title="Choose a character" data-note="The checker allows each character one sentence."><time>0:07</time><span>Choose a character</span></button></li> <li><button type="button" data-t="11.6" data-title="Choose a companion" data-note="Each companion gets one sentence, and the checker rejects any that gives away the odds."><time>0:11</time><span>Choose a companion</span></button></li> <li><button type="button" data-t="15.8" data-title="Add cards" data-note="The checker holds card buttons to six words."><time>0:15</time><span>Add cards</span></button></li> <li><button type="button" data-t="20.9" data-title="Pick a country" data-note="Flight times and prices come from game data, not the text."><time>0:20</time><span>Pick a country</span></button></li> <li><button type="button" data-t="23.5" data-title="The briefing" data-note="The game writes the briefing from live state: the stop, the clock, the police, the next step."><time>0:23</time><span>The briefing</span></button></li> <li><button type="button" data-t="28.1" data-title="News" data-note="News is story text, so the checker gives it different rules than a button."><time>0:28</time><span>News</span></button></li> <li><button type="button" data-t="37.5" data-title="A call" data-note="Dialogue must name its speaker, or the checker fails it."><time>0:37</time><span>A call</span></button></li> <li><button type="button" data-t="46.6" data-title="Make a move" data-note="A move shows its name and its time, never the odds."><time>0:46</time><span>Make a move</span></button></li> <li><button type="button" data-t="49" data-title="The roll" data-note="The result says what happened and what it cost."><time>0:49</time><span>The roll</span></button></li> <li><button type="button" data-t="55.5" data-title="The first stop" data-note="Each kind of text passed its own rules before this build ran."><time>0:55</time><span>The first stop</span></button></li> </ol> </div> </div> <pre class="rt__check"><i>$</i> pbbg-content check content/pbbg/coalition.bundle.json
<em>warning</em> COAL-10 ch2.level.eri_airstrip.fence.text: Owner, 2026-10-30: say a flight's length as '8-hour flight', never 'hours in the air'.<em>error</em> SPEAKER ch2.sibling_visa: Dialogue requires a speaker. Set speakerRef to a declared entity.<em>warning</em> TEXT-02 ch2.level.eri_town.bus.name: Review action labels longer than six words.
<i>$</i> python3 tools/build.pycontent-check: 0 errors, 0 warningspbbg-check: <u>Content checks passed.</u></pre> <p class="rt__intro" style="margin-top: 14px">The checker caught the first three lines when I added chapter two. The last two are the fixed build.</p> <div class="rt__links"> <a href="https://github.com/quarterback/pbbg-content-schema">PBBG Content Schema on GitHub</a> <a href="projects/pbbg-content-schema.html">How I built it</a> <a href="https://github.com/quarterback/escape-game/blob/main/content/pbbg/coalition.bundle.json">The game's text in the schema</a> </div> </section>
<section class="g sec" id="talks" aria-labelledby="h-talks"> <h2 id="h-talks">Talks and conversations</h2> <div class="media"> <figure><div class="vidwrap"><iframe src="https://www.youtube-nocookie.com/embed/hnAScuK-oMo" title="Beyond Civic Tech: Public Mechanics Starts at Home, Ron Bronson at CUGOS" loading="lazy" allow="accelerometer; encrypted-media; gyroscope; picture-in-picture; fullscreen" allowfullscreen referrerpolicy="strict-origin-when-cross-origin"></iframe></div><figcaption>Beyond Civic Tech: Public Mechanics Starts at Home<span>CUGOS Fall Fling keynote, November 2025</span></figcaption></figure> <figure><div class="vidwrap"><iframe src="https://www.youtube-nocookie.com/embed/_HAVowmb3JU" title="What Finnish Baseball Taught Me About Game Design, Ron Bronson at Donut.js" loading="lazy" allow="accelerometer; encrypted-media; gyroscope; picture-in-picture; fullscreen" allowfullscreen referrerpolicy="strict-origin-when-cross-origin"></iframe></div><figcaption>What Finnish Baseball Taught Me About Game Design<span>Donut.js, Portland, November 2019</span></figcaption></figure> </div> <div class="eps"> <iframe class="ep" title="Repairing Service Design for the Age of AI, Service Design Show" src="https://embed.podcasts.apple.com/us/podcast/repairing-service-design-for-the-age-of-ai-ron-bronson-ep-236/id1104665758?i=1000726081505" height="175" loading="lazy" allow="autoplay *; encrypted-media *; clipboard-write" sandbox="allow-forms allow-popups allow-same-origin allow-scripts allow-top-navigation-by-user-activation"></iframe> <iframe class="ep" title="Consequence Design with Ron Bronson, Technically Speaking with Harrison Wheeler" src="https://embed.podcasts.apple.com/us/podcast/consequence-design-with-ron-bronson/id1505591873?i=1000479159967" height="175" loading="lazy" allow="autoplay *; encrypted-media *; clipboard-write" sandbox="allow-forms allow-popups allow-same-origin allow-scripts allow-top-navigation-by-user-activation"></iframe> </div> </section>
<section class="g sec" id="writing" aria-labelledby="h-wr"> <h2 id="h-wr">Writing</h2> <p class="sec__st">A simulation can run without errors while rewarding the wrong team. A model can recommend that an agent's request be reviewed without granting permission to act. A service can acknowledge a request without completing the job. I write about the rules, records, and checks that make those differences visible.</p> <ul class="wlist"> <li><span class="wlist__d">Nov 2026</span><a href="https://vloora.com/writing/the-permission-layer/">The permission layer</a></li> <li><span class="wlist__d">Oct 2026</span><a href="https://blog.ronbronson.com/bringing-ax-to-life-building-a-content-schema-for-browser-games-developed-with-agents/">Bringing AX to Life: Building a Content Schema for Browser Games Developed With Agents</a></li> <li><span class="wlist__d">Oct 2026</span><a href="https://vloora.com/writing/permit-review-delays/">Permit review statistics can hide long delays</a></li> <li><span class="wlist__d">Sep 2026</span><a href="https://vloora.com/writing/decision-models-and-judgment/">Using decision models to flag agent requests for review</a></li> <li><span class="wlist__d">Aug 2026</span><a href="https://blog.ronbronson.dev/3mudm62kyes2n">Rebuilding player development in a PC sports sim</a></li> <li><span class="wlist__d">Aug 2026</span><a href="https://blog.ronbronson.dev/3msnpahn5r22k">Introducing ApexVarsity</a></li> <li><span class="wlist__d">Jul 2026</span><a href="https://vloora.com/writing/proof-an-agent-did-its-job/">What counts as proof that an agent did its job?</a></li> <li><span class="wlist__d">Jan 2026</span><a href="https://blog.ronbronson.com/who-holds-the-pen-why-ai-agents-need-a-manager-not-just-a-manual">Who Holds the Pen? Why AI Agents Need a Manager, Not Just a Manual</a></li> <li><span class="wlist__d">Jun 2025</span><a href="https://blog.ronbronson.com/context-engineering-for-llms-starts-with-systems-not-prompts">Context Engineering for LLMs Starts With Systems, Not Prompts</a></li> </ul> </section>
<section class="g sec" id="systems" aria-labelledby="h-sys"> <h2 id="h-sys">NPM tools</h2> <article class="sys"><div><h3><a href="https://www.npmjs.com/package/red-pen-editor">Red Pen Editor</a></h3><code>npm i red-pen-editor</code></div><div class="sys__b"><p class="sys__idea">An editor for AI agents with permission to cut. It looks for what a draft can lose without changing what it says, and it refuses any cut that would drop the last mention of a number, date, or link. Agents can use it as a skill or through an MCP server. It runs locally, with no API key.</p></div></article> <article class="sys"><div><h3><a href="projects/pbbg-content-schema.html">PBBG Content Schema</a></h3><code>npx -y github:quarterback/pbbg-content-schema install-skill</code></div><div class="sys__b"><p class="sys__idea">A content format and checker that keeps a browser game’s rules, story, and interface text apart, so AI agents can edit one without breaking the others.</p></div></article> <article class="sys"><div><h3><a href="projects/closedtab.html">closedtab</a></h3><code>npm i closedtab</code></div><div class="sys__b"><p class="sys__idea">Shared memory for people and AI agents. It records what an agent decided and where it went off plan, which test results and agent logs often miss. The next session starts with that record.</p><p><a href="https://blog.ronbronson.com/closedtab-a-npm-shared-memory-for-you-and-your-ai-agents">Closedtab: A npm shared memory for you and your AI agents</a><br /><a href="https://blog.ronbronson.com/agent-experience-needs-failure-affordances/">Agent Experience Needs Failure Affordances</a></p></div></article> <article class="sys"><div><h3><a href="projects/prosekeep.html">Prosekeep</a></h3><code>npm i prosekeep</code></div><div class="sys__b"><p class="sys__idea">An editorial system for teams writing with AI agents. It carries writing standards, author decisions, source requirements, and publishing workflows across repositories and agent tools. I treat editorial authority as a content design problem: an author’s decisions should still hold when the writing reaches editing and review in another tool.</p></div></article> <article class="sys"><div><h3><a href="https://www.npmjs.com/package/plain-language-default">plain-language-default</a></h3><code>npm i plain-language-default</code></div><div class="sys__b"><p class="sys__idea">A reusable writing standard for AI agents based on the U.S. Federal Plain Language Guidelines. It gives every agent the same rules for writing plainly.</p></div></article> </section>
</main>
<footer class="g foot" id="contact"> <div> <h2>Elsewhere</h2> <div class="foot__icons"><a href="https://bsky.app/profile/ronbronson.com" target="_blank" rel="me noopener" aria-label="Bluesky" title="Bluesky"><svg viewBox="0 0 576 512" fill="currentColor" aria-hidden="true"><path d="M407.8 294.7c-3.3-.4-6.7-.8-10-1.3 3.4 .4 6.7 .9 10 1.3zM288 227.1C261.9 176.4 190.9 81.9 124.9 35.3 61.6-9.4 37.5-1.7 21.6 5.5 3.3 13.8 0 41.9 0 58.4S9.1 194 15 213.9c19.5 65.7 89.1 87.9 153.2 80.7 3.3-.5 6.6-.9 10-1.4-3.3 .5-6.6 1-10 1.4-93.9 14-177.3 48.2-67.9 169.9 120.3 124.6 164.8-26.7 187.7-103.4 22.9 76.7 49.2 222.5 185.6 103.4 102.4-103.4 28.1-156-65.8-169.9-3.3-.4-6.7-.8-10-1.3 3.4 .4 6.7 .9 10 1.3 64.1 7.1 133.6-15.1 153.2-80.7 5.9-19.9 15-138.9 15-155.5s-3.3-44.7-21.6-52.9c-15.8-7.1-40-14.9-103.2 29.8-66.1 46.6-137.1 141.1-163.2 191.8z"></path></svg></a><a href="https://mastodon.social/@ronbronson" target="_blank" rel="me noopener" aria-label="Mastodon" title="Mastodon"><svg viewBox="0 0 448 512" fill="currentColor" aria-hidden="true"><path d="M433 179.1c0-97.2-63.7-125.7-63.7-125.7-62.5-28.7-228.6-28.4-290.5 0 0 0-63.7 28.5-63.7 125.7 0 115.7-6.6 259.4 105.6 289.1 40.5 10.7 75.3 13 103.3 11.4 50.8-2.8 79.3-18.1 79.3-18.1l-1.7-36.9s-36.3 11.4-77.1 10.1c-40.4-1.4-83-4.4-89.6-54-.6-4.6-.9-9.3-.9-13.9 85.6 20.9 158.7 9.1 178.7 6.7 56.1-6.7 105-41.3 111.2-72.9 9.8-49.8 9-121.5 9-121.5zM357.9 304.3l-46.6 0 0-114.2c0-49.7-64-51.6-64 6.9l0 62.5-46.3 0 0-62.5c0-58.5-64-56.6-64-6.9l0 114.2-46.7 0c0-122.1-5.2-147.9 18.4-175 25.9-28.9 79.8-30.8 103.8 6.1l11.6 19.5 11.6-19.5c24.1-37.1 78.1-34.8 103.8-6.1 23.7 27.3 18.4 53 18.4 175l0 0z"></path></svg></a><a href="https://www.linkedin.com/in/ronbronson/" target="_blank" rel="me noopener" aria-label="LinkedIn" title="LinkedIn"><svg viewBox="0 0 448 512" fill="currentColor" aria-hidden="true"><path d="M100.3 448l-92.9 0 0-299.1 92.9 0 0 299.1zM53.8 108.1C24.1 108.1 0 83.5 0 53.8 0 39.5 5.7 25.9 15.8 15.8s23.8-15.8 38-15.8 27.9 5.7 38 15.8 15.8 23.8 15.8 38c0 29.7-24.1 54.3-53.8 54.3zM447.9 448l-92.7 0 0-145.6c0-34.7-.7-79.2-48.3-79.2-48.3 0-55.7 37.7-55.7 76.7l0 148.1-92.8 0 0-299.1 89.1 0 0 40.8 1.3 0c12.4-23.5 42.7-48.3 87.9-48.3 94 0 111.3 61.9 111.3 142.3l0 164.3-.1 0z"></path></svg></a><a href="https://github.com/quarterback" target="_blank" rel="me noopener" aria-label="GitHub" title="GitHub"><svg viewBox="0 0 512 512" fill="currentColor" aria-hidden="true"><path d="M216.5 362.5c-66-8-112.5-55.5-112.5-117 0-25 9-52 24-70-6.5-16.5-5.5-51.5 2-66 20-2.5 47 8 63 22.5 19-6 39-9 63.5-9s44.5 3 62.5 8.5c15.5-14 43-24.5 63-22 7 13.5 8 48.5 1.5 65.5 16 19 24.5 44.5 24.5 70.5 0 61.5-46.5 108-113.5 116.5 17 11 28.5 35 28.5 62.5l0 52C323 491.5 335.5 500 350.5 494 441 459.5 512 369 512 257 512 115.5 397 0 255.5 0S0 115.5 0 257c0 111 70.5 203 165.5 237.5 13.5 5 26.5-4 26.5-17.5l0-40c-7 3-16 5-24 5-33 0-52.5-18-66.5-51.5-5.5-13.5-11.5-21.5-23-23-6-.5-8-3-8-6 0-6 10-10.5 20-10.5 14.5 0 27 9 40 27.5 10 14.5 20.5 21 33 21s20.5-4.5 32-16c8.5-8.5 15-16 21-21z"></path></svg></a><a href="https://www.instagram.com/ronbronson/" target="_blank" rel="me noopener" aria-label="Instagram" title="Instagram"><svg viewBox="0 0 448 512" fill="currentColor" aria-hidden="true"><path d="M224.3 141a115 115 0 1 0 -.6 230 115 115 0 1 0 .6-230zm-.6 40.4a74.6 74.6 0 1 1 .6 149.2 74.6 74.6 0 1 1 -.6-149.2zm93.4-45.1a26.8 26.8 0 1 1 53.6 0 26.8 26.8 0 1 1 -53.6 0zm129.7 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM399 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z"></path></svg></a><a href="https://twitter.com/ronbronson" target="_blank" rel="me noopener" aria-label="Twitter" title="Twitter"><svg viewBox="0 0 448 512" fill="currentColor" aria-hidden="true"><path d="M357.2 48L427.8 48 273.6 224.2 455 464 313 464 201.7 318.6 74.5 464 3.8 464 168.7 275.5-5.2 48 140.4 48 240.9 180.9 357.2 48zM332.4 421.8l39.1 0-252.4-333.8-42 0 255.3 333.8z"></path></svg></a><a href="https://letterboxd.com/ronbronson/" target="_blank" rel="me noopener" aria-label="Letterboxd" title="Letterboxd"><svg viewBox="0 0 640 512" fill="currentColor" aria-hidden="true"><path d="M521.3 128C586.9 128 640 181.1 640 246.6S586.9 365.2 521.3 365.2c-42.5 0-79.7-22.3-100.7-55.8 11.4-18.2 18-39.7 18-62.8s-6.6-44.6-18-62.8l.8-1.2c20.8-32.3 56.8-53.9 97.9-54.6l2 0zM320 128c42.5 0 79.7 22.3 100.7 55.8-11.4 18.2-18 39.7-18 62.8s6.6 44.6 18 62.8l-.8 1.2c-20.8 32.3-56.8 53.9-97.9 54.6l-2 0c-42.5 0-79.7-22.3-100.7-55.8 11.4-18.2 18-39.7 18-62.8s-6.6-44.6-18-62.8l.8-1.2c20.8-32.3 56.8-53.9 97.9-54.6l2 0zm-201.3 0c42.5 0 79.7 22.3 100.7 55.8-11.4 18.2-18 39.7-18 62.8s6.6 44.6 18 62.8l-.8 1.2c-20.8 32.3-56.8 53.9-97.9 54.6l-2 0C53.1 365.1 0 312.1 0 246.6S53.1 128 118.7 128z"></path></svg></a><a href="https://bookhive.buzz/profile/ronbronson.com" target="_blank" rel="me noopener" aria-label="Bookhive" title="Bookhive"><svg viewBox="0 0 448 512" fill="currentColor" aria-hidden="true"><path d="M384 512L96 512c-53 0-96-43-96-96L0 96C0 43 43 0 96 0L400 0c26.5 0 48 21.5 48 48l0 288c0 20.9-13.4 38.7-32 45.3l0 66.7c17.7 0 32 14.3 32 32s-14.3 32-32 32l-32 0zM96 384c-17.7 0-32 14.3-32 32s14.3 32 32 32l256 0 0-64-256 0zm32-232c0 13.3 10.7 24 24 24l176 0c13.3 0 24-10.7 24-24s-10.7-24-24-24l-176 0c-13.3 0-24 10.7-24 24zm24 72c-13.3 0-24 10.7-24 24s10.7 24 24 24l176 0c13.3 0 24-10.7 24-24s-10.7-24-24-24l-176 0z"></path></svg></a><a href="https://record.club/ron" target="_blank" rel="me noopener" aria-label="Record.club" title="Record.club"><svg viewBox="0 0 512 512" fill="currentColor" aria-hidden="true"><path d="M0 256a256 256 0 1 1 512 0 256 256 0 1 1 -512 0zm256-96a96 96 0 1 1 0 192 96 96 0 1 1 0-192zm0 240a144 144 0 1 0 0-288 144 144 0 1 0 0 288zm0-112a32 32 0 1 0 0-64 32 32 0 1 0 0 64z"></path></svg></a><a href="https://listening.ronbronson.com" target="_blank" rel="me noopener" aria-label="Listening" title="Listening"><svg viewBox="0 0 448 512" fill="currentColor" aria-hidden="true"><path d="M64 224c0-88.4 71.6-160 160-160s160 71.6 160 160l0 37.5c-10-3.5-20.8-5.5-32-5.5l-16 0c-26.5 0-48 21.5-48 48l0 128c0 26.5 21.5 48 48 48l16 0c53 0 96-43 96-96l0-160C448 100.3 347.7 0 224 0S0 100.3 0 224L0 384c0 53 43 96 96 96l16 0c26.5 0 48-21.5 48-48l0-128c0-26.5-21.5-48-48-48l-16 0c-11.2 0-22 1.9-32 5.5L64 224z"></path></svg></a><a href="https://www.last.fm/user/statechampion" target="_blank" rel="me noopener" aria-label="Last.fm" title="Last.fm"><svg viewBox="0 0 512 512" fill="currentColor" aria-hidden="true"><path d="M225.8 367.1l-18.8-51s-30.5 34-76.2 34c-40.5 0-69.2-35.2-69.2-91.5 0-72.1 36.4-97.9 72.1-97.9 66.5 0 74.8 53.3 100.9 134.9 18.8 56.9 54 102.6 155.4 102.6 72.7 0 122-22.3 122-80.9 0-72.9-62.7-80.6-115-92.1-25.8-5.9-33.4-16.4-33.4-34 0-19.9 15.8-31.7 41.6-31.7 28.2 0 43.4 10.6 45.7 35.8l58.6-7c-4.7-52.8-41.1-74.5-100.9-74.5-52.8 0-104.4 19.9-104.4 83.9 0 39.9 19.4 65.1 68 76.8 44.9 10.6 79.8 13.8 79.8 45.7 0 21.7-21.1 30.5-61 30.5-59.2 0-83.9-31.1-97.9-73.9-32-96.8-43.6-163-161.3-163-86.1 0-131.8 54.5-131.8 147.2 0 89.1 45.7 137.2 127.9 137.2 66.2 0 97.9-31.1 97.9-31.1z"/></svg></a><a rel="me" href="#contact" data-contact aria-label="Email" title="Email"><svg viewBox="0 0 512 512" fill="currentColor" aria-hidden="true"><path d="M48 64c-26.5 0-48 21.5-48 48 0 15.1 7.1 29.3 19.2 38.4l208 156c17.1 12.8 40.5 12.8 57.6 0l208-156c12.1-9.1 19.2-23.3 19.2-38.4 0-26.5-21.5-48-48-48L48 64zM0 196L0 384c0 35.3 28.7 64 64 64l384 0c35.3 0 64-28.7 64-64l0-188-198.4 148.8c-34.1 25.6-81.1 25.6-115.2 0L0 196z"></path></svg></a></div> <p class="foot__teach">Teaching and research live on <a href="https://masthead.ronbronson.com">ronbronson.com</a>.</p> </div> <div> <h2>Colophon, with digressions</h2> <p><b>Type</b> PP Neue Montreal, Switzer, IBM Plex Mono</p> <p><b>Built with</b> HTML, CSS, JavaScript, SVG, canvas, WebGL, Ajv, PBBG Content Schema</p> <p><b>Embeds</b> YouTube, Apple Podcasts</p> <p><b>Colorways</b> Snow and Coffee</p> <p><b>Hosting</b> GitHub, Vercel</p> <p class="digression" id="digression">Inexplicably, a Green Bay Packers shareholder.</p> </div> </footer> <a class="pull" id="pull" href="projects.html" data-dissolve="room" aria-label="Projects" draggable="false"> <span class="pull__room" aria-hidden="true"><span class="pull__h">Problems are designed</span><span class="pull__p">These are examples of my projects, from games to tools and system demos. They show how I use multi-agent orchestration and my own models to bring ideas to life.</span></span> <span class="pull__label" aria-hidden="true">Projects</span> </a> <script src="assets/pull.js" defer></script> <script src="assets/runthrough.js" defer></script> <script> /* Colour theme: the two swatches in the top bar set data-theme on <html> and remember the pick. The head script applies it early. */ (function () { var root = document.documentElement; var btns = document.querySelectorAll("[data-theme-pick]"); function sync() { var cur = root.getAttribute("data-theme") || "snow"; for (var i = 0; i < btns.length; i++) btns[i].setAttribute("aria-pressed", btns[i].getAttribute("data-theme-pick") === cur ? "true" : "false"); } for (var i = 0; i < btns.length; i++) btns[i].addEventListener("click", function () { var t = this.getAttribute("data-theme-pick"); if (t === "snow") root.removeAttribute("data-theme"); else root.setAttribute("data-theme", t); try { localStorage.setItem("rb-theme", t); } catch (e) {} sync(); }); sync(); })(); </script> <script> /* Digressions — one aside, picked at random per load (never the same one twice in a row). Add or edit entries in DIGRESSIONS; the footer shows one at a time so the list never has to be spelled out. */ (function () { var DIGRESSIONS = [ "Inexplicably, a Green Bay Packers shareholder.", "Favorite sports teams: Toronto Blue Jays, Vimpelin Veto, New Jersey Devils, Lapuan Virkiä, <s>New York Jets</s>, Portland Timbers, New York Knicks, Portland Thorns, Brighton & Hove Albion, Sassuolo, Toluca, Toronto Tempo, Montreal Expos (RIP)", "<em>Have you seen my fragrance collection?</em> <a href='https://www.oksmelly.xyz/' target='_blank' rel='noopener'>it’s here</a>.", "I’m a longtime tea sommelier. I once curated the tea menu at <a href='https://hopscotchcoffee.com/' target='_blank' rel='noopener'>Hopscotch Coffee</a> in Bloomington. Ask me for loose-leaf recs!", "Favorite wine regions: Slovenia, Georgia or anything that aged in amphorae or an old boot. I’m not picky.", "I’ve coached high school tennis for ten years across 3 states. My career varsity record apparently is 91-33-4. 1 team state championship, 4 District/Regional titles, 5 Conference titles. 4 individual state champions. So far…", "Yes, I have a <a href='https://www.discogs.com/user/quarterback/collection?header=1' target='_blank' rel='noopener'>Discogs</a> 🙄", "I actually grew up watching golf, because my grandfather played. I still like a Par 3 because of him.", "Last time I went fishing? 1994.", "Unsurprisingly, I was once a bar trivia host in Bloomington. One step closer to my true calling: game show host." ]; var el = document.getElementById("digression"); if (!el) return; var last = -1; try { last = parseInt(sessionStorage.getItem("rb-digression"), 10); } catch (e) {} var i = Math.floor(Math.random() * DIGRESSIONS.length); while (DIGRESSIONS.length > 1 && i === last) i = Math.floor(Math.random() * DIGRESSIONS.length); try { sessionStorage.setItem("rb-digression", i); } catch (e) {} el.innerHTML = DIGRESSIONS[i]; })(); </script>
</div><script src="assets/contact.js" defer></script></body></html>