<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Experiments on bradleycarey.com</title>
    <link>https://bradleycarey.com/series/experiments/</link>
    <description>Recent content in Experiments on bradleycarey.com</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Wed, 18 Mar 2026 00:17:57 -0400</lastBuildDate>
    <atom:link href="https://bradleycarey.com/series/experiments/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Checkbox Canvas: Images &amp; Video</title>
      <link>https://bradleycarey.com/posts/checkbox-images-and-video/</link>
      <pubDate>Tue, 17 Mar 2026 10:15:00 -0500</pubDate>
      <guid>https://bradleycarey.com/posts/checkbox-images-and-video/</guid>
      <description>&lt;p&gt;These two demos are the only ones in the series that process external input. One takes images, one takes live video. They&amp;rsquo;re also the only ones where a canvas element sneaks into the pipeline. The output still goes entirely to checkboxes; the canvas is just the fastest way to sample pixel data from a source that the browser won&amp;rsquo;t otherwise let you read directly.&lt;/p&gt;&#xA;&lt;p&gt;The underlying algorithm in both cases is the same: &lt;a href=&#34;https://en.wikipedia.org/wiki/Floyd%E2%80%93Steinberg_dithering&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Floyd-Steinberg error diffusion&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Checkbox Canvas: Games</title>
      <link>https://bradleycarey.com/posts/checkbox-games/</link>
      <pubDate>Mon, 16 Mar 2026 21:00:00 -0500</pubDate>
      <guid>https://bradleycarey.com/posts/checkbox-games/</guid>
      <description>&lt;p&gt;Games are an interesting stress test for the 1-bit constraint. A simulation can skip frames and still look fine. A game can&amp;rsquo;t. Input latency matters, collision detection matters, and the player is paying close attention in a way that they aren&amp;rsquo;t when watching a visual effect. If the game loop is wrong, you notice immediately.&lt;/p&gt;&#xA;&lt;p&gt;Both of these work. Unironically.&lt;/p&gt;&#xA;&lt;h2 id=&#34;pong-interactive&#34;&gt;&#xA;  &lt;strong&gt;&lt;a href=&#34;https://bradleycarey.com/checkboxes/pong.html&#34; &gt;Pong&lt;/a&gt;&lt;/strong&gt; &lt;em&gt;(interactive)&lt;/em&gt;&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#pong-interactive&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Two players. Left paddle: W and S. Right paddle: up and down arrow keys.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Checkbox Canvas: Visual Effects</title>
      <link>https://bradleycarey.com/posts/checkbox-visual-effects/</link>
      <pubDate>Mon, 16 Mar 2026 10:30:00 -0500</pubDate>
      <guid>https://bradleycarey.com/posts/checkbox-visual-effects/</guid>
      <description>&lt;p&gt;Every effect here is the same underlying structure: for each checkbox, compute a number, threshold it to on/off. The interesting part is what function you use to compute the number. Pure math, no textures, no precomputed lookup tables, just trig per cell per frame.&lt;/p&gt;&#xA;&lt;div style=&#34;margin:1.5rem 0&#34;&gt;&#xA;&lt;div id=&#34;spiral-grid&#34; style=&#34;display:grid;width:fit-content;line-height:0&#34;&gt;&lt;/div&gt;&#xA;&lt;script&gt;&#xA;(function() {&#xA;  var COLS = 52, ROWS = 20;&#xA;  var g = document.getElementById(&#39;spiral-grid&#39;);&#xA;  g.style.gridTemplateColumns = &#39;repeat(&#39; + COLS + &#39;, auto)&#39;;&#xA;  var frag = document.createDocumentFragment();&#xA;  for (var i = 0; i &lt; COLS * ROWS; i++) {&#xA;    var cb = document.createElement(&#39;input&#39;);&#xA;    cb.type = &#39;checkbox&#39;;&#xA;    cb.style.pointerEvents = &#39;none&#39;;&#xA;    cb.style.cursor = &#39;default&#39;;&#xA;    frag.appendChild(cb);&#xA;  }&#xA;  g.appendChild(frag);&#xA;  var cbs = Array.from(g.querySelectorAll(&#39;input&#39;));&#xA;  var cx = COLS / 2, cy = ROWS / 2, t = 0;&#xA;  function tick() {&#xA;    t += 0.03;&#xA;    for (var r = 0; r &lt; ROWS; r++) {&#xA;      for (var c = 0; c &lt; COLS; c++) {&#xA;        var dx = c - cx, dy = (r - cy) * 1.6;&#xA;        var dist = Math.sqrt(dx * dx + dy * dy);&#xA;        var angle = Math.atan2(dy, dx);&#xA;        cbs[r * COLS + c].checked = Math.sin(angle * 3 + Math.log(dist + 1) * 4 - t * 3) &gt; 0;&#xA;      }&#xA;    }&#xA;    requestAnimationFrame(tick);&#xA;  }&#xA;  tick();&#xA;})();&#xA;&lt;/script&gt;&#xA;&lt;/div&gt;&#xA;&lt;h2 id=&#34;spirals&#34;&gt;&#xA;  &lt;strong&gt;&lt;a href=&#34;https://bradleycarey.com/checkboxes/spirals.html&#34; &gt;Spirals&lt;/a&gt;&lt;/strong&gt;&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#spirals&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Four modes that cycle automatically:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Checkbox Canvas: Simulations</title>
      <link>https://bradleycarey.com/posts/checkbox-simulations/</link>
      <pubDate>Sun, 15 Mar 2026 19:45:00 -0500</pubDate>
      <guid>https://bradleycarey.com/posts/checkbox-simulations/</guid>
      <description>&lt;p&gt;The 1-bit constraint is most interesting when you stack it against a system with real state. These four demos are simulations. They evolve by rules, and the checkboxes just report what happened. The display isn&amp;rsquo;t the computation; it&amp;rsquo;s the readout.&lt;/p&gt;&#xA;&lt;h2 id=&#34;slime-mold-simulation-interactive&#34;&gt;&#xA;  &lt;strong&gt;&lt;a href=&#34;https://bradleycarey.com/checkboxes/slime-mold-simulation.html&#34; &gt;Slime Mold Simulation&lt;/a&gt;&lt;/strong&gt; &lt;em&gt;(interactive)&lt;/em&gt;&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#slime-mold-simulation-interactive&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Physarum_polycephalum&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Physarum polycephalum&lt;/a&gt; is a slime mold that navigated mazes, solved the shortest path between oat flakes, and independently approximated the Tokyo subway network. It has no brain, no neurons, no central coordination. Researchers at Hokkaido University published &lt;a href=&#34;https://doi.org/10.1126/science.1177894&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;a paper about it in Science in 2010&lt;/a&gt; and everyone was appropriately unsettled.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Checkbox Canvas</title>
      <link>https://bradleycarey.com/posts/checkbox-canvas/</link>
      <pubDate>Sun, 15 Mar 2026 12:00:00 -0500</pubDate>
      <guid>https://bradleycarey.com/posts/checkbox-canvas/</guid>
      <description>&lt;div id=&#34;cb-hero&#34;&gt;&#xA;&lt;style&gt;&#xA;#cb-hero { margin: 1.5rem 0; }&#xA;#cb-hero-grid { display: grid; width: fit-content; line-height: 0; }&#xA;#cb-hero-grid input { pointer-events: none; cursor: default; }&#xA;&lt;/style&gt;&#xA;&lt;div id=&#34;cb-hero-grid&#34;&gt;&lt;/div&gt;&#xA;&lt;script&gt;&#xA;(function() {&#xA;  const COLS = 24, ROWS = 8;&#xA;  const g = document.getElementById(&#39;cb-hero-grid&#39;);&#xA;  g.style.gridTemplateColumns = `repeat(${COLS}, auto)`;&#xA;  const frag = document.createDocumentFragment();&#xA;  for (let i = 0; i &lt; COLS * ROWS; i++) {&#xA;    const cb = document.createElement(&#39;input&#39;);&#xA;    cb.type = &#39;checkbox&#39;;&#xA;    frag.appendChild(cb);&#xA;  }&#xA;  g.appendChild(frag);&#xA;  const cbs = Array.from(g.querySelectorAll(&#39;input&#39;));&#xA;  let t = 0;&#xA;  function tick() {&#xA;    t += 0.07;&#xA;    for (let c = 0; c &lt; COLS; c++) {&#xA;      const h = Math.round((ROWS - 1) * (0.5 + 0.45 * Math.sin(t + c * 0.55)));&#xA;      for (let r = 0; r &lt; ROWS; r++) {&#xA;        cbs[r * COLS + c].checked = (ROWS - 1 - r) &lt;= h;&#xA;      }&#xA;    }&#xA;    requestAnimationFrame(tick);&#xA;  }&#xA;  tick();&#xA;})();&#xA;&lt;/script&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;At some point I asked myself: how bad of an idea is it to use HTML checkboxes as pixels?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Proof Of Work: A Strength Training Dashboard</title>
      <link>https://bradleycarey.com/posts/strength-training-dashboard/</link>
      <pubDate>Sat, 28 Feb 2026 12:00:00 -0500</pubDate>
      <guid>https://bradleycarey.com/posts/strength-training-dashboard/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been tracking my workouts with &lt;a href=&#34;https://play.google.com/store/apps/details?id=com.maxworkoutcoach.workouttrainer.workouttrainer&amp;amp;hl=en_US&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;the same Android app&lt;/a&gt; for almost 7 years. Nearly a thousand workouts, 59,000 reps, 6.8 million pounds of volume. The app does its job, but the data just sits there. I wanted to actually see it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://bradleycarey.com/dashboard/&#34; &gt;Check out the dashboard&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-problem&#34;&gt;&#xA;  The Problem&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#the-problem&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Workout apps are great at recording sets and reps. They&amp;rsquo;re terrible at showing you the big picture. I wanted to answer questions like: how has my squat progressed over 6 years? When was my best training year? How consistent am I really? What does 6.8 million pounds even look like?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Weight Projector - Interactive Calorie Tracker</title>
      <link>https://bradleycarey.com/posts/2026-02-16-weight-projector-interactive-calorie-tracker/</link>
      <pubDate>Mon, 16 Feb 2026 14:30:00 -0500</pubDate>
      <guid>https://bradleycarey.com/posts/2026-02-16-weight-projector-interactive-calorie-tracker/</guid>
      <description>&lt;p&gt;I wanted a simple way to visualize weight loss projections over time, and while sites like &lt;a href=&#34;https://www.losertown.org/eats/cal.php&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Losertown&lt;/a&gt; provide calculations, they only display results in an HTML table. I wanted something with a nice graph that shows the trajectory at a glance.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://bradleycarey.com/weight-projector.html&#34; &gt;Try the Weight Projector&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;features&#34;&gt;&#xA;  Features&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#features&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The Weight Projector calculates your weight trajectory over a full year based on your profile and daily calorie budget:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Quasicrystals in Your Browser</title>
      <link>https://bradleycarey.com/posts/quasicrystals-in-your-browser/</link>
      <pubDate>Sat, 12 Apr 2025 17:50:42 -0500</pubDate>
      <guid>https://bradleycarey.com/posts/quasicrystals-in-your-browser/</guid>
      <description>&lt;h1 id=&#34;click-here-to-view-the-interactive-demo&#34;&gt;&#xA;  &lt;a href=&#34;https://bradleycarey.com/quasicrystals/&#34; &gt;Click here to view the interactive demo&lt;/a&gt;&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#click-here-to-view-the-interactive-demo&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Epilepsy warning: The demo contains rapidly changing patterns and colors which may trigger seizures in susceptible individuals.&lt;/p&gt;&#xA;&lt;p&gt;What is a quasicrystal? From &lt;a href=&#34;https://blog.matthen.com/post/51566631087/quasicrystals-are-highly-structured-patterns-which&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Matthias Matthiesen&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Quasicrystals are highly structured patterns which are not periodic. Unlike the crystalline structure of e.g. hexagons, a quasicrystal will never line up perfectly with a shifted copy of itself. Here such a structure is created as the interference pattern between 7 waves approaching the centre of the image at equal angles. The 2011 Nobel prize in Chemistry was awarded for the discovery of quasicrystals in chemical compounds.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Chicken tornado - A PixiJS experiment</title>
      <link>https://bradleycarey.com/posts/chicken-tornado-pixijs/</link>
      <pubDate>Mon, 14 May 2018 00:28:02 -0400</pubDate>
      <guid>https://bradleycarey.com/posts/chicken-tornado-pixijs/</guid>
      <description>&lt;p&gt;I was bored and decided to see what &lt;a href=&#34;https://www.pixijs.com/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;PixiJS&lt;/a&gt; is all about. Sooo&amp;hellip; I made a tornado of chickens.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://bradleycarey.com/pixijs/chicken2.png&#34; alt=&#34;Chicken&#34;&gt;&#xA;&lt;img src=&#34;https://bradleycarey.com/pixijs/chicken3.png&#34; alt=&#34;Chicken&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Confused? No worries! Once you see the demo you will be even more confused!&lt;/p&gt;&#xA;&lt;p&gt;Seizure warning. 200 multicolored chickens violently spinning will grace your screen.&lt;/p&gt;&#xA;&lt;h1 id=&#34;click-here-to-unleash-the-chicken-tornado&#34;&gt;&#xA;  &lt;a href=&#34;https://bradleycarey.com/pixijs/&#34; &gt;Click here to unleash the chicken tornado&lt;/a&gt;&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#click-here-to-unleash-the-chicken-tornado&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h1&gt;</description>
    </item>
    <item>
      <title>WebGL 3D Wireframe using GLGE</title>
      <link>https://bradleycarey.com/posts/2013-11-23-webgl-3d-wireframe-using-glge/</link>
      <pubDate>Sat, 23 Nov 2013 23:41:08 -0400</pubDate>
      <guid>https://bradleycarey.com/posts/2013-11-23-webgl-3d-wireframe-using-glge/</guid>
      <description>&lt;img src=&#34;https://bradleycarey.com/images/2015/01/webgl-300x193.png&#34; alt=&#34;webgl&#34; width=&#34;300&#34; height=&#34;193&#34; class=&#34;float-right size-medium wp-image-400&#34; srcset=&#34;https://bradleycarey.com/images/2015/01/webgl-300x193.png 300w, https://bradleycarey.com/images/2015/01/webgl.png 475w&#34; sizes=&#34;(max-width: 300px) 100vw, 300px&#34; /&gt;&#xA;&lt;p&gt;This is the same as the 3D wireframe example which was done in OpenGL, only ported to the new technology known as WebGL. &lt;a href=&#34;http://www.khronos.org/webgl/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;WebGL&lt;/a&gt; is still a new technology that uses GPU acceleration to render 3D graphics in a web browser and it has shown vast potential to modernize the web.&lt;/p&gt;&#xA;&lt;p&gt;Many browsers do not even fully support WebGL at the moment. As such, to view this example you will need an updated, modern browser such as Firefox, Chome, or Opera. Internet Explorer does not support WebGL rendering at the moment unless you install a plugin.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
