<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Julio Merino's corner on Julio Merino (jmmv.dev)</title><link>https://jmmv.dev/index.html</link><description>Recent content in Julio Merino's corner on Julio Merino (jmmv.dev)</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><managingEditor>julio@meroh.net (Julio Merino)</managingEditor><webMaster>julio@meroh.net (Julio Merino)</webMaster><copyright>Copyright 2004&#150;2026 Julio Merino</copyright><lastBuildDate>Tue, 17 Mar 2026 16:00:00 +0100</lastBuildDate><atom:link href="https://jmmv.dev/feed.xml" rel="self" type="application/rss+xml"/><item><title>I think AI is pushing me toward the AGPL</title><link>https://jmmv.dev/2026/03/ai-and-agpl-licensing.html</link><pubDate>Tue, 17 Mar 2026 16:00:00 +0100</pubDate><author>julio@meroh.net (Julio Merino)</author><guid>https://jmmv.dev/2026/03/ai-and-agpl-licensing.html</guid><description>&lt;p&gt;&lt;em&gt;Why agentic coding changes everything for the open-source craft and maintainership.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It has been two months since I&amp;rsquo;ve been using AI coding agents &amp;ldquo;for real&amp;rdquo;. In &lt;a href="https://jmmv.dev/2026/03/vibecoding-ticket-el.html"&gt;my previous article&lt;/a&gt;, I reflected on my experiment to vibe-code a full Emacs module from scratch. In there, I intentionally left one important question unanswered: what is the meaning and impact of agentic coding on the free software ecosystem we have all grown accustomed to?&lt;/p&gt;
&lt;p&gt;Right now, I have many thoughts but no good answers, and the reason is that the more I use these tools, the more I doubt my long-held beliefs about open-source licensing. While I&amp;rsquo;ve found that agentic coding makes me more productive&amp;mdash;provided I supervise the agents carefully, in some circumstances&amp;mdash;it also distances me from the act of coding itself, stripping away the pride of craftsmanship and thus the desire to publish code as open source.&lt;/p&gt;
&lt;p&gt;The bigger worry, however, is for the ecosystem as a whole. Let&amp;rsquo;s dive into what&amp;rsquo;s on my mind right now.&lt;/p&gt;</description><enclosure url="https://jmmv.dev/images/2026-03-17-agpl-cover-image.jpg" length="303323" type="image/jpeg"/></item><item><title>Reflections on vibecoding ticket.el</title><link>https://jmmv.dev/2026/03/vibecoding-ticket-el.html</link><pubDate>Fri, 06 Mar 2026 08:00:00 -0800</pubDate><author>julio@meroh.net (Julio Merino)</author><guid>https://jmmv.dev/2026/03/vibecoding-ticket-el.html</guid><description>&lt;p&gt;It has now been a month since &lt;a href="https://jmmv.dev/2026/02/one-week-with-claude-code.html"&gt;I started playing with Claude Code&lt;/a&gt; &amp;ldquo;for real&amp;rdquo; and by now I&amp;rsquo;ve mostly switched to Codex CLI: it is much snappier&amp;mdash;who would imagine that a &amp;ldquo;Rewrite in Rust&amp;rdquo; would make things tangibly faster&amp;mdash;and the answers feel more to-the-point than Claude&amp;rsquo;s to me.&lt;/p&gt;
&lt;p&gt;As part of this experiment, I decided to go all-in with the crazy idea of vibecoding a project without even looking at the code. The project I embarked on is an Emacs module to wrap a CLI ticket tracking tool designed to be used in conjunction with coding agents. Quite fitting for the journey, I&amp;rsquo;d say.&lt;/p&gt;
&lt;p&gt;In this article, I&amp;rsquo;d like to present a bunch of reflections on this relatively-simple vibecoding journey. But first, let&amp;rsquo;s look at what the Emacs module does.&lt;/p&gt;</description><enclosure url="https://jmmv.dev/images/2026-03-06-ticket.el.png" length="84434" type="image/jpeg"/></item><item><title>Grumpy Julio plays with CLI coding agents</title><link>https://jmmv.dev/2026/02/one-week-with-claude-code.html</link><pubDate>Mon, 09 Feb 2026 09:30:00 -0800</pubDate><author>julio@meroh.net (Julio Merino)</author><guid>https://jmmv.dev/2026/02/one-week-with-claude-code.html</guid><description>&lt;p&gt;&lt;em&gt;Or the more tired &amp;ldquo;One week with Claude Code&amp;rdquo;-type article.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s no secret that I&amp;rsquo;ve been grumpy about the new AI-based coding trend. I&amp;rsquo;ve been grumpy about the &amp;ldquo;push from above to use AI or else&amp;rdquo;. I&amp;rsquo;ve been grumpy about the eye-rolling hype I see on LinkedIn. I&amp;rsquo;ve been grumpy about being on the receiving end of vibe-coded PRs that over-engineer solutions to simple problems. I&amp;rsquo;ve been grumpy about the thought that we are about to see an amount of bloat like we have never imagined before.&lt;/p&gt;
&lt;p&gt;But, at the same time, I&amp;rsquo;ve been using LLMs to review my articles, to perform deep research, to generate cover pictures, and before last week, I had even dipped my toes into AI-based coding agents to help me with boring, repetitive tasks. And you know what? I see their promise of increased productivity, yet the amounts of slop I&amp;rsquo;ve witnessed make me skeptical and I have had little experience with coding agents myself to judge their promised usefulness.&lt;/p&gt;
&lt;p&gt;So&amp;hellip; surprise! Last weekend I decided to start a Claude Code subscription and, after spending a week on it, I am uncomfortably excited to use it more. How has this happened? Let&amp;rsquo;s take a look at how I ended here, the kinds of mini-projects I worked on throughout this past week, and the (semi-expected) downsides I encountered.&lt;/p&gt;</description><enclosure url="https://jmmv.dev/images/2026-02-09-cover-image.jpg" length="312568" type="image/jpeg"/></item><item><title>ssh-agent broken in tmux? I've got you!</title><link>https://jmmv.dev/2025/12/ssh-agent-switcher-release.html</link><pubDate>Fri, 26 Dec 2025 10:00:00 +0100</pubDate><author>julio@meroh.net (Julio Merino)</author><guid>https://jmmv.dev/2025/12/ssh-agent-switcher-release.html</guid><description>&lt;p&gt;A little over two years ago, I wrote an article titled &lt;a href="https://jmmv.dev/2023/11/ssh-agent-forwarding-and-tmux-done.html"&gt;SSH agent forwarding and tmux done right&lt;/a&gt;. In it, I described how SSH agent forwarding works&amp;mdash;a feature that lets a remote machine use the credentials stored in your local ssh-agent instance&amp;mdash;and how using a console multiplexer like tmux or screen often breaks it.&lt;/p&gt;
&lt;p&gt;In that article, I presented the &lt;a href="https://github.com/jmmv/ssh-agent-switcher/"&gt;ssh-agent-switcher&lt;/a&gt;: a program I put together in a few hours to fix this problem. In short, ssh-agent-switcher exposes an agent socket at a stable location (&lt;code&gt;/tmp/ssh-agent.${USER?}&lt;/code&gt; by default) and proxies all incoming credential requests to the transient socket that the sshd server creates on a connection basis.&lt;/p&gt;
&lt;p&gt;In this article, I want to formalize this project by presenting its first actual release, 1.0.0, and explain what has changed to warrant this release number. I put effort into creating this formal release because ssh-agent-switcher has organically gained more interest than I imagined as it is solving a real problem that various people have.&lt;/p&gt;</description><enclosure url="https://jmmv.dev/images/2025-12-26-ssh-agent-forwarding.jpg" length="261647" type="image/jpeg"/></item><item><title>From Azure Functions to FreeBSD</title><link>https://jmmv.dev/2025/12/from-azure-functions-to-freebsd.html</link><pubDate>Sun, 07 Dec 2025 12:00:00 -0800</pubDate><author>julio@meroh.net (Julio Merino)</author><guid>https://jmmv.dev/2025/12/from-azure-functions-to-freebsd.html</guid><description>&lt;p&gt;&lt;em&gt;Putting FreeBSD&amp;rsquo;s &amp;ldquo;power to serve&amp;rdquo; motto to the test.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;On Thanksgiving morning, I woke up to one of my web services being unavailable. All HTTP requests failed with a &amp;ldquo;503 Service unavailable&amp;rdquo; error. I logged into the console, saw a simplistic &amp;ldquo;Runtime version: Error&amp;rdquo; message, and was not able to diagnose the problem.&lt;/p&gt;
&lt;p&gt;I did not spend a lot of time trying to figure the issue out and I didn&amp;rsquo;t even want to contact the support black hole. Because&amp;hellip; there was something else hidden behind an innocent little yellow warning at the top of the dashboard:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Migrate your app to Flex Consumption as Linux Consumption will reach EOL on September 30 2028 and will no longer be supported.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I had known for a few weeks now, while trying to set up a new app, that all of my Azure Functions apps were on death row. The free plan I was using was going to be decommissioned and the alternatives I tried didn&amp;rsquo;t seem to support custom handlers written in Rust. I still had three years to deal with this, but hitting a showstopper error pushed me to take action.&lt;/p&gt;
&lt;p&gt;All of my web services are now hosted by the FreeBSD server in my garage with just a few tweaks to their codebase. This is their migration story.&lt;/p&gt;</description><enclosure url="https://jmmv.dev/images/2025-12-07-azure-vs-freebsd.jpg" length="144470" type="image/jpeg"/></item><item><title>BazelCon 2025 recap</title><link>https://jmmv.dev/2025/11/bazelcon-2025-recap.html</link><pubDate>Sun, 23 Nov 2025 17:00:00 -0800</pubDate><author>julio@meroh.net (Julio Merino)</author><guid>https://jmmv.dev/2025/11/bazelcon-2025-recap.html</guid><description>&lt;p&gt;It has been just over two years since I started Blog System/5, and that means it&amp;rsquo;s time for the now-usual(?) BazelCon 2025 trip report!&lt;/p&gt;
&lt;p&gt;The conference, arranged by the Linux Foundation, took place in Atlanta, GA, USA over three days: one for tutorials and two for the main talks. An extra hackathon day, organized by Aspect Build, followed. Unfortunately, a canceled flight meant I missed the tutorials, but I attended the rest of the events. As usual, it was a super-fun time to connect with old acquaintances and an energizing event that left me with plenty of new topics to research.&lt;/p&gt;</description><enclosure url="https://jmmv.dev/images/2025-11-23-bazelcon.jpg" length="570766" type="image/jpeg"/></item><item><title>You are holding BUILD files wrong</title><link>https://jmmv.dev/2025/09/you-are-holding-build-files-wrong.html</link><pubDate>Fri, 26 Sep 2025 09:00:00 -0700</pubDate><author>julio@meroh.net (Julio Merino)</author><guid>https://jmmv.dev/2025/09/you-are-holding-build-files-wrong.html</guid><description>&lt;p&gt;I&amp;rsquo;ve heard it from people new to Bazel but also from people very familiar with the Bazel ecosystem: BUILD files must go away. And they must go away because they are redundant: they just repeat the dependency information that&amp;rsquo;s already encoded in the in-code import/use statements.&lt;/p&gt;
&lt;p&gt;Hearing this from newcomers to Bazel isn&amp;rsquo;t surprising: after all, most newcomers are used to build tools that provide zero facilities to express dependencies across the sources of your own project. Hearing it from old-timers, however, is disappointing because it misses the point of what BUILD files can truly offer.&lt;/p&gt;</description><enclosure url="https://jmmv.dev/images/2025-09-26-you-are-holding-build-files-wrong.jpg" length="87330" type="image/jpeg"/></item><item><title>Bazel and glibc versions</title><link>https://jmmv.dev/2025/09/glibc-versions-bazel.html</link><pubDate>Fri, 19 Sep 2025 00:08:00 -0700</pubDate><author>julio@meroh.net (Julio Merino)</author><guid>https://jmmv.dev/2025/09/glibc-versions-bazel.html</guid><description>&lt;p&gt;Imagine this scenario: your team uses Bazel for fast, distributed C++ builds. A developer builds a change on their workstation, all tests pass, and the change is merged. The CI system picks it up, gets a cache hit from the developer&amp;rsquo;s build, and produces a release artifact. Everything looks green. But when you deploy to production, the service crashes with a mysterious error: &lt;code&gt;version 'GLIBC_2.28' not found&lt;/code&gt;. What went wrong?&lt;/p&gt;</description><enclosure url="https://jmmv.dev/images/2025-09-19-glibc-versions-bazel-cover-image.jpg" length="182393" type="image/jpeg"/></item><item><title>Trusting builds with Bazel remote execution</title><link>https://jmmv.dev/2025/09/bazel-remote-execution.html</link><pubDate>Fri, 12 Sep 2025 08:00:00 -0700</pubDate><author>julio@meroh.net (Julio Merino)</author><guid>https://jmmv.dev/2025/09/bazel-remote-execution.html</guid><description>&lt;p&gt;The previous article on &lt;a href="https://jmmv.dev/2025/09/bazel-remote-caching.html"&gt;Bazel remote caching&lt;/a&gt; concluded that using &lt;em&gt;just&lt;/em&gt; a remote cache for Bazel builds was suboptimal due to limitations in what can and cannot be cached for security reasons. The reason behind the restrictions was that it is impossible to safely reuse a cache across users. Or is it?&lt;/p&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll see how leveraging remote execution in conjunction with a remote cache opens the door to safely sharing the cache across users. The reason is that remote execution provides a trusted execution environment for actions, and this opens the door to cross-user result sharing. Let&amp;rsquo;s see why and how.&lt;/p&gt;</description><enclosure url="https://jmmv.dev/images/2025-09-12-bazel-remote-execution-cover-image.jpg" length="147776" type="image/jpeg"/></item><item><title>Understanding Bazel remote caching</title><link>https://jmmv.dev/2025/09/bazel-remote-caching.html</link><pubDate>Fri, 05 Sep 2025 08:30:00 -0700</pubDate><author>julio@meroh.net (Julio Merino)</author><guid>https://jmmv.dev/2025/09/bazel-remote-caching.html</guid><description>&lt;p&gt;The previous article on &lt;a href="https://jmmv.dev/2025/07/bazel-action-determinism.html"&gt;Bazel action non-determinism&lt;/a&gt; provided an introduction to actions: what they are, how they are defined, and how they act as the fundamental unit of execution in Bazel. What the article did not mention is that actions are &lt;em&gt;also&lt;/em&gt; the fundamental unit of caching during execution to avoid doing already-done work.&lt;/p&gt;
&lt;p&gt;In this second part of the series, I want to revisit the very basics of how Bazel runs actions and how remote caching (&lt;em&gt;not&lt;/em&gt; remote execution, because that&amp;rsquo;ll come later) works. The goal here is to introduce the &lt;strong&gt;Action Cache (AC)&lt;/strong&gt;, the &lt;strong&gt;Content Addressable Storage (CAS)&lt;/strong&gt;, how they play together, and then have some fun in describing the many ways in which it&amp;rsquo;s possible to poison such a cache in an accidental or malicious manner.&lt;/p&gt;</description><enclosure url="https://jmmv.dev/images/2025-09-05-bazel-remote-caching-cover-image.jpg" length="969844" type="image/jpeg"/></item><item><title>Bazel and action (non-) determinism</title><link>https://jmmv.dev/2025/07/bazel-action-determinism.html</link><pubDate>Mon, 21 Jul 2025 08:00:00 -0700</pubDate><author>julio@meroh.net (Julio Merino)</author><guid>https://jmmv.dev/2025/07/bazel-action-determinism.html</guid><description>&lt;p&gt;A key feature of Bazel is its ability to produce fast, reliable builds by caching the output of actions. This system, however, relies on a fundamental principle: build actions must be deterministic. For the most part, Bazel helps ensure that they are, but in the odd cases when they aren&amp;rsquo;t, builds can fail in subtle and frustrating ways, eroding trust in the build system.&lt;/p&gt;
&lt;p&gt;This article is the first in a series on Bazel&amp;rsquo;s execution model. Having explained these concepts many times, I want to provide a detailed reference before explaining a cool solution to a problem I recently developed at work. We will start with action non-determinism, then cover remote caching and execution, and finally, explore the security implications of these features.&lt;/p&gt;
&lt;p&gt;This first article explains what non-determinism is, how it manifests, and how you can diagnose and prevent it in your own builds. Let&amp;rsquo;s begin.&lt;/p&gt;</description><enclosure url="https://jmmv.dev/images/2025-07-21-bazel-action-determinism-cover.jpg" length="520669" type="image/jpeg"/></item><item><title>Lessons along the EndBOX journey</title><link>https://jmmv.dev/2025/06/endbox-journey-lessons.html</link><pubDate>Tue, 17 Jun 2025 09:00:00 -0700</pubDate><author>julio@meroh.net (Julio Merino)</author><guid>https://jmmv.dev/2025/06/endbox-journey-lessons.html</guid><description>&lt;p&gt;About six months ago, during one of my long runs, I had a wild idea: what if I built an OS disk image that booted straight into EndBASIC, bundled it with a Raspberry Pi, a display, a custom 3D-printed case, and made a tiny, self-contained retro BASIC computer? Fast-forward to today and such an idea exists in the form of &amp;ldquo;the EndBOX prototype&amp;rdquo;!&lt;/p&gt;
&lt;p&gt;This article isn&amp;rsquo;t the product announcement though&amp;mdash;&lt;a href="https://www.endbasic.dev/2025/06/unveiling-the-endbox.html"&gt;that&amp;rsquo;s elsewhere&lt;/a&gt;. What I want to do here is look back at the Blog System/5 articles I&amp;rsquo;ve written over the past months because what might have seemed like scattered topics were actually stepping stones toward the EndBOX.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s look at what I learned along the way and why, even though developing EndBASIC may sound like a &amp;ldquo;useless waste of time&amp;rdquo;, it&amp;rsquo;s a great playground and the source of inspiration for the articles you&amp;rsquo;ve come to appreciate here.&lt;/p&gt;</description><enclosure url="https://jmmv.dev/images/2025-06-17-endbox-journey-lessons.jpg" length="451795" type="image/jpeg"/></item><item><title>Whatever happened to sandboxfs?</title><link>https://jmmv.dev/2025/06/whatever-happened-to-sandboxfs.html</link><pubDate>Wed, 11 Jun 2025 10:00:00 -0400</pubDate><author>julio@meroh.net (Julio Merino)</author><guid>https://jmmv.dev/2025/06/whatever-happened-to-sandboxfs.html</guid><description>&lt;p&gt;Back in 2017&amp;ndash;2020, while I was on the Blaze team at Google, I took on a 20% project that turned into a bit of an obsession: &lt;a href="https://github.com/bazelbuild/sandboxfs"&gt;sandboxfs&lt;/a&gt;. Born out of my work supporting iOS development, it was my attempt to solve a persistent pain point that frustrated both internal teams and external users alike: Bazel&amp;rsquo;s &lt;a href="https://github.com/bazelbuild/bazel/issues/8230"&gt;poor sandboxing performance on macOS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;sandboxfs was a user-space file system designed to efficiently create virtual file hierarchies backed by real files&amp;mdash;a faster alternative to the &amp;ldquo;symlink forests&amp;rdquo; that Bazel uses to prepare per-action sandboxes. The idea was simple: if we could lower sandbox creation overhead, we could make Bazel&amp;rsquo;s sandboxing actually usable on macOS.&lt;/p&gt;
&lt;p&gt;Unfortunately, things didn&amp;rsquo;t play out as I dreamed. Today, sandboxfs is effectively abandoned, and macOS sandboxing performance remains an unsolved problem. In this post, I&amp;rsquo;ll walk you through why I built sandboxfs, what worked, what didn&amp;rsquo;t, and why&amp;mdash;despite its failure&amp;mdash;I still think the core idea holds promise.&lt;/p&gt;</description><enclosure url="https://jmmv.dev/images/2025-06-11-sandboxfs-cover-concept.png" length="7119929" type="image/jpeg"/></item><item><title>Beginning 3D printing</title><link>https://jmmv.dev/2025/05/beginning-3d-printing.html</link><pubDate>Wed, 28 May 2025 09:00:00 -0700</pubDate><author>julio@meroh.net (Julio Merino)</author><guid>https://jmmv.dev/2025/05/beginning-3d-printing.html</guid><description>&lt;p&gt;Hello readers and sorry for the 2-month radio silence. I&amp;rsquo;ve been pretty busy at work, traveling during school breaks, hacking on EndBASIC when time permitted, and&amp;hellip; as of two weeks ago&amp;hellip; tinkering with 3D printing as a complete beginner. So, today, I&amp;rsquo;d like to walk you through the latter because it has been a really fun and rewarding journey, albeit frustrating at times.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;d think that to use a 3D printer, you&amp;rsquo;d design a 3D model and then&amp;hellip; just&amp;hellip; send it to the printer? That&amp;rsquo;s almost true, but it ignores the realities of producing a physical object from an &amp;ldquo;abstract&amp;rdquo; model: when designing such a model, you need to take into account the limitations of 3D printing and you need to translate your model into something the 3D printer can understand via a process called &lt;em&gt;slicing&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s take a brief peek at all of these steps. I&amp;rsquo;ll assume you are a complete beginner like I am. The pictures I&amp;rsquo;ll show are all for a &amp;ldquo;first project&amp;rdquo; I did to remake the bars of a bird cage I have, as the birds had fully destroyed the previous ones.&lt;/p&gt;</description><enclosure url="https://jmmv.dev/images/2025-05-28-prusa-box.jpg" length="3411105" type="image/jpeg"/></item><item><title>The next generation of Bazel builds</title><link>https://jmmv.dev/2025/03/bazel-next-generation.html</link><pubDate>Mon, 24 Mar 2025 08:00:00 -0700</pubDate><author>julio@meroh.net (Julio Merino)</author><guid>https://jmmv.dev/2025/03/bazel-next-generation.html</guid><description>&lt;p&gt;Today marks the 10th anniversary of &lt;a href="https://blog.engflow.com/2024/10/01/birth-of-the-bazel/"&gt;Bazel&amp;rsquo;s public announcement&lt;/a&gt; so this is the perfect moment to reflect on what the next generation of build systems in the Bazel ecosystem may look like.&lt;/p&gt;
&lt;p&gt;I write this with the inspiration that comes from attending &lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:7295871444343734272/"&gt;the first ever conference on Buildbarn&lt;/a&gt;, one of the many remote execution systems for Bazel. In the conference, Ed Schouten, the creator of &lt;a href="https://github.com/buildbarn"&gt;Buildbarn&lt;/a&gt;, presented Bonanza: a skunkworks reimagination of Bazel for truly large builds.&lt;/p&gt;</description><enclosure url="https://jmmv.dev/images/2025-03-24-laptop-vs-datacenter.jpg" length="525451" type="image/jpeg"/></item></channel></rss>