<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="generator" content="Astro v6.4.3"><title>LLBBL.com | lä | bē | bo͝ol |</title><meta name="description" content="LLBBL.com is the home of an internet goblin shipping projects, posts, and small experiments. Phonetic spelling, retro vibes, useful work."><link rel="canonical" href="https://llbbl.com/"><!-- Open Graph --><meta property="og:title" content="LLBBL.com | lä | bē | bo͝ol |"><meta property="og:description" content="LLBBL.com is the home of an internet goblin shipping projects, posts, and small experiments. Phonetic spelling, retro vibes, useful work."><meta property="og:type" content="website"><meta property="og:url" content="https://llbbl.com/"><meta property="og:image" content="https://llbbl.com/og/index.png"><meta property="og:image:alt" content="LLBBL.com"><meta property="og:image:width" content="1200"><meta property="og:image:height" content="630"><meta property="og:locale" content="en_US"><meta property="og:site_name" content="LLBBL.com"><!-- Twitter --><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="LLBBL.com | lä | bē | bo͝ol |"><meta name="twitter:description" content="LLBBL.com is the home of an internet goblin shipping projects, posts, and small experiments. Phonetic spelling, retro vibes, useful work."><meta name="twitter:image" content="https://llbbl.com/og/index.png"><meta name="twitter:image:alt" content="LLBBL.com"><link rel="icon" type="image/x-icon" href="/llbbl-content/favicon.ico"><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=VT323&family=Press+Start+2P&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet"><link rel="stylesheet" href="/_astro/Taskbar.D2Vnzgzy.css">
<style>.counter-wrap.svelte-1wu0gmi{text-align:center}.counter-display.svelte-1wu0gmi{display:block;width:100%;border:1px solid var(--lime);background:#a8ff2e0a;padding:8px;font-family:var(--font-mono);font-size:24px;letter-spacing:6px;color:var(--lime);text-shadow:0 0 6px rgba(168,255,46,.5);cursor:pointer;transition:background .2s,text-shadow .2s}.counter-display.svelte-1wu0gmi:hover:not(:disabled){background:#a8ff2e1a;text-shadow:0 0 12px rgba(168,255,46,.7)}.counter-display.svelte-1wu0gmi:disabled{cursor:default}.counter-display.counted.svelte-1wu0gmi{border-color:var(--cyan);color:var(--cyan);text-shadow:0 0 6px rgba(0,229,255,.5)}.counter-display.animating.svelte-1wu0gmi{animation:svelte-1wu0gmi-counter-flash .6s ease-out}.counter-label.svelte-1wu0gmi{font-family:var(--font-mono);font-size:11px;color:var(--muted);margin-top:4px}.counter-loading.svelte-1wu0gmi{opacity:.4}@keyframes svelte-1wu0gmi-counter-flash{0%{background:#a8ff2e4d}to{background:#a8ff2e0a}}.thumb-art[data-astro-cid-w7gzxxox]{margin:0;font-family:var(--font-mono);font-size:10px;line-height:1.2;color:var(--lime);text-shadow:0 0 4px rgba(168,255,46,.3);text-align:center}.hero-window{grid-column:span 8;grid-row:span 1}.sysop-window{grid-column:span 4;grid-row:span 2}.projects-window{grid-column:span 8}.posts-window{grid-column:span 7}.experiments-window{grid-column:span 5}.newsletter-window{grid-column:span 8}.guestbook-window{grid-column:span 4}
</style><script type="module" src="/_astro/page.ByD2Qsgn.js"></script></head> <body>  <div class="page"> <nav class="menubar"> <a href="/" class="brand">LLBBL_</a> <a href="/"><span class="num">1</span>home</a> <a href="/about"><span class="num">2</span>about</a> <a href="/projects"><span class="num">3</span>projects</a> <a href="/posts"><span class="num">4</span>posts</a> <a href="/experiments"><span class="num">5</span>experiments</a> <a href="/interests"><span class="num">6</span>interests</a> <span class="spacer"></span> <span class="clock" id="menubar-clock">00:00:00</span> <div class="auth-slot"> <style>astro-island,astro-slot,astro-static-slot{display:contents}</style><script>(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).only=e;window.dispatchEvent(new Event("astro:only"));})();</script><script>(()=>{var g=Object.defineProperty;var w=(c,s,d)=>s in c?g(c,s,{enumerable:!0,configurable:!0,writable:!0,value:d}):c[s]=d;var l=(c,s,d)=>w(c,typeof s!="symbol"?s+"":s,d);var E=new Set(["__proto__","constructor","prototype"]);{let c={0:t=>y(t),1:t=>d(t),2:t=>new RegExp(t),3:t=>new Date(t),4:t=>new Map(d(t)),5:t=>new Set(d(t)),6:t=>BigInt(t),7:t=>new URL(t),8:t=>new Uint8Array(t),9:t=>new Uint16Array(t),10:t=>new Uint32Array(t),11:t=>Number.POSITIVE_INFINITY*t},s=t=>{let[p,e]=t;return p in c?c[p](e):void 0},d=t=>t.map(s),y=t=>typeof t!="object"||t===null?t:Object.fromEntries(Object.entries(t).map(([p,e])=>[p,s(e)]));class f extends HTMLElement{constructor(){super(...arguments);l(this,"Component");l(this,"hydrator");l(this,"hydrate",async()=>{var b;if(!this.hydrator||!this.isConnected)return;let e=(b=this.parentElement)==null?void 0:b.closest("astro-island[ssr]");if(e){e.addEventListener("astro:hydrate",this.hydrate,{once:!0});return}let n=this.querySelectorAll("astro-slot"),r={},i=this.querySelectorAll("template[data-astro-template]");for(let o of i){let a=o.closest(this.tagName);a!=null&&a.isSameNode(this)&&(r[o.getAttribute("data-astro-template")||"default"]=o.innerHTML,o.remove())}for(let o of n){let a=o.closest(this.tagName);a!=null&&a.isSameNode(this)&&(r[o.getAttribute("name")||"default"]=o.innerHTML)}let u;try{u=this.hasAttribute("props")?y(JSON.parse(this.getAttribute("props"))):{}}catch(o){let a=this.getAttribute("component-url")||"<unknown>",v=this.getAttribute("component-export");throw v&&(a+=` (export ${v})`),console.error(`[hydrate] Error parsing props for component ${a}`,this.getAttribute("props"),o),o}let h;await this.hydrator(this)(this.Component,u,r,{client:this.getAttribute("client")}),this.removeAttribute("ssr"),this.dispatchEvent(new CustomEvent("astro:hydrate"))});l(this,"unmount",()=>{this.isConnected||this.dispatchEvent(new CustomEvent("astro:unmount"))})}disconnectedCallback(){document.removeEventListener("astro:after-swap",this.unmount),document.addEventListener("astro:after-swap",this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute("await-children")||document.readyState==="interactive"||document.readyState==="complete")this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener("DOMContentLoaded",e),n.disconnect(),this.childrenConnectedCallback()},n=new MutationObserver(()=>{var r;((r=this.lastChild)==null?void 0:r.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue==="astro:end"&&(this.lastChild.remove(),e())});n.observe(this,{childList:!0}),document.addEventListener("DOMContentLoaded",e)}}async childrenConnectedCallback(){let e=this.getAttribute("before-hydration-url");e&&await import(e),this.start()}getRetryImportUrl(e){let n=new URL(e,document.baseURI),r=`astro-retry=${Date.now()}`,i=n.hash.replace(/^#/,"");return n.hash=i?`${i}&${r}`:r,n.toString()}async importWithRetry(e){try{return await import(e)}catch(n){return await new Promise(r=>setTimeout(r,1e3)),import(this.getRetryImportUrl(e))}}handleHydrationError(e){let n=this.getAttribute("component-url"),r=new CustomEvent("astro:hydration-error",{cancelable:!0,bubbles:!0,composed:!0,detail:{error:e,componentUrl:n}});this.dispatchEvent(r)&&console.error(`[astro-island] Error hydrating ${n}`,e)}async start(){let e=JSON.parse(this.getAttribute("opts")),n=this.getAttribute("client");if(Astro[n]===void 0){window.addEventListener(`astro:${n}`,()=>this.start(),{once:!0});return}try{await Astro[n](async()=>{let r=this.getAttribute("renderer-url");try{let[i,{default:u}]=await Promise.all([this.importWithRetry(this.getAttribute("component-url")),r?this.importWithRetry(r):Promise.resolve({default:()=>()=>{}})]),h=this.getAttribute("component-export")||"default";if(h.includes(".")){this.Component=i;for(let m of h.split(".")){if(E.has(m)||!this.Component||typeof this.Component!="object"&&typeof this.Component!="function"||!Object.hasOwn(this.Component,m))throw new Error(`Invalid component export path: ${h}`);this.Component=this.Component[m]}}else{if(E.has(h))throw new Error(`Invalid component export path: ${h}`);this.Component=i[h]}return this.hydrator=u,this.hydrate}catch(i){return this.handleHydrationError(i),()=>{}}},e,this)}catch(r){this.handleHydrationError(r)}}attributeChangedCallback(){this.hydrate()}}l(f,"observedAttributes",["props"]),customElements.get("astro-island")||customElements.define("astro-island",f)}})();</script><astro-island uid="22qOIK" component-url="/_astro/AuthButton.eV7ATwb1.js" component-export="default" renderer-url="/_astro/client.DpL8pV0i.js" props="{}" ssr client="only" before-hydration-url="/_astro/astro_scripts/before-hydration.js.iRdLQs0n.js" opts="{&quot;name&quot;:&quot;AuthButton&quot;,&quot;value&quot;:&quot;react&quot;}"></astro-island> </div> </nav> <script type="module">function e(){const n=document.getElementById("menubar-clock");if(!n)return;const t=new Date,o=String(t.getHours()).padStart(2,"0"),c=String(t.getMinutes()).padStart(2,"0"),r=String(t.getSeconds()).padStart(2,"0");n.textContent=`${o}:${c}:${r}`}e();setInterval(e,1e3);</script> <div class="banner"> <pre><span class="c">██╗     ██╗     ██████╗ ██████╗ ██╗</span>
<span class="c">██║     ██║     ██╔══██╗██╔══██╗██║</span>
<span class="c">██║     ██║     ██████╔╝██████╔╝██║</span>
<span class="c">██║     ██║     ██╔══██╗██╔══██╗██║</span>
<span class="c">███████╗███████╗██████╔╝██████╔╝███████╗</span>
<span class="c">╚══════╝╚══════╝╚═════╝ ╚═════╝ ╚══════╝</span>     <span class="l">node 01 · 24h · ansi+utf8 · sysop: llbbl</span></pre> <div class="banner-meta"> <span><span class="blink-dot"></span><b>online</b></span> <span>uptime <b>4d 02h 14m</b></span> <span>users <b>1</b></span> <span>build <b>v0.1.3</b></span> <span>last seen <b>just now</b></span> </div> </div> <div class="ticker"> <div class="ticker-track"> ▸ <b>EXPERIMENT</b> chord-compass — circle-of-fifths explorer with audio playback &nbsp;&nbsp;·&nbsp;&nbsp; ▸ <b>api2spec</b> v0.5 released — generate OpenAPI specs from source code &nbsp;&nbsp;·&nbsp;&nbsp; ▸ <b>NOW</b> shipping: building developer tools and exploring agentic AI workflows &nbsp;&nbsp;·&nbsp;&nbsp; ▸ <b>WEBRING</b> small-web ring open to applicants &nbsp;&nbsp;·&nbsp;&nbsp; ▸ <b>VISITOR</b> #00042077 &nbsp;&nbsp;·&nbsp;&nbsp;  ▸ <b>EXPERIMENT</b> chord-compass — circle-of-fifths explorer with audio playback &nbsp;&nbsp;·&nbsp;&nbsp; ▸ <b>api2spec</b> v0.5 released — generate OpenAPI specs from source code &nbsp;&nbsp;·&nbsp;&nbsp; ▸ <b>NOW</b> shipping: building developer tools and exploring agentic AI workflows &nbsp;&nbsp;·&nbsp;&nbsp; ▸ <b>WEBRING</b> small-web ring open to applicants &nbsp;&nbsp;·&nbsp;&nbsp; ▸ <b>VISITOR</b> #00042077 &nbsp;&nbsp;·&nbsp;&nbsp;  </div> </div> <div class="grid"> <div class="win hero-window"> <div class="win-bar cyan"> <span class="win-title">about.txt</span> <span class="win-ctrl"> <span>_</span> <span>&square;</span> <span>&times;</span> </span> </div> <div class="win-body">  <div class="hero-grid"> <div class="hero-left"> <h1 class="hero-name">hi, i'm<br>Logan<span class="period">.</span><span class="cursor"></span></h1> <p class="hero-tagline">
builder &middot; writer &middot; internet goblin.<br>
this is my corner of the network. projects, posts, and small experiments.
</p> <div class="hero-meta">
location: <span class="val">austin, texas</span> &middot; status: <span class="val">shipping</span> </div> <div class="hero-links"> <a href="https://github.com/llbbl">GitHub</a> <a href="https://bsky.app/profile/llbbl.blog">Bluesky</a> <a href="https://www.linkedin.com/in/loganlindquist/">LinkedIn</a> <a href="/posts">Blog</a> </div> </div> <div class="hero-right"> <pre class="portrait-box">┌──────────────────┐
│     ╭──────╮     │
│    ╱ ░░░░░░ ╲    │
│   │ ░░░░░░░░ │   │
│   │ ┌──┐┌──┐ │   │
│   │ │◉ ││ ◉│ │   │
│   │ └──┘└──┘ │   │
│   │    ▽     │   │
│   │  ╰───╯   │   │
│   │ ░▓▓▓▓▓░  │   │
│    ╲ ░▓▓▓░  ╱    │
│     ╰──────╯     │
└──────────────────┘</pre> <div class="portrait-label">sysop_portrait.ansi</div> </div> </div>  </div> </div> <div class="win sysop-window"> <div class="win-bar violet"> <span class="win-title">sysop.dat</span> <span class="win-ctrl"> <span>_</span> <span>&square;</span> <span>&times;</span> </span> </div> <div class="win-body">  <div class="sysop-stats"> <span class="lbl">node</span><span>01 of 01</span> <span class="lbl">baud</span><span>fiber</span> <span class="lbl">uptime</span><span>4d 02h</span> <span class="lbl">status</span><span class="online">● online</span> <span class="lbl">tests</span><span class="online">102 ✓</span> <span class="lbl">sysop</span><span>llbbl</span> <span class="lbl">tz</span><span>CDT (-05)</span> </div> <div class="sysop-section"> <h4>/now</h4> <p>
building developer tools and exploring agentic AI workflows.
      shipping open-source projects and writing about the craft.
</p> <div class="sysop-tags"> <span class="tag violet">agentic-ai</span> <span class="tag cyan">dev-tools</span> <span class="tag lime">open-source</span> <span class="tag amber">writing</span> </div> </div>  <div class="sysop-section"> <h4>webring</h4> <div class="webring"> <span class="ring-name">small-web ring</span> <a href="#">&laquo; prev</a> <a href="#">random</a> <a href="#">next &raquo;</a> </div> </div> <script>(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).load=e;window.dispatchEvent(new Event("astro:load"));})();</script><astro-island uid="Z28pgi5" component-url="/_astro/VisitorCounter.B-JOBdcF.js" component-export="default" renderer-url="/_astro/client.svelte.SsfJ051U.js" props="{}" ssr client="load" before-hydration-url="/_astro/astro_scripts/before-hydration.js.iRdLQs0n.js" opts="{&quot;name&quot;:&quot;VisitorCounter&quot;,&quot;value&quot;:true}" await-children><!--[--><div class="counter-wrap svelte-1wu0gmi"><button class="counter-display svelte-1wu0gmi" disabled="" title="click to be counted!"><!--[0--><span class="counter-loading svelte-1wu0gmi">--------</span><!--]--></button> <div class="counter-label svelte-1wu0gmi"><!--[-1-->click to be counted<!--]--></div></div><!--]--><!--astro:end--></astro-island>  </div> </div> <div class="win projects-window"> <div class="win-bar cyan"> <span class="win-title">projects/ — featured</span> <span class="win-ctrl"> <span>_</span> <span>&square;</span> <span>&times;</span> </span> </div> <div class="win-body">  <div class="projects-grid"> <div class="project-card"> <span class="project-num">[01]</span> <div class="project-title"> <a href="https://github.com/api2spec/api2spec" target="_blank" rel="noopener noreferrer"> api2spec </a> </div> <p class="project-desc">Generate OpenAPI specifications directly from your source code.</p> <div class="project-tags"> <span class="tag cyan">Go</span> </div> </div><div class="project-card"> <span class="project-num">[02]</span> <div class="project-title"> <a href="https://github.com/llbbl/upkeep" target="_blank" rel="noopener noreferrer"> upkeep </a> </div> <p class="project-desc">Claude Code skills + Bun CLI for maintaining JavaScript and TypeScript repositories.</p> <div class="project-tags"> <span class="tag cyan">TypeScript</span><span class="tag cyan">Bun</span><span class="tag cyan">Claude Code</span> </div> </div><div class="project-card"> <span class="project-num">[03]</span> <div class="project-title"> <a href="https://github.com/llbbl/semantic-docs" target="_blank" rel="noopener noreferrer"> semantic-docs </a> </div> <p class="project-desc">Documentation theme with semantic vector search. Featured on the official Astro Themes directory.</p> <div class="project-tags"> <span class="tag cyan">Astro</span><span class="tag cyan">React</span><span class="tag cyan">TypeScript</span><span class="tag cyan">Tailwind CSS</span> </div> </div><div class="project-card"> <span class="project-num">[04]</span> <div class="project-title"> <a href="https://github.com/agentic-tooling/maturity-model" target="_blank" rel="noopener noreferrer"> Agentic Tooling Maturity Model </a> </div> <p class="project-desc">A framework for assessing agentic AI tooling practices across engineering organizations.</p> <div class="project-tags"> <span class="tag cyan">AI</span><span class="tag cyan">Developer Tooling</span> </div> </div> </div>  </div> </div> <div class="win posts-window"> <div class="win-bar amber"> <span class="win-title">posts/ — readme.md</span> <span class="win-ctrl"> <span>_</span> <span>&square;</span> <span>&times;</span> </span> </div> <div class="win-body"> <div><div class="post-row"><span class="post-date">Jun 02, 2026</span><span class="post-title"><a href="/posts/2026-05-30-day-10-zero-point/">Day 10: The Zero Point</a></span><span class="post-tags"><span class="tag lime">Timekeeping</span><span class="tag lime">Programming</span><span class="tag lime">Astronomy</span><span class="tag lime">Computing-history</span><span class="tag lime">30daysoftime</span></span></div><div class="post-row"><span class="post-date">May 23, 2026</span><span class="post-title"><a href="/posts/2026-05-17-running-terraform-existing-ci/">Running Terraform in Your Existing CI Pipeline</a></span><span class="post-tags"><span class="tag lime">Devops</span><span class="tag lime">Infrastructure</span><span class="tag lime">Terraform</span><span class="tag lime">Opentofu</span><span class="tag lime">Cicd</span><span class="tag lime">Github</span><span class="tag lime">Gitlab</span></span></div><div class="post-row"><span class="post-date">May 22, 2026</span><span class="post-title"><a href="/posts/2026-05-17-hcp-terraform-pricing-trap/">HCP Terraform&#39;s Per-Resource Pricing Is a Trap</a></span><span class="post-tags"><span class="tag lime">Devops</span><span class="tag lime">Infrastructure</span><span class="tag lime">Terraform</span><span class="tag lime">Pricing</span><span class="tag lime">Hashicorp</span></span></div><div class="post-row"><span class="post-date">May 21, 2026</span><span class="post-title"><a href="/posts/2026-05-17-when-to-skip-terraform-entirely/">When You Should Skip Terraform Entirely</a></span><span class="post-tags"><span class="tag lime">Devops</span><span class="tag lime">Infrastructure</span><span class="tag lime">Aws</span><span class="tag lime">Azure</span><span class="tag lime">Gcp</span><span class="tag lime">Terraform</span></span></div><div class="post-row"><span class="post-date">May 20, 2026</span><span class="post-title"><a href="/posts/2026-05-17-opentofu-regrets-default-2026-infrastructure/">OpenTofu Is the No-Regrets Default for 2026 Infrastructure</a></span><span class="post-tags"><span class="tag lime">Devops</span><span class="tag lime">Infrastructure</span><span class="tag lime">Opentofu</span><span class="tag lime">Terraform</span></span></div><a href="/posts" class="archive-link">view all posts &rarr;</a></div> </div> </div> <div class="win experiments-window"> <div class="win-bar lime"> <span class="win-title">experiments/</span> <span class="win-ctrl"> <span>_</span> <span>&square;</span> <span>&times;</span> </span> </div> <div class="win-body"> <div class="experiment-row" data-astro-cid-w7gzxxox> <div class="experiment-thumb" data-astro-cid-w7gzxxox> <pre class="thumb-art" data-astro-cid-w7gzxxox>♪♫♬
◯─◯
♩♭♯</pre> </div> <div class="experiment-info" data-astro-cid-w7gzxxox> <div class="experiment-title" data-astro-cid-w7gzxxox> <a href="https://chord-compass.logan.center" target="_blank" rel="noopener noreferrer" data-astro-cid-w7gzxxox> Chord Compass </a> <span class="star" data-astro-cid-w7gzxxox>&#9733;</span> </div> <p class="experiment-desc" data-astro-cid-w7gzxxox>Circle-of-fifths chord explorer with audio playback.</p> </div> </div><div class="experiment-row" data-astro-cid-w7gzxxox> <div class="experiment-thumb" data-astro-cid-w7gzxxox> <pre class="thumb-art" data-astro-cid-w7gzxxox>┌──┐
│&gt;&gt;│
└──┘</pre> </div> <div class="experiment-info" data-astro-cid-w7gzxxox> <div class="experiment-title" data-astro-cid-w7gzxxox> <a href="https://sre-commander.logan.center" target="_blank" rel="noopener noreferrer" data-astro-cid-w7gzxxox> SRE Commander </a> <span class="star" data-astro-cid-w7gzxxox>&#9733;</span> </div> <p class="experiment-desc" data-astro-cid-w7gzxxox>Keyboard-driven ops game. Manage servers and respond to incidents.</p> </div> </div><div class="experiment-row" data-astro-cid-w7gzxxox> <div class="experiment-thumb" data-astro-cid-w7gzxxox> <pre class="thumb-art" data-astro-cid-w7gzxxox>╔══╗
║▲▼║
╚══╝</pre> </div> <div class="experiment-info" data-astro-cid-w7gzxxox> <div class="experiment-title" data-astro-cid-w7gzxxox> <a href="https://elevator-agent.logan.center" target="_blank" rel="noopener noreferrer" data-astro-cid-w7gzxxox> Elevator Agent </a> <span class="star" data-astro-cid-w7gzxxox>&#9733;</span> </div> <p class="experiment-desc" data-astro-cid-w7gzxxox>Atari 2600-style elevator action game.</p> </div> </div><div class="experiment-row" data-astro-cid-w7gzxxox> <div class="experiment-thumb" data-astro-cid-w7gzxxox> <pre class="thumb-art" data-astro-cid-w7gzxxox>┌┬┬┬┐
│││││
└┴┴┴┘</pre> </div> <div class="experiment-info" data-astro-cid-w7gzxxox> <div class="experiment-title" data-astro-cid-w7gzxxox> <a href="https://scale-lab.logan.center" target="_blank" rel="noopener noreferrer" data-astro-cid-w7gzxxox> Scale Lab </a> <span class="star" data-astro-cid-w7gzxxox>&#9733;</span> </div> <p class="experiment-desc" data-astro-cid-w7gzxxox>Musical scale and mode explorer with piano keyboard.</p> </div> </div> </div> </div> <div class="win newsletter-window"> <div class="win-bar pink"> <span class="win-title">subscribe.dlg</span> <span class="win-ctrl"> <span>_</span> <span>&square;</span> <span>&times;</span> </span> </div> <div class="win-body">  <div class="newsletter-grid"> <div class="newsletter-left"> <p class="newsletter-desc">
occasional dispatches on developer tools, agentic AI,
        open-source projects, and interesting things from the small web.
        no spam, unsubscribe anytime.
</p> </div> <div class="newsletter-right"> <form action="https://buttondown.com/api/emails/embed-subscribe/loganland" method="post" target="popupwindow"> <input type="email" name="email" placeholder="your@email.address" required class="newsletter-input"> <button type="submit" class="newsletter-btn" aria-label="Subscribe to newsletter">[ subscribe &rarr; ]</button> </form> </div> </div>  </div> </div> <div class="win guestbook-window"> <div class="win-bar lime"> <span class="win-title">guestbook.dlg</span> <span class="win-ctrl"> <span>_</span> <span>&square;</span> <span>&times;</span> </span> </div> <div class="win-body">  <p class="guestbook-desc">
leave a message, say hello, or just let me know you stopped by.
    old-school guestbook vibes.
</p> <a href="/guestbook" class="guestbook-btn" aria-label="Sign the guestbook">[ sign the guestbook &rarr; ]</a>  </div> </div> </div> <footer class="about-footer"> <div class="about-footer-top"> <div> <div class="about-footer-brand">llbbl<span class="period">.</span></div> <div class="about-footer-sub">/home/llbbl</div> </div> <img src="/llbbl-content/logan_logo_c1.jpg" alt="llbbl." class="about-footer-logo"> <div class="about-footer-links"> <a href="https://github.com/llbbl">github</a> <a href="https://www.linkedin.com/in/loganlindquist/">linkedin</a> <a href="https://bsky.app/profile/llbbl.blog">bluesky</a> <a href="/rss.xml">rss</a> <a href="/cdn-cgi/l/email-protection#88e4e7efe9e6c8e4e4eaeae4a6ebe7e5">email</a> </div> </div> <div class="about-footer-bottom"> <span>&copy; 2026 Logan Lindquist Land. all rights reserved.</span> <span class="under-construction">&#9888; under construction &#9888;</span> <span>v1.0.0 &middot; <a href="/colophon">colophon</a></span> </div> </footer> <div class="taskbar"> <span class="taskbar-start">START</span> <div class="taskbar-tabs"> <span class="taskbar-tab active">llbbl.exe</span> <span class="taskbar-tab">projects/</span> <span class="taskbar-tab">posts/</span> <span class="taskbar-tab">experiments/</span> <span class="taskbar-tab">subscribe.dlg</span> </div> <div class="taskbar-right"> <span>&copy; 2026</span> <span>v1.0.0</span> <span class="blink-dot"></span> </div> </div> </div>  <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script></body></html>