<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.4">Jekyll</generator><link href="https://nikodunk.com/rss.xml" rel="self" type="application/atom+xml" /><link href="https://nikodunk.com/" rel="alternate" type="text/html" /><updated>2026-07-30T19:55:44+00:00</updated><id>https://nikodunk.com/rss.xml</id><title type="html">DUNK | Writing</title><entry><title type="html">Pretty, Performant Unix</title><link href="https://nikodunk.com/2026-07-15-pretty-unix" rel="alternate" type="text/html" title="Pretty, Performant Unix" /><published>2026-07-15T15:00:00+00:00</published><updated>2026-07-15T15:00:00+00:00</updated><id>https://nikodunk.com/pretty-unix</id><content type="html" xml:base="https://nikodunk.com/2026-07-15-pretty-unix"><![CDATA[<p>Similar to my decade-late <a href="/a-node-js-developer-discovers-rails">discovery of Ruby on Rails</a>, I recently discovered Elementary OS which is also a piece of often-overlooked technology from the 2007 technology era. This is a slightly edited version of a thank you post on their Reddit.</p>

<p>Just paid for and installed Elementary after being a Linux user for a decade. I was looking for something more polished that would stop me tinkering, and force me to focus on what I’m building and making money and life (I usually have had this experience owning macs, but love my Framework hardware).</p>

<p>I had never considered Elementary before due to it being on an Ubuntu LTS base. What changed? Over the last few years Flatpak + Homebrew Linux + distrobox containers became central to my workflow, so it doesn’t matter what the OS is based on and I can just pick something pretty that works well! It’s “pretty unix” as Paul Graham called it in an <a href="https://paulgraham.com/mac.html">essay</a> that stuck with me.</p>

<blockquote>
  <p>They make a new kind of computer that’s as well designed as a Bang &amp; Olufsen stereo system, and underneath is the best Unix machine you can buy.</p>
</blockquote>

<p>I installed Elementary on my Framework laptop. I also love how unlike every other Linux distribution, you don’t add another logo underneath the “Framework” logo on the bootsplash - such thoughtful minimalism.</p>

<p>Everything works really well and is integrated nicely. The system is also crazy memory efficient and snappy. I came from the Universal Blue / Bazzite ecosystem and loved the worry-free, automatic updates which also exist on Elementary since I leave the underlying system untouched and updates are applied automatically.</p>

<p>I was using Bazzite before but my OS was just too exciting as described above. I also like how Elementary is backed by a company and is more likely to (and has already been) long-lived, vs. a project that relies solely on free labor.</p>

<p>Thank you for building this, Elementary! You have a new fan! Elementary OS in 2026 is a great common-sense balance between openness, while still being aesthetic and allowing me to get work done.</p>

<p><img src="/assets/pretty-unix/elementary-screenshot.jpg" alt="" /></p>]]></content><author><name></name></author><summary type="html"><![CDATA[Similar to my decade-late discovery of Ruby on Rails, I recently discovered Elementary OS which is also a piece of often-overlooked technology from the 2007 technology era. This is a slightly edited version of a thank you post on their Reddit.]]></summary></entry><entry><title type="html">Swarm logic for batteries</title><link href="https://nikodunk.com/2026-06-06-swarm-logic" rel="alternate" type="text/html" title="Swarm logic for batteries" /><published>2026-07-06T15:00:00+00:00</published><updated>2026-07-06T15:00:00+00:00</updated><id>https://nikodunk.com/swarm-logic</id><content type="html" xml:base="https://nikodunk.com/2026-06-06-swarm-logic"><![CDATA[<p><img src="/assets/swarms/pelicans-on-ocean-beach-2.jpg" alt="" /></p>

<p><a href="https://en.wikipedia.org/wiki/Swarm_intelligence">Swarm logic (or swarm intelligence)</a> in software is a design approach where complex, intelligent behavior emerges from many simple agents following simple local rules — with no central controller coordinating them.</p>

<p>Each agent only knows about its immediate environment and neighbors, yet the collective produces sophisticated global behavior. The “intelligence” lives in the system, not any individual.</p>

<p>A problem we had with initial versions of <a href="https://pilaenergy.com">Pila Energy</a> was that our leader/coordinator would be reset or knocked offline, leading to the followers becoming “dumb” batteries again. This is obviously not acceptable for a resiliency product. We also don’t want to move the controller to the cloud, because we believe that your hardware should belong to you, no matter whether our cloud is accessible or not.</p>

<p>One day when surfing at Ocean Beach, a V-formation of pelicans flew overhead. From my low vantage point over the water, I saw how one pelican peeled off and the others seamlessly closed the gap in the V. I was reminded of how resilient and simple swarm logic can be. Each bird follows 3 simple rules: stay close, avoid collision, match direction. This leads to the V, and makes the system very resilient.</p>

<p>This “leaderless” logic became known as the “pelican logic”, and the swarm of equals is now implemented for Pila’s mesh aggregation and decisioning. This makes our whole-home battery system act as a whole whether you’ve decided to pair with our cloud or not, and dynamically adapts even if certain batteries get moved or become unavailable.</p>

<hr />

<p>Note: LA times <a href="https://www.latimes.com/california/story/2021-04-29/uc-san-diego-pelicans">covered</a> how pelicans glide above the ocean, but I stole this photo from <a href="https://www.agoodplace.co.uk/pelicans-nicaragua">Ian Wood</a>.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Flatcar Container Linux + Dokploy make for a great DIY Heroku</title><link href="https://nikodunk.com/2025-06-10-DIY-Serverless-(coreOS-+-dokploy)" rel="alternate" type="text/html" title="Flatcar Container Linux + Dokploy make for a great DIY Heroku" /><published>2026-05-24T15:00:00+00:00</published><updated>2026-05-24T15:00:00+00:00</updated><id>https://nikodunk.com/DIY-Serverless-(coreOS-+-dokploy)</id><content type="html" xml:base="https://nikodunk.com/2025-06-10-DIY-Serverless-(coreOS-+-dokploy)"><![CDATA[<p>The hosting landscape ranges from low-cost, high-maintenance to high-cost, low-maintenance solutions. The sequence is roughly as in the image below: full-on VPS =&gt; Heroku platform-as-a-service =&gt; containers services like Lightsail =&gt; serverless functions like on Vercel, Firebase, Cloudflare Workers.</p>

<p><img src="/assets/flatcar-dokploy/landscape.jpg" alt="" /></p>

<p>I’d like to propose a self-hosted PaaS as a great middle-ground. By combining two open source projects (Flatcar, Dokploy) I run 4 projects on a $5 VPS with all of the conveniences of Heroku.</p>

<h2 id="the-problem">The Problem</h2>

<p>Problem 1: Maintenance - Renting a cheap VPS from someone like Hetzner or Digital Ocean is great. But you need to know a minimum about server maintenance and backups. What about OS updates and security of the underlying OS? What if something goes wrong with an automatic upgrade? How about closing and opening the right ports. Don’t have a password login! One of the main benefits of “serverless” like Firebase Functions or “container platforms” like AWS Lightsail or Fargate is that you don’t need to babysit an Ubuntu installation with automatic upgrades and OS updates.</p>

<p>Problem 2: Costs slowly add if you add a VPS per project, especially if they’re continually running even when not needed. If you have a few projects kicking around that bring in minimal revenue like I do, it’s useful to not pay a lot of overhead for a Heroku server each. Container services fall into this category too - 5+ bucks a month per container indefinitely makes you cull periodically. On the serverless function end of the spectrum, your usage can unexpectedly spike from an HN post and you’ll get billed for it (Tweets documenting this are wide-spread). You also get walled into whichever walled garden is currently cool (Vercel, Firebase before it, etc).</p>

<h1 id="a-solution">A Solution</h1>

<p>A locked-down, automatically-updating container host OS like <a href="https://www.flatcar.org/">Flatcar Container Linux</a> or <a href="https://fedoraproject.org/coreos">Fedora CoreOS</a> solves most of the server maintenance problems for you. You install it once, close all but the relevant ports in the cloud provider’s firewall, and it’s pretty much set-and-forget. These installs are only accessible over your SSH key by default. At its best, Flatcar provides a lot of the low-maintenance platform of PaaS, with all of the affordability and vendor neutrality of a VPS. But in comparison to running Ubuntu with unattended upgrades we have atomic rollbacks which are the “killer feature” here. If an update fails, it rolls back to the previous partition. Ubuntu should mostly be fine, but when it isn’t it requires manual maintenance. And you’ll always be on vacation when the manual maintenance becomes necessary.</p>

<p>So we have an affordable, reliable server with predictable and low costs. We can put multiple projects on it (as we’ll do in the next paragraph), adding another project doesn’t add more marginal cost overhead until you hit the limits of the VPS, and then scales slowly. Cost is solved.</p>

<p><img src="/assets/flatcar-dokploy/flatcar.jpg" alt="" /></p>

<p>Convenience is not solved yet though: deploying applications with raw Docker still takes focus away from working on your project itself. What about all of the sweet hassle-free features from PaaS like deploy from git, easy database deploys, and - you know - not having to mess around with Kubernetes for your side project? Here’s where the second move comes in: <a href="https://dokploy.com">Dokploy</a>. Dokploy is your CI, can put as many projects on your server as you like, builds containers from git, helps you debug logs, is an env manager, and provides UI around container orchestration. It’s Heroku, but open-source. You only access Dokploy through https, meaning you can close all SSH and management ports and remove a whole class of (ssh, access) attacks. You back up your relevant databases to an external storage service (best-case S3 on a separate cloud provider), to make things very resilient. Note that for a single-node setup like I run, there will be a brief window of downtime during OS updates unless you configure a reboot strategy.</p>

<p><img src="/assets/flatcar-dokploy/dokploy.jpg" alt="" /></p>

<p>Dokploy itself runs in a container, all your projects and databases do too, and the underlying OS automatically updates (with rollbacks) forever. I think modifying a VPS into a “container service” in this way is the sweet spot of convenience and cost: load that VPS with a bomb-proof no-config OS like coreOS, and put Dokploy on it for a no-fuss container service UI. It gives you the hassle-free experience of a Heroku-like platform, but with the cost and independence of a VPS.</p>

<p>This way you can have your cake and eat it too: most of the benefits of serverless, with most of the benefits of running your own VPS.</p>

<p><img src="/assets/flatcar-dokploy/dokploy-2.jpg" alt="" /></p>

<hr />

<p>Let’s implement this Flatcar + Dokploy stack on Hetzner in a quick example.</p>

<p>Go to Hetzner and sign up for an account.</p>

<p><img src="/assets/flatcar-dokploy/hetzner.jpg" alt="" /></p>

<p>Add an SSH key.</p>

<p>Some VPSs like EC2 or Vultr support Flatcar out of the box. To get an image on my preferred Hetzner, you need to upload the Flatcar image to Hetzner yourself. We’ll do so with the <a href="https://www.flatcar.org/docs/latest/installing/cloud/hetzner/">officially documented</a> few lines below:</p>

<p>I downloaded hcloud-upload-image binary, then in the folder with hcloud-upload-image, ran:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">export </span><span class="nv">HCLOUD_TOKEN</span><span class="o">=</span>&lt;your-token&gt;
<span class="nb">export </span><span class="nv">CHANNEL</span><span class="o">=</span>current
<span class="nb">export </span><span class="nv">VERSION</span><span class="o">=</span>current

./hcloud-upload-image upload <span class="se">\</span>
 <span class="nt">--architecture</span><span class="o">=</span>x86 <span class="se">\</span>
 <span class="nt">--compression</span><span class="o">=</span>bz2 <span class="se">\</span>
 <span class="nt">--image-url</span><span class="o">=</span>https://<span class="k">${</span><span class="nv">CHANNEL</span><span class="k">}</span>.release.flatcar-linux.net/amd64-usr/<span class="k">${</span><span class="nv">VERSION</span><span class="k">}</span>/flatcar_production_hetzner_image.bin.bz2 <span class="se">\</span>
 <span class="nt">--labels</span> <span class="nv">os</span><span class="o">=</span>flatcar,flatcar-channel<span class="o">=</span><span class="k">${</span><span class="nv">CHANNEL</span><span class="k">}</span> <span class="se">\</span>
  <span class="nt">--description</span> flatcar-<span class="k">${</span><span class="nv">CHANNEL</span><span class="k">}</span><span class="nt">-x86</span>
</code></pre></div></div>

<p><br /></p>

<p><img src="/assets/flatcar-dokploy/hetzner-1.jpg" alt="" /></p>

<p>Create a server from this image you uploaded, and SSH into it. Note we went slightly off of the recommended path here and didn’t add an Ignition file. The main thing an Ignition file does is adds your SSH key to the OS image. But Hetzner adds this into your userdata already, so I found this unnecessary. You can also start your containers with an Ignition file, but that’s cumbersome and somewhat non-standard IMO, and that’s what we have Dokploy for. So we skipped the Ignition file. Feel free to add one if you need it - either through the Hetzner CLI or paste it into “cloud init” when creating a new image from your snapshot.</p>

<p><img src="/assets/flatcar-dokploy/hetzner-2.jpg" alt="" /></p>

<p>Welcome to your fresh, auto-updating instance of Flatcar!</p>

<p><img src="/assets/flatcar-dokploy/hetzner-3.jpg" alt="" /></p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ssh core@&lt;your ip&gt; <span class="c"># we'll lock this down real soon don't worry</span>
</code></pre></div></div>

<p><br /></p>

<p>Now let’s install Dokploy.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>systemctl <span class="nb">enable </span>docker <span class="c"># auto-start Docker on reboot (as we didn't define this in Ignition). From there, Dokploy will do the rest.</span>
<span class="nb">sudo</span> <span class="nt">-i</span> <span class="c"># one-time, for root</span>
curl <span class="nt">-sSL</span> https://dokploy.com/install.sh | sh
</code></pre></div></div>

<p><img src="/assets/flatcar-dokploy/hetzner-4.png" alt="" /></p>

<p>That’s it! Go to your server’s IP at port 3000 and set up Dokploy, close your ports, and be on your merry way!</p>

<p>You now have an easy to use UI on top of an automatically-updating immutable OS.</p>

<p><img src="/assets/flatcar-dokploy/dokploy-2.jpg" alt="" /></p>

<p><img src="/assets/flatcar-dokploy/hetzner-5.png" alt="" /></p>

<p>Assign the Dokploy UI to a subdomain or domain, and then you can close all the ports except for <code class="language-plaintext highlighter-rouge">80</code> for http and <code class="language-plaintext highlighter-rouge">443</code> for https, which will let those pesky bots bite their teeth out when they’re sniffing for our non-standard SSH port. Access everything you need through the web dashboard. You shouldn’t really need to check in much on the underlying linux system again. You now have an auto-updating and sealed off host, with an auto-updating container deployment system, itself running in a container.</p>

<hr />

<p>Caveat: if your traffic is super intermittent and spikey go for serverless functions. If you’re just starting out go with Heroku.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[The hosting landscape ranges from low-cost, high-maintenance to high-cost, low-maintenance solutions. The sequence is roughly as in the image below: full-on VPS =&gt; Heroku platform-as-a-service =&gt; containers services like Lightsail =&gt; serverless functions like on Vercel, Firebase, Cloudflare Workers.]]></summary></entry><entry><title type="html">Network resilience vs. grid resilience</title><link href="https://nikodunk.com/2025-06-13-networks-vs-grid-reslience" rel="alternate" type="text/html" title="Network resilience vs. grid resilience" /><published>2025-06-17T15:00:00+00:00</published><updated>2025-06-17T15:00:00+00:00</updated><id>https://nikodunk.com/networks-vs-grid-reslience</id><content type="html" xml:base="https://nikodunk.com/2025-06-13-networks-vs-grid-reslience"><![CDATA[<p><img align="left" src="/assets/network-vs-grid-resilience/header.jpg" class="responsive-left" /> 
At <a href="https://pilaenergy.com/blog/network-vs-energy-resilience">Pila</a>, our immediate mission is to bring 21st-century energy resilience to every household and retire the gas generator for good. Distributing batteries throughout buildings for modern energy security is the first step. But as the grid breaks into a billion of these intelligent, independent systems, Pila’s far more ambitious goal is also to help define the systems and protocols to ensure they all work together. That means enabling batteries in homes, businesses, and communities to automatically work together as one seamless whole. Through auto-meshing and embedded local intelligence, we can turn individual appliances into an ultra-resilient, distributed energy network.</p>

<p><strong>The status quo</strong></p>

<p><img align="left" src="/assets/network-vs-grid-resilience/enel-x-juicebox.jpg" class="responsive-left" /> 
The U.S. electric grid, as it stands today, runs largely on old-school communication networks - and in some ways, that’s a blessing in disguise. While intelligence and connectivity can unlock enormous potential, they also come with trade-offs: Too often, they introduce brittle complexity. “Smart” yet inflexible hardware often ages quickly. And they can introduce new forms of risk from software vulnerabilities and excessive dependency on internet access to exposure to unstable supply chains. We’ve already seen how this can go wrong -  when <a href="https://www.canarymedia.com/articles/ev-charging/enel-x-way-abandoned-its-us-ev-charging-customers-what-happens-next">Enel X deprecated the software</a> that kept JuiceBox EV chargers running, they left 25,000 of commercial users suddenly unsupported.</p>

<p>In the world of energy, those kinds of failures are more than inconvenient - they’re downright dangerous. When a smart speaker fails, <a href="https://arstechnica.com/gadgets/2024/08/app-redesign-blowback-will-cost-sonos-up-to-30-million-ceo-says/">the music stops</a>. But when a smart grid component fails, people lose power. Resilience isn’t optional. And yet, too much of today’s “smart” infrastructure depends on <a href="https://www.jeffgeerling.com/blog/2025/i-wont-connect-my-dishwasher-your-stupid-cloud">unnecessary cloud servers</a>, <a href="https://arstechnica.com/gadgets/2024/12/nightmare-zipcar-outage-is-a-warning-against-complete-app-dependency/">mobile apps</a>, <a href="https://arstechnica.com/gadgets/2024/12/startup-will-brick-800-emotional-support-robot-for-kids-without-refunds/">vendor APIs</a>, or <a href="https://arstechnica.com/gadgets/2025/04/google-ending-support-for-older-nest-thermostats-will-stop-selling-nests-in-europe/">firmware updates</a> to <a href="https://arstechnica.com/gaming/2024/11/firmware-hacks-are-rejuvenating-spotifys-car-thing-before-the-company-bricks-it/">function</a> <a href="https://arstechnica.com/gadgets/2024/02/leap-year-glitch-broke-self-pay-pumps-across-new-zealand-for-over-10-hours/">properly</a>. That’s not good enough.</p>

<p><strong>Where we need to go</strong></p>

<p><img align="left" src="/assets/network-vs-grid-resilience/pila-mesh.png" class="responsive-left" /> 
<em>We believe the intelligence layer should be just as resilient as the physical grid itself<strong>.</strong></em> It can’t be the weakest link. Some consumer products that have paved the way for our vision include <a href="https://ollama.com/">Ollama</a>, <a href="https://www.home-assistant.io/">Home Assistant</a>, <a href="https://www.youtube.com/watch?app=desktop&amp;v=eIcZZX10pa4">Trmnl</a>, <a href="https://us.shelly.com/">Shelly</a>, and the <a href="https://www.tesla.com/support/energy/solar-inverter/connecting-to-tesla-solar-inverter">Powerwall</a> and the <a href="https://www.youtube.com/watch?v=HhqD-ljcD6I">original Nest</a> (before Google made Home app obligatory). These products can function without the internet and “official apps” from the app store.</p>

<p>At Pila, we’re building infrastructure-grade, local-first intelligence that runs at the edge, continues working when cloud services go down, and doesn’t rely on remote updates to stay useful. On-device processing and local networking - paired with optional local APIs, Home Assistant integration, and more - ensure your microgrid keeps running at full functionality, no matter what happens. The energy system must remain <a href="https://pilledtexts.com/why-i-use-a-17-year-old-thinkpad/">anti-fragile</a>. Of course there’s a tremendous amount of value added with an internet connection - from real-time power price signals to weather data to convenient remote control from your smartphone. But this value can exist as an optional benefit atop the core functionality, not a mission-critical failure point.</p>

<p>If AI becomes embedded into everything, it too should work local-first and not require a cloud. We believe it belongs on the edge - close to the energy assets themselves, designed to operate and coordinate autonomously, and built to outlast the hardware it runs on. The future grid won’t rely on fragile, centralized control. It will emerge from billions of resilient, intelligent systems at the edge.</p>

<style>
  @media (min-width: 640px) {
    .responsive-left {
      max-width: 60%;
      margin-right: 10px;
    }
  }

</style>]]></content><author><name></name></author><summary type="html"><![CDATA[At Pila, our immediate mission is to bring 21st-century energy resilience to every household and retire the gas generator for good. Distributing batteries throughout buildings for modern energy security is the first step. But as the grid breaks into a billion of these intelligent, independent systems, Pila’s far more ambitious goal is also to help define the systems and protocols to ensure they all work together. That means enabling batteries in homes, businesses, and communities to automatically work together as one seamless whole. Through auto-meshing and embedded local intelligence, we can turn individual appliances into an ultra-resilient, distributed energy network.]]></summary></entry><entry><title type="html">New thoughts June 2025</title><link href="https://nikodunk.com/2025-06-12-New-thoughts-June-2025" rel="alternate" type="text/html" title="New thoughts June 2025" /><published>2025-06-12T15:00:00+00:00</published><updated>2025-06-12T15:00:00+00:00</updated><id>https://nikodunk.com/New-thoughts-June-2025</id><content type="html" xml:base="https://nikodunk.com/2025-06-12-New-thoughts-June-2025"><![CDATA[<ul>
  <li>San Francisco seasons are like the expansion pack to the normal seasons. The base game had sun, snow, leaves &amp; bloom. The developers were pushed to come up with new ones, and the best they could come up with is rain wind fog and another sun (but less hot).</li>
  <li>We just got a puppy. We’re currently the uncool parents with our puppy. We are learning to not be so distracted that we ignore our adult friends at parties, like I’ve complained about (human) parents doing to me at parties for so long.</li>
  <li>Open source is like busking, closed source is like concerts.</li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[San Francisco seasons are like the expansion pack to the normal seasons. The base game had sun, snow, leaves &amp; bloom. The developers were pushed to come up with new ones, and the best they could come up with is rain wind fog and another sun (but less hot). We just got a puppy. We’re currently the uncool parents with our puppy. We are learning to not be so distracted that we ignore our adult friends at parties, like I’ve complained about (human) parents doing to me at parties for so long. Open source is like busking, closed source is like concerts.]]></summary></entry><entry><title type="html">You are what you measure (even in open source)</title><link href="https://nikodunk.com/2025-06-10-You-are-what-you-measure" rel="alternate" type="text/html" title="You are what you measure (even in open source)" /><published>2025-06-09T15:00:00+00:00</published><updated>2025-06-09T15:00:00+00:00</updated><id>https://nikodunk.com/You-are-what-you-measure</id><content type="html" xml:base="https://nikodunk.com/2025-06-10-You-are-what-you-measure"><![CDATA[<p>Transparency in open-source software</p>

<p>A lot of effort is wasted in volunteering. Especially when people are giving away their time for free, I think we need to be just as careful as what we point their time at as if they were charging for their time.</p>

<p>For solo projects, there’s an additional layer: it’s fun to write software. Who cares if anyone’s using it? But there might also be another problem that would be both fun to write software for AND people would actually use.</p>

<p>Closed projects do this to prove their value (say quarterly results or even on their landing page), it’s interesting that open ones often don’t. Capitalism has come up with a great way to not waste money and effort on things no one uses: we track what’s being used, and how, and inform time investment based on that. Because time is free when we’re building the commons, why measure? I think this is backwards.</p>

<p>Universal blue project - a downstream project of Fedora - recently started measuring very precisely who is using what. More interestingly, the same tools helped me shed light on who was using what of the upstream. And the numbers were <a href="https://github.com/ublue-os/countme">surprising</a>.</p>

<p>I think we need to track who’s using what in the commons, so that less effort is wasted. If you have volunteers, you’re <em>more</em> obligated to measure, not less. Let’s use the tools of capitalism to improve the commons.</p>

<p><img src="/assets/you-are-what-you-measure/growth_global.svg" alt="" /></p>

<p><img src="/assets/you-are-what-you-measure/growth_upstream.svg" alt="" /></p>]]></content><author><name></name></author><summary type="html"><![CDATA[Transparency in open-source software]]></summary></entry><entry><title type="html">A beautiful description from surfline</title><link href="https://nikodunk.com/2025-06-03-a-beautiful-description-from-surfline" rel="alternate" type="text/html" title="A beautiful description from surfline" /><published>2025-06-03T15:00:00+00:00</published><updated>2025-06-03T15:00:00+00:00</updated><id>https://nikodunk.com/a-beautiful-description-from-surfline</id><content type="html" xml:base="https://nikodunk.com/2025-06-03-a-beautiful-description-from-surfline"><![CDATA[<p>Ocean Beach has many, many moods, from windy spring, to gray summer, manic ecstasy of clear blue fall days to the doom and gloom of stormy winter.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Ocean Beach has many, many moods, from windy spring, to gray summer, manic ecstasy of clear blue fall days to the doom and gloom of stormy winter.]]></summary></entry><entry><title type="html">How to lock a Subaru Crosstrek with the Valet key (for surfing or swimming)</title><link href="https://nikodunk.com/2024-10-29-crosstrek-valet-key%20copy" rel="alternate" type="text/html" title="How to lock a Subaru Crosstrek with the Valet key (for surfing or swimming)" /><published>2024-10-29T15:00:00+00:00</published><updated>2024-10-29T15:00:00+00:00</updated><id>https://nikodunk.com/crosstrek-valet-key%20copy</id><content type="html" xml:base="https://nikodunk.com/2024-10-29-crosstrek-valet-key%20copy"><![CDATA[<p>It’s taken me 4 years of owning a Subaru Crosstrek to work out how to take my valet key surfing without putting the fob into a radio bag (so that the fob in the car doesn’t just keep the car unlocked). This is a key feature for people who transport water sports gear with their Subaru (as their ads would like to suggest they’re built for), yet couldn’t find it in the manual, on Youtube, or online.</p>

<p>Though extremely well-hidden, this feature does exist. I eventually found <a href="https://youtu.be/rvUemRS2g2M?si=x0uTz6CE4sYLFrCd&amp;t=415s">this Youtube video</a> - the only place I ever have seen it mentioned.</p>

<ul>
  <li>You hold the lock button</li>
  <li>you then simultaneously double-press (!) the unlock button (Subaru starcluster logo)</li>
  <li>Your key fob is now off, you can remove the valet key, and place your fob into the car without a radio bag.</li>
  <li>You press any button on the fob to turn the fob back on.</li>
</ul>

<p>Happy surfing.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[It’s taken me 4 years of owning a Subaru Crosstrek to work out how to take my valet key surfing without putting the fob into a radio bag (so that the fob in the car doesn’t just keep the car unlocked). This is a key feature for people who transport water sports gear with their Subaru (as their ads would like to suggest they’re built for), yet couldn’t find it in the manual, on Youtube, or online.]]></summary></entry><entry><title type="html">To fork or not to fork</title><link href="https://nikodunk.com/2024-08-28-node-gnome-cosmic" rel="alternate" type="text/html" title="To fork or not to fork" /><published>2024-08-28T15:00:00+00:00</published><updated>2024-08-28T15:00:00+00:00</updated><id>https://nikodunk.com/node-gnome-cosmic</id><content type="html" xml:base="https://nikodunk.com/2024-08-28-node-gnome-cosmic"><![CDATA[<p>In general, it seems like a bad idea to “start over from a clean slate” in Open Source software. More wood behind fewer arrows seems like the way to go to avoid fragmentation, bike shedding and re-inventing wheels.</p>

<p>But one of the best things to happen to Node in the past few years was Bun and Deno. Node’s pace of improvement has <a href="https://www.youtube.com/watch?v=8oU_TTbG-O8">increased dramatically</a> once it got some real competition to be inspired by (.env support, test runner, watch mode, glob support, top-level await, require/ESM cross-import, single file bundle, Typescript support out of box, SqlLite, window shim, and stable fetch).</p>

<p>While I like the Gnome desktop project, they do sometimes feel a little slow in their rate of innovation &amp; their openness to innovation. Merge requests that everyone’s pretty much on board with can be open for years. Maybe Cosmic desktop’s “fork” (technically re-build) and a little competition will speed them up like Node was sped up by Bun and Deno!</p>]]></content><author><name></name></author><summary type="html"><![CDATA[In general, it seems like a bad idea to “start over from a clean slate” in Open Source software. More wood behind fewer arrows seems like the way to go to avoid fragmentation, bike shedding and re-inventing wheels.]]></summary></entry><entry><title type="html">Self-hosting without being distracted by devops</title><link href="https://nikodunk.com/2024-08-15-self-hosting-the-easy-way" rel="alternate" type="text/html" title="Self-hosting without being distracted by devops" /><published>2024-08-15T15:00:00+00:00</published><updated>2024-08-15T15:00:00+00:00</updated><id>https://nikodunk.com/self-hosting-the-easy-way</id><content type="html" xml:base="https://nikodunk.com/2024-08-15-self-hosting-the-easy-way"><![CDATA[<p>Ever since Heroku turned off their free tier, many have been at a loss where to host small, hobby, or archived projects. Paying $12/mo for each one of them quickly adds up. I dislike modern Heroku alternatives like Render, Fly.io and others as they cost as much as Heroku, but are not as ergonomic in my opinion.</p>

<p>Like many, I’ve recently discovered how far along “Heroku-like” solutions like Appliku and Coolify have come that add a layer of ergonomics onto a raw server/VPS (or even a Raspberry Pi if that floats your boat).</p>

<p>Coolify lets me get the benefits of self-hosting my sites and apps on a VPS (cost savings, freedom, cost control), while still getting all the benefits of a stable, abstracted-away platform like Heroku. It allows me to focus on building apps and features without fussing too much about ports, certificates, containerization (god forbid I go near a Kubernetes timesink). </p>

<p>There’s two steps involved:</p>

<ol>
  <li>Sign up at <a href="https://hetzner.com">Hetzner.com</a> (I used an arm instance) for $3/mo, and self-updating Fedora CoreOS (or normal Fedora though you’ll need to set it to auto-update)</li>
  <li>Install <a href="https://coolify.io/self-hosted">Coolify</a> with the one-liner and start donating $10/mo to their project.</li>
</ol>

<p>There is no step 3 - start deploying apps in docker containers (or more Heroku-like Nixpacks if you can get them to work) to your new small server. Follow a hardening tutorial and create snapshots of the server.</p>

<p>Coolify can create backups of your databases to the server itself (which you’ll have to download to local) or to S3. You can layer in as many apps as you want until memory runs thin. Most apps won’t see much traffic, and if you see spikes you can grow your instances or spin them out to a separate server (“VPS”). At 2 apps and 2 databases, I’m at 900mb/4096mb memory usage (including the OS).</p>

<p>I originally started researching solutions like <a href="https://kamal-deploy.org/">Kamal</a> and Dokku, but for me these are a step too far into the “distraction” of devops. I love devops, and I will happily bikeshed and optimize my servers all day without getting any profitable/valuable work done. I need to keep myself away from these these choices and abstract them away. I need a button to push that requires no setup. Coolify provides that button!</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Ever since Heroku turned off their free tier, many have been at a loss where to host small, hobby, or archived projects. Paying $12/mo for each one of them quickly adds up. I dislike modern Heroku alternatives like Render, Fly.io and others as they cost as much as Heroku, but are not as ergonomic in my opinion.]]></summary></entry></feed>