<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Steamfield blog</title><description>Steamfield is a small software studio. We build OpenData, OpenChart, StatGlass, Stacks and rr, and write about how they work.</description><link>https://steamfield.io</link><item><title>Drawing the charts on this site at build time</title><link>https://steamfield.io/blog/charts-at-build-time</link><guid isPermaLink="true">https://steamfield.io/blog/charts-at-build-time</guid><description>Every chart on steamfield.io is an OpenChart spec rendered to static SVG during the build, so the page ships no charting code and the figures show with scripts turned off.</description><pubDate>Sun, 01 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The charts on the steamfield.io home page ship as plain SVG. The page’s JavaScript contains no charting library, and the figures show up with scripts turned off. OpenChart renders each one during the Astro build from the same JSON spec you would hand its React component.&lt;/p&gt;
&lt;h2 id=&quot;rendering-a-spec-to-svg&quot;&gt;Rendering a spec to SVG&lt;/h2&gt;
&lt;p&gt;OpenChart’s vanilla package has a static entry point, &lt;code&gt;renderStaticSVG&lt;/code&gt;, that takes a spec and returns an SVG string. It runs the same layout engine as the browser renderers, including label collision handling, so a static chart and an interactive one with the same spec look the same.&lt;/p&gt;
&lt;pre class=&quot;astro-code synthwave-84&quot; style=&quot;background-color:#262335;color:#bbbbbb;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FEDE5D&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#FF7EDB&quot;&gt;renderStaticSVG&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#FEDE5D&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#FF8B39&quot;&gt; &amp;quot;@opendata-ai/openchart-vanilla/static&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FEDE5D&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#FF7EDB&quot;&gt; svg&lt;/span&gt;&lt;span style=&quot;color:#FFFFFFEE&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#36F9F6&quot;&gt; renderStaticSVG&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;  {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FF7EDB&quot;&gt;    mark&lt;/span&gt;&lt;span style=&quot;color:#B6B1B1&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#FF8B39&quot;&gt; &amp;quot;line&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FF7EDB&quot;&gt;    data&lt;/span&gt;&lt;span style=&quot;color:#B6B1B1&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#36F9F6&quot;&gt; weeklyCommits&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FF7EDB&quot;&gt;    encoding&lt;/span&gt;&lt;span style=&quot;color:#B6B1B1&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FF7EDB&quot;&gt;      x&lt;/span&gt;&lt;span style=&quot;color:#B6B1B1&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#FF7EDB&quot;&gt;field&lt;/span&gt;&lt;span style=&quot;color:#B6B1B1&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#FF8B39&quot;&gt; &amp;quot;week&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FF7EDB&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color:#B6B1B1&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#FF8B39&quot;&gt; &amp;quot;temporal&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FF7EDB&quot;&gt;      y&lt;/span&gt;&lt;span style=&quot;color:#B6B1B1&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#FF7EDB&quot;&gt;field&lt;/span&gt;&lt;span style=&quot;color:#B6B1B1&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#FF8B39&quot;&gt; &amp;quot;commits&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FF7EDB&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color:#B6B1B1&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#FF8B39&quot;&gt; &amp;quot;quantitative&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FF7EDB&quot;&gt;      color&lt;/span&gt;&lt;span style=&quot;color:#B6B1B1&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#FF7EDB&quot;&gt;field&lt;/span&gt;&lt;span style=&quot;color:#B6B1B1&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#FF8B39&quot;&gt; &amp;quot;product&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FF7EDB&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color:#B6B1B1&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#FF8B39&quot;&gt; &amp;quot;nominal&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FF7EDB&quot;&gt;    endpointLabels&lt;/span&gt;&lt;span style=&quot;color:#B6B1B1&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F97E72&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;  { &lt;/span&gt;&lt;span style=&quot;color:#FF7EDB&quot;&gt;width&lt;/span&gt;&lt;span style=&quot;color:#B6B1B1&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F97E72&quot;&gt; 620&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FF7EDB&quot;&gt;height&lt;/span&gt;&lt;span style=&quot;color:#B6B1B1&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F97E72&quot;&gt; 320&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FF7EDB&quot;&gt;watermark&lt;/span&gt;&lt;span style=&quot;color:#B6B1B1&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F97E72&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In Astro the string goes straight into the page with &lt;code&gt;set:html&lt;/code&gt;. The SVG carries a &lt;code&gt;viewBox&lt;/code&gt;, so a little CSS (&lt;code&gt;width: 100%; height: auto&lt;/code&gt;) makes it scale with its column.&lt;/p&gt;
&lt;h2 id=&quot;matching-the-pages-palette&quot;&gt;Matching the page’s palette&lt;/h2&gt;
&lt;p&gt;A static SVG has its colors written into attributes, so CSS variables can’t restyle it after the fact. OpenChart also computes some colors itself (label contrast against a bar, for instance), so it needs real values when it renders. The site’s chart helper passes a theme whose colors mirror the CSS tokens:&lt;/p&gt;
&lt;pre class=&quot;astro-code synthwave-84&quot; style=&quot;background-color:#262335;color:#bbbbbb;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FEDE5D&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#FEDE5D&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#36F9F6&quot;&gt; renderChart&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FF7EDB;font-style:italic&quot;&gt;build&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;, { &lt;/span&gt;&lt;span style=&quot;color:#FF7EDB;font-style:italic&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FEDE5D&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#FF7EDB;font-style:italic&quot;&gt;options&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt; }) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FEDE5D&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#36F9F6&quot;&gt; renderStaticSVG&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#36F9F6&quot;&gt;build&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FF7EDB&quot;&gt;palette&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;), {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FEDE5D&quot;&gt;    ...&lt;/span&gt;&lt;span style=&quot;color:#FF7EDB&quot;&gt;options&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FF7EDB&quot;&gt;    idPrefix&lt;/span&gt;&lt;span style=&quot;color:#B6B1B1&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#FF7EDB&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FF7EDB&quot;&gt;    theme&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FF7EDB&quot;&gt;    darkMode&lt;/span&gt;&lt;span style=&quot;color:#B6B1B1&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#FF8B39&quot;&gt; &amp;quot;force&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FF7EDB&quot;&gt;    watermark&lt;/span&gt;&lt;span style=&quot;color:#B6B1B1&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F97E72&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;  });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;build&lt;/code&gt; is a function of the palette rather than a fixed spec, so a figure can pick colors in its own encoding. The OpenData figure uses that to draw FRED in hot pink and every other source in a quiet violet. &lt;code&gt;idPrefix&lt;/code&gt; keeps each chart’s gradient and clip-path IDs unique when several charts share a page.&lt;/p&gt;
&lt;p&gt;The neon glow isn’t in the SVG. A CSS &lt;code&gt;drop-shadow&lt;/code&gt; filter on the chart’s wrapper adds it, so the rendered markup stays plain and the glow can change without re-rendering anything:&lt;/p&gt;
&lt;pre class=&quot;astro-code synthwave-84&quot; style=&quot;background-color:#262335;color:#bbbbbb;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FEDE5D&quot;&gt;.oc-figure&lt;/span&gt;&lt;span style=&quot;color:#72F1B8&quot;&gt; svg&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#72F1B8&quot;&gt;  filter&lt;/span&gt;&lt;span style=&quot;color:#B6B1B1&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#FE4450&quot;&gt; drop-shadow&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97E72&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#F97E72&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#F97E72&quot;&gt; 3px&lt;/span&gt;&lt;span style=&quot;color:#FE4450&quot;&gt; rgb&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97E72&quot;&gt;255&lt;/span&gt;&lt;span style=&quot;color:#F97E72&quot;&gt; 46&lt;/span&gt;&lt;span style=&quot;color:#F97E72&quot;&gt; 136&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt; / &lt;/span&gt;&lt;span style=&quot;color:#F97E72&quot;&gt;0.45&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FE4450&quot;&gt;    drop-shadow&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97E72&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#F97E72&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#F97E72&quot;&gt; 10px&lt;/span&gt;&lt;span style=&quot;color:#FE4450&quot;&gt; rgb&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97E72&quot;&gt;160&lt;/span&gt;&lt;span style=&quot;color:#F97E72&quot;&gt; 77&lt;/span&gt;&lt;span style=&quot;color:#F97E72&quot;&gt; 255&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt; / &lt;/span&gt;&lt;span style=&quot;color:#F97E72&quot;&gt;0.25&lt;/span&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#BBBBBB&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;problems-we-ran-into&quot;&gt;Problems we ran into&lt;/h2&gt;
&lt;p&gt;Bar lists ignore the theme. OpenChart 9’s &lt;code&gt;barlist&lt;/code&gt; mark uses a fixed color list, so a themed palette never reaches it. The OpenData figure is a horizontal bar chart instead, with the rows reversed because band scales draw the first row at the bottom.&lt;/p&gt;
&lt;p&gt;Tick labels used the theme’s &lt;code&gt;axis&lt;/code&gt; color, which we had set to the hairline color. They were barely legible until &lt;code&gt;axis&lt;/code&gt; pointed at the muted text color and the hairline moved to &lt;code&gt;hairline&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Weekly commit counts were too spiky to chart. The first version of the OpenChart figure showed weekly commits per product, and one busy week of Stacks work flattened every other line. The figure now shows cumulative commits, which keeps every series readable.&lt;/p&gt;
&lt;h2 id=&quot;where-the-data-comes-from&quot;&gt;Where the data comes from&lt;/h2&gt;
&lt;p&gt;The figures read JSON files checked into the repository. A script walks the git history of each product repository and writes daily commit counts. Another reads OpenData’s catalog snapshot. Both run by hand, so the build never depends on a network call, and each figure’s caption says how current its data is. The StatGlass and rr figures are illustrative and schematic respectively, and their captions say so.&lt;/p&gt;</content:encoded><category>openchart</category><category>astro</category><category>engineering</category><author>Riley Hilliard</author></item><item><title>Why Steamfield</title><link>https://steamfield.io/blog/why-steamfield</link><guid isPermaLink="true">https://steamfield.io/blog/why-steamfield</guid><description>Steamfield is a small studio that builds its own products and takes no client work. This post covers what they are and how each one grew out of another.</description><pubDate>Sun, 01 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Steamfield builds its own products and takes no client work. Most of them are open source. Each one started as a tool we needed for our own work, and we still use all of them every day.&lt;/p&gt;
&lt;p&gt;Until now each product had its own repository and its own site, spread across three GitHub accounts, so it wasn’t obvious they came from the same place or that they depend on each other. This site puts them side by side.&lt;/p&gt;
&lt;h2 id=&quot;what-we-make&quot;&gt;What we make&lt;/h2&gt;
&lt;p&gt;OpenData answers questions about public data. You connect it to Claude or ChatGPT, ask about rent in Austin or measles cases by county, and it finds the right government datasets, runs the numbers and draws a chart, with every figure linked to its source. The catalog holds 1,036 datasets from 213 sources right now.&lt;/p&gt;
&lt;p&gt;OpenChart is the charting library OpenData draws with. You describe a chart as JSON and it handles scales, label collisions, responsive layout and dark mode. We split it out because the spec format turned out to be a good target for agents: it validates field by field, so a model that writes a bad chart gets told which field is wrong.&lt;/p&gt;
&lt;p&gt;StatGlass is a menu bar system monitor for Apple Silicon Macs that keeps 30 days of history. It used to be called Kelvo. It exists because “why were the fans going at 3pm?” is a question every other monitor we tried could only answer at 3pm.&lt;/p&gt;
&lt;p&gt;Stacks scaffolds projects for coding agents. It writes the instruction files, hooks, CI and tests an agent needs to work safely in a new repo, and then checks the result with &lt;code&gt;stacks verify&lt;/code&gt;. This site was started with it.&lt;/p&gt;
&lt;p&gt;rr runs commands on other machines. OpenData’s test suite is about 14,000 tests, and rr shards it across whatever hosts are free so a full run doesn’t tie up a laptop.&lt;/p&gt;
&lt;h2 id=&quot;how-they-connect&quot;&gt;How they connect&lt;/h2&gt;
&lt;p&gt;Most of the products began as something OpenData needed. OpenChart was its charting code, split out once we wanted charts that looked like they belonged in a newspaper. rr came when OpenData’s test suite got slow enough that a full run tied up a laptop for the duration. Stacks came from writing the same agent setup into every new repository. StatGlass is the exception: it came from watching those builds and test runs heat up a laptop and wanting to see afterward what had happened.&lt;/p&gt;
&lt;p&gt;The home page uses the products on each other where it can. OpenChart draws its charts at build time, the hero’s mountains are the commit history of every product repository, and the Stacks demo replays recorded output from scaffolding this site.&lt;/p&gt;
&lt;h2 id=&quot;why-no-services-page&quot;&gt;Why no services page&lt;/h2&gt;
&lt;p&gt;We don’t take client work, and we don’t plan to. Working only on our own products means we pick the problems and keep living with our decisions long after they ship. If you want to talk about one of the products, the address in the footer reaches a person.&lt;/p&gt;
&lt;h2 id=&quot;what-the-blog-covers&quot;&gt;What the blog covers&lt;/h2&gt;
&lt;p&gt;Posts cover how the products work and what we learn building them, such as how OpenChart places labels or how rr splits a 14,000-test suite across machines. They come out when there is something to write up. The &lt;a href=&quot;/rss.xml&quot;&gt;RSS feed&lt;/a&gt; is the easiest way to follow along.&lt;/p&gt;</content:encoded><category>studio</category><author>Riley Hilliard</author></item></channel></rss>