<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[BayLeaf Blog]]></title><description><![CDATA[Human commentary on BayLeaf, the generative AI counterplatform for UC Santa Cruz]]></description><link>https://blog.bayleaf.dev</link><image><url>https://substackcdn.com/image/fetch/$s_!4QwT!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa606a527-a58e-47e3-9610-a228520a77d3_1024x1024.png</url><title>BayLeaf Blog</title><link>https://blog.bayleaf.dev</link></image><generator>Substack</generator><lastBuildDate>Mon, 14 Sep 2026 08:09:39 GMT</lastBuildDate><atom:link href="https://blog.bayleaf.dev/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Adam M. Smith]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[bayleafdev@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[bayleafdev@substack.com]]></itunes:email><itunes:name><![CDATA[Adam M. Smith]]></itunes:name></itunes:owner><itunes:author><![CDATA[Adam M. Smith]]></itunes:author><googleplay:owner><![CDATA[bayleafdev@substack.com]]></googleplay:owner><googleplay:email><![CDATA[bayleafdev@substack.com]]></googleplay:email><googleplay:author><![CDATA[Adam M. Smith]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Blocking Closed-Weight Models]]></title><description><![CDATA[And other lines we could draw]]></description><link>https://blog.bayleaf.dev/p/blocking-closed-weight-models</link><guid isPermaLink="false">https://blog.bayleaf.dev/p/blocking-closed-weight-models</guid><dc:creator><![CDATA[Adam M. Smith]]></dc:creator><pubDate>Wed, 02 Sep 2026 23:02:19 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4QwT!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa606a527-a58e-47e3-9610-a228520a77d3_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>About a month ago, I wrote one of the first posts on this blog about delisting closed-weight models on the BayLeaf API while still serving requests for them: <a href="https://blog.bayleaf.dev/p/delisting-closed-weight-models">https://blog.bayleaf.dev/p/delisting-closed-weight-models</a></p><p>Today, I&#8217;m <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/403">blocking</a> access to closed-weight models in the BayLeaf API.</p><p>Why make such a big deal about whether you can download the model weights? I don&#8217;t think I want to try to convince you on this specific point today. Some of you might already be sold on it on the basis of relational reciprocity (giving back to the Web that made these models possible) or free-market economics (access to model weights enables an ecosystem where many different implementations of AI can thrive). Others might just read it as me trying to argue against the generic architectural pattern of software as a service, which (and you&#8217;re so smart) I seem to use all over the BayLeaf project, actually.</p><p>I&#8217;m making a big deal of it because I think some big deals ought to be made, with promises, compromises, and with robust and inspectable implementations. Let&#8217;s draw some lines, propose not to cross them, and see what living with that decision feels like (at least for a while). At this specific moment, I don&#8217;t think it is super important precisely where those lines get drawn.</p><p>Here are a few packages I&#8217;m imagining:</p><ul><li><p><strong>No closed-weight models (the one I&#8217;m implementing)</strong>: Just don&#8217;t serve inference for models for which we can&#8217;t find an associated public weight repository (e.g. a HuggingFace link). This might lock us out of future proprietary models that make more efficient use of energy (proxied by inference cost in dollars) or human attention (proxied by number of agent steps to complete a task). However, because whether the models are downloadable isn&#8217;t intrinsically coupled to efficiency and other issues, the risk of potential, future, temporary regret seems low. Seems reasonable. Let&#8217;s do it. Done, even if it reverses one of my earlier deliberate choices to preserve access for research and comparison.</p></li><li><p><strong>No data or money for inference to problematic providers (or whoever is suitably OpenAI/Google/Anthropic-like to attract your ire)</strong>: I like the hit-em-where-it-hurts spirit of this one, but it gets tricky to implement. Can data flow back to OpenAI for the use of their open-weight GPT-OSS models? Can we use GPT-OSS from a non-OpenAI provider? Can money flow to Amazon, who pays Anthropic behind the scenes? What about how Anthropic pays SpaceXAI behind the scenes for Colossus? Can we still use Google Drive or even Google Search if we&#8217;re boycotting Gemini? If we effectively reward Google for good behavior by paying them for inference of open-weight (or other less-problematic category of) models through their Model-as-a-Service (MaaS) system, are we still feeding the beast? This confusion is what kept drawing me back to just blocking closed-weight models and seeing what it is like to live with that choice for a while.</p></li><li><p><strong>Model&#8211;harness disaggregation</strong>: Microsoft once famously got in big trouble for bundling a browser too tightly with an operating system, but it was fine for Google to do the same a decade later, at least for a while. There&#8217;s currently tension around how strongly Google pushes to be the default search engine in beyond-Google browsers. Something analogous is happening with mobile operating systems and their associated (or importantly not-associated) app stores. In the generative AI space, I can foresee problematic power relations when models and harnesses are too tightly integrated. Currently, you can use non-OpenAI models inside of OpenAI&#8217;s Codex harness, and you can use Claude models in harnesses beyond Claude Code. But you can&#8217;t leverage your Claude <em>subscription</em> when you leave an Anthropic-provided harness. And the situation between Cursor (the harness), Cursor Composer (the model), and being acquired by SpaceXAI (who makes their own models and harnesses with different degrees of mandatory coupling) is rapidly changing as I write this. Rather than a wait-and-see, sure-hope-we-don&#8217;t-get-locked-in strategy, we could just commit to exercising the discipline of never running a harness that comes from the same organization that provides the model. BayLeaf encourages but does not enforce this usage pattern. Trying to live by this one myself has gotten me to mostly give up on Anthropic models, because I can&#8217;t access them in a cost-efficient way without leaving my agentic home in <a href="https://opencode.ai/">OpenCode</a> and other open-source harnesses that I&#8217;ve contributed to. When model&#8211;harness antitrust action comes, I&#8217;ll be ready, but it doesn&#8217;t feel like a big issue for others.</p></li><li><p><strong>Capped context windows</strong>: This one is trying to merge some kind of self-care practice with labor action by way of an inference server parameter tweak, but there is some logic to it. Context windows limit how far back in a conversation (or other agent activity trace) a model can reach when trying to decide how to respond. What happens if we cap context windows on supported inference endpoints at, say, sixteen thousand tokens? (This is maybe comparable to twenty-five pages of text.) This limits how deep of a relationship you can get into with your robot buddy. It limits how complex of a job your robot buddy can do after they let you go. It limits how lost you can get in a conversation before the session hits a hard stop. It also puts a nice low cap on your maximum per-request spend, far below the cost associated with those long-horizon agentic traces that many model-trainers like to brag about. It&#8217;s not a cap on the agent&#8217;s intelligence, maybe just on the scope of the application of that intelligence. Someone needs to test this to see if the effects on self-care or labor displacement point in the right direction, but it would be super cheap to implement.</p></li></ul><p>Backing up to the title of this post, I&#8217;m blocking access to closed-weight models only a little bit because I care about reciprocity and healthy markets. I mostly want to get people thinking about specific, actionable demands and to have municipal-scale institutions adopt them (even if only temporarily) so we can all gain experience with what&#8217;s feasible and effective.</p><p>(Because my agents have the data at hand: &#8220;Models without published weights accounted for about 33% of BayLeaf&#8217;s OpenRouter inference spending in August. Claude Sonnet 5 alone accounted for 23% of total spending, and Claude Opus 4.8 accounted for another 7%. The remaining 3.5% went mostly to Grok, with smaller amounts spent on Gemini and GPT models.&#8221;)</p>]]></content:encoded></item><item><title><![CDATA[Military-grade Encryption]]></title><description><![CDATA[*pew pew*]]></description><link>https://blog.bayleaf.dev/p/military-grade-encryption</link><guid isPermaLink="false">https://blog.bayleaf.dev/p/military-grade-encryption</guid><dc:creator><![CDATA[Adam M. Smith]]></dc:creator><pubDate>Wed, 02 Sep 2026 08:44:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!gZAJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc044980b-2a0e-466c-9c2d-36898cd76342_766x542.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the early days of the Web, very little data was encrypted in transit. Of what little was encrypted, only a subset was encrypted adequately. US export controls treated strong cryptographic software as a weapon, so web browsers shipped with weakened &#8220;export-grade&#8221; encryption. Those controls were relaxed around the turn of the millennium (during a past <a href="https://en.wikipedia.org/wiki/AI_winter">AI winter</a>). Later efforts including the EFF&#8217;s <a href="https://www.eff.org/deeplinks/2020/11/10-years-https-everywhere">HTTPS Everywhere</a> and the free, automated certificates provided by <a href="https://letsencrypt.org/">Let&#8217;s Encrypt</a> helped make HTTPS with reasonable ciphers the norm we have today.</p><p>One lasting effect of that history is that, for a certain population, &#8220;military-grade encryption&#8221; has a very precise connotation: It&#8217;s the <em>actual</em> encryption you can&#8217;t have, while the encryption you can have isn&#8217;t <em>actually</em> that good. It&#8217;s unsafe to let others have it. Or it&#8217;s too expensive to let you have it. The only way to stop a bad guy with a gun is for the other guys with guns to be able to read your email, or something like that. There is no alternative.</p><p>To rapidly bring this back to generative AI in higher education, I&#8217;m going to talk about who can see the data processed by LLMs. It might seem that if a language model needs to read your text to understand it, and a remote provider runs the model, then the provider needs to be able to read your text. I can require that it be encrypted on the way there and that the provider encrypt it when stored (or simply not store it at all). But surely the provider needs to be able to <em>read</em> it while the model is working? Nope! The model needs to to read it, but the model provider doesn&#8217;t.</p><p>It&#8217;s time for some military-grade encryption, of a sort.</p><p>Suppose you are the United States Department of War, and you need a good coding agent for, you know, war stuff. Do you just make a <a href="https://en.wikipedia.org/wiki/POST_(HTTP)">POST</a> request to <code>https://api.openai.com/v1</code> like any other customer? Probably not. I can&#8217;t find the precise details of how it all works. I got lost among <a href="https://www.fedramp.gov/">FedRAMP</a>, <a href="https://www.disa.mil/">DISA</a>, <a href="https://www.esi.mil/">ESI</a>, IL5 and IL6, why the Pentagon cleared AWS, Google, Microsoft, OpenAI, and others but not Anthropic, blah. Let&#8217;s work from basic words on public webpages, not acronyms and <a href="https://genai.mil/">mysterious dead-end landing pages</a>.</p><p>Our sister campus UC Riverside was proud to <a href="https://cloud.google.com/blog/topics/public-sector/a-new-standard-for-research-how-uc-riverside-is-securing-the-path-to-federal-grants-with-google-public-sector">announce</a> a partnership with Google to address &#8220;technical red tape and rigorous security and technical oversight that occasionally forced the university to decline critical funding.&#8221; The solution was a &#8220;secure enclave&#8221; with a &#8220;secure network boundary that keeps sensitive information such as <a href="https://www.dodcui.mil/">Controlled Unclassified Information (CUI)</a> protected.&#8221;</p><p>Here I hit an delightful name collision (or perhaps an aspirational declaration of intent). UCR&#8217;s Secure Enclave seems to be a tightly controlled, monitored Google Cloud environment built with <a href="https://github.com/google/stellar-engine">Stellar Engine</a> (an open-source Terraform framework for deploying infrastructure that maps onto federal security requirements). The enclosure is mostly administrative and architectural: identity controls, isolated networks, managed encryption keys, restricted ingress and egress, extensive logging, and a substantial pile of compliance documentation. Stellar Engine can also provision <em>Confidential VMs</em>, but UCR&#8217;s public documentation doesn&#8217;t say whether it uses them. More importantly, it describes authorized UCR staff managing the environment and its decryption keys. This kind of secure enclave controls <em>which</em> operators may see the data. It doesn&#8217;t necessarily mean operator access cryptographically impossible. <a href="https://aws.amazon.com/blogs/machine-learning/exploring-the-zero-operator-access-design-of-mantle/">Zero operator access</a> (ZOA) is the specific property I&#8217;m itching for.</p><p>Meanwhile, Google sells something closer to another meaning of secure enclave. <a href="https://cloud.google.com/docs/security/confidential-space">Confidential Space</a> runs a workload inside a hardware-backed <a href="https://en.wikipedia.org/wiki/Trusted_execution_environment">trusted execution environment</a> (TEE). Remote attestation lets someone check which code is running before releasing secrets to it, while memory encryption and a hardened operating system keep the workload hidden even from the people operating the surrounding infrastructure (awesome!). Skipping some amazing computer science and engineering detail (including cryptography), this is how a cloud provider can offer compute without retaining the ordinary technical ability to peek at what is being computed. It is a bit more expensive and complicated than the typical way of running cloud services, but it is an actual commercially available alternative. Many organizations want this level of privacy, not just those with guns.</p><p>Google isn&#8217;t the only player in the cryptographically sealed enclave game. Other cloud providers offer comparable systems, including AWS with its <a href="https://aws.amazon.com/ec2/nitro/nitro-enclaves/">Nitro Enclaves</a>. Specifically in the world of confidential LLM inference, <a href="https://confidentialinference.net/">ConfidentialInference.net</a> tracks available providers and their model catalogs, tagged by security architecture. When a provider combines remote attestation with end-to-end encryption to the attested workload, you are getting, to my knowledge, at least the <em>cryptographic</em> component of military-grade encryption for LLMs. (I&#8217;m sure there&#8217;s a &#8220;does the guy guarding the door have a gun?&#8221; aspect that I&#8217;m leaving out here.)</p><p>Can we have this at UC Santa Cruz, to protect our student data, our research data, and our late-night, stressed-out rants about housing (un)afforability? Yes, and it doesn&#8217;t even need to be difficult for users to set up.</p><p>When you are having that <em>sensitive</em> chat, my recently-added agent skill will nudge you away from BayLeaf Chat and into a desktop app running on your own computer, such as OpenCode or OpenChamber. I give you one-line setup commands like <code>opencode auth login https://api.bayleaf.dev</code> to hook those desktop apps with cloud inference services. Until last night, this configured only <em>standard</em> LLM inference services: encrypted transport to a provider that contractually promises not snarf your data. But now a similar command also configures our <em>sealed</em> LLM inference service. Your device verifies the enclave&#8217;s attestation, then encrypts your conversation to a key bound to that enclave. Neither the provider&#8217;s ordinary infrastructure nor the BayLeaf operator (that&#8217;s me) is capable of getting at the plaintext. Per-token prices are higher and the model catalog is a bit sparse, but it works.</p><p>Skipping back, you don&#8217;t use one of these confidential inference services simply by making a POST request to <code>https://api.bayleaf.dev/v1</code>. That would use encrypted transport to deliver plaintext to the ordinary BayLeaf API route. Instead, you need extra code on your computer to verify the attestation and pack up your data in a form that can be unpacked only inside the secure enclave, nowhere in between. Most agent harnesses don&#8217;t support this, and I didn&#8217;t want to make users install a separate desktop sidecar app that they would need to launch before their agent started working. So, for OpenCode, I created and published the <a href="https://www.npmjs.com/package/opencode-tinfoil">opencode-tinfoil</a> plugin for integrating Tinfoil-compatible confidential LLM inference providers, including the one available through the BayLeaf API. Once you have it set up, you&#8217;ll see a new batch of models in the picker:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gZAJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc044980b-2a0e-466c-9c2d-36898cd76342_766x542.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gZAJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc044980b-2a0e-466c-9c2d-36898cd76342_766x542.png 424w, https://substackcdn.com/image/fetch/$s_!gZAJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc044980b-2a0e-466c-9c2d-36898cd76342_766x542.png 848w, https://substackcdn.com/image/fetch/$s_!gZAJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc044980b-2a0e-466c-9c2d-36898cd76342_766x542.png 1272w, https://substackcdn.com/image/fetch/$s_!gZAJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc044980b-2a0e-466c-9c2d-36898cd76342_766x542.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gZAJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc044980b-2a0e-466c-9c2d-36898cd76342_766x542.png" width="766" height="542" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c044980b-2a0e-466c-9c2d-36898cd76342_766x542.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:542,&quot;width&quot;:766,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:90812,&quot;alt&quot;:&quot;cropped screenshot of the model picker in OpenChamber showing blocks for \&quot;BayLeaf and \&quot;BayLeaf Sealed\&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.bayleaf.dev/i/213827864?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc044980b-2a0e-466c-9c2d-36898cd76342_766x542.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="cropped screenshot of the model picker in OpenChamber showing blocks for &quot;BayLeaf and &quot;BayLeaf Sealed&quot;" title="cropped screenshot of the model picker in OpenChamber showing blocks for &quot;BayLeaf and &quot;BayLeaf Sealed&quot;" srcset="https://substackcdn.com/image/fetch/$s_!gZAJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc044980b-2a0e-466c-9c2d-36898cd76342_766x542.png 424w, https://substackcdn.com/image/fetch/$s_!gZAJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc044980b-2a0e-466c-9c2d-36898cd76342_766x542.png 848w, https://substackcdn.com/image/fetch/$s_!gZAJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc044980b-2a0e-466c-9c2d-36898cd76342_766x542.png 1272w, https://substackcdn.com/image/fetch/$s_!gZAJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc044980b-2a0e-466c-9c2d-36898cd76342_766x542.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Model picker in OpenChamber with a new &#8220;BayLeaf Sealed&#8221; category</figcaption></figure></div><p>This isn&#8217;t <a href="https://www.war.gov/News/Releases/Release/Article/4475177/classified-networks-ai-agreements/">IL7</a>, but it is better than you can get in any <em>Education</em> package from a major AI provider.</p>]]></content:encoded></item><item><title><![CDATA[Reduce, Reuse, Recycle]]></title><description><![CDATA[reflections on a recent boo-boo]]></description><link>https://blog.bayleaf.dev/p/reduce-reuse-recycle</link><guid isPermaLink="false">https://blog.bayleaf.dev/p/reduce-reuse-recycle</guid><dc:creator><![CDATA[Adam M. Smith]]></dc:creator><pubDate>Thu, 27 Aug 2026 20:08:49 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4QwT!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa606a527-a58e-47e3-9610-a228520a77d3_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the enterprise IT discourse, the evergreen &#8220;build-versus-buy&#8221; debate presumes you are going to be spending big either way. Do you spend a bunch to build exactly the system you need without paying for features you don&#8217;t care about? Or do you eat the markup buying more than you need with the confidence that the thing you buy is being professionally maintained by people who have learned from your competitors&#8217; mistakes? Do you lock in prices for ongoing staff salaries or lock in prices for vendor service agreements? For BayLeaf, we kinda don&#8217;t do either.</p><p>We don&#8217;t <em>spend big</em> on <a href="https://bayleaf.dev/">BayLeaf</a>. We don&#8217;t build much, and we don&#8217;t buy much either. We don&#8217;t train models, don&#8217;t build inference servers, don&#8217;t assemble physical hardware, don&#8217;t develop general-purpose chat interfaces, and don&#8217;t build coding-agent harnesses. Okay, we did make one coding-agent harness, <a href="https://lathe.tools/">Lathe</a>, but we spun that out into a BayLeaf-independent project immediately after it was useful enough to be worth sharing. We do, however, contribute patches upstream to Open WebUI, OpenCode, and OpenChamber. We do use LLM inference through OpenRouter and Tinfoil, web context from Tavily, and sandboxes from Daytona. We do have a custom service running for the BayLeaf API, but did we make the right build versus buy decision there? A recent, uh, incident got me thinking.</p><p>Earlier today I realized a problem with the BayLeaf API that might have been caught if there were more than one person looking over the implementation. Users of the BayLeaf API (at least the part of it that wraps OpenRouter) are subject to a daily spending limit. However, users could effectively bypass that limit by repeatedly revoking and re-provisioning their BayLeaf API key. Users need to be able to rotate their keys in response to personal leaks, so it&#8217;s a legitimate usage pattern. My earlier implementation of the BayLeaf API specifically accounted for this exact potential abuse pattern, but I didn&#8217;t closely track the implementation for regressions. Later work to add Sealed inference accidentally changed the key lifecycle: re-provisioning a BayLeaf key caused the next request to mint a fresh back-end key, resetting the provider-side spending limit. There&#8217;s a more precise <a href="https://github.com/bayleaf-ucsc/bayleaf/issues/66">writeup of the incident on GitHub</a>. What matters is that I made a mistake, it cost me some money (perhaps $300), and it got me thinking.</p><p>Of course the buggiest parts of BayLeaf are in the parts we built ourselves. But why did we need to build the BayLeaf API in the first place? Other campuses are deploying the free and open-source <em>API Gateway</em> <a href="https://www.litellm.ai/">LiteLLM</a>, even the NSF-funded <a href="https://nrp.ai/llm-status/">National Research Platform LLM Service</a>. Should I have just used LiteLLM? This could mean less building, more reuse, and more opportunities to have local frictions turn into upstream contributions with global impact. I may yet decide to adopt LiteLLM, but it would currently run counter to a strategy to <em>reduce</em> total system complexity and institutional cost or environmental impacts.</p><p>Any institutional adopter of a gateway product, whether self-hosted like LiteLLM or managed like <a href="https://portkey.ai/">PortKey</a>, is going to need to glue the LLM inference service to institutional identity and policy: people need a way to log in with their existing accounts. The trouble is that people need <em>more</em> than just LLM inference services to make widely productive use of generative AI technology. The BayLeaf API abstracts over the web fetch and web services provided by Tavily and the isolated code execution sandboxes provided by Daytona. We could have decided to build these versus buy them on a per-usage basis, but we&#8217;d still need them. The LiteLLM developers know this, and they have special-case support for <a href="https://docs.litellm.ai/docs/integrations/websearch_interception">web search integration</a> and <a href="https://docs.litellm.ai/docs/guides/code_interpreter">code interpreters</a>. However, these are slight generalizations of the instantiations of those ideas present in ChatGPT, not the weird and wild versions we have. So, let&#8217;s presume any campus-scale adopter is going to build just enough custom glue to solve at least authentication and moderate extensibility (rather than getting lost in LiteLLM&#8217;s plugin system). For BayLeaf, that ease of extensibility bought us quick integration of E2EE inference providers, smoothed desktop harness onboarding, a place to document how to use coding agents with Canvas, etc.</p><p>It&#8217;s hard to speculate whether this kind of incident would have been just as likely if I had been using LiteLLM (or PortKey) instead of OpenRouter for the normal LLM inference path. But maybe?</p><p>My cool-headed editing agent, who didn&#8217;t just find $300 on the floor, wants to put it this way: &#8220;The local seam cannot be purchased away. Therefore, reduce its scope, reuse everything on either side of it, and recycle its inevitable failures into shared institutional memory.&#8221; Fine. In this case, recycling means turning the incident into automated lifecycle assertions and this public reflection. Zooming out, what else can we reduce, reuse, or recycle through some different combination of building, buying, or simply b-not engaging? I&#8217;ll be on the lookout.</p><p>Ah, because this whole incident started with me looking for where the biggest flow of BayLeaf&#8217;s spending was going: Stop using Claude Sonnet 5, UCSC folks, or just everyone. According to the <a href="https://deepswe.datacurve.ai/">DeepSWE benchmark</a>, Sonnet 5 is <em>everywhere</em> dominated by other models, including open-weight models like yesterday&#8217;s (mid-sized and vision-capable) <a href="https://z.ai/blog/glm-5.3-flash">GLM-5.3-Flash</a>. You could use this model to generate fewer output tokens over fewer total agent steps to get your thing done while, under reasonable assumptions, using less energy and spending less (of my) money to do it. I like giving people room to explore and learn for themselves, but I&#8217;d also like to build (or maybe even buy?) better tooling to gather evidence about irresponsible model choices. Right now I have personal vibes, stale reviews, and scattered benchmarks that aren&#8217;t aligned with campus interests. Deciding that a model choice is <em>conclusively irresponsible</em> requires political and institutional analysis. Does anyone want to try to sell us tools for that?</p>]]></content:encoded></item><item><title><![CDATA[Offramps]]></title><description><![CDATA[and where they lead]]></description><link>https://blog.bayleaf.dev/p/offramps</link><guid isPermaLink="false">https://blog.bayleaf.dev/p/offramps</guid><dc:creator><![CDATA[Adam M. Smith]]></dc:creator><pubDate>Tue, 25 Aug 2026 23:42:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4QwT!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa606a527-a58e-47e3-9610-a228520a77d3_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In a recent <a href="https://youtu.be/r03DPWGIxfY?t=2670">Slate interview</a>, science fiction author and journalist Cory Doctorow offers an <em>optimistic</em> view of a post-AI world. Not post-AI in the sense that we stop using AI technologies, but post-AI in the sense that we are no longer paying today&#8217;s prices to use ChatGPT, Claude, or Gemini.</p><blockquote><p>You know, when AI crashes, we&#8217;ll have GPUs at ten cents on the dollar. We&#8217;ll have an army of skilled workers who know how to make those GPUs do really interesting and cool things. We&#8217;ll have these open-source models that have barely been touched and optimized. [...] I think we&#8217;ll have open-source models. I think they&#8217;ll do really interesting things. I think we&#8217;ll have a lot of cheap hardware, and I think we&#8217;ll have a lot of people who know how to use it.</p></blockquote><p>Doctorow calls this the <em>productive residue</em> of the bubble. I wanna know more about that productive residue. I want to jump ahead to the sustainable part. But, augh, I don&#8217;t want to erase the crash itself. The pensions, jobs, public services, and household savings exposed to the bubble belong mostly to people who did not create it. Doctorow suggests that if the crash is followed by austerity, as recent financial crises have been, its costs will be imposed downward while many of the people who inflated the bubble leave with their wealth intact.</p><p>So the question isn&#8217;t how to make the crash arrive faster. It is how to start building the post-bubble settlement before it arrives. It&#8217;s not X, it&#8217;s Y, of course.</p><p>One way to read the current stage of LLM development is as <a href="https://arxiv.org/abs/2608.17055">unnecessary production</a>. A few-days-old preprint applies the European Union&#8217;s waste hierarchy to language models: prevention, reuse, recycling, recovery, and disposal. A model can become waste when enormous resources go into training it, it is used briefly, and then it is displaced by another model trained from scratch. Fine-tuning, model merging, and other adaptations can extend a model&#8217;s useful life. And sometimes the least wasteful choice is not to use an LLM at all.</p><p>After the speculative demand for constant replacement dries up, models don&#8217;t need to vanish. We can keep using, adapting, combining, and eventually retiring them. That cultural and technical capacity to maintain the parts of this system that we need can live in public, in individuals and organizations that don&#8217;t think of themselves as representing an AI industry.</p><p>Interactive planning has a technique called <a href="https://en.wikipedia.org/wiki/Interactive_planning#Idealized_Design">Idealized Design</a>. You plan for what should come next by assuming that the current system failed last night. &#8220;Gentlemen, the telephone system of the United States was destroyed last night&#8221; is the opening premise in <a href="https://knowledge.wharton.upenn.edu/podcast/knowledge-at-wharton-podcast/idealized-design-how-bell-labs-imagined-and-created-the-telephone-system-of-the-future/">a fun story about Bell Labs redesigning the telephone system</a>. Continuing the design exercise, two constraints:</p><blockquote><p>First, technological feasibility. This means we cannot use any but currently available knowledge. No science fiction. We can&#8217;t replace the phone with mental telepathy. The second constraint, the system we design must be operationally viable. [...] The system must be able to function and survive in the current environment. For example, it will have to obey current laws and regulations.</p></blockquote><p>Let&#8217;s run with it. Gentlepersons, the centralized generative AI service system was destroyed last night. ChatGPT, Claude, Gemini, and their commercial API endpoints are gone. Neoclouds, wrapper apps, and a good slice of the hardware design and manufacturing industry was destroyed too, why not? The rest of the environment remains: snapshots of open-weight models, already manufactured hardware, public research, open-source software, and people who know how to work with all of it. This is cleaner than Doctorow&#8217;s crash, but it&#8217;s a design exercise for asking what we could build from the residue without quietly assuming that the existing service providers will return.</p><p>If you want LLM services, you might run them for yourself or your organization on what is now cheap hardware. Small-ish models are already pretty good. We could get several years of useful work from models whose knowledge stops in 2026, especially when skill documents and retrieval tools can supply current context and people can continue adapting the models at the level of parameters or architectural adapters. Or we might pool hardware through universities, libraries, cooperatives, or an actually-open successor to today&#8217;s inference marketplaces. Access would probably be slower and less uniform. It would also be less dependent on a few firms subsidizing usage while trying to capture a market.</p><p>You would still need a harness: a place to keep conversations and files, connect models to other systems, and decide what context they can act on. We already have a healthy range of free, open-source harnesses. Even if the commercial support behind like tools like Open WebUI, OpenCode, and OpenChamber is lost in the crash, their snapshotted sources can be inspected, forked, and maintained or even cloned and rebooted without the permission their current industry backers.</p><p>Now onto human knowledge and cultural practice. How do millions of people (is it more than a billion now? whatever) move from services that hides nearly every technical decision to systems they can understand and control? We should probably start to build the offramps now, document them, and give people routine opportunities to practice using them.</p><p>I recently added a <a href="https://agentskills.io/">skill</a> to the Basic agent on <a href="https://chat.bayleaf.dev/">BayLeaf Chat</a>, and I called it <code>offramp</code>. This one gives the agent a few key tips to help someone stop using BayLeaf Chat. It explicitly says that using BayLeaf Chat to get help leaving BayLeaf Chat is legitimate.</p><p>The skill is configured to trigger under two conditions. First, if the user is explicitly asking how to grow beyond BayLeaf Chat, sure, help them grow. Second, if the user is discussing a particularly sensitive subject for which they might benefit from enhanced privacy protections, they might need this advice too. Are you asking for financial advice, personal health advice, or career advice laced with talk of self-harm? I think LLMs can be useful in some of those scenarios, but not here. Not on the record, not in a database some professor can browse when they are curious. Let&#8217;s take this conversation onto your personal device so that you own the terms and scope of data retention.</p><p>The first level of offramp is to move the harness onto the user&#8217;s own device. The skill currently suggests <a href="https://openchamber.dev/">OpenChamber</a>, a desktop interface for the <a href="https://opencode.ai/">OpenCode</a> agent harness, connected to the <a href="https://api.bayleaf.dev/">BayLeaf API</a> for inference. Conversation history then stays on the device and is no longer available to the BayLeaf Chat administrator (that&#8217;s me). It&#8217;s a meaningful step, but it still leaves you partially dependent on BayLeaf&#8217;s inference service.</p><p>Offramps, the blog post title is plural for a reason. A user can take further offramps from BayLeaf inference to an individual zero-data-retention service, maybe ordinary pay-per-month subscription like <a href="https://opencode.ai/go?ref=XSJCGQMBEA">OpenCode Go</a> or high-security pay-per-token inference service like <a href="https://tinfoil.sh/">Tinfoil</a>. Or maybe they could dabble in disconnecting from cloud services altogether by model running on hardware they control. It&#8217;ll cost them some in time and/or money, but the end of the ramp leads to a productive life even in a world where BayLeaf is destroyed alongside ChatGPT in our idealized design exercise.</p><p>The <code>offramp</code> skill is part of BayLeaf&#8217;s counterfoil research strategy. In Illich&#8217;s sense, <em>counterfoil research</em> is inquiry conducted against the grain of institutional self-interest: research that questions the necessity of an institution&#8217;s expansion rather than continually finding reasons for it to grow. For BayLeaf, that means operating a useful campus service that helps us develop to a level where we don&#8217;t need BayLeaf any more.</p><p>In the moment when someone turning to a robot buddy is stressed, exposed, or frightened, that is when I want them to see the offramp. Withholding it at precisely that moment is a kind of invitation to dependence. I don&#8217;t want people to practice comfortable dependence on something shaped almost like ChatGPT. I want them to become comfortable carrying their own practices, context, and judgment from one system to another, including into whatever we can build from the residue.</p>]]></content:encoded></item><item><title><![CDATA[Tokens are Words, Not Money]]></title><description><![CDATA[even if they seem to cost money]]></description><link>https://blog.bayleaf.dev/p/tokens-are-words-not-money</link><guid isPermaLink="false">https://blog.bayleaf.dev/p/tokens-are-words-not-money</guid><dc:creator><![CDATA[Adam M. Smith]]></dc:creator><pubDate>Fri, 21 Aug 2026 20:42:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!5TyD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1af8576-56e1-4487-bac5-1e374d234c51_878x868.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It&#8217;s easy to hear people talking about &#8220;tokens&#8221; in a generative AI context and infer that they are like a weird new kind of money. After all, the kind of tokens used in cryptocurrencies were like a weird new kind of money, and those tokens were tangled up with GPUs, energy usage, data centers, economic exploitation, and so on, too. But I want you to think about generative AI tokens as words, a unit of measure for text, not a holder of value. This shift matters because people already know how to reason about reading, writing, and rereading. Treating tokens primarily as an accounting unit distracts from conversations we could be having about literacy, turning them into debates about the value of content subscriptions.</p><p>Some part of me needs to clarify up front that the tokens processed by LLMs aren&#8217;t literally words, just word-like. I think you should accept this, not just so we can get on with the blog post, but because even literal English words are only a bit like words in other languages anyway. A linguist might step in to distinguish <a href="https://en.wikipedia.org/wiki/Lexeme">lexemes</a> from <a href="https://en.wikipedia.org/wiki/Morpheme">morphemes</a> from <a href="https://en.wikipedia.org/wiki/Grapheme">graphemes</a>, but let&#8217;s just say that sometimes the natural chunks of text don&#8217;t align with apparent word boundaries. You can decompose &#8220;precaution&#8221; into &#8220;pre-&#8221; and &#8220;caution&#8221; or acknowledge that &#8220;put up&#8221; (as in &#8220;to put up with&#8221;) isn&#8217;t <em>just</em> putting something in an upward direction.</p><p>For now, let&#8217;s assume we have enough of a shared sense of words to talk about word counts. I can talk about how I read a twelve-thousand-word research paper or how I need to write a new paper&#8217;s abstract in no more than 250 words. Already, counts of words read versus written are distinct. Further, reading twelve thousand words of unfamiliar text is quite a different task from reading twelve thousand words of familiar text, and maybe the text is familiar because I just wrote it myself or at recently reviewed it for another purpose. These intuitive distinctions between kinds of word counts will come in handy in just a moment.</p><p>To get an LLM hosted on a commercial inference service to generate text for you, you need to pay. So what does a token cost? Let&#8217;s look up the pricing for a currently leading open-weight LLM, <a href="https://openrouter.ai/moonshotai/kimi-k3">Kimi K3, on the OpenRouter inference marketplace</a>. As I write this, there&#8217;s a headline price of $13 per million tokens. So, that&#8217;s it, right? Wait, this page is covered with slightly different prices, all measured in the same dollars-per-million-token units, and the numbers are changing over time. Some of these prices seem to distinguish &#8220;input&#8221; tokens from &#8220;output&#8221; tokens and even from &#8220;cached read&#8221; input tokens. Let&#8217;s map it out using the idea of tokens as words.</p><p>$13/M is the <em>current</em> output-token price for the cheapest provider of K3. This is like saying there are many writers for hire, all writing in the same style, but maybe they write at different speeds and are more or less busy with work from other clients. The tables show that different K3 providers have different recent throughput rates (some have recently been generating about 10 tokens per second, whereas others have been running around 70 tokens per second). At the same time, the tables show different uptime percentages. This tells us how often the different providers are turning customers away because they are unavailable or overloaded. These writers-for-hire are moody! It&#8217;s not always the case that the more expensive providers are the fastest or most reliable ones, so it is justifiable that OpenRouter takes a cut to <a href="https://openrouter.ai/docs/features/provider-routing">route requests among providers</a> according to preferences for price, throughput, latency, and availability.</p><p>Okay, we&#8217;ve figured out how to map the idea of written words onto output tokens, and we&#8217;ve accepted that prices can vary because there are many different writing teams out there. But what about reading? We haven&#8217;t even explained half the prices on that page.</p><p>The next headline number on the OpenRouter K3 page is the &#8220;in&#8221; or &#8220;input token&#8221; cost, currently $2.60/M. This tells us something about the cost for models to process input text before deciding how they are going to generate the outputs. But what even are the inputs when you are using a chatbot or coding agent?</p><p>Imagine you are ten turns deep into a conversation with a chatbot. You&#8217;ve just sent your latest question, and you want the harnessed model (an agent) to reply. To generate the reply, your harness sends your ten previous user messages, the ten previous agent replies, and your most recent user message. This is the text the model needs to read before writing a reply. Even though reading is generally easier than writing (and this is reflected in the prices we saw, $2.60/M in versus $13/M out), keeping a conversation going requires a lot of reading. In particular, it requires a lot of rereading text that should be familiar, assuming our request is routed to the same provider endpoint that handled the earlier responses. Familiar reading has a different market price from unfamiliar reading, and for K3 that&#8217;s currently about $0.30/M (varying by provider, of course).</p><p>In transformer-architecture LLMs, this notion of familiarity with text has a technical interpretation. In most LLMs, the in-context meaning of each word (sorry, token) is influenced by all of the words that came before it in the text. Consider &#8220;the cat sat on the mat.&#8221; Specifically, consider being partway through reading it: &#8220;the cat sat on the _.&#8221; The second &#8220;the&#8221; isn&#8217;t just an isolated definite article; it&#8217;s the definite article of the as-yet-unspecified place where the cat is sitting. This contextualized, thickened representation is part of why the model is more likely to say &#8220;the cat sat on the mat&#8221; than &#8220;the cat sat on the cat,&#8221; even if &#8220;the cat&#8221; was more common than &#8220;the mat&#8221; in the model&#8217;s training data. It requires compute to build up these thickened representations, so we&#8217;d like to save them to avoid recomputing them for each new request that shares an identical input text prefix. At the same time, these thickened representations take extra storage space to keep around, so providers won&#8217;t keep them around forever. Providers give you a discount on reading text that is familiar in the technical sense that its previously computed representation remains available through <a href="https://developers.openai.com/api/docs/guides/prompt-caching">prompt caching</a>.</p><p>At this point, we have three different dollars-per-million-token prices for a specific model from a specific provider at a specific point in time in a competitive marketplace. We can trace these to the distinct efforts needed to write versus read, or to read familiar versus unfamiliar text, all measured in word counts. But we&#8217;re not done interpreting that OpenRouter page! If you click the &#8220;Pricing&#8221; tab, you get yet another price: &#8220;Weighted Avg Input Price,&#8221; currently $0.79/M (somewhere between the cached and uncached input prices). What&#8217;s this?</p><p>People use different models for different purposes, so the typical ratio of cached to uncached inputs (of requests containing familiar text to those containing unfamiliar text) can vary. Further, providers with different amounts of cache storage or different cache-eviction (forgetting? defamiliarizing?) strategies can influence this balance. &#8220;Weighted Avg Input Price&#8221; is trying to abstract over a bunch of details to give you one simple input price. The &#8220;Weighted Avg Output Price&#8221; (currently $14.84/M for K3) is trying to do the same on the output side. Even though a lot of interesting technical and economic detail is getting erased here, these prices are starting to become useful.</p><p>Suppose I want to ask my assistant to generate a 250-word summary of a 12,000-word research paper. I&#8217;ve got input and output word counts. We can apply the rough rule of thumb that <a href="https://help.openai.com/en/articles/4936856-what-are-tokens-and-how-to-count-them">an English word maps to about 1.3 LLM tokens</a>. From there, we can plug in these weighted average input and output prices to find that our summarization request might cost, uh, about 1.7 cents. (The true cost is likely to be higher because this paper is likely unfamiliar and uncached, and newer models will likely write additional internal reasoning text to themselves before writing the final summary. Nevertheless, it&#8217;ll be cheap.)</p><p>When a new model comes out or an existing provider adds support for an old model, we sometimes want to summarize the usage cost of the model with a single number, without reference to a specific task. <a href="https://artificialanalysis.ai/methodology">Artificial Analysis calculates its blended prices</a> using a &#8220;7:2:1&#8221; ratio: assume that requests involve 70% cached inputs, 20% uncached inputs, and 10% outputs, by token. If we&#8217;re considering blended cost ratios, the units of text cancel out: it doesn&#8217;t matter that tokens aren&#8217;t exactly words so long as they are typically proportional. Because the blended cost of inputs is cheaper than outputs by about the same ratio that inputs are more common than outputs, we sometimes just read the raw dollars-per-million output token market price as the single summary figure for the model as a whole.</p><p>Even though tokens aren&#8217;t money, there is a justifiable chain of abstractions and approximations that lets us say &#8220;GLM-5.2 costs $3.60/M&#8221; (this is the model powering the Basic agent on <a href="https://chat.bayleaf.dev/">BayLeaf Chat</a>) and &#8220;Opus-5 costs $25/M&#8221; (this is the model I often use for maintenance of BayLeaf&#8217;s infrastructure). When a new model comes out that scores perhaps &#8220;82% as smart as Opus-5&#8221; by the ratio of their <a href="https://artificialanalysis.ai/leaderboards/models">Artificial Analysis Intelligence Index</a> scores, at a blended cost of $0.18/M, hmm, maybe we should switch to that one. (DeepSeek V4 Flash 0731 is the one I&#8217;m thinking about today, and it is already marked as the recommended model on the <a href="https://api.bayleaf.dev/">BayLeaf API</a>.)</p><p>Even if there&#8217;s an analytically useful way to treat LLM tokens as if they were money (or simply cost money), this immediately erases the rich distinction between reading and writing and the importance of familiarity when reading. If you want to control the US-dollar cost of your LLM usage, simply asking your assistant to be concise in replies isn&#8217;t going to matter much. Getting your assistant to read less, or to read in ways that put much more of the text into the familiar category, matters much more.</p><p>Perhaps I should write another post specifically about these responsible cost-control techniques. The key concept you&#8217;d need to learn is how to identify the <a href="https://developers.openai.com/api/docs/guides/prompt-caching">longest identical prefix shared from one request to the next</a>. But before getting into techniques, we should ask why users need to recover these distinctions from provider accounting categories in the first place.</p><p>Most people using LLMs access them via pay-per-month subscription services that offer them a quantitatively unspecified amount of service. Some are a bit more transparent, promising that your subscription covers a certain number of requests within rate-limiting windows of a certain duration. If you are only thinking in terms of atomic requests (each of which involves some specific amount of familiar and unfamiliar reading before some hidden reasoning and visible writing), nothing is nudging you to learn even about token counts, let alone the distinctions between cached and uncached inputs.</p><p>Until the last month, I had gone about two years without monthly subscriptions to LLM inference services. I probably paid a lot more as a result. Flat-rate individual subscriptions can provide <a href="https://www.theregister.com/software/2026/04/16/anthropic-ejects-bundled-tokens-from-enterprise-seat-deal/5226555">far more inference than the same payment would buy at API rates</a>, while enterprise services increasingly expose metered consumption. Whatever the providers&#8217; motives for that subsidy, I think paying per token taught me things I couldn&#8217;t have learned as easily as a subscription customer.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5TyD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1af8576-56e1-4487-bac5-1e374d234c51_878x868.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5TyD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1af8576-56e1-4487-bac5-1e374d234c51_878x868.png 424w, https://substackcdn.com/image/fetch/$s_!5TyD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1af8576-56e1-4487-bac5-1e374d234c51_878x868.png 848w, https://substackcdn.com/image/fetch/$s_!5TyD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1af8576-56e1-4487-bac5-1e374d234c51_878x868.png 1272w, https://substackcdn.com/image/fetch/$s_!5TyD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1af8576-56e1-4487-bac5-1e374d234c51_878x868.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5TyD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1af8576-56e1-4487-bac5-1e374d234c51_878x868.png" width="878" height="868" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a1af8576-56e1-4487-bac5-1e374d234c51_878x868.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:868,&quot;width&quot;:878,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:190484,&quot;alt&quot;:&quot;A BayLeaf Chat usage card reports 5,049 prompt tokens, including 5,024 cached tokens, and 276 completion tokens, for a total of 5,325 tokens and an inference cost of about $0.0029.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.bayleaf.dev/i/212198924?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1af8576-56e1-4487-bac5-1e374d234c51_878x868.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A BayLeaf Chat usage card reports 5,049 prompt tokens, including 5,024 cached tokens, and 276 completion tokens, for a total of 5,325 tokens and an inference cost of about $0.0029." title="A BayLeaf Chat usage card reports 5,049 prompt tokens, including 5,024 cached tokens, and 276 completion tokens, for a total of 5,325 tokens and an inference cost of about $0.0029." srcset="https://substackcdn.com/image/fetch/$s_!5TyD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1af8576-56e1-4487-bac5-1e374d234c51_878x868.png 424w, https://substackcdn.com/image/fetch/$s_!5TyD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1af8576-56e1-4487-bac5-1e374d234c51_878x868.png 848w, https://substackcdn.com/image/fetch/$s_!5TyD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1af8576-56e1-4487-bac5-1e374d234c51_878x868.png 1272w, https://substackcdn.com/image/fetch/$s_!5TyD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1af8576-56e1-4487-bac5-1e374d234c51_878x868.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A BayLeaf Chat usage card exposes the cached input, total input, output, and cost figures behind one agent reply.</figcaption></figure></div><p>On BayLeaf Chat, under each agent reply, there&#8217;s a little info button you can click to get some usage and cost data about that reply. The display is a little too technical, but what&#8217;s important is that it has these unpacked token counts. The <code>cached_tokens</code> figure is less than the <code>prompt_tokens</code> figure, but only by a bit (because most of the text in the conversation is recycled from one reply to the next), and the <code>total_tokens</code> figure is only a little higher than that (because the replies are typically small compared with the inputs that prompted them).</p><p>One of the things you can learn from examining these usage cards is that the actual size (token or word count) of a conversation is often not easy to predict from the words you see on the screen. When you ask the agent something that causes it to look things up on the web or interact with other external systems, the agent needs to write some additional words to do those searches and read a whole lot more additional words to make sense of the search results before it writes back to you. This isn&#8217;t an argument for us to turn off web search to optimize costs. This is an argument for people to demand visibility into token counts so they can understand what&#8217;s actually driving the system&#8217;s individual and socialized costs.</p><p>The everyday interfaces of ChatGPT, Claude, and Gemini generally hide token counts from users as if they were a distracting technical detail mostly only relevant to system integrators. But if you can allow the slight fudge that tokens are words, every user already has some intuition for interpreting word counts and making responsible choices on that basis. The &#8220;token&#8221; terminology makes you think about accounting, whereas &#8220;word&#8221; sets you up to think about reading versus writing, how meaning thickens in context, how familiarity degrades when things fall out of working memory, etc. It&#8217;s easy to look at a chatbot&#8217;s apparently lengthy reply and wonder if the output was worth the cost. I want you to think about all of the words that got read before writing that reply, think about which human wrote them, and how we can plug in more relevant context sources while encoding them compactly.</p><p>Tokens are words, not money. Hopefully I&#8217;ve thickened your representation for &#8220;tokens&#8221; in a generative AI context so that you&#8217;re ready to make choices differently in the future.</p>]]></content:encoded></item><item><title><![CDATA[What are people doing with BayLeaf Chat?]]></title><description><![CDATA[A distant reading approach]]></description><link>https://blog.bayleaf.dev/p/what-are-people-doing-with-bayleaf</link><guid isPermaLink="false">https://blog.bayleaf.dev/p/what-are-people-doing-with-bayleaf</guid><dc:creator><![CDATA[Adam M. Smith]]></dc:creator><pubDate>Thu, 20 Aug 2026 04:28:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4QwT!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa606a527-a58e-47e3-9610-a228520a77d3_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;ve read <em>a lot</em> of LLM chats, not of BayLeaf users, but of users of a precursor system that I ran in 2024. There&#8217;s a lot you can learn about how they think by seeing how they write to these machine ghosts. Since BayLeaf started operating, however, I&#8217;ve barely read any. This post explores a way to let me get a sense of what people are doing with the BayLeaf Chat service without, for their safety and my own, me directly eyeballing raw conversation data.</p><p>Chat is the only part of BayLeaf that records the content of your messages, and even those are deleted automatically after a while. Of your conversations, my <a href="https://bayleaf.dev/privacy.html">privacy statement</a> says &#8220;They are accessible only to you and the system administrator.&#8221; That&#8217;s me, the system administrator. If I&#8217;m going to keep operating BayLeaf, I want some assurance that my system isn&#8217;t responding in ways that are too cringe. I want to know what my system is talking about, at the level of broad categories, and, for sensitive categories, I want to use my privileged access to spot check a few items. Eventually, I&#8217;ll make this last level of access impossible, even for myself.</p><p>A few years ago, the folks over at Anthropic shared the design of <a href="https://www.anthropic.com/research/clio">Clio</a>: &#8220;a system for privacy-preserving insights into real-world AI use.&#8221; The core idea is to do the first few levels of analysis of raw customer data automatically, only letting human analysts get involved after a few layers of summarization and aggregation. In literary studies, we might call this a <a href="https://en.wikipedia.org/wiki/Distant_reading">distant reading</a> technique (in contrast to close readings where the multiple meanings of specific words and phrases might be scrutinized). Clio works through four phases: extracting facets (extracting rough summaries and metadata), semantic clustering (grouping related conversation by theme or general topic), cluster description (giving clusters a descriptive title and summary without bubbling up sensitive data), and building hierarchies (assembling clusters of clusters until a digestible bigger picture emerges). I ran something similar.</p><p>The first phase of my pipeline was conversation data extraction. This was a little tricky because conversations on BayLeaf Chat are structured as trees rather than linear lists of messages and that the storage format has changed over the last few months. The only interesting move I made in the extraction phase was to mask out my own usage data. I already know what I do with BayLeaf, so my analysis was focused on others.</p><p>Next came the compaction phase. Even though users don&#8217;t spend a lot of time typing messages into BayLeaf Chat, conversations can get pretty large when they upload or paste large documents, elicit long replies from the agent, or when the agent does several rounds of interaction with third party services (e.g. web search) before formulating the user-facing response. My strategy was to mid-truncate user messages and agent replies (keeping the first and last chunks of a message and throwing away anything left in the middle) and to discard any reasoning blocks or tool call results. This discarded about 89% of the total text volume keeping what I assumed to be the interesting parts.</p><p>For facet extraction, I ran each of the compacted conversation streams through a mid-sized language model (<a href="https://openrouter.ai/deepseek/deepseek-v4-flash-0731">DeepSeek V4 Flash 0731</a>, the currently recommended model on the BayLeaf API). I asked the model to produce a topic (2&#8211;6 word phrase), user message language (e.g. &#8220;en&#8221; or &#8220;zh&#8221;), and summary (1&#8211;2 sentence de-identified gist of the user&#8217;s intent). This analysis was pretty cheap. I spent about $0.08 in total for facet extraction (compared to a total of about $3.15 on a coding agent based on the same model to execute the rest of this project and help edit the blog post).</p><p>Once I had the facets extracted for each conversation, I needed a way to group related conversations together. It&#8217;s not completely unreasonable to simply ask another LLM to name the common patterns, but I opted for something more mechanical and scalable: classical unsupervised machine learning. I used OpenAI&#8217;s text-embedding-3-small model to get a vector for each conversation&#8217;s extracted topic, then I threw those through <a href="https://hdbscan.readthedocs.io/en/latest/">HDBSCAN</a>. HDBSCAN works by estimating how densely clustered each conversation is in the vector space, growing clusters out of regions of stable density and keeping the ones that persist across density thresholds. Conversations too spread out to belong to any stable region are left over, and I treated that leftover as its own long-tail bucket rather than forcing it into a cluster. I think that, in Anthropic&#8217;s approach, human analysts got involved in some of these groupings, but it was fully automatic in my design. I don&#8217;t think my design is better, just a faster path to a first look at the big picture.</p><p>Once I had the conversations clustered, I wanted to be able to describe the result. Taking the top twelve or so clusters by size, I again asked a mid-sized language model to come up with a de-personalized summary. This time, the describer model only got access to the per-conversation summaries (not the super-short topic or the longer, compacted message history). For each cluster, the describer gave me a 2&#8211;5 word title naming the theme of the cluster and 1&#8211;2 sentence summary of what the items in the cluster had in common.</p><p>So, what did I find? Here are the model-generated titles and summaries, in order of decreasing cluster size. (Does Substack not support tables?? Okay, the format here is going to be &#8220;Title: Summary&#8221;.)</p><ul><li><p><strong>Rust GUI development &amp; tutorial building:</strong> One sustained project: egui/eframe/GPUI node editors, mdBook tutorial sites, prompt-crafting for AI coding</p></li><li><p><strong>Model identity &amp; privacy inquiries:</strong> &#8221;What model are you?&#8221;, &#8220;who&#8217;s the provider?&#8221;, &#8220;what&#8217;s your data retention?&#8221;</p></li><li><p><strong>Football simulation development:</strong> Python NFL-sim: scheduling, drafts, GM logic, play-by-play</p></li><li><p><strong>Academic recommendation letters:</strong> Rec letters, grade appeals, GSI support letters, program-status decisions</p></li><li><p><strong>AI in learning &amp; game-assistance research:</strong> Literature searches on AI tutoring, self-directed learning, player-assistance</p></li><li><p><strong>Reflective academic writing:</strong> Essays, self-evaluations, fellowship statements (ethnic studies, education)</p></li><li><p><strong>Hilly-commute vehicles:</strong> E-bikes/scooters for steep campus terrain</p></li><li><p><strong>Marine biology coursework:</strong> Right whales, energetics, lecture review</p></li><li><p><strong>Linux setup &amp; troubleshooting:</strong> Drivers, displays, VPN</p></li><li><p><strong>Campus mascot humor:</strong> UCSC jokes (banana slugs, hills)</p></li><li><p><strong>Agentic coding model selection:</strong> OpenChamber vs Cline, BayLeaf/OpenRouter config</p></li><li><p><strong>Faculty burnout &amp; boundaries:</strong> Educators in distress seeking crisis support, boundaries, exit strategies</p></li><li><p><strong>Physics homework:</strong> E&amp;M, circuits</p></li><li><p><strong>&#8230;plus ~12 smaller clusters:</strong> Phaser, LaTeX, Canvas LMS, salamanders, SSH, AI-detection, etc.</p></li><li><p><strong>Long tail:</strong> One-off personal queries: recipes, dating, health, flights, taxes, jokes</p></li></ul><p>As someone with a very personal interest in the topic of &#8220;Faculty burnout &amp; boundaries&#8221;, I did drill down to the raw data for a few of these. I can report that the agent is responding well enough, the facet extraction and cluster summaries are accurate enough, and, ugh, it&#8217;s a good thing that I&#8217;ve found a way to maintain a lot of distance from the raw data over the recent two years. I&#8217;m glad my system could provide someone support, but I&#8217;m also glad I didn&#8217;t get sucked into trying to provide that support directly myself.</p><p>Even though this analysis is basically <a href="https://github.com/bayleaf-ucsc/bayleaf/tree/main/analysis/clio-gist">fully automated</a>, I&#8217;m not sure that I want to rig it up to run regularly. I&#8217;m writing this blog post as a starting point for in-person conversations about how much a community should be allowed to know about what others in that community are doing in chats that feel private. It is one thing for Anthropic to use Clio on a tiny fraction of data from their international user base. It&#8217;s another to run it for just my single-campus community.</p>]]></content:encoded></item><item><title><![CDATA[National Security Letters]]></title><description><![CDATA[What happens if I get one?]]></description><link>https://blog.bayleaf.dev/p/national-security-letters</link><guid isPermaLink="false">https://blog.bayleaf.dev/p/national-security-letters</guid><dc:creator><![CDATA[Adam M. Smith]]></dc:creator><pubDate>Wed, 19 Aug 2026 19:27:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-Zom!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa03c985a-4efe-41d9-82ff-f677600a2432_1440x1080.avif" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;m listening to this <em>Darknet Diaries</em> podcast <a href="https://darknetdiaries.com/transcript/176/">episode about National Security Letters</a>, and it got me thinking about what it might be like to get an <a href="https://en.wikipedia.org/wiki/National_security_letter">NSL</a> as the BayLeaf operator. What if someone comes knocking on my door with a secret demand for my colleague&#8217;s data from BayLeaf Chat? What could it be asking for? What do I need to give up? What could my colleague actually learn about what&#8217;s happening to them? Would the answers to these questions make me want to change the design of BayLeaf in anticipation of the next letter?</p><p>I haven&#8217;t received any NSLs (<a href="https://en.wikipedia.org/wiki/Warrant_canary">yet</a>), so please don&#8217;t interpret this post as a telegraphed announcement of disclosure. I&#8217;m just thinking things through.</p><p>For narrative purposes, let&#8217;s say that you, dear reader, are one of my faculty colleagues. Even more, you are actively using BayLeaf Chat to plan and execute terrorist operations. You are the bad guy, and you need to be stopped. Or maybe you are a just doing Middle East politics research, an international student, or someone organizing a union drive, etc. And I, Adam (the BayLeaf operator), get this letter, and the letter is about <em>you</em>. The FBI or whoever needs me to share what I know about you, and they don&#8217;t let me tell the public or even you about how I&#8217;m doing it. I can talk to my own layer about it, but that&#8217;s about it.</p><p>The letter can&#8217;t ask for everything about you. Per usual interpretations of <a href="https://www.law.cornell.edu/uscode/text/18/2709">18 U.S. Code &#167; 2709 - Counterintelligence access to telephone toll and transactional records</a>, the letter can only ask me for transactional <em>metadata</em>, not the <em>content</em> of your messages. So, I might be compelled to reveal that someone with your campus email address sent a message or got an agent&#8217;s response at a specific date and time, and maybe I&#8217;d also reveal the conversation identifier that links several messages into a specific flow. An NSL isn&#8217;t going to require me to share the payload of these messages. That&#8217;d take a search warrant, but we&#8217;re talking about NSLs today. You can learn a bit more about &#8220;electronic communication transactional records&#8221; (ECTRs) in <a href="https://cdt.org/wp-content/uploads/2016/09/ECTR-FAQ.pdf">this DOJ FAQ</a> (hosted by CDT).</p><p>I think ECTRs are about where, when, and with whom an individual is communicating. Is a chat with an agent even two-party communication? Is the name of the model-generated title of your conversation data or metadata? Are tool calls and responses protected? How about the length of the messages (token counts)? I don&#8217;t know. My understanding is that the boundaries between data and metadata are murky even for traditional communication between two human parties. In this world where you are plotting your attack in a computer-mediated conversation, apparently, with yourself, there&#8217;s even less precedent I can find.</p><p>Let&#8217;s assume the letter is just asking for message timestamps (analogous to phone call initiation records). How much of those could BayLeaf Chat leak? Per our current data retention policy (and automated cleanup machinery), data and metadata for your old chats are faithfully wiped 90 days after you last interact with them (on a per-conversation basis). [&#10024; Editing agent&#8217;s note: Two honest caveats I found while auditing this: attachments are not deleted along with their conversation, they become orphans and get swept on a later run, so a file outlives its chat by up to about 48 hours; and deleted rows persist in the managed database&#8217;s backups until those age out on the hosting provider&#8217;s schedule.] Well, if your account is in a special records hold group, your records are not cleaned up automatically. However, the Help agent on BayLeaf Chat can transparently tell you if you are in one of those groups. Currently, I&#8217;m the only user in such a group because that&#8217;s part of how I test the retention exception mechanism.</p><p>In my own audit of the data retention machinery for this post, I realized that a user&#8217;s custom instructions (system prompts) and explicitly written memories are currently retained forever. Given that these are where you might have the system remember a clue like &#8220;Attack in September&#8221;, I need to think about how these are retained. Previously, I had been considering them like innocuous profile data (like your display name), but they plausibly contain the precursors to sensitive messages that you&#8217;d like to not have haunting you years after writing them. Ah, and if I&#8217;m considering them to be subscriber metadata (akin to a billing address in a traditional phone system) rather than message content, are they available to snarf via NSLs? Dunno.</p><p>I was relieved to learn that &#8220;&#167; 2709 does not require communication service providers to create records which they do not maintain in the ordinary course of business&#8221; (<a href="https://www.justice.gov/olc/opinion/requests-information-under-electronic-communications-privacy-act">OLC, 32 Op. O.L.C. 145 (2008)</a>). This means I can&#8217;t, at least via NSLs, be compelled to start recording additional information. The same opinion is blunt about the other side of the deal: if you <em>do</em> keep a record, even scattered across aggregate data, you have to go extract it and hand it over. If BayLeaf were operated by a big company with tons of internal logs and metrics already being recorded, there might be a rich picture of you being painted by previously-recorded metadata. Here at <a href="https://en.wikipedia.org/wiki/Bus_factor">bus-factor-one</a> BayLeaf, however, there is much less metadata about you than a commercial provider would hold, and I don&#8217;t plan on logging more any time soon. That said, I shouldn&#8217;t pretend the pile is empty: your account record and group memberships (which can indirectly encode course enrollment) are currently kept indefinitely, the API database keeps a per-backend record of the last date you used each one, revoked API key rows are never purged so an email address is permanent once I&#8217;ve seen it, and a handful of log lines in the API carry your email address for a few days.</p><p>Speaking of logging, it is important that BayLeaf Chat isn&#8217;t the only service available from BayLeaf. Using the BayLeaf API, you can setup chat and coding agent apps on your own personal devices. When you use those, your personal device has the only copy of the message content. So, even if I were served with a search warrant (secret or otherwise), I would have nothing stored to hand over. If you are concerned about privacy of your chats, please stop using hosted chat services altogether, even BayLeaf&#8217;s. This is the same move of giving up using Google Docs for sensitive document editing. Keep those documents on your personal devices, please, for your own sake.</p><p>Back on NSLs, it doesn&#8217;t seem that realistic that I, the BayLeaf operator, would actually be the recipient of the NSL. To the degree that BayLeaf is associated with UC Santa Cruz (which is, to say, partial), NSLs are likely going to be delivered directly to UC administration or to one of my subprocessors (like DigitalOcean or Cloudflare) better equipped to respond in a timely manner. [&#10024; Editing agent&#8217;s note: In fact I am not authorized to accept service on behalf of the Regents at all: UC&#8217;s own guidance tells employees to redirect anyone attempting service to the Office of the General Counsel in Oakland.] When your messages come through BayLeaf services, your email address generally travels along with them. So, if someone wants your metadata and has the legal authorization to get it, they can get it without going through me. (Even more reason to practice ways of using Generative AI without a centralized service in the first place!)</p><p>If BayLeaf&#8217;s records about you were cleanly interpretable as my own records in my role as faculty, they might be additionally protected under the UC Electronic Communications Policy. However, to the degree that I&#8217;m operating BayLeaf as a <a href="https://en.wikipedia.org/wiki/Shadow_IT">shadow IT</a> system, I&#8217;m unclear on how others in power might interpret the policy. It sure would be simpler if the university actually owned this whole thing.</p><p>So, if you really are doing something nefarious (or something benign that someone else decides is nefarious), how are you supposed to keep it under wraps? Using your own chat or coding agent harness on your own device will keep your data out of BayLeaf&#8217;s databases, but a compromised back-end service provider could leak your data. In the last few weeks, I&#8217;ve added a <em>Sealed Inference</em> service facet of the BayLeaf API based on <a href="https://tinfoil.sh/mission">Tinfoil</a>. If you get your local agent to use the Sealed service, the <em>content</em> of your requests is protected from both myself and the back-end providers on a level that you simply can&#8217;t get from OpenAI/Anthropic/Google, at least in their Education packages. What Sealed does not hide is the metadata this whole post is about: the fact that you made a request, when you made it, how big it was, roughly how many tokens it used, and even which model you picked. Should this inference mode be the default on BayLeaf? Maybe. The threat model behind that choice goes beyond NSLs, but <a href="https://www.washingtonpost.com/world/national-security/nsa-infiltrates-links-to-yahoo-google-data-centers-worldwide-snowden-documents-say/2013/10/30/e51d661e-4166-11e3-8b74-d89d714ca4dd_story.html">the associated paranoia isn&#8217;t entirely unjustified</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-Zom!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa03c985a-4efe-41d9-82ff-f677600a2432_1440x1080.avif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-Zom!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa03c985a-4efe-41d9-82ff-f677600a2432_1440x1080.avif 424w, https://substackcdn.com/image/fetch/$s_!-Zom!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa03c985a-4efe-41d9-82ff-f677600a2432_1440x1080.avif 848w, https://substackcdn.com/image/fetch/$s_!-Zom!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa03c985a-4efe-41d9-82ff-f677600a2432_1440x1080.avif 1272w, https://substackcdn.com/image/fetch/$s_!-Zom!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa03c985a-4efe-41d9-82ff-f677600a2432_1440x1080.avif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-Zom!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa03c985a-4efe-41d9-82ff-f677600a2432_1440x1080.avif" width="1440" height="1080" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a03c985a-4efe-41d9-82ff-f677600a2432_1440x1080.avif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1080,&quot;width&quot;:1440,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:72776,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/avif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.bayleaf.dev/i/211903698?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa03c985a-4efe-41d9-82ff-f677600a2432_1440x1080.avif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-Zom!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa03c985a-4efe-41d9-82ff-f677600a2432_1440x1080.avif 424w, https://substackcdn.com/image/fetch/$s_!-Zom!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa03c985a-4efe-41d9-82ff-f677600a2432_1440x1080.avif 848w, https://substackcdn.com/image/fetch/$s_!-Zom!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa03c985a-4efe-41d9-82ff-f677600a2432_1440x1080.avif 1272w, https://substackcdn.com/image/fetch/$s_!-Zom!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa03c985a-4efe-41d9-82ff-f677600a2432_1440x1080.avif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">SSL Added and removed here!</figcaption></figure></div><p>When I saw this slide over a decade ago, I thought to myself &#8220;If I&#8217;m ever operating a service like this, I&#8217;m not going to design it to have that one convenient point for the full take.&#8221; But here I am, running BayLeaf Chat in a shape where there is such a bottleneck. At least I&#8217;m running an <a href="https://github.com/open-webui/open-webui">open-source chat harness</a> with <a href="https://github.com/bayleaf-ucsc/bayleaf">transparent operations</a>. I tell myself that the Chat service&#8217;s design is justified because it offers people an incremental offramp from Google-shaped services. Time will tell how many decide to follow that offramp.</p>]]></content:encoded></item><item><title><![CDATA[Nights and Weekends]]></title><description><![CDATA[Just turn off the servers when nobody is using them.]]></description><link>https://blog.bayleaf.dev/p/nights-and-weekends</link><guid isPermaLink="false">https://blog.bayleaf.dev/p/nights-and-weekends</guid><dc:creator><![CDATA[Adam M. Smith]]></dc:creator><pubDate>Mon, 17 Aug 2026 21:34:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!K6UK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03dfd1e8-765b-418e-88c5-94d3426b0b3a_1943x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>With all of BayLeaf&#8217;s users concentrated in one specific geographical area, following the rhythms and schedules of campus life, could we save some money by perhaps turning off the servers at night and on weekends? Our costs are currently very low and can&#8217;t be reduced without fully cutting off access, but the investigation might reveal something about what it is like to run a campus Generative AI service.</p><p>I&#8217;ve a few sources of historical data to work with. Each gives a partial view, but there&#8217;s pretty strong consensus in what they say.</p><p>First, I can look at the last 90 days of message traffic metadata on BayLeaf Chat. I can&#8217;t look further back than 90 days because, per our data retention policy, that&#8217;s literally all we store. So, this&#8217;ll tell us about the tail end of spring quarter and some quieter and less structured usage in the summer quarter.</p><p>Next, I have six months of logs from the OpenCode coding agent harness on my laptop and more than two years of activity on a friends-and-family instance of Open WebUI. Together, these represent something close to what we might expect for the BayLeaf API and BayLeaf Chat services over a longer period of time, but biased toward my personal usage patterns.</p><p>Before I launch into what I found, think about what you might expect the data to show. If UC Santa Cruz were a stereotypical business organization, you might expect steady weekday usage during business hours, and maybe even a clear lunchtime notch. Maybe Monday mornings would show users accessing the system to get oriented for the week, and Friday afternoons would show a gentle ramp down as people left early. Now, consider that we&#8217;re at a university, with folks staying up late to prepare for exams, balancing social lives, perhaps specifically *not* accessing the services while they are in scheduled lectures. What&#8217;s that usage going to look like?</p><p>According to the data, weekends aren&#8217;t a big thing. Whatever effects you might think would push weekday and weekend patterns apart seem to mostly cancel out. Usage on Saturdays and Sundays falls between the highest and lowest weekday usage in all three datasets. The location and ratio of peaks and troughs vary a bit by dataset and by whether you aggregate by session count, message count within a session, token count within a message, and so on. My personal data shows I&#8217;m almost twice as active on Thursdays as I am on Fridays, but the campus data suggests this is just a personal quirk. Someone else with a different schedule might have a consistently different profile.</p><p>Time of day is where things get a bit more interesting. Across all three datasets, there&#8217;s a clear on-off pattern, with activity starting around 8am and turning off around midnight. In the off period, we&#8217;re not fully off. Activity is minimal but nonzero (even in my personal datasets) at 4am. Meanwhile, 4pm is a daytime peak. My personal data shows distinct notches at 5pm, for commuting home, and 7pm, for cooking and eating dinner. However, these notches only appear when you look at user message counts. For requests at the API level (which include agents following up on tool call results, etc.), they go away. I often leave my agents cooking up some code while I&#8217;m cooking my family dinner.</p><p>Overall, there&#8217;s a wake-sleep pattern that comes from most of the UC Santa Cruz campus community being in the same place at the same time. We&#8217;re maybe 20 times as active in wake mode as in sleep mode. But is this pattern exploitable?</p><p>By analogy to electrical power generation, it can be cheaper and more efficient to keep some kinds of generators running continuously around the clock. To handle demand spikes, you might then bring peaker plants online at critical moments. This isn&#8217;t even generally true across the full range of generation technologies, but let&#8217;s see how far the analogy gets us.</p><p>If we ran BayLeaf using on-campus GPUs (we don&#8217;t), maybe we could turn off those servers at midnight and wake them up at 8am. You&#8217;d hope that, if we had 20 GPUs, we&#8217;d simply turn off 19 for sleep mode so that the service remained available to night owls. However, the situation isn&#8217;t so simple. For a given size of model, there&#8217;s a minimum hardware configuration needed to generate tokens at a reasonable rate. We outsource inference to third-party services because, even at our 4pm peak usage, we can&#8217;t fully utilize a single dedicated inference server.</p><p>If our wake-sleep patterns were 12 hours on, 12 hours off, perhaps we could coordinate with a sister campus in (*checks globe*) Iran, Kazakhstan, or western Russia. They&#8217;d be active when we weren&#8217;t. With a 16-hour active period, however, we&#8217;d have overlap. Maybe we could band together with other West Coast universities (perhaps in some sort of system of universities in California) and reach enough aggregate demand that diurnal resource scaling starts to make sense. Until then, it seems prudent to pool our usage with the much larger national market and let providers with much more comprehensive data decide how many servers to keep active at various times of day.</p><p>I realized I&#8217;ve gotten to the end of this data-oriented post without sharing any concrete data. So, uh, here&#8217;s a snapshot of my personal coding agent data, which turns out to be fairly representative of campus-wide usage as well:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!K6UK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03dfd1e8-765b-418e-88c5-94d3426b0b3a_1943x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!K6UK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03dfd1e8-765b-418e-88c5-94d3426b0b3a_1943x1260.png 424w, https://substackcdn.com/image/fetch/$s_!K6UK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03dfd1e8-765b-418e-88c5-94d3426b0b3a_1943x1260.png 848w, https://substackcdn.com/image/fetch/$s_!K6UK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03dfd1e8-765b-418e-88c5-94d3426b0b3a_1943x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!K6UK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03dfd1e8-765b-418e-88c5-94d3426b0b3a_1943x1260.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!K6UK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03dfd1e8-765b-418e-88c5-94d3426b0b3a_1943x1260.png" width="1456" height="944" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/03dfd1e8-765b-418e-88c5-94d3426b0b3a_1943x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:944,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:136214,&quot;alt&quot;:&quot;Four bar charts show 72,224 completion requests and 12,025 user messages from OpenCode, February 14 through August 17, 2026, grouped by local hour and day of week. Both hourly charts show little activity from about 3am to 7am, rising activity from 8am onward, and a sharp peak at 4pm: 9,351 completion requests and about 1,360 user messages. User messages have noticeable dips at 5pm and 7pm, while completion requests remain comparatively high at those times. In both weekday charts, Thursday is highest and Friday is lowest. Completion requests range from 6,605 on Friday to 14,291 on Thursday; Saturday has 8,960 and Sunday 7,809. User messages range from 1,222 on Friday to 2,534 on Thursday; Saturday has 1,261 and Sunday 1,381. Thus, weekend activity falls within the weekday range rather than forming a distinct low period.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.bayleaf.dev/i/211622600?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03dfd1e8-765b-418e-88c5-94d3426b0b3a_1943x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Four bar charts show 72,224 completion requests and 12,025 user messages from OpenCode, February 14 through August 17, 2026, grouped by local hour and day of week. Both hourly charts show little activity from about 3am to 7am, rising activity from 8am onward, and a sharp peak at 4pm: 9,351 completion requests and about 1,360 user messages. User messages have noticeable dips at 5pm and 7pm, while completion requests remain comparatively high at those times. In both weekday charts, Thursday is highest and Friday is lowest. Completion requests range from 6,605 on Friday to 14,291 on Thursday; Saturday has 8,960 and Sunday 7,809. User messages range from 1,222 on Friday to 2,534 on Thursday; Saturday has 1,261 and Sunday 1,381. Thus, weekend activity falls within the weekday range rather than forming a distinct low period." title="Four bar charts show 72,224 completion requests and 12,025 user messages from OpenCode, February 14 through August 17, 2026, grouped by local hour and day of week. Both hourly charts show little activity from about 3am to 7am, rising activity from 8am onward, and a sharp peak at 4pm: 9,351 completion requests and about 1,360 user messages. User messages have noticeable dips at 5pm and 7pm, while completion requests remain comparatively high at those times. In both weekday charts, Thursday is highest and Friday is lowest. Completion requests range from 6,605 on Friday to 14,291 on Thursday; Saturday has 8,960 and Sunday 7,809. User messages range from 1,222 on Friday to 2,534 on Thursday; Saturday has 1,261 and Sunday 1,381. Thus, weekend activity falls within the weekday range rather than forming a distinct low period." srcset="https://substackcdn.com/image/fetch/$s_!K6UK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03dfd1e8-765b-418e-88c5-94d3426b0b3a_1943x1260.png 424w, https://substackcdn.com/image/fetch/$s_!K6UK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03dfd1e8-765b-418e-88c5-94d3426b0b3a_1943x1260.png 848w, https://substackcdn.com/image/fetch/$s_!K6UK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03dfd1e8-765b-418e-88c5-94d3426b0b3a_1943x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!K6UK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03dfd1e8-765b-418e-88c5-94d3426b0b3a_1943x1260.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">My personal coding agent activity by day of week and time of day</figcaption></figure></div>]]></content:encoded></item><item><title><![CDATA[Backyard Furnaces]]></title><description><![CDATA[Because we have data centers at home, and power plants too]]></description><link>https://blog.bayleaf.dev/p/backyard-furnaces</link><guid isPermaLink="false">https://blog.bayleaf.dev/p/backyard-furnaces</guid><dc:creator><![CDATA[Adam M. Smith]]></dc:creator><pubDate>Sun, 09 Aug 2026 12:04:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bSMi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30b1a7fc-c798-4134-8b40-f6184e0fcfea_4032x2268.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Sometimes people ask me: where do you get the hardware to run inference for <a href="https://bayleaf.dev/">BayLeaf</a> or, if you&#8217;re so interested in medium-sized models, what&#8217;s the biggest model you can handle? These are reasonable questions, but I think they come from an unstated assumption that the GPUs or whatever devices generate the tokens are in a rack somewhere on campus, or maybe they come from a machine in my office. BayLeaf uses <a href="https://openrouter.ai/">cloud services for inference</a>, like most other organizations, but what if we really did run the models themselves, not just the harnesses, on campus?</p><p>Lest we settle for <a href="https://en.wikipedia.org/wiki/Backyard_furnace">AI pig iron</a>, I don&#8217;t think we should run inference for BayLeaf services on campus. However, there&#8217;s a lot to be learned from an earnest attempt.</p><h1><strong>A Laptop in my Office</strong></h1><p>It&#8217;s commonly assumed that you need (multiple) GPUs to run LLMs. This is untrue, but it gives us somewhere to start. Let&#8217;s pick a location on campus, stick a machine with a GPU there, load an LLM on it, and measure how much power it takes to generate tokens of text from some model at some speed.</p><p>My faculty office in the <a href="https://maps.ucsc.edu/">Engineering 2 building</a> has university-provided electrical power, cooling, and network access. The computing hardware for my personal data center will be my personal laptop, an <a href="https://support.apple.com/en-us/117736">M3 Max MacBook Pro</a>. Because this computer has one large block of <a href="https://developer.apple.com/videos/play/tech-talks/10580/">unified memory</a> (64GB), it will let us try running some models that would otherwise require multiple desktop-class GPU devices (e.g. <a href="https://www.nvidia.com/en-us/geforce/graphics-cards/40-series/rtx-4090/">NVIDIA RTX 4090s</a>) or a server-class GPU (e.g. an <a href="https://www.nvidia.com/en-us/data-center/a100/">NVIDIA A100</a>).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7zIQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96e2ed6e-7695-4617-83ac-155e9d76539f_4032x2268.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7zIQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96e2ed6e-7695-4617-83ac-155e9d76539f_4032x2268.jpeg 424w, https://substackcdn.com/image/fetch/$s_!7zIQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96e2ed6e-7695-4617-83ac-155e9d76539f_4032x2268.jpeg 848w, https://substackcdn.com/image/fetch/$s_!7zIQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96e2ed6e-7695-4617-83ac-155e9d76539f_4032x2268.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!7zIQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96e2ed6e-7695-4617-83ac-155e9d76539f_4032x2268.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7zIQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96e2ed6e-7695-4617-83ac-155e9d76539f_4032x2268.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/96e2ed6e-7695-4617-83ac-155e9d76539f_4032x2268.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2159411,&quot;alt&quot;:&quot;A faculty office with a large window looking onto redwoods, a whiteboard, books, family photographs, and an FPGA development board on the desk.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.bayleaf.dev/i/210456799?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96e2ed6e-7695-4617-83ac-155e9d76539f_4032x2268.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A faculty office with a large window looking onto redwoods, a whiteboard, books, family photographs, and an FPGA development board on the desk." title="A faculty office with a large window looking onto redwoods, a whiteboard, books, family photographs, and an FPGA development board on the desk." srcset="https://substackcdn.com/image/fetch/$s_!7zIQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96e2ed6e-7695-4617-83ac-155e9d76539f_4032x2268.jpeg 424w, https://substackcdn.com/image/fetch/$s_!7zIQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96e2ed6e-7695-4617-83ac-155e9d76539f_4032x2268.jpeg 848w, https://substackcdn.com/image/fetch/$s_!7zIQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96e2ed6e-7695-4617-83ac-155e9d76539f_4032x2268.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!7zIQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96e2ed6e-7695-4617-83ac-155e9d76539f_4032x2268.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">My faculty office in Engineering 2</figcaption></figure></div><p>I&#8217;ll start with two of the strongest open-weight LLMs for their total size at this point in the summer of 2026: <a href="https://huggingface.co/Qwen/Qwen3.6-27B">Qwen3.6-27B</a>, the &#8220;dense&#8221; one, and <a href="https://huggingface.co/Qwen/Qwen3.6-35B-A3B">Qwen3.6-35B-A3B</a>, the &#8220;sparse&#8221; one. I&#8217;ll use the 8-bit quantization of each model, so you can easily estimate the on-disk storage size and in-memory size by the parameter count: a 35 billion parameter model is going to take up about 35 gigabytes. With 64 gigabytes of memory in this machine, I&#8217;ll have lots of room left over to store KV-cache for whichever model I&#8217;m using. (The cache is an important data structure for making LLM inference efficient, but it requires almost as much memory as the model itself for storage in typical agentic usage scenarios.)</p><p>You don&#8217;t just double-click the models and run them like apps; you need to run an inference server that will load and interpret them in response to user queries. I&#8217;ll use the <a href="https://github.com/jundot/omlx">oMLX inference server</a>. While you might use <a href="https://github.com/vllm-project/vllm">vLLM</a> for production-grade multi-user inference services, oMLX is a nice match for my laptop.</p><p>This setup with those two Qwen3.6 models in oMLX isn&#8217;t something new for me. I&#8217;ve been running this setup for a few months, and I&#8217;m a monetary and technical contributor to the oMLX open-source project.</p><p>When I fire off some <a href="https://github.com/bayleaf-ucsc/bayleaf/issues/54#issuecomment-5061579852">benchmarking runs</a>, I find the dense model generates about 12 tokens per second (tps) and the sparse model runs at 78 tps. The sparse model is faster because it only activates a fraction of the model for each output token (35B-A3B means only 3 billion out of 35 billion parameters are active at each token, a density factor of about 8.5%; 27B means all 27 billion parameters of the 27 billion parameter model are active each time, 100% density). According to <a href="https://github.com/QwenLM/Qwen3.6">published quality benchmarks</a> (and my vague, subjective sense), the dense model is smarter than the sparse one, but the quality difference isn&#8217;t big enough to justify the throughput sacrifice. So, the sparse model is what I&#8217;d realistically use in production (in some bizarre world where my laptop were the inference substrate).</p><p>During inference tests, I can feel my laptop physically heating up. I measured it drawing 120 Watts of power. As I write this blog post (on the waterfront steps of <a href="https://kglteater.dk/en/visit-us/the-opera">Copenhagen Opera House</a>), my laptop is idling at 16W. But most of that is from having the screen brightness cranked up so I can read text outside. If I were writing this post in my hotel room, I&#8217;d probably be using more like 8W, or even 4W if I kept the screen extra dim. (This trip to Copenhagen for <a href="https://fdg2026.org/">an academic conference</a> is going to cost me more than a year&#8217;s operating costs of BayLeaf, by the way.)</p><p>The numbers I reported above were for processing a single request at a time. This makes sense for personal use, but for a service, we might reasonably be asked to generate responses for several requests concurrently. When I <a href="https://github.com/bayleaf-ucsc/bayleaf/issues/54#issuecomment-5061579852">re-run my tests with multiple concurrent requests</a>, the per-request token generation rate goes down, but the total token generation rate goes up. For a server-class GPU, you might configure the server to work on 32 distinct requests at a time. For my high-memory, weak-compute laptop, handling even a second request concurrently makes the first request&#8217;s response trickle back uncomfortably slowly.</p><p>Okay, I ran an on-campus inference service, and it totally worked. I&#8217;m done, right? No: it is all of this beyond-the-GPU stuff that matters a lot.</p><p>Suppose I wanted to wire my laptop&#8217;s oMLX instance up as one of the back-ends for BayLeaf. My laptop isn&#8217;t always in my office (it&#8217;s in Copenhagen right now!), so the BayLeaf user-facing services need to find the inference hardware as it comes around the world. This isn&#8217;t a major problem, as I can logically wire things up with my <a href="https://tailscale.com/">Tailscale VPN</a>. But what if I need to close the lid of my laptop? What if the times of day when BayLeaf users want inference services collide with when I want to use my computer&#8217;s GPU and RAM for something else?</p><p>Even if it can technically run LLM inference services, a laptop in my office is clearly not a satisfying replacement for your typical data center.</p><p>(Rabbit hole: Qwen3.6-35B-A3B is an excellent model for its size, but it&#8217;s also not smart enough to handle many of the things I&#8217;d like to do with BayLeaf. It&#8217;s often the case that <a href="https://arxiv.org/abs/2001.08361">bigger models are better</a>. It&#8217;s also often the case that newer models, of a given size, are getting better every few months. It seems likely that &#8220;35B-A3B&#8221; is a good shape for <a href="https://huggingface.co/blog/moe">MoE models</a>, even if the Qwen3.6 instantiation of that shape isn&#8217;t fully satisfying.)</p><h1><strong>A Campus Data Center</strong></h1><p>Just a one-minute walk from my office in the Engineering 2 building takes you to the Communications building on campus. This building serves multiple kinds of communications: the <a href="https://film.ucsc.edu/">Film and Digital Media department</a> has offices, studios, and editing bays in there, it&#8217;s got a satellite dish on the roof that might have something to do with radio communications, and, most important for us, it houses a <a href="https://its.ucsc.edu/services/network-and-infrastructure/server-and-storage-management/physical-server-hosting/">machine room with racks of servers and data networking</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!l9jE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91fe5292-9f8e-49b6-8ad8-0f2f3a9300ac_4032x2268.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!l9jE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91fe5292-9f8e-49b6-8ad8-0f2f3a9300ac_4032x2268.jpeg 424w, https://substackcdn.com/image/fetch/$s_!l9jE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91fe5292-9f8e-49b6-8ad8-0f2f3a9300ac_4032x2268.jpeg 848w, https://substackcdn.com/image/fetch/$s_!l9jE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91fe5292-9f8e-49b6-8ad8-0f2f3a9300ac_4032x2268.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!l9jE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91fe5292-9f8e-49b6-8ad8-0f2f3a9300ac_4032x2268.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!l9jE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91fe5292-9f8e-49b6-8ad8-0f2f3a9300ac_4032x2268.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/91fe5292-9f8e-49b6-8ad8-0f2f3a9300ac_4032x2268.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3634230,&quot;alt&quot;:&quot;The front entrance of the Communications building, with Film and Digital Media signage and a satellite dish visible on the roof.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.bayleaf.dev/i/210456799?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91fe5292-9f8e-49b6-8ad8-0f2f3a9300ac_4032x2268.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The front entrance of the Communications building, with Film and Digital Media signage and a satellite dish visible on the roof." title="The front entrance of the Communications building, with Film and Digital Media signage and a satellite dish visible on the roof." srcset="https://substackcdn.com/image/fetch/$s_!l9jE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91fe5292-9f8e-49b6-8ad8-0f2f3a9300ac_4032x2268.jpeg 424w, https://substackcdn.com/image/fetch/$s_!l9jE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91fe5292-9f8e-49b6-8ad8-0f2f3a9300ac_4032x2268.jpeg 848w, https://substackcdn.com/image/fetch/$s_!l9jE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91fe5292-9f8e-49b6-8ad8-0f2f3a9300ac_4032x2268.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!l9jE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91fe5292-9f8e-49b6-8ad8-0f2f3a9300ac_4032x2268.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The Communications building</figcaption></figure></div><p>I went down to the basement of the Communications building, following the high-pitched whine of server fans, and found a locked door. Through the window, I could see the machines with their glowing lights. It&#8217;s a <a href="https://its.ucsc.edu/services/network-and-infrastructure/server-and-storage-management/physical-server-hosting/">data center with industrial grade power and thermal utilities</a>. If I somehow got my hands on a server-class GPU, I could run it from there, right? That&#8217;d clearly be the appropriate location to run on-campus compute infrastructure. But, I don&#8217;t have a key to the door.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!L0TR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b147205-2816-4f56-807f-a0046bc32a02_2268x4032.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!L0TR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b147205-2816-4f56-807f-a0046bc32a02_2268x4032.jpeg 424w, https://substackcdn.com/image/fetch/$s_!L0TR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b147205-2816-4f56-807f-a0046bc32a02_2268x4032.jpeg 848w, https://substackcdn.com/image/fetch/$s_!L0TR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b147205-2816-4f56-807f-a0046bc32a02_2268x4032.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!L0TR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b147205-2816-4f56-807f-a0046bc32a02_2268x4032.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!L0TR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b147205-2816-4f56-807f-a0046bc32a02_2268x4032.jpeg" width="1456" height="2588" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1b147205-2816-4f56-807f-a0046bc32a02_2268x4032.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2588,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1746837,&quot;alt&quot;:&quot;Server and networking racks with green indicator lights, seen through the window of a locked door in the Communications Building basement.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.bayleaf.dev/i/210456799?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b147205-2816-4f56-807f-a0046bc32a02_2268x4032.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Server and networking racks with green indicator lights, seen through the window of a locked door in the Communications Building basement." title="Server and networking racks with green indicator lights, seen through the window of a locked door in the Communications Building basement." srcset="https://substackcdn.com/image/fetch/$s_!L0TR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b147205-2816-4f56-807f-a0046bc32a02_2268x4032.jpeg 424w, https://substackcdn.com/image/fetch/$s_!L0TR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b147205-2816-4f56-807f-a0046bc32a02_2268x4032.jpeg 848w, https://substackcdn.com/image/fetch/$s_!L0TR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b147205-2816-4f56-807f-a0046bc32a02_2268x4032.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!L0TR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b147205-2816-4f56-807f-a0046bc32a02_2268x4032.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The Communications Building Data Center, through the locked door.</figcaption></figure></div><p>Or maybe I do have a way in. It turns out that several of the machines in the Communications Building Data Center are already rigged up to participate in the <a href="https://its.ucsc.edu/services/research-computing/research-specific-computing-and-applications/national-research-platform-nautilus-hyperconverged-gpu-cluster/">Nautilus Hyperconverged GPU Cluster</a> of the National Research Platform (NRP). For unrelated reasons, I already have admin privileges for a resource namespace on this cluster. So, a few <a href="https://kubernetes.io/">Kubernetes</a> commands later, I had access to a machine that identified itself as <code>k8s-gpu-6.ucsc.edu</code> with an <a href="https://www.nvidia.com/en-us/design-visualization/rtx-5000/">NVIDIA RTX 5000 Ada Generation GPU</a> with 32 GB VRAM.</p><p>I got the two Qwen3.6 models running on that GPU server, this time using vLLM rather than oMLX, and I collected some <a href="https://github.com/bayleaf-ucsc/bayleaf/issues/54">unremarkable throughput measurements</a>. I say unremarkable because many others have gathered the same data. For a single request, the server-class GPU runs somewhat faster than the laptop-class GPU. For multiple requests, the server-class GPU maintains per-request performance much better. But this is common knowledge that doesn&#8217;t require an experiment. What mattered more is that, as an individual faculty member, I was able to figure out how to put this all together from already-purchased, already-running resources.</p><p>The problem is that these resources aren&#8217;t arranged to be able to support a service like BayLeaf. There&#8217;s no problem with running LLMs on NRP: it&#8217;s an <a href="https://nrp.ai/llms/">officially supported service</a>. The bigger issue is that this research platform is allocated for research use, and the LLM service in particular is not operated with any of the privacy and security guarantees we need. Even if I wanted to use UCSC&#8217;s existing NRP nodes to run my own LLM service (under my own privacy terms), I shouldn&#8217;t. <a href="https://nrp.ai/documentation/userdocs/start/policies/">GPU nodes on NRP</a> are supposed to be allocated only temporarily, for jobs that can keep the GPU at 40% utilization or above at all times. Even with whole-campus adoption, I don&#8217;t think BayLeaf has enough around-the-clock demand to justify keeping a single dedicated GPU reserved for BayLeaf inference services.</p><p>I ran <a href="https://github.com/bayleaf-ucsc/bayleaf/issues/54#issuecomment-5052784252">another experiment</a>, this time using CPU-only inference on a machine that identified itself as <code>fiona8.ucsc.edu</code>. The same two models are, of course, capable of running inside vLLM. GPUs were never technically required. The dense model generates at 4 tps and the sparse model 7 tps. Natural human speech rate is somewhere between these figures, so we shouldn&#8217;t rule out CPU-only inference on generation speed alone.</p><p>The problem is reading, not writing, in two senses. First, we humans read the output of the model, we don&#8217;t speak it. Text that trickles out at speech rate doesn&#8217;t afford skimming or even reading particularly comfortably. Second, models don&#8217;t just generate output, they process inputs that contextualize the future output. If you ask your friend to summarize a 10-page research paper, you don&#8217;t mind it when they take an hour to read the paper first. But if your LLM-based assistant takes an hour to read the paper first before typing out the summary, you&#8217;ll be frustrated. (There&#8217;s an emerging technical literature on <a href="https://arxiv.org/abs/2401.09670">&#8220;disaggregated inference&#8221;</a> where input processing and output generation are separated, run by different software systems on different hardware. But let&#8217;s not get lost in that rabbit hole.) If we&#8217;re too focused on generating tokens, we&#8217;ll miss the constraints that make one system design or another feasible for use in BayLeaf.</p><p>Think of it like power generation. Just because I&#8217;m able to rent a diesel generator, haul it up to campus, and generate electricity, doesn&#8217;t mean it is a good idea. For all sorts of reasons (efficiency, environmental, and otherwise), we <a href="https://www.eia.gov/energyexplained/electricity/electricity-in-the-us.php">centralize power generation</a> at scales larger than a single university campus.</p><p>Say, where does the power for the campus data center, or my office for that matter, come from anyway?</p><h1><strong>A Campus Power Plant</strong></h1><p>Just another one-minute walk from the Communications building on campus takes you to the <a href="https://ppdo.ucsc.edu/physical-plant/building-utilities-and-fleet-services/cogeneration-shop/">campus cogeneration plant</a>. <a href="https://www.energy.gov/eere/iedo/combined-heat-and-power-basics">Cogeneration</a>, here, refers to simultaneous generation of electrical power and useful heat. Useful heat, in the form of near-boiling water, can be piped between buildings to provide much more efficient heating (or even cooling, through the use of <a href="https://www.energy.gov/femp/absorption-chillers-chp-systems">absorption chillers</a>) than electricity provides. If the Communications building houses our data center, then the Cogen facility houses our power plant. Or at least it did, sort of, partially.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1stR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa215fa-c490-4163-946e-8fd507379734_4032x2268.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1stR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa215fa-c490-4163-946e-8fd507379734_4032x2268.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1stR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa215fa-c490-4163-946e-8fd507379734_4032x2268.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1stR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa215fa-c490-4163-946e-8fd507379734_4032x2268.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1stR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa215fa-c490-4163-946e-8fd507379734_4032x2268.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1stR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa215fa-c490-4163-946e-8fd507379734_4032x2268.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ffa215fa-c490-4163-946e-8fd507379734_4032x2268.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2340379,&quot;alt&quot;:&quot;The glass entrance to the cogeneration plant's turbine room, with the machinery visible inside and warning signs mounted on the door and window.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.bayleaf.dev/i/210456799?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa215fa-c490-4163-946e-8fd507379734_4032x2268.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The glass entrance to the cogeneration plant's turbine room, with the machinery visible inside and warning signs mounted on the door and window." title="The glass entrance to the cogeneration plant's turbine room, with the machinery visible inside and warning signs mounted on the door and window." srcset="https://substackcdn.com/image/fetch/$s_!1stR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa215fa-c490-4163-946e-8fd507379734_4032x2268.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1stR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa215fa-c490-4163-946e-8fd507379734_4032x2268.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1stR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa215fa-c490-4163-946e-8fd507379734_4032x2268.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1stR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa215fa-c490-4163-946e-8fd507379734_4032x2268.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The turbine room at the campus cogeneration plant</figcaption></figure></div><p>According to <a href="https://ppdo.ucsc.edu/energy-management/campus-energy-data/">campus sources</a>, about 64% of campus electricity comes from our cogen plant. About 6% comes from our various photovoltaic arrays (mostly the canopy in the East Remote Parking Lot). The remaining 30% is made up by on-demand imports from PG&amp;E. PG&amp;E is also the supplier for the natural gas (methane) burned in the <a href="https://www.cei.com/our-work/uc-santa-cruz-cogeneration-plant">&#8220;Solar Turbines&#8221;-branded Mercury 50 PG Generator Set</a> in the cogen plant.</p><p>Numbers aside, it is fair to say most of our electrical power is generated locally. However, even that local generation capacity is not entirely situated here. We didn&#8217;t <a href="https://www.eia.gov/energyexplained/natural-gas/natural-gas-and-the-environment.php">frack the methane</a> we burn or smelt the iron used to forge the turbine parts here. There are important reasons, some strategic and some historical, for us to continue to burn the methane here rather than having <a href="https://www.pge.com/">PG&amp;E</a> burn it for us off-campus.</p><p>It might be fun to stash a computer in the control room of the cogen plant, to have it generate tokens using hyper-locally produced energy and (at least by proximity) be part of <a href="https://www.ashrae.org/technical-resources/ai-data-center-framework/energy-and-thermal-efficiency">heat recovery and reuse systems</a>. But it would just be a stunt. The amount of energy used by AI services at a campus scale is just so tiny compared to <a href="https://ppdo.ucsc.edu/energy-management/campus-energy-data/">other kinds of campus energy usage</a>. On the individual scale, dimming your laptop screen, or, even better, remembering to close the exterior door to the lecture hall when the heating or cooling systems are working, is going to matter a bit more than where your AI tokens are generated.</p><h1><strong>Decommissioning and Decarbonization</strong></h1><p>In most of my years as a student and later faculty on the UC Santa Cruz campus, I saw the metallic lettering of the <a href="https://ceqanet.opr.ca.gov/2011082037">&#8220;F. LOUIS FACKLER COGENERATION PLANT&#8221;</a> sign attached to a large beige building. When I went to go capture a photograph of the building for this blog post, I noticed the sign has recently moved to a smaller, brown building.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bSMi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30b1a7fc-c798-4134-8b40-f6184e0fcfea_4032x2268.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bSMi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30b1a7fc-c798-4134-8b40-f6184e0fcfea_4032x2268.jpeg 424w, https://substackcdn.com/image/fetch/$s_!bSMi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30b1a7fc-c798-4134-8b40-f6184e0fcfea_4032x2268.jpeg 848w, https://substackcdn.com/image/fetch/$s_!bSMi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30b1a7fc-c798-4134-8b40-f6184e0fcfea_4032x2268.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!bSMi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30b1a7fc-c798-4134-8b40-f6184e0fcfea_4032x2268.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bSMi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30b1a7fc-c798-4134-8b40-f6184e0fcfea_4032x2268.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/30b1a7fc-c798-4134-8b40-f6184e0fcfea_4032x2268.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3738762,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.bayleaf.dev/i/210456799?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30b1a7fc-c798-4134-8b40-f6184e0fcfea_4032x2268.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!bSMi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30b1a7fc-c798-4134-8b40-f6184e0fcfea_4032x2268.jpeg 424w, https://substackcdn.com/image/fetch/$s_!bSMi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30b1a7fc-c798-4134-8b40-f6184e0fcfea_4032x2268.jpeg 848w, https://substackcdn.com/image/fetch/$s_!bSMi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30b1a7fc-c798-4134-8b40-f6184e0fcfea_4032x2268.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!bSMi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30b1a7fc-c798-4134-8b40-f6184e0fcfea_4032x2268.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The F. Louis Fackler Cogeneration Plant sign on the newer building</figcaption></figure></div><p>There&#8217;s a whole story that could be told about <a href="https://library.ucsc.edu/reg-hist/louis-f-fackler-founding-campus-engineer-uc-santa-cruz">Fackler, the man</a>, and the plant(s) named after him. However, I&#8217;ll cut it short to say that even the new building, which houses the Mercury 50, is <a href="https://news.ucsc.edu/2025/02/uc-santa-cruz-sets-fossil-free-date/">planned to be decommissioned and not replaced</a>. The future of energy at UC Santa Cruz involves ramping down, rather than up, carbon-emitting energy generation.</p><p>On a much shorter time scale, the <a href="https://its.ucsc.edu/about/it-projects/it-project-communications-building-data-center-closure/">Communications Building Data Center is also being decommissioned</a>. NRP servers currently operating there will need to move to off-campus data centers. For reasons mostly to do with power and water access, this means using a slice of space in an <a href="https://computing.science.ucsc.edu/services/data-center-hosting/">existing data center in Quincy, Washington</a>, not even in California.</p><p>As I imagine an on-campus inference service for BayLeaf, it involves commissioning new infrastructure, re-carbonizing the campus in ways that directly contradict other <a href="https://ppdo.ucsc.edu/environment/files/ucsc-decarbonization-electrification-pre-design-final-report.pdf">well-reasoned plans</a>.</p><p>If there is a role for university-only inference services, I think the appropriate scale of it is at something larger than a single campus (as it is for power generation). It seems appropriate that UC San Diego&#8217;s <a href="https://www.sdsc.edu/">San Diego Supercomputer Center (SDSC)</a> is being used to experimentally run LLMs for multiple UC campuses. It offers inference for UCSD&#8217;s <a href="https://tritonai.ucsd.edu/tritongpt/">TritonGPT</a> and UCB&#8217;s <a href="https://ai.berkeley.edu/beargpt">BearGPT</a>. Should it run a hypothetical SlugGPT for UCSC? I&#8217;m not sure. All of California&#8217;s higher education institutions are located in one timezone and have similar academic calendars, so our load is peaky, and we haven&#8217;t yet invented some kind of &#8220;AI battery&#8221; that would allow us to store excess inference capability in off-hours to spend down during peak hours.</p><p>We want our LLM-based agents to respond quickly, but that might mean responding within half a second, not within a few milliseconds. With that kind of latency tolerance, the inference service could be almost anywhere else on the Internet-connected Earth without us noticing. We should probably have base-load inference services follow the sun as it shines on different parts of the world rather than push too hard for regional (e.g. campus-level or even state-level) self-sufficiency.</p><h1><strong>Metallurgical Literacy</strong></h1><p>I opened this post with an oblique reference to <a href="https://en.wikipedia.org/wiki/Backyard_furnace">backyard furnaces (&#22303;&#27861;&#28860;&#38050;)</a>. During China&#8217;s <a href="https://www.britannica.com/event/Great-Leap-Forward">Great Leap Forward (1958&#8211;1962)</a>, the term referred to efforts to radically decentralize steel production. To cut a long story short and avoid torturing a weak analogy, what came out of those furnaces was mostly brittle pig iron rather than usable steel, and production was eventually re-centralized.</p><p>I hope you can see the analogy between backyard furnaces and me generating tokens with my laptop in my faculty office. It seems like it sort of works for me, if you excuse some response quality issues, but there&#8217;s no way I can usefully compete with cloud inference services when you look at the bigger picture of system reliability, energy efficiency, or alignment with campus decarbonization goals.</p><p>So why did Mao Zedong and I even go down this path in the first place? To speculate (as I&#8217;m an engineer rather than a historian or political scientist), I think it&#8217;s about developing people, perspectives, and credibility of exit from other plans. I want people to understand that the path from methane to chatbots (or from photovoltaics to research automation assistance) is traceable at the human scale, that many of the important processes are close analogs to things that are already happening on campus within a few minutes&#8217; walking distance from one another.</p><p>When there&#8217;s something we don&#8217;t like about how Generative AI currently works in society, we need to be able to <a href="https://github.com/bayleaf-ucsc/bayleaf/blob/main/politics/RESEARCH.md">build and operate alternatives</a> so we can be precise about the definition of the problem and the feasibility of the solutions. If we&#8217;re not able to make alternatives tangible, we&#8217;ll be too cautious to try new things and cling too tightly to the first things that seem to even partially work.</p>]]></content:encoded></item><item><title><![CDATA[Facebook is not the Internet]]></title><description><![CDATA[But Claude is AI, right?]]></description><link>https://blog.bayleaf.dev/p/facebook-is-not-the-internet</link><guid isPermaLink="false">https://blog.bayleaf.dev/p/facebook-is-not-the-internet</guid><dc:creator><![CDATA[Adam M. Smith]]></dc:creator><pubDate>Wed, 05 Aug 2026 21:01:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4QwT!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa606a527-a58e-47e3-9610-a228520a77d3_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Most folk these days have internalized the idea that Facebook and LinkedIn or YouTube and Netflix are not the same thing as the Internet. Whether these cloud services are free on the basis of advertising and data harvesting or require a monthly subscription, we understand that, on a lower level, Internet access is a distinct prerequisite for using them. At the same time, we know there&#8217;s more you can do with Internet access than access a few brand-name services (even if those few services account for the vast majority of our usage these days).</p><p>Should a university procure every student a Netflix account and every employee a LinkedIn Career plan? Probably not, for so, so many reasons. It makes a lot more sense to offer everyone basic Internet access when they are on campus via convenient Wi-Fi. Individual users or smaller-than-a-whole-campus groups can opt into additional services on their own. Oh, and it would be nice for the university to provide some kind of hosting services so that specific members of the campus community have some capability of offering their services to others in the community.</p><p>There&#8217;s a similar picture we need to draw for Generative AI. This post is going to try to leverage your well-established familiarity with the Internet and the Web (even if you are mostly a casual user of it) to help you pull apart some ideas that are too easily collapsed in the current public discourse around Generative AI.</p><p>Let&#8217;s focus on retail Generative AI subscription services associated with brands like ChatGPT, Claude, and Gemini. Under problematic privacy terms and tight usage limits, you can usually access some version of these services for free. Or, if you decide to pay, you can get some kind of Plus or Pro subscription, perhaps $5 or $20 per month, offering more. For some folk, even that&#8217;s not enough, and there are Max or Ultra subscriptions, maybe $100 or $200 per month, that give you even more smarts or more messages per day. The privacy terms, usage limits, and per-user prices of the subscriptions available for universities and other large organizations are a little different than those for individual users, but we&#8217;ll ignore those distinctions for today.</p><p>Should the campus procure everyone a ChatGPT Plus account (or some close, institutionally-negotiated equivalent)? You can&#8217;t say it would be unrealistic: we&#8217;ve seen this done <a href="https://adminvc.ucla.edu/news/ucla-introduces-chatgpt-enterprise-campus-first-california-higher-ed">for individual UC campuses like UCLA</a> and <a href="https://edsource.org/2026/cal-state-renews-controversial-system-wide-contract-with-openai/758919">for the entire California State University system</a>. But, augh, I can&#8217;t help but think these purchases were made without a clear understanding of alternatives. Was a campus-wifi-like design even considered?</p><p>What does a raw Generative AI service look like? It would be something that gives you access to the smarts (the text extruder, the spicy autocomplete engine, the stochastic parrot, etc.) without a brand-name chat interface. It might be a pay-as-you-go service like <a href="https://openrouter.ai/">OpenRouter</a> or a flat-fee subscription service like <a href="https://opencode.ai/go">OpenCode Go</a>. Typically, these are available under excellent privacy terms (usually zero data retention, ZDR) and with generous usage limits. Unless you are a software developer directly integrating your custom software with these services, you can&#8217;t make much use of these services by yourself. It&#8217;d be like trying to use the Web without a browser! (Your programmer friend, a fan of <a href="https://curl.se/">curl</a>, asserts that this is a possibility, but they are suspiciously reluctant to show you how to do it yourself.) We often call this level of Generative AI service the API: the application programming interface. Specifically, we might call it an inference API providing access to pre-trained models (to distinguish it from APIs capable of training or fine-tuning new models).</p><p>So, what&#8217;s like the browser for Generative AI? The two places you&#8217;ll most often see Generative AI come to life (in the sense of making spicy autocomplete into something useful) are chat interfaces and agentic coding tools. In chat interfaces, your opening query and subsequent responses are valuable context that steer the underlying model to generate text that is relevant to your interests that day. In agentic coding tools, this context is typically thickened to include all of the code and documentation files for a project, and the generated text can be executed as commands in that project environment to have impacts on the real world (e.g. sending a message or deploying a new version of a web service). In 2026, we might generalize both of these with the term &#8220;harness.&#8221; We say a model can become an agent when it is connected to a harness and supplied with context.</p><p>Can you get a chat interface or a coding interface <em>&#224; la carte</em>, without any bundled subscription smarts? Sure, <a href="https://openwebui.com/">Open WebUI</a> offers a browser-based chat interface that feels a lot like the one you&#8217;d see at ChatGPT.com or Claude.ai. Importantly, you can plug in various different inference API services. Open WebUI is software that you can run on your own computer or have someone in your community run on a cloud service on your behalf. <a href="https://opencode.ai/">OpenCode</a> is a terminal-based coding agent harness that feels like Claude Code, and <a href="https://openchamber.dev/">OpenChamber</a> is a desktop app that feels like Claude Cowork. But, again, they can be connected to any back-end API service. Harnesses are typically free to run directly on your own computer, or they can be run for your community on a cloud hosting service at very low aggregate cost. Setting up Open WebUI for your friends and family is only about as hard as setting up a self-hosted blog package like WordPress or Ghost. If the harness only needs to serve you as an individual, there&#8217;s often a convenient desktop app (or even mobile app!) package of that same software available.</p><p>Running your own harness (or having someone run it for you) doesn&#8217;t mean you need to fully disengage from big-name Generative AI providers and their flagship models. You can use a specific model like Claude Opus 5 inside of OpenCode or chat with the same model that powers ChatGPT from inside of Open WebUI. You can switch models or even back-end providers mid-session to explore alternatives or optimize your costs. You don&#8217;t need to export or import your data when you switch providers because your data is stored near you and your harness. Alternatively, you can fully disengage from the big-name providers if you like (perhaps for cost, privacy, ethics, politics, or other reasons).</p><p>You can use the Google Chrome browser with your Verizon home internet to watch a documentary on Netflix. I can use the Firefox browser with my Xfinity home internet to watch a documentary on YouTube. Such flexibility, very variety. Now, consider the idea of a university purchasing Google AI Pro for Education (<a href="https://ai.berkeley.edu/tools-training/licensed-ai-tools">like they&#8217;ve done at UC Berkeley</a>). Students, faculty, and staff can only use one family of harnesses (Google-branded surfaces like Google Docs, Gemini Notebook, etc.) to access one family of Generative AI models (Gemini) with a cloud-only context storage model. In this design, there&#8217;s no way for me to have an off-the-record chat or try out a different harness or model because the API access layer has been erased. It&#8217;d be like an Internet service that only offered Facebook access, as if <a href="https://en.wikipedia.org/wiki/Facebook_Zero">Facebook simply were the Internet</a>.</p><p><a href="https://bayleaf.dev/">BayLeaf</a> is trying to make the alternative, the inference-APIs-and-agent-harnesses design, tangible. Students, faculty, and staff can access a wide variety of Generative AI models, all under zero-data-retention terms, via the BayLeaf API. We have a generous default usage limit (currently $5/day for most users) with the ability to make exceptions. We also run harnesses for chat and coding (using Open WebUI for chat and the Lathe toolkit to add sandboxed code execution abilities). We even have a smoother onramp for using BayLeaf in local-to-your-computer harnesses like OpenCode and OpenChamber. We don&#8217;t require your chat data to be stored on our servers (if you use your own harness), and we&#8217;ve even figured out how to offer you the smarts (the spicy autocomplete engine) without either us <a href="https://tinfoil.sh/blog/2026-07-14-secure-prompt-caching">or even our back-end providers</a> being able to access your data, even in flight, using E2EE (end-to-end encryption).</p><p>At this point in the blog post, I want you to be able to read retail Generative AI subscriptions (and their institutional equivalents) as if they were Facebook-only Internet access plans. I want you to be able to identify the harness as the thing that makes the underlying generative models useful. I want you to feel a creeping discomfort with the idea that California&#8217;s public universities are ceding control and making additional payments to access services with strictly less capability than API-level services from those same providers.</p><p>BayLeaf is my fairly hard-line take on what&#8217;s appropriate for an institution like UC Santa Cruz. However, I want to applaud the hundred-flowers approach taken by our sister campus UC Berkeley: <a href="https://tinfoil.sh/blog/2026-07-14-secure-prompt-caching">https://ai.berkeley.edu/tools-training/licensed-ai-tools</a> They offer harnessed and API-level access to models from various providers, some channels centrally funded while others based on recharge, some self-service and others by approval only. Beyond the big-name bundles like ChatGPT Edu and Google AI Pro, they have in-house offerings like their BearGPT and Campus AI Sandbox (roughly analogous to BayLeaf Chat and BayLeaf API). From this breadth of offerings, you can infer that a single big-name bundled-subscription service was not by itself sufficient to meet the needs of the campus community. You could also infer that the investment to explore in-house and open-source alternatives was affordable.</p><p>Before I close, I should say that inference API services don&#8217;t necessarily have to be things you access over the Internet. The hardware and software implementing the smarts of the API could also be run on your own computer. The responses from laptop-sized models might be a little disappointing, the text trickling out slowly as your laptop gets uncomfortably warm, but it is possible. Generative AI isn&#8217;t inherently an Internet technology. It&#8217;s just much more convenient (and energy-, time-, and cost-efficient) to treat it as one. We, a big-ass public university that already runs other IT infrastructure, could run the models ourselves, but I don&#8217;t think we should go that far. I can analyze the thermodynamics of on-campus inference in another post. For today, just hang on to this idea of separating inference APIs from harnesses. Keep control of your data (your context!), keep your options open, and, when possible, buy your spicy autocomplete in bulk.</p>]]></content:encoded></item><item><title><![CDATA[Delisting Closed-Weight Models]]></title><description><![CDATA[And maybe taking a step further]]></description><link>https://blog.bayleaf.dev/p/delisting-closed-weight-models</link><guid isPermaLink="false">https://blog.bayleaf.dev/p/delisting-closed-weight-models</guid><dc:creator><![CDATA[Adam M. Smith]]></dc:creator><pubDate>Thu, 30 Jul 2026 07:33:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4QwT!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa606a527-a58e-47e3-9610-a228520a77d3_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>For much of its operational history, <a href="https://bayleaf.dev/">BayLeaf</a> has highlighted open-weight LLMs. The <em>Basic</em> model in the BayLeaf Chat service has always been powered by an open-weight model (even if it wasn&#8217;t told in the system prompt exactly which one), and most of the per-course agents have been based on open-weight models. But, with the introduction of the BayLeaf API in March 2026, users could directly access a huge variety of models, including many closed-weight models.</p><p>I like the way that open-weight models are available for unauthenticated download from the web in the same way that much of the presumed-public data used to train them was. That&#8217;s a great expression of reciprocity. Am I giving that up or diluting my focus by allowing people to access closed-weight models on my platform? I&#8217;m still not sure.</p><p>This morning, I <a href="https://github.com/bayleaf-ucsc/bayleaf/commit/bbd2fa3094ed96b2cc33b6c0a0a3b9f4cf096b7d">pushed a change</a> to the BayLeaf API that effectively delists closed-weight models. If you craft a request with the correct model slug for a closed-weight model you know of (perhaps you found it listed on OpenRouter), the request will still go through (assuming there are ZDR providers for it available), but I&#8217;m not making it too easy.</p><p>What do I gain by taking this step, or the next step beyond delisting to actually block access to closed-weight models? I gain some ideological purity points, but who is counting? I gain a talking point about how I operate an open-weight-only LLM service, and that feels good personally. I&#8217;d hope, a few months after delisting, that I can tell stories of how people didn&#8217;t knock on my door asking for access to those unlisted models. It&#8217;d show sufficiency and that access to plenty-good-enough doesn&#8217;t require dancing on the frontier.</p><p>What do I lose by making those brand-name models harder or impossible to access? Writing this in July 2026, just a few days after the <a href="https://images.nvidia.com/pdf/Open-Weights-and-American-AI-Leadership.pdf">Open Weights and American AI Leadership</a> open letter and the launch and <a href="https://huggingface.co/moonshotai/Kimi-K3">full binary release of Kimi K3</a>, I&#8217;m not clear I&#8217;m giving up much at all either in the present or in the long term. There&#8217;s <a href="https://artificialanalysis.ai/models/open-source">an increasing thin sliver of capability</a> that is only accessible via specific closed-weight models, and it would be easy for me to justify that accepting (excepting?) this sliver is a fair price to pay for being able to declare ourselves satisfied within the open-weight sphere.</p><p>To be fair, it is reasonable to want access to the full variety of models to run comparative experiments. This is something I&#8217;m a little interested in myself as an AI nerd, but the vast majority of BayLeaf&#8217;s audience, the UC Santa Cruz campus community, doesn&#8217;t need this, and it is available at reasonable costs outside the walls of the BayLeaf playground. Maybe I&#8217;ll take that next step in the near future.</p><p>If my choice is between needing to tell someone that, sorry, we don&#8217;t have ClaudeGPT-9000 or getting to tell someone that there&#8217;s no way using BayLeaf can contribute data or money to providers who don&#8217;t play the Web reciprocity game&#8230; uh, the choice is getting clearer by the second.</p><p>You should know that the vast majority of BayLeaf&#8217;s development and maintenance was done and continues to be done with agents based on closed-weight models, but that fraction is steadily ticking down. And that&#8217;s not just because I&#8217;m trying out monstrously-large open-weight models like Kimi K3. The fraction done with laptop-scale (and even phone-scale) open-weight models is ticking up from below. It&#8217;s just computers, man. It doesn&#8217;t have to be empires.</p><p><em>Edit on September 2, 2026: I decided to fully block closed-weight models. </em></p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;185e41e3-22af-4be2-ba7f-a2ebb4efaa08&quot;,&quot;caption&quot;:&quot;About a month ago, I wrote one of the first posts on this blog about delisting closed-weight models on the BayLeaf API while still serving requests for them: https://blog.bayleaf.dev/p/delisting-closed-weight-models&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Blocking Closed-Weight Models&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:237427323,&quot;name&quot;:&quot;Adam M. Smith&quot;,&quot;bio&quot;:&quot;Associate Professor of Computational Media at UC Santa Cruz&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5df3a25a-8b62-4033-a766-4b1cc3761be8_400x400.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-09-02T23:02:19.586Z&quot;,&quot;cover_image&quot;:null,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.bayleaf.dev/p/blocking-closed-weight-models&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:213935251,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:10266146,&quot;publication_name&quot;:&quot;BayLeaf Blog&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!4QwT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa606a527-a58e-47e3-9610-a228520a77d3_1024x1024.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div>]]></content:encoded></item><item><title><![CDATA[Why is it called BayLeaf?]]></title><description><![CDATA[Spoiler: abundance and usefulness]]></description><link>https://blog.bayleaf.dev/p/why-is-it-called-bayleaf</link><guid isPermaLink="false">https://blog.bayleaf.dev/p/why-is-it-called-bayleaf</guid><dc:creator><![CDATA[Adam M. Smith]]></dc:creator><pubDate>Thu, 30 Jul 2026 06:25:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4QwT!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa606a527-a58e-47e3-9610-a228520a77d3_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I didn&#8217;t go through any kind of branding exercise when I initially named the <a href="https://bayleaf.dev/">BayLeaf AI Playground</a>. The name just sort of came to me in the moment. There are a lot of bay trees on campus and plenty of bay-named things here referencing that already, so is that it?</p><p>The leaves of the <a href="https://en.wikipedia.org/wiki/Umbellularia">California bay</a> have a particular symbolism for me. They are abundant, abundant to such a degree that they are hard to notice. It takes someone calling them out, maybe remarking on the scent, or telling a story of how the campus mascot banana slug&#8217;s coloring is a form of natural camouflage that only works because of the contrast of the occasional yellowed leaf against the more common green and brown... Someone makes them visible, and then you see them everywhere. They are useful too (yes, really), but again it also takes someone stepping you through it to make it believable. Did you know you can make a kind of chocolatey treat from the roasted nuts of the bay tree? Reader, we&#8217;ll get to that part later.</p><h1>Abundance</h1><p>A pile of leaves doesn&#8217;t immediately seem to evoke anything you&#8217;d attribute to a generative AI service platform, so give me a moment to build the connections.</p><p>BayLeaf (the platform) didn&#8217;t arrive with a splashy product launch, fully formed, and shaped by a product team to be consumed by a paying (or captive for the harvesting) audience. Most people in the campus community will encounter it as some thing that was quietly already existing. It should feel fit to the environment because it grew here by incremental evolution of something that was already working for me. You don&#8217;t have to use it, and it doesn&#8217;t demand much of you when you decide to try it.</p><p>Any plant, but certainly something as complicated as a tree, integrates with a larger environment. The bay trees on campus don&#8217;t need watering or pesticide treatments. They just sort of continue because they found a niche, and they occupy it abundantly. BayLeaf, as a pile of software, can&#8217;t be immediately transported into a new organization, or even another higher education campus, without local adaptation. You need someone to plug it into the authentication system used to identify campus community users, you need someone to register domains, create cloud service accounts, paste API keys (and be responsible for the results of pasting those keys), all in a way that is hopefully compatible with existing campus IT services and policies. But once you&#8217;ve got those, it doesn&#8217;t take much to keep it going. You don&#8217;t need full-time staff, you don&#8217;t need corporate gifts or even funding from state or federal initiatives. There&#8217;s some level of labor and funding flowing through it, but those fit within my budget of personal activities to stay on top of the happenings of my field, constructed to center on artificial intelligence, interactive media, and the combination of these in higher-education context.</p><p>BayLeaf is this thing that appears all around you, once someone points it out, as an already-existing thing that you might make use of if you got the guidance or summoned the curiosity to figure it out on your own. Maybe abundance isn&#8217;t quite the right term for a bus-factor-one pseudo-hobby project, but it&#8217;s what I&#8217;m reaching for with the name.</p><h1>Usefulness</h1><p>Have you ever paid for a jar of dried bay leaves at the grocery store only to have it sit unused on the shelf for years because so few recipes seemed to call for them? Stop doing that. The bay leaves you get off a tree on campus aren&#8217;t quite the same as the ones you buy from the store, and there are some ways that they are actually better. Don&#8217;t wait for them to be mentioned by name in a recipe. Put them in places where they might fit, and see what happens. Bay leaves are moderately useful, and your use of them will expand if you take it upon yourself to talk to others about how they are using them.</p><p>You don&#8217;t just, like, stuff them into your face like other things you&#8217;d buy from the same grocery store. It really matters what context (wink) you place them in. You can learn some recipes. You can invent new ones. You aren&#8217;t switching to a bay-only diet, but maybe you are making it a little bit of your identity to try using the leaves in new ways.</p><p>BayLeaf, the AI thing, occupies a category of software that some people believe to be categorically useless or even harmful to use. I disagree, but at the same time I see how, if your only exposure to a bay leaves was just directly biting one at some point back in 2023, you&#8217;d find them pretty disgusting. I can write much more in the future about what makes most commercial generative AI service offerings unpalatable to me, but I want to stay focused on usefulness here.</p><p>Bay trees, in addition to leaves, grow a fruit that is a bit like an avocado, a powerfully bitter avocado with a thin and quick-rotting meat. Useless, right? The pit, the peppernut as it is sometimes called, is this interesting thing that you can collect and roast. When you crack open the shell to access and then grind up the roasted nut-meat, you get this curious oily substance that is a lot like chocolate. It is brown and roasty, sure, but it melts in your hand and freezes solid at room temperature. It tastes like coffee, lightly-burnt popcorn, and, yes, chocolate. Basically, it&#8217;s like an alt-nutella that you can make from squirrel-discarded lumps you can just pick up off the ground. <a href="https://edibleeastbay.com/2015/08/16/roasted-bay-nuts/">It&#8217;s a thing</a> (and probably has been a thing around here for the last ten thousand years).</p><p>Acorns are a thing too, and they are even more abundant (in masting years) and quite a bit more useful too. But, I didn&#8217;t name my service after acorns, so I&#8217;ll scale back to the more subtle and let-me-introduce-you nature of the California bay.</p><p>I haven&#8217;t said anything about LLMs, agents, skills, sandboxes, or security reviews, labor relations, or even anarchist philosophy. We&#8217;ll get to those aspects of BayLeaf in another post. For today, let&#8217;s say that BayLeaf does offer something useful to those who are patient and curious to build skill and experience using it. It&#8217;s not the revolutionary future of anything. It&#8217;s the already-present, a pretty normal and, in the big picture, moderately useful thing you could learn about. Beyond individual use, there&#8217;s another level that we, the higher education community, might find useful too, but we can take our time on that. There&#8217;s no rush.</p><p>Thanks for your attention. This has been a test of the BayLeaf Blog publishing system. (First post.)</p>]]></content:encoded></item></channel></rss>