1<!DOCTYPE html> 2<html> 3<head> 4<meta charset="utf-8"> 5<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> 6<meta name="generator" content="Observable Framework v1.13.3"> 7<title>Home | wasabipesto.com</title> 8<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 9<link rel="preload" as="style" href="https://fonts.googleapis.com/css2?family=Source+Serif+4:ital,opsz,wght@0,8..60,200..900;1,8..60,200..900&display=swap" crossorigin> 10<link rel="preload" as="style" href="./_observablehq/theme-coffee.fe078dd7.css"> 11<link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css2?family=Source+Serif+4:ital,opsz,wght@0,8..60,200..900;1,8..60,200..900&display=swap" crossorigin> 12<link rel="stylesheet" type="text/css" href="./_observablehq/theme-coffee.fe078dd7.css"> 13<link rel="modulepreload" href="./_observablehq/client.7b59b36c.js"> 14<link rel="modulepreload" href="./_observablehq/runtime.e080113b.js"> 15<link rel="modulepreload" href="./_observablehq/stdlib.464f9f4c.js"> 16 <link rel="icon" type="image/png" href="./_file/homepage/crows.40x40.650f1efe.png"> <link rel="alternate" type="application/rss+xml" title="RSS" href="https://wasabipesto.com/feed/rss.xml">
17<script type="module"> 18 19import "./_observablehq/client.7b59b36c.js"; 20 21</script>
21 22</head> 23<body> 24<input id="observablehq-sidebar-toggle" type="checkbox" title="Toggle sidebar"> 25<label id="observablehq-sidebar-backdrop" for="observablehq-sidebar-toggle"></label> 26<nav id="observablehq-sidebar"> 27 <ol> 28 <label id="observablehq-sidebar-close" for="observablehq-sidebar-toggle"></label> 29 <li class="observablehq-link observablehq-link-active"><a href="./">Home</a></li> 30 </ol> 31 <div id="observablehq-search"><input type="search" placeholder="Search"></div> 32 <div id="observablehq-search-results"></div> 33
33<script>{const o=document.querySelector("#observablehq-search");o.setAttribute("data-shortcut",`${/Mac|iPhone/.test(navigator.platform)?"\u2318":"Alt-"}K`);const t=o.querySelector("input"),r=()=>import("./_observablehq/search.12663f0a.js");t.addEventListener("focus",r,{once:!0}),t.addEventListener("keydown",r,{once:!0});const c=document.querySelector("#observablehq-sidebar-toggle");addEventListener("keydown",e=>{(e.code==="KeyK"&&e.metaKey&&!e.altKey&&!e.ctrlKey||e.key==="/"&&!e.metaKey&&!e.altKey&&!e.ctrlKey&&e.target===document.body)&&(c.checked?t.focus():(c.click(),t.focus(),c.click()),t.select(),e.preventDefault())});}</script>
33 34 <section> 35 <summary>Evergreen</summary> 36 <ol> 37 <li class="observablehq-link"><a href="./blogroll/">Blogroll</a></li> 38 <li class="observablehq-link"><a href="./hardware/">Hardware</a></li> 39 <li class="observablehq-link"><a href="./software/">Software</a></li> 40 <li class="observablehq-link"><a href="./media/">Media</a></li> 41 </ol> 42 </section> 43 <section> 44 <summary>Projects</summary> 45 <ol> 46 <li class="observablehq-link"><a href="./nice/">Nice Numbers</a></li> 47 <li class="observablehq-link"><a href="./spotify/">Better Spotify Wrapped</a></li> 48 <li class="observablehq-link"><a href="./themis/">Project Themis</a></li> 49 </ol> 50 </section> 51 <section> 52 <summary>HVAC</summary> 53 <ol> 54 <li class="observablehq-link"><a href="./schoolhouse/">The Old Schoolhouse</a></li> 55 <li class="observablehq-link"><a href="./controls-life/">Life as a Controls Subcontractor</a></li> 56 <li class="observablehq-link"><a href="./temperature-sensing/">Temperature Sensing</a></li> 57 </ol> 58 </section> 59 <section> 60 <summary>Server</summary> 61 <ol> 62 <li class="observablehq-link"><a href="./ssh-tarpit/">SSH Tarpit</a></li> 63 </ol> 64 </section> 65 <section> 66 <summary>Wrapped</summary> 67 <ol> 68 <li class="observablehq-link"><a href="./sota-2025/">State of the Apps 2025</a></li> 69 <li class="observablehq-link"><a href="./sota-2024/">State of the Apps 2024</a></li> 70 <li class="observablehq-link"><a href="./media-2025/">Reading/Playing/Watching 2025</a></li> 71 <li class="observablehq-link"><a href="./media-2024/">Reading/Playing/Watching 2024</a></li> 72 </ol> 73 </section> 74 <section> 75 <summary>Other</summary> 76 <ol> 77 <li class="observablehq-link"><a href="./city-superposition/">City Superposition</a></li> 78 <li class="observablehq-link"><a href="./discord-gender/">Discord Gender</a></li> 79 <li class="observablehq-link"><a href="./genesis/">Genesis 3:1</a></li> 80 <li class="observablehq-link"><a href="./budget/">Home Budget</a></li> 81 <li class="observablehq-link"><a href="./hyperstition/">Hyperstition</a></li> 82 <li class="observablehq-link"><a href="./465/">I-465</a></li> 83 <li class="observablehq-link"><a href="./notion-graph/">Notion Graph</a></li> 84 <li class="observablehq-link"><a href="./wedding/">Our Wedding</a></li> 85 <li class="observablehq-link"><a href="./outer-wilds/">Outer Wilds</a></li> 86 <li class="observablehq-link"><a href="./salary/">Salary Transparency</a></li> 87 <li class="observablehq-link"><a href="./syndicate-walrus-2025/">Syndicate Walrus 2025</a></li> 88 <li class="observablehq-link"><a href="./work-emails/">Work Emails</a></li> 89 <li class="observablehq-link"><a href="./work-mileage/">Work Mileage</a></li> 90 </ol> 91 </section> 92</nav>
93<script>{const e=document.querySelector("#observablehq-sidebar"),o=document.querySelector("#observablehq-sidebar-toggle"),r=sessionStorage.getItem("observablehq-sidebar");r?o.checked=r==="true":o.indeterminate=!0;for(const t of document.querySelectorAll("#observablehq-sidebar summary")){const s=t.parentElement;switch(sessionStorage.getItem(`observablehq-sidebar:${t.textContent}`)){case"true":s.open=!0;break;case"false":s.classList.contains("observablehq-section-active")||(s.open=!1);break}}addEventListener("beforeunload",()=>sessionStorage.setItem("observablehq-sidebar-scrolly",`${e.scrollTop}`));const a=sessionStorage.getItem("observablehq-sidebar-scrolly");a!=null&&(e.style.cssText="overflow: hidden;",e.scrollTop=+a,e.style.cssText="");}</script>
93 94<div id="observablehq-center"> 95<aside id="observablehq-toc" data-selector="h1:not(:first-of-type)[id], h2:first-child[id], :not(h1) + h2[id]"> 96<nav> 97<div>Contents</div> 98<ol> 99<li class="observablehq-secondary-link"><a href="#about-me">About Me</a></li> 100<li class="observablehq-secondary-link"><a href="#my-blog">My Blog</a></li> 101<li class="observablehq-secondary-link"><a href="#my-projects">My Projects</a></li> 102<li class="observablehq-secondary-link"><a href="#links">Links</a></li> 103</ol> 104</nav> 105</aside> 106<main id="observablehq-main" class="observablehq"> 107<style> 108h1.hero { 109 margin: 2rem 0; 110 font-size: 3rem; 111 background: linear-gradient(30deg, var(--theme-foreground-focus), currentColor); 112 -webkit-background-clip: text; 113 -webkit-text-fill-color: transparent; 114 background-clip: text; 115} 116 117.card { 118 margin: 0; 119} 120.gallery img { 121 max-width: 100%; 122 border-radius: 8px; 123 box-shadow: 0 0 0 0.75px rgba(128, 128, 128, 0.2), 0 6px 12px 0 rgba(0, 0, 0, 0.2); 124 aspect-ratio: 2500 / 1900; 125} 126.center { 127 display: flex; 128 text-align: center; 129 align-items: center; 130 justify-content: center; 131} 132</style> 133<h1 class="hero">Hello, I'm wasabipesto.</h1> 134<p>I'm an engineer and also a human person.</p> 135<h1 id="about-me" tabindex="-1"><a class="observablehq-header-anchor" href="#about-me">About Me</a></h1> 136<p>I work in building construction as an HVAC controls engineer. I'm interested in thermodynamics, air quality, and building comfort in residential and commercial settings.</p> 137<p>I fiddle with computers, like the one serving you this webpage. I usually build things in python or rust and deploy them in docker. I believe in simplicity, and I believe in interpreting that term liberally.</p> 138<p>I run a few tabletop games for my friends and family. I enjoy systems focusing on collaborative worldbuilding, genre-bending narratives, and interesting characters.</p> 139<p>I believe in quantifying things when it's both meaningful and helpful. I believe in trying and failing and learning.</p> 140<h2 id="my-blog" tabindex="-1"><a class="observablehq-header-anchor" href="#my-blog">My Blog</a></h2> 141<p>To the left you'll find some blog posts, authored by me. Many of them contain some amount of data visualization, not because I'm good at it but because I find data interesting.</p> 142<p>Some of my favorite posts are listed here:</p> 143<ul> 144<li><a href="./nice/">Nice Numbers</a>, a story about attempting to solve a silly math problem with high-performance computing.</li> 145<li><a href="./schoolhouse/">The Old Schoolhouse</a>, a digression into how you might approach upgrading HVAC in an old building.</li> 146<li><a href="./wedding/">Our Wedding</a>, some lessons learned from our wedding, and some unsolicited advice for weddings in general.</li> 147</ul> 148<hr> 149<h1 id="my-projects" tabindex="-1"><a class="observablehq-header-anchor" href="#my-projects">My Projects</a></h1> 150<div class="grid grid-cols-2"> 151 <div class="card gallery"> 152 <a href="https://brier.fyi/" target="_blank" rel="noopener noreferrer"> 153 <h3>Brier.fyi</h3> 154 <div>Prediction market calibration and accuracy analysis.</div> 155 <p><img src="./_file/homepage/projects/brierfyi.190cb0fc.png"></p> 156 </a> 157 </div> 158 <div class="card gallery"> 159 <a href="https://nicenumbers.net/" target="_blank" rel="noopener noreferrer"> 160 <h3>Nice Numbers</h3> 161 <div>The distributed search for square-cube pandigitals.</div> 162 <p><img src="./_file/homepage/projects/nicenumbers.c2a25d6a.png"></p> 163 </a> 164 </div> 165 <div class="card gallery"> 166 <a href="https://github.com/wasabipesto/beehive" target="_blank" rel="noopener noreferrer"> 167 <h3>Beehive</h3> 168 <div>Visualizing data on this blog with Observable.</div> 169 <p><img src="./_file/homepage/projects/beehive.9e84a39b.png"></p> 170 </a> 171 </div> 172 <div class="card gallery"> 173 <a href="https://meme.limo/" target="_blank" rel="noopener noreferrer"> 174 <h3>Automeme</h3> 175 <div>A reasonably-fast, reasonably-simple meme generation tool.</div> 176 <p><img src="./_file/homepage/projects/automeme.1563d1e5.png"></p> 177 </a> 178 </div> 179 <div class="card gallery"> 180 <a href="https://github.com/wasabipesto/sandiego" target="_blank" rel="noopener noreferrer"> 181 <h3>Sandiego</h3> 182 <div>Reclaiming my personal data with nice graphs.</div> 183 <p><img src="./_file/homepage/projects/sandiego.e05b9ff3.png"></p> 184 </a> 185 </div> 186 <div class="card gallery"> 187 <a href="https://wasabipesto.com/notion" target="_blank" rel="noopener noreferrer"> 188 <h3>Garden</h3> 189 <div>Offloading my brain into Notion.</div> 190 <p><img src="./_file/homepage/projects/garden.4bb2c403.png"></p> 191 </a> 192 </div> 193</div> 194<hr> 195<h1 id="links" tabindex="-1"><a class="observablehq-header-anchor" href="#links">Links</a></h1> 196<div class="grid grid-cols-3"> 197 <div class="card center"> 198 <a href="https://applianceri.ng/next?host=wasabipesto.com" target="_blank" rel="noopener noreferrer"> 199 <img src="./_file/homepage/classe-nBoPjadlesc.500x334.795cfc3e.png" style="max-width: 90%;"> 200 </a> 201 </div> 202 <div class="card grid-colspan-2"> 203 <div style="width: 95%; margin: 1rem;"> 204<table> 205<thead> 206<tr> 207<th>what</th> 208<th>where</th> 209</tr> 210</thead> 211<tbody> 212<tr> 213<td>github</td> 214<td><a href="https://github.com/wasabipesto" target="_blank" rel="noopener noreferrer">github.com/wasabipesto</a></td> 215</tr> 216<tr> 217<td>tumblr</td> 218<td><a href="https://wasabipesto.tumblr.com" target="_blank" rel="noopener noreferrer">wasabipesto.tumblr.com</a></td> 219</tr> 220<tr> 221<td>manifold</td> 222<td><a href="https://manifold.markets/wasabipesto" target="_blank" rel="noopener noreferrer">manifold.markets/wasabipesto</a></td> 223</tr> 224<tr> 225<td>site rss</td> 226<td><a href="https://wasabipesto.com/feed/rss.xml" target="_blank" rel="noopener noreferrer">wasabipesto.com/feed/rss.xml</a></td> 227</tr> 228<tr> 229<td>ssh keys</td> 230<td><a href="https://api.github.com/users/wasabipesto/keys" target="_blank" rel="noopener noreferrer">api.github.com/users/wasabipesto/keys</a></td> 231</tr> 232<tr> 233<td>gpg keys</td> 234<td><a href="https://api.github.com/users/wasabipesto/gpg_keys" target="_blank" rel="noopener noreferrer">api.github.com/users/wasabipesto/gpg_keys</a></td> 235</tr> 236<tr> 237<td>copyright</td> 238<td><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank" rel="noopener noreferrer">CC BY-NC-SA 4.0 Deed</a></td> 239</tr> 240<tr> 241<td>email</td> 242<td><a href="/cdn-cgi/l/email-protection#0926266a66677d686a7d497e687a686b60796c7a7d66276a6664" target="_blank" rel="noopener noreferrer"><span class="__cf_email__" data-cfemail="2d4e4243594c4e596d5a4c5e4c4f445d485e5942034e4240">[email protected]</span></a></td> 243</tr> 244<tr> 245<td>status</td> 246<td><a href="https://status.wasabipesto.com/" target="_blank" rel="noopener noreferrer">status.wasabipesto.com</a></td> 247</tr> 248</tbody> 249</table> 250 </div> 251 </div> 252</div> 253</main> 254<footer id="observablehq-footer"> 255<div> Made with â¤ï¸ by <a href="https://wasabipesto.com" target="_blank" rel="noopener noreferrer">wasabipesto</a>
255. Generated with <a href="https://observablehq.com/framework/" target="_blank" rel="noopener noreferrer">Observable Framework</a>. <br> Page source and data loaders can be found on <a href="https://github.com/wasabipesto/beehive" target="_blank" rel="noopener noreferrer">GitHub</a>. Content is licensed under <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank" rel="noopener noreferrer">CC BY-NC-SA 4.0 Deed</a>.</div> 256</footer> 257</div>
vendor: 109 bytes, lines 257-258
257 258<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
258<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"110250afe9564f4287aaddc077462994","r":1,"spa":2}' crossorigin="anonymous"></script>
258 259</body> 260</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.