<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://blog.polverini.com.ar/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blog.polverini.com.ar/" rel="alternate" type="text/html" /><updated>2026-07-25T14:32:44+00:00</updated><id>https://blog.polverini.com.ar/feed.xml</id><title type="html">guybrush.sh</title><subtitle>Notas técnicas, scripts y pensamientos random</subtitle><author><name>Guybrush Threepwood</name></author><entry xml:lang="en"><title type="html">Build Your Own PaaS with Coolify on Oracle Cloud (Always Free)</title><link href="https://blog.polverini.com.ar/build-your-own-paas-with-coolify-on-oracle-cloud.html" rel="alternate" type="text/html" title="Build Your Own PaaS with Coolify on Oracle Cloud (Always Free)" /><published>2026-07-25T00:00:00+00:00</published><updated>2026-07-25T00:00:00+00:00</updated><id>https://blog.polverini.com.ar/build-your-own-paas-with-coolify-on-oracle-cloud</id><content type="html" xml:base="https://blog.polverini.com.ar/build-your-own-paas-with-coolify-on-oracle-cloud.html"><![CDATA[<h1 id="️-prologue--before-setting-sail">🏴‍☠️ Prologue — Before Setting Sail</h1>

<blockquote>
  <p><em>“We didn’t build this ship to win a naval war. We built it to learn how to navigate.”</em>
— Guybrush Threepwood (probably)</p>
</blockquote>

<p>If you’ve ever tried to deploy an application to the cloud, you’ve probably gone through at least one of these services:</p>

<ul>
  <li>Render</li>
  <li>Railway</li>
  <li>Fly.io</li>
  <li>DigitalOcean</li>
  <li>Hetzner</li>
  <li>AWS</li>
  <li>Azure</li>
</ul>

<p>They all work great… until the first bill arrives.</p>

<p>Oracle Cloud has a rather interesting quirk: their <strong>Always Free</strong> program offers resources that, if used wisely, are enough to set up a surprisingly powerful personal lab.</p>

<p>In this tutorial we’ll use the <strong>Ampere A1 ARM</strong> instance, which for development and self-hosting typically offers excellent performance-to-power consumption ratio. Many modern projects (Docker, PostgreSQL, Redis, Nginx, Traefik, Python, Node.js, Go, Java, etc.) run perfectly on ARM and make excellent use of these resources.</p>

<p>For cases where Docker images still only exist for x86, we’ll add a small AMD machine as a secondary <em>worker</em>. That way we get the best of both worlds.</p>

<p>The idea isn’t just to install Coolify.</p>

<p>The idea is to understand how Oracle organizes its infrastructure:</p>

<ul>
  <li>Compartments.</li>
  <li>Virtual Networks.</li>
  <li>Firewall rules.</li>
  <li>Instances.</li>
  <li>Storage.</li>
  <li>SSH keys.</li>
  <li>Security.</li>
  <li>ARM and x86 architectures.</li>
</ul>

<p>Once you understand those pieces, deploying any other service becomes much easier.</p>

<hr />

<h1 id="️-security-notice-very-important">☠️ Security Notice (very important)</h1>

<p>This article is designed as a <strong>learning lab</strong>.</p>

<p>The goal is to have a deployment up and running in minutes to learn the platform and understand how all the components interact.</p>

<p>For that reason, we’ll temporarily expose some services to the Internet, such as:</p>

<ul>
  <li>Port <strong>22</strong> (SSH).</li>
  <li>Port <strong>8000</strong> (Coolify initial admin panel).</li>
</ul>

<p>This <strong>does not represent a recommended production configuration</strong>.</p>

<p>From a cybersecurity perspective, any unnecessarily exposed service increases your attack surface. In other words…</p>

<blockquote>
  <p>We’re leaving the ship’s door open while we learn where the cannons are.</p>
</blockquote>

<p>In a real-world environment, it would be advisable, among other measures, to:</p>

<ul>
  <li>Limit SSH access to known IP addresses.</li>
  <li>Disable password access and use SSH keys only.</li>
  <li>Close port 8000 after Coolify’s initial setup is complete.</li>
  <li>Publish only HTTP/HTTPS behind Traefik.</li>
  <li>Apply the principle of <strong>least privilege</strong>, exposing only strictly necessary services.</li>
  <li>Keep the operating system updated.</li>
  <li>Implement monitoring, backups, and audit logs.</li>
  <li>Consider using security lists, Network Security Groups (NSG), VPN, or a <em>bastion host</em> for administrative access.</li>
</ul>

<p>Throughout the blog we’ll be hardening this installation step by step.</p>

<p>This is not the ship’s final destination.</p>

<p>It’s just the first port where we’ll learn to navigate.</p>

<hr />

<h1 id="-guybrush-philosophy">🍌 Guybrush Philosophy</h1>

<p>In this series we don’t look for perfect infrastructure from day one.</p>

<p>We look to understand what each piece does.</p>

<p>First we make the ship float.</p>

<p>Then we learn to navigate.</p>

<p>And only at the end… we worry about the pirates.</p>

<hr />

<h1 id="️-mission-build-your-own-paas-with-coolify-on-oracle-cloud-always-free">🏴‍☠️ Mission: Build Your Own PaaS with Coolify on Oracle Cloud (Always Free)</h1>

<blockquote>
  <p><em>“While others pay 20 bucks a month for a VPS… we plunder Oracle’s cloud using Always Free. Welcome to Monkey Island.”</em></p>
</blockquote>

<p>After battling Oracle Cloud several times, I found a configuration that turned out really solid for running <strong>Coolify</strong> without spending a single doubloon.</p>

<p>The idea is to maximize the <strong>Always Free Tier</strong>, using the powerful Ampere ARM machine as the main server and, if any project needs x86 architecture, add a small AMD VM as a worker.</p>

<p>By the end of this tutorial you’ll have your own PaaS, with automatic HTTPS, deployments from Git, and enough space to host several personal projects.</p>

<hr />

<h1 id="-resource-distribution">⚓ Resource Distribution</h1>

<p><strong>Region</strong></p>

<p>📍 Chile Central (Santiago) — <code class="language-plaintext highlighter-rouge">sa-santiago-1</code></p>

<h2 id="main-server">Main Server</h2>

<table>
  <thead>
    <tr>
      <th>Resource</th>
      <th>Value</th>
      <th>Architecture</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>ARM Ampere A1</td>
      <td>—</td>
      <td>—</td>
    </tr>
    <tr>
      <td>CPU</td>
      <td>2 OCPU</td>
      <td>ARM</td>
    </tr>
    <tr>
      <td>RAM</td>
      <td>12 GB</td>
      <td>ARM</td>
    </tr>
    <tr>
      <td>Disk</td>
      <td>100 GB</td>
      <td>ARM</td>
    </tr>
  </tbody>
</table>

<p>This is where Coolify will live.</p>

<hr />

<h2 id="optional-worker">Optional Worker</h2>

<table>
  <thead>
    <tr>
      <th>Resource</th>
      <th>Value</th>
      <th>Architecture</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>AMD x86</td>
      <td>—</td>
      <td>—</td>
    </tr>
    <tr>
      <td>CPU</td>
      <td>1/8 OCPU</td>
      <td>x86</td>
    </tr>
    <tr>
      <td>RAM</td>
      <td>1 GB</td>
      <td>x86</td>
    </tr>
    <tr>
      <td>Disk</td>
      <td>50 GB</td>
      <td>x86</td>
    </tr>
  </tbody>
</table>

<p>Ideal for containers that still don’t have ARM images.</p>

<hr />

<h2 id="remaining-space">Remaining Space</h2>

<p>There are still approximately <strong>50 GB</strong> free out of the <strong>200 GB</strong> Oracle gives away.</p>

<p>Not bad for free.</p>

<hr />

<h1 id="️-step-1--create-the-compartment">🏝️ Step 1 — Create the Compartment</h1>

<p>Log into Oracle Cloud and verify that the <strong>Home Region</strong> is:</p>

<blockquote>
  <p><strong>Chile (Santiago)</strong></p>
</blockquote>

<p>Then go to:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Identity &amp; Security
    └── Compartments
</code></pre></div></div>

<p>Create a new one.</p>

<p>Name:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>prod-coolify-compartment
</code></pre></div></div>

<p>Parent:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Root Tenancy
</code></pre></div></div>

<p>This compartment will let us keep the entire lab organized.</p>

<hr />

<h1 id="-step-2--create-the-network">🌐 Step 2 — Create the Network</h1>

<p>Go to:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Networking
    └── Virtual Cloud Networks
</code></pre></div></div>

<p>Select your compartment.</p>

<p>Choose:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Start VCN Wizard
</code></pre></div></div>

<p>Then:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>VCN with Internet Connectivity
</code></pre></div></div>

<p>Name:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>coolify-vcn
</code></pre></div></div>

<p>When the wizard finishes, go to:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Security Lists
</code></pre></div></div>

<p>and open the <strong>Default Security List</strong>.</p>

<hr />

<h2 id="open-the-ports">Open the Ports</h2>

<p>Add these <strong>Ingress</strong> rules.</p>

<table>
  <thead>
    <tr>
      <th>Port</th>
      <th>Use</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>22</td>
      <td>SSH</td>
    </tr>
    <tr>
      <td>80</td>
      <td>HTTP + Let’s Encrypt</td>
    </tr>
    <tr>
      <td>443</td>
      <td>HTTPS</td>
    </tr>
    <tr>
      <td>8000</td>
      <td>Coolify initial admin panel</td>
    </tr>
  </tbody>
</table>

<p><strong>Important</strong></p>

<p>Oracle has a small detail that catches many people.</p>

<p>In the rules:</p>

<p><strong>DO NOT fill in “Source Port Range”.</strong></p>

<p>It must remain completely empty.</p>

<p>The port goes only in:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Destination Port Range
</code></pre></div></div>

<hr />

<h1 id="-step-3--create-the-arm-vm">💻 Step 3 — Create the ARM VM</h1>

<p>Go to:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Compute
    └── Instances
        └── Create Instance
</code></pre></div></div>

<p>Name:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>coolify-master-arm
</code></pre></div></div>

<p>Compartment:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>prod-coolify-compartment
</code></pre></div></div>

<hr />

<h2 id="choose-ubuntu">Choose Ubuntu</h2>

<p>Go to:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Change Image
</code></pre></div></div>

<p>Select:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Canonical Ubuntu
</code></pre></div></div>

<p>And explicitly choose an LTS version.</p>

<p>Recommended:</p>

<ul>
  <li>Ubuntu 24.04 LTS</li>
  <li>Ubuntu 22.04 LTS</li>
</ul>

<p>Architecture:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>aarch64
</code></pre></div></div>

<hr />

<h2 id="choose-the-right-machine">Choose the Right Machine</h2>

<p>Go to:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Change Shape
</code></pre></div></div>

<p>Select:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>VM.Standard.A1.Flex
</code></pre></div></div>

<p>Oracle hides a little secret here.</p>

<p>You have to expand the advanced configuration panel (the almost invisible arrow).</p>

<p>There you manually configure:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>2 OCPU
12 GB RAM
</code></pre></div></div>

<p>Make sure it still shows:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Always Free Eligible
</code></pre></div></div>

<hr />

<h2 id="add-multiple-ssh-keys">Add Multiple SSH Keys</h2>

<p>Choose:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Paste Public Keys
</code></pre></div></div>

<p>Paste them one below the other.</p>

<p>Example:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>MacBook
Ubuntu Desktop
Notebook
</code></pre></div></div>

<p>As long as they’re public keys (<code class="language-plaintext highlighter-rouge">*.pub</code>) Oracle will accept them all.</p>

<hr />

<h2 id="expand-the-disk">Expand the Disk</h2>

<p>In the <strong>Boot Volume</strong> section expand the advanced options.</p>

<p>Check:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Specify custom boot volume size
</code></pre></div></div>

<p>and enter:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>100 GB
</code></pre></div></div>

<p>If we don’t do this Oracle creates a much smaller disk and resizing it later is much more annoying.</p>

<p>Finally:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Create
</code></pre></div></div>

<hr />

<h1 id="-step-4--the-hidden-ubuntu-firewall">🔥 Step 4 — The Hidden Ubuntu Firewall</h1>

<p>This was the bug that cost me the most time.</p>

<p>Even though we open the ports in Oracle…</p>

<p>…Ubuntu can still block them.</p>

<p>Connect via SSH.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ssh ubuntu@PUBLIC_IP
</code></pre></div></div>

<p>Execute:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>iptables <span class="nt">-I</span> INPUT 6 <span class="nt">-m</span> state <span class="nt">--state</span> NEW <span class="nt">-p</span> tcp <span class="nt">--dport</span> 80 <span class="nt">-j</span> ACCEPT

<span class="nb">sudo </span>iptables <span class="nt">-I</span> INPUT 6 <span class="nt">-m</span> state <span class="nt">--state</span> NEW <span class="nt">-p</span> tcp <span class="nt">--dport</span> 443 <span class="nt">-j</span> ACCEPT

<span class="nb">sudo </span>iptables <span class="nt">-I</span> INPUT 6 <span class="nt">-m</span> state <span class="nt">--state</span> NEW <span class="nt">-p</span> tcp <span class="nt">--dport</span> 8000 <span class="nt">-j</span> ACCEPT
</code></pre></div></div>

<p>Then save the rules.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>netfilter-persistent save
</code></pre></div></div>

<blockquote>
  <p><strong>Captain’s Note:</strong> on some modern Ubuntu images you may need to install <code class="language-plaintext highlighter-rouge">iptables-persistent</code> first (<code class="language-plaintext highlighter-rouge">sudo apt install -y iptables-persistent netfilter-persistent</code>) if the save command doesn’t exist.</p>
</blockquote>

<hr />

<h1 id="️-step-5--install-coolify">⚙️ Step 5 — Install Coolify</h1>

<p>Connected via SSH, simply run:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-fsSL</span> https://cdn.coollabs.io/coolify/install.sh | bash
</code></pre></div></div>

<p>Grab a coffee.</p>

<p>The installer does practically everything.</p>

<p>When it finishes, open:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>http://PUBLIC_IP:8000
</code></pre></div></div>

<p>Create your admin user…</p>

<p>…and done.</p>

<p>Now you have your own Heroku, Render or Railway.</p>

<p>And free.</p>

<hr />

<h1 id="️-step-6--add-an-amd-worker-optional">🖥️ Step 6 — Add an AMD Worker (Optional)</h1>

<p>If you need to run Docker images that only exist for x86, create another VM.</p>

<p>Configuration:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>VM.Standard.E2.1.Micro
Ubuntu 24.04
50 GB
</code></pre></div></div>

<p>Open the same ports using the procedure above.</p>

<p>Then from Coolify:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Servers

+ Add Server
</code></pre></div></div>

<p>Enter the public IP.</p>

<p>Coolify generates an SSH key.</p>

<p>Copy that key into:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~/.ssh/authorized_keys
</code></pre></div></div>

<p>on the AMD server.</p>

<p>Finally press:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Validate &amp; Install
</code></pre></div></div>

<p>In a few minutes Coolify automatically installs Docker and leaves the node ready to receive deployments.</p>

<hr />

<h1 id="️-conclusion">🏴‍☠️ Conclusion</h1>

<p>With this architecture we get:</p>

<ul>
  <li>✅ An ARM server with <strong>2 OCPU and 12 GB RAM</strong>.</li>
  <li>✅ An x86 worker for ARM-incompatible projects.</li>
  <li>✅ Automatic HTTPS via Traefik and Let’s Encrypt.</li>
  <li>✅ Deployments from GitHub.</li>
  <li>✅ Docker managed from a web interface.</li>
  <li>✅ All within Oracle Cloud’s <strong>Always Free</strong> plan.</li>
</ul>

<p>Not bad for an infrastructure that costs exactly <strong>0 doubloons per month</strong>.</p>

<p>In the next episode we’ll see how to connect your own domain, configure DNS, and have Coolify publishing applications as if we had a small hidden datacenter on Monkey Island.</p>]]></content><author><name>Guybrush Threepwood</name></author><category term="oracle-cloud" /><category term="coolify" /><category term="paas" /><category term="docker" /><category term="devops" /><category term="infrastructure" /><category term="monkey-island-vibes" /><summary type="html"><![CDATA[🏴‍☠️ Prologue — Before Setting Sail]]></summary></entry><entry xml:lang="es"><title type="html">Montar tu propio PaaS con Coolify en Oracle Cloud (Always Free)</title><link href="https://blog.polverini.com.ar/montar-tu-propio-paas-con-coolify-en-oracle-cloud.html" rel="alternate" type="text/html" title="Montar tu propio PaaS con Coolify en Oracle Cloud (Always Free)" /><published>2026-07-25T00:00:00+00:00</published><updated>2026-07-25T00:00:00+00:00</updated><id>https://blog.polverini.com.ar/montar-tu-propio-paas-con-coolify-en-oracle-cloud</id><content type="html" xml:base="https://blog.polverini.com.ar/montar-tu-propio-paas-con-coolify-en-oracle-cloud.html"><![CDATA[<h1 id="️-prólogo--antes-de-zarpar">🏴‍☠️ Prólogo — Antes de zarpar</h1>

<blockquote>
  <p><em>“No construimos este barco para ganar una guerra naval. Lo construimos para aprender a navegar.”</em>
— Guybrush Threepwood (probablemente)</p>
</blockquote>

<p>Si alguna vez intentaste desplegar una aplicación en la nube, seguramente terminaste pasando por alguno de estos servicios:</p>

<ul>
  <li>Render</li>
  <li>Railway</li>
  <li>Fly.io</li>
  <li>DigitalOcean</li>
  <li>Hetzner</li>
  <li>AWS</li>
  <li>Azure</li>
</ul>

<p>Todos funcionan muy bien… hasta que llega la primera factura.</p>

<p>Oracle Cloud tiene una particularidad bastante interesante: su programa <strong>Always Free</strong> ofrece recursos que, bien aprovechados, alcanzan para montar un laboratorio personal sorprendentemente potente.</p>

<p>En este tutorial vamos a utilizar especialmente la instancia <strong>Ampere A1 ARM</strong>, que para desarrollo y autoalojamiento suele ofrecer una relación rendimiento/consumo excelente. Muchos proyectos modernos (Docker, PostgreSQL, Redis, Nginx, Traefik, Python, Node.js, Go, Java, etc.) funcionan perfectamente sobre ARM y aprovechan muy bien esos recursos.</p>

<p>Para los casos en que todavía existan imágenes Docker exclusivas para x86, agregaremos una pequeña máquina AMD como <em>worker</em> secundario. Así obtenemos lo mejor de ambos mundos.</p>

<p>La idea no es solamente instalar Coolify.</p>

<p>La idea es entender cómo Oracle organiza su infraestructura:</p>

<ul>
  <li>Compartimentos.</li>
  <li>Redes virtuales.</li>
  <li>Reglas de firewall.</li>
  <li>Instancias.</li>
  <li>Almacenamiento.</li>
  <li>Claves SSH.</li>
  <li>Seguridad.</li>
  <li>Arquitecturas ARM y x86.</li>
</ul>

<p>Una vez que comprendés esas piezas, desplegar cualquier otro servicio resulta muchísimo más sencillo.</p>

<hr />

<h1 id="️-aviso-de-seguridad-muy-importante">☠️ Aviso de Seguridad (muy importante)</h1>

<p>Este artículo está pensado como un <strong>laboratorio de aprendizaje</strong>.</p>

<p>El objetivo es tener un despliegue funcionando en pocos minutos para conocer la plataforma y entender cómo interactúan todos los componentes.</p>

<p>Por ese motivo vamos a dejar expuestos temporalmente algunos servicios hacia Internet, por ejemplo:</p>

<ul>
  <li>Puerto <strong>22</strong> (SSH).</li>
  <li>Puerto <strong>8000</strong> (panel de administración inicial de Coolify).</li>
</ul>

<p>Eso <strong>no representa una configuración recomendada para producción</strong>.</p>

<p>Desde una perspectiva de ciberseguridad, cualquier servicio publicado innecesariamente aumenta la superficie de ataque. En otras palabras…</p>

<blockquote>
  <p>Estamos dejando la puerta del barco abierta mientras aprendemos dónde están los cañones.</p>
</blockquote>

<p>En un entorno real sería recomendable, entre otras medidas:</p>

<ul>
  <li>Limitar el acceso SSH a direcciones IP conocidas.</li>
  <li>Deshabilitar el acceso por contraseña y utilizar únicamente claves SSH.</li>
  <li>Cerrar el puerto 8000 una vez finalizada la instalación inicial de Coolify.</li>
  <li>Publicar únicamente HTTP/HTTPS detrás de Traefik.</li>
  <li>Aplicar el principio de <strong>mínimo privilegio</strong>, exponiendo solamente los servicios estrictamente necesarios.</li>
  <li>Mantener el sistema operativo actualizado.</li>
  <li>Implementar monitoreo, copias de seguridad y registros de auditoría.</li>
  <li>Considerar el uso de listas de seguridad, Network Security Groups (NSG), VPN o un <em>bastion host</em> para el acceso administrativo.</li>
</ul>

<p>A lo largo del blog iremos endureciendo (“hardening”) esta instalación paso a paso.</p>

<p>Este no es el destino final del barco.</p>

<p>Es apenas el primer puerto donde vamos a aprender a navegar.</p>

<hr />

<h1 id="-filosofía-guybrush">🍌 Filosofía Guybrush</h1>

<p>En esta serie no buscamos la infraestructura perfecta desde el primer día.</p>

<p>Buscamos entender qué hace cada pieza.</p>

<p>Primero hacemos que el barco flote.</p>

<p>Después aprendemos a navegar.</p>

<p>Y recién al final… nos preocupamos por los piratas.</p>

<hr />

<h1 id="️-misión-montar-tu-propio-paas-con-coolify-en-oracle-cloud-always-free">🏴‍☠️ Misión: Montar tu propio PaaS con Coolify en Oracle Cloud (Always Free)</h1>

<blockquote>
  <p><em>“Mientras otros pagan 20 dólares por mes por un VPS… nosotros saqueamos la nube de Oracle usando el Always Free. Bienvenido a Monkey Island.”</em></p>
</blockquote>

<p>Después de pelearme varias veces con Oracle Cloud, encontré una configuración que quedó realmente sólida para correr <strong>Coolify</strong> sin gastar un solo doblón.</p>

<p>La idea es aprovechar al máximo el <strong>Always Free Tier</strong>, usando la poderosa máquina ARM de Ampere como servidor principal y, si algún proyecto necesita arquitectura x86, sumar una segunda VM AMD como worker.</p>

<p>Al finalizar este tutorial vas a tener un PaaS propio, con HTTPS automático, despliegues desde Git y espacio suficiente para alojar varios proyectos personales.</p>

<hr />

<h1 id="-distribución-de-recursos">⚓ Distribución de recursos</h1>

<p><strong>Región</strong></p>

<p>📍 Chile Central (Santiago) — <code class="language-plaintext highlighter-rouge">sa-santiago-1</code></p>

<h2 id="servidor-principal">Servidor Principal</h2>

<table>
  <thead>
    <tr>
      <th>Recurso</th>
      <th>Valor</th>
      <th>Arquitectura</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>ARM Ampere A1</td>
      <td>—</td>
      <td>—</td>
    </tr>
    <tr>
      <td>CPU</td>
      <td>2 OCPU</td>
      <td>ARM</td>
    </tr>
    <tr>
      <td>RAM</td>
      <td>12 GB</td>
      <td>ARM</td>
    </tr>
    <tr>
      <td>Disco</td>
      <td>100 GB</td>
      <td>ARM</td>
    </tr>
  </tbody>
</table>

<p>Será el servidor donde vive Coolify.</p>

<hr />

<h2 id="worker-opcional">Worker opcional</h2>

<table>
  <thead>
    <tr>
      <th>Recurso</th>
      <th>Valor</th>
      <th>Arquitectura</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>AMD x86</td>
      <td>—</td>
      <td>—</td>
    </tr>
    <tr>
      <td>CPU</td>
      <td>1/8 OCPU</td>
      <td>x86</td>
    </tr>
    <tr>
      <td>RAM</td>
      <td>1 GB</td>
      <td>x86</td>
    </tr>
    <tr>
      <td>Disco</td>
      <td>50 GB</td>
      <td>x86</td>
    </tr>
  </tbody>
</table>

<p>Ideal para contenedores que todavía no poseen imágenes ARM.</p>

<hr />

<h2 id="espacio-restante">Espacio restante</h2>

<p>Todavía quedan aproximadamente <strong>50 GB</strong> libres de los <strong>200 GB</strong> que Oracle regala.</p>

<p>Nada mal para ser gratis.</p>

<hr />

<h1 id="️-paso-1--crear-el-compartimento">🏝️ Paso 1 — Crear el Compartimento</h1>

<p>Entramos a Oracle Cloud y verificamos que la <strong>Home Region</strong> sea:</p>

<blockquote>
  <p><strong>Chile (Santiago)</strong></p>
</blockquote>

<p>Luego vamos a:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Identity &amp; Security
    └── Compartments
</code></pre></div></div>

<p>Creamos uno nuevo.</p>

<p>Nombre:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>prod-coolify-compartment
</code></pre></div></div>

<p>Parent:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Root Tenancy
</code></pre></div></div>

<p>Este compartimento nos permitirá tener todo el laboratorio ordenado.</p>

<hr />

<h1 id="-paso-2--crear-la-red">🌐 Paso 2 — Crear la red</h1>

<p>Entramos en:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Networking
    └── Virtual Cloud Networks
</code></pre></div></div>

<p>Seleccionamos nuestro compartimento.</p>

<p>Elegimos:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Start VCN Wizard
</code></pre></div></div>

<p>Luego:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>VCN with Internet Connectivity
</code></pre></div></div>

<p>Nombre:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>coolify-vcn
</code></pre></div></div>

<p>Cuando termine el asistente, entramos a:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Security Lists
</code></pre></div></div>

<p>y abrimos la <strong>Default Security List</strong>.</p>

<hr />

<h2 id="abrir-los-puertos">Abrir los puertos</h2>

<p>Agregar estas reglas <strong>Ingress</strong>.</p>

<table>
  <thead>
    <tr>
      <th>Puerto</th>
      <th>Uso</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>22</td>
      <td>SSH</td>
    </tr>
    <tr>
      <td>80</td>
      <td>HTTP + Let’s Encrypt</td>
    </tr>
    <tr>
      <td>443</td>
      <td>HTTPS</td>
    </tr>
    <tr>
      <td>8000</td>
      <td>Panel inicial de Coolify</td>
    </tr>
  </tbody>
</table>

<p><strong>Importante</strong></p>

<p>Oracle tiene un pequeño detalle que hace caer a mucha gente.</p>

<p>En las reglas:</p>

<p><strong>NO completar “Source Port Range”.</strong></p>

<p>Debe quedar completamente vacío.</p>

<p>El puerto va únicamente en:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Destination Port Range
</code></pre></div></div>

<hr />

<h1 id="-paso-3--crear-la-vm-arm">💻 Paso 3 — Crear la VM ARM</h1>

<p>Vamos a:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Compute
    └── Instances
        └── Create Instance
</code></pre></div></div>

<p>Nombre:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>coolify-master-arm
</code></pre></div></div>

<p>Compartimento:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>prod-coolify-compartment
</code></pre></div></div>

<hr />

<h2 id="elegir-ubuntu">Elegir Ubuntu</h2>

<p>Entramos en:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Change Image
</code></pre></div></div>

<p>Seleccionamos:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Canonical Ubuntu
</code></pre></div></div>

<p>Y elegimos explícitamente una versión LTS.</p>

<p>Recomendadas:</p>

<ul>
  <li>Ubuntu 24.04 LTS</li>
  <li>Ubuntu 22.04 LTS</li>
</ul>

<p>Arquitectura:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>aarch64
</code></pre></div></div>

<hr />

<h2 id="elegir-la-máquina-correcta">Elegir la máquina correcta</h2>

<p>Entramos en:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Change Shape
</code></pre></div></div>

<p>Seleccionamos:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>VM.Standard.A1.Flex
</code></pre></div></div>

<p>Acá Oracle esconde un pequeño secreto.</p>

<p>Hay que desplegar el panel de configuración avanzada (la flechita casi invisible).</p>

<p>Allí configuramos manualmente:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>2 OCPU
12 GB RAM
</code></pre></div></div>

<p>Verificar que siga apareciendo:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Always Free Eligible
</code></pre></div></div>

<hr />

<h2 id="agregar-varias-claves-ssh">Agregar varias claves SSH</h2>

<p>Elegimos:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Paste Public Keys
</code></pre></div></div>

<p>Pegamos una debajo de la otra.</p>

<p>Ejemplo:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>MacBook
Ubuntu Desktop
Notebook
</code></pre></div></div>

<p>Mientras sean claves públicas (<code class="language-plaintext highlighter-rouge">*.pub</code>) Oracle las acepta todas.</p>

<hr />

<h2 id="ampliar-el-disco">Ampliar el disco</h2>

<p>En la sección <strong>Boot Volume</strong> expandimos las opciones avanzadas.</p>

<p>Marcamos:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Specify custom boot volume size
</code></pre></div></div>

<p>y escribimos:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>100 GB
</code></pre></div></div>

<p>Si no hacemos esto Oracle crea un disco bastante más chico y después ampliarlo es mucho más incómodo.</p>

<p>Finalmente:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Create
</code></pre></div></div>

<hr />

<h1 id="-paso-4--el-firewall-escondido-de-ubuntu">🔥 Paso 4 — El firewall escondido de Ubuntu</h1>

<p>Este fue el bug que más tiempo me hizo perder.</p>

<p>Aunque abramos los puertos en Oracle…</p>

<p>…Ubuntu todavía puede bloquearlos.</p>

<p>Conectate por SSH.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ssh ubuntu@IP_PUBLICA
</code></pre></div></div>

<p>Ejecutá:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>iptables <span class="nt">-I</span> INPUT 6 <span class="nt">-m</span> state <span class="nt">--state</span> NEW <span class="nt">-p</span> tcp <span class="nt">--dport</span> 80 <span class="nt">-j</span> ACCEPT

<span class="nb">sudo </span>iptables <span class="nt">-I</span> INPUT 6 <span class="nt">-m</span> state <span class="nt">--state</span> NEW <span class="nt">-p</span> tcp <span class="nt">--dport</span> 443 <span class="nt">-j</span> ACCEPT

<span class="nb">sudo </span>iptables <span class="nt">-I</span> INPUT 6 <span class="nt">-m</span> state <span class="nt">--state</span> NEW <span class="nt">-p</span> tcp <span class="nt">--dport</span> 8000 <span class="nt">-j</span> ACCEPT
</code></pre></div></div>

<p>Y luego guardamos las reglas.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>netfilter-persistent save
</code></pre></div></div>

<blockquote>
  <p><strong>Nota del capitán:</strong> en algunas imágenes modernas de Ubuntu puede ser necesario instalar primero <code class="language-plaintext highlighter-rouge">iptables-persistent</code> (<code class="language-plaintext highlighter-rouge">sudo apt install -y iptables-persistent netfilter-persistent</code>) si el comando de guardado no existe.</p>
</blockquote>

<hr />

<h1 id="️-paso-5--instalar-coolify">⚙️ Paso 5 — Instalar Coolify</h1>

<p>Conectados por SSH simplemente ejecutamos:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-fsSL</span> https://cdn.coollabs.io/coolify/install.sh | bash
</code></pre></div></div>

<p>Tomate un café.</p>

<p>El instalador hace prácticamente todo solo.</p>

<p>Cuando termine, abrimos:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>http://IP_PUBLICA:8000
</code></pre></div></div>

<p>Creamos el usuario administrador…</p>

<p>…y listo.</p>

<p>Ya tenemos nuestro propio Heroku, Render o Railway privado.</p>

<p>Y gratis.</p>

<hr />

<h1 id="️-paso-6--agregar-un-worker-amd-opcional">🖥️ Paso 6 — Agregar un Worker AMD (opcional)</h1>

<p>Si necesitás ejecutar imágenes Docker que sólo existen para x86, creamos otra VM.</p>

<p>Configuración:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>VM.Standard.E2.1.Micro
Ubuntu 24.04
50 GB
</code></pre></div></div>

<p>Abrimos los mismos puertos usando el procedimiento anterior.</p>

<p>Luego desde Coolify:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Servers

+ Add Server
</code></pre></div></div>

<p>Ingresamos la IP pública.</p>

<p>Coolify genera una clave SSH.</p>

<p>Copiamos esa clave dentro de:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~/.ssh/authorized_keys
</code></pre></div></div>

<p>del servidor AMD.</p>

<p>Finalmente presionamos:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Validate &amp; Install
</code></pre></div></div>

<p>En pocos minutos Coolify instala automáticamente Docker y deja el nodo listo para recibir despliegues.</p>

<hr />

<h1 id="️-conclusión">🏴‍☠️ Conclusión</h1>

<p>Con esta arquitectura obtenemos:</p>

<ul>
  <li>✅ Un servidor ARM de <strong>2 OCPU y 12 GB RAM</strong>.</li>
  <li>✅ Un worker x86 para proyectos incompatibles con ARM.</li>
  <li>✅ HTTPS automático mediante Traefik y Let’s Encrypt.</li>
  <li>✅ Despliegues desde GitHub.</li>
  <li>✅ Docker administrado desde una interfaz web.</li>
  <li>✅ Todo dentro del plan <strong>Always Free</strong> de Oracle Cloud.</li>
</ul>

<p>No está nada mal para una infraestructura que cuesta exactamente <strong>0 doblones por mes</strong>.</p>

<p>En el próximo episodio veremos cómo conectar un dominio propio, configurar DNS y dejar Coolify publicando aplicaciones como si tuviéramos un pequeño datacenter escondido en Monkey Island.</p>]]></content><author><name>Guybrush Threepwood</name></author><category term="oracle-cloud" /><category term="coolify" /><category term="paas" /><category term="docker" /><category term="devops" /><category term="infraestructura" /><category term="monkey-island-vibes" /><summary type="html"><![CDATA[🏴‍☠️ Prólogo — Antes de zarpar]]></summary></entry><entry xml:lang="es"><title type="html">🏴‍☠️ Cómo convertir una Dell Wyse en un kiosco pirata con Porteus Kiosk</title><link href="https://blog.polverini.com.ar/como-convertir-una-dell-wyse-en-un-kiosco-pirata-con-porteus-kiosk.html" rel="alternate" type="text/html" title="🏴‍☠️ Cómo convertir una Dell Wyse en un kiosco pirata con Porteus Kiosk" /><published>2026-07-02T00:00:00+00:00</published><updated>2026-07-02T00:00:00+00:00</updated><id>https://blog.polverini.com.ar/como-convertir-una-dell-wyse-en-un-kiosco-pirata-con-porteus-kiosk</id><content type="html" xml:base="https://blog.polverini.com.ar/como-convertir-una-dell-wyse-en-un-kiosco-pirata-con-porteus-kiosk.html"><![CDATA[<h1 id="️-cómo-convertir-una-dell-wyse-en-un-kiosco-pirata-con-porteus-kiosk">🏴‍☠️ Cómo convertir una Dell Wyse en un kiosco pirata con Porteus Kiosk</h1>

<blockquote>
  <p>“Hay barcos que nacieron para navegar… y hay thin clients que nacieron para jubilarse en un depósito. Nosotros elegimos otro destino.”</p>
</blockquote>

<p>Si alguna vez compraste una <strong>Dell Wyse</strong> por dos mangos en Marketplace, seguramente te pasó lo mismo que a mí.</p>

<p>La mirás.</p>

<p>La enchufás.</p>

<p>Pensás:</p>

<blockquote>
  <p><em>“Esto tiene que servir para algo más que juntar polvo.”</em></p>
</blockquote>

<p>Y tenías razón.</p>

<p>Con <strong>Porteus Kiosk</strong> podés convertir esa cajita en un navegador prácticamente indestructible para cartelería, domótica, Home Assistant, paneles de control, recepción de empresas o cualquier pantalla que sólo necesite abrir un navegador y olvidarse del resto.</p>

<hr />

<h1 id="️-antes-de-empezar">☠️ Antes de empezar</h1>

<p>Primero una aclaración.</p>

<p>Las Wyse vienen en varias versiones (7010, 7020, etc.) y muchas veces ni Dell parece ponerse de acuerdo.</p>

<p>La forma más fácil de identificar la tuya es mirando el procesador:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>lscpu
</code></pre></div></div>

<p>o</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cat</span> /proc/cpuinfo | <span class="nb">grep</span> <span class="s2">"model name"</span>
</code></pre></div></div>

<p>Con eso normalmente ya sabés qué modelo tenés realmente.</p>

<hr />

<h1 id="-descargar-porteus-kiosk">🏴 Descargar Porteus Kiosk</h1>

<p>El sitio oficial es:</p>

<p>https://porteus-kiosk.org/download.html</p>

<p>Hasta hace unos años había un botón enorme que decía <strong>Download ISO</strong>.</p>

<p>Ahora no.</p>

<p>Bienvenido al mundo moderno.</p>

<p>Para descargar la versión Community tenés que crear una cuenta gratuita en el Customer Panel.</p>

<p>Una vez logueado, el sistema genera la ISO asociada a tu cuenta y recién ahí aparece el enlace de descarga.</p>

<p>Descargá la versión <strong>Porteus Kiosk Standard</strong>.</p>

<hr />

<h1 id="-preparando-el-disco">⚓ Preparando el disco</h1>

<p>En mi caso reutilicé una de esas cosas que todos tenemos guardadas “por las dudas”.</p>

<p>¿Viste esos discos externos USB que un día murieron?</p>

<p>Bueno… adentro tienen una pequeña placa SATA-USB.</p>

<p>Le saqué la placa a un disco que había pasado a mejor vida y terminé usando ese adaptador para conectar el módulo SATA de la Wyse a la notebook.</p>

<p>Reciclaje nivel Monkey Island.</p>

<p>Obviamente, si pertenecés al mundo capitalista, también existen adaptadores SATA-USB que se compran y funcionan exactamente igual.</p>

<hr />

<h1 id="-identificar-el-disco">🦜 Identificar el disco</h1>

<p>Antes de conectar el disco ejecutamos:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>lsblk
</code></pre></div></div>

<p>Por ejemplo:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>NAME        SIZE
nvme0n1    512G
</code></pre></div></div>

<p>Ahora conectamos el disco de la Wyse.</p>

<p>Y volvemos a ejecutar exactamente el mismo comando.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>lsblk
</code></pre></div></div>

<p>Ahora aparece algo así:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>NAME        SIZE
nvme0n1    512G
sdb          16G
</code></pre></div></div>

<p>¡Perfecto!</p>

<p>Comparando ambas salidas queda clarísimo cuál apareció recién.</p>

<p>En mi caso fue:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sdb
</code></pre></div></div>

<p><strong>MUY IMPORTANTE</strong></p>

<p>Vamos a usar únicamente la unidad.</p>

<p>No la partición.</p>

<p>O sea:</p>

<p>✔️ <code class="language-plaintext highlighter-rouge">/dev/sdb</code></p>

<p>NO</p>

<p>❌ <code class="language-plaintext highlighter-rouge">/dev/sdb1</code></p>

<p>Porque sino estaríamos escribiendo dentro de una partición y no sobre el disco completo.</p>

<hr />

<h1 id="-desmontar-el-disco">⚓ Desmontar el disco</h1>

<p>Ubuntu suele montarlo automáticamente.</p>

<p>Antes de grabar la imagen conviene desmontarlo.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>umount /dev/sdb<span class="k">*</span>
</code></pre></div></div>

<p>(reemplazando la letra por la que corresponda).</p>

<hr />

<h1 id="-grabar-la-imagen">💣 Grabar la imagen</h1>

<p>Ahora viene el famoso <code class="language-plaintext highlighter-rouge">dd</code>.</p>

<p>Ese comando tiene una habilidad especial.</p>

<p>Es increíblemente rápido…</p>

<p>…e increíblemente capaz de destruir el disco equivocado.</p>

<p>Revisá dos veces la letra.</p>

<p>Después una tercera.</p>

<p>Y recién ahí ejecutalo.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo dd </span><span class="k">if</span><span class="o">=</span>~/Descargas/Porteus-Kiosk-6.x.x-x86_64.iso <span class="nv">of</span><span class="o">=</span>/dev/sdb <span class="nv">bs</span><span class="o">=</span>4M <span class="nv">status</span><span class="o">=</span>progress
</code></pre></div></div>

<p>Donde:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">if=</code> → archivo ISO descargado.</li>
  <li><code class="language-plaintext highlighter-rouge">of=</code> → disco destino.</li>
  <li><code class="language-plaintext highlighter-rouge">bs=4M</code> → copia mucho más rápido.</li>
  <li><code class="language-plaintext highlighter-rouge">status=progress</code> → muestra el progreso en tiempo real.</li>
</ul>

<p>Durante varios minutos la terminal parece poseída mientras copia bloques.</p>

<p>Es completamente normal.</p>

<hr />

<h1 id="-esperar-que-termine-de-verdad">⚓ Esperar que termine de verdad</h1>

<p>Cuando <code class="language-plaintext highlighter-rouge">dd</code> finaliza todavía pueden quedar datos pendientes en la caché.</p>

<p>Para obligar al sistema a escribir absolutamente todo ejecutamos:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sync</span>
</code></pre></div></div>

<p>Cuando vuelve el prompt…</p>

<p>Ya está.</p>

<p>Podés retirar el disco.</p>

<hr />

<h1 id="-primer-arranque">🚀 Primer arranque</h1>

<p>Volvés a instalar el módulo SATA dentro de la Wyse.</p>

<p>Conectás:</p>

<ul>
  <li>teclado</li>
  <li>monitor</li>
  <li>red (preferentemente Ethernet)</li>
</ul>

<p>y encendés la máquina.</p>

<p>Después de unos segundos aparece el asistente de Porteus Kiosk.</p>

<p>Desde ahí configurás:</p>

<ul>
  <li>idioma</li>
  <li>red</li>
  <li>URL inicial</li>
  <li>resolución</li>
  <li>comportamiento del navegador</li>
  <li>actualizaciones</li>
</ul>

<p>En menos de diez minutos tenés un kiosco funcionando.</p>

<hr />

<h1 id="️-por-qué-porteus">☠️ ¿Por qué Porteus?</h1>

<p>Porque hace exactamente una cosa.</p>

<p>Y la hace muy bien.</p>

<p>No hay escritorio.</p>

<p>No hay usuarios.</p>

<p>No hay Office.</p>

<p>No hay “¿qué tocó el cliente ahora?”.</p>

<p>Hay un Linux mínimo cuyo único trabajo es abrir un navegador y seguir funcionando durante años.</p>

<p>Y eso, para cartelería digital, Home Assistant, dashboards de Grafana, recepciones o sistemas industriales, vale oro.</p>

<hr />

<h1 id="-epílogo">🍺 Epílogo</h1>

<p>Mientras algunos instalan veinte gigabytes de sistema operativo para abrir una página web…</p>

<p>…nosotros reciclamos una thin client de oficina con un disco rescatado de un cadáver electrónico y la dejamos lista para navegar durante años.</p>

<p>LeChuck estaría orgulloso.</p>

<p>Windows… bueno… seguramente todavía esté buscando actualizaciones.</p>

<hr />

<p><em>“Porque todo problema tecnológico puede resolverse con una terminal, un café y la cantidad justa de piratería.”</em></p>]]></content><author><name>Guybrush Threepwood</name></author><category term="linux" /><category term="porteus" /><category term="wyse" /><category term="hardware" /><category term="porteus kiosk" /><category term="wyse" /><category term="dell" /><category term="thin client" /><category term="linux" /><category term="chrome" /><summary type="html"><![CDATA[🏴‍☠️ Cómo convertir una Dell Wyse en un kiosco pirata con Porteus Kiosk]]></summary></entry><entry xml:lang="en"><title type="html">🏴‍☠️ How to turn a Dell Wyse into a pirate kiosk with Porteus Kiosk</title><link href="https://blog.polverini.com.ar/how-to-turn-a-dell-wyse-into-a-pirate-kiosk-with-porteus-kiosk.html" rel="alternate" type="text/html" title="🏴‍☠️ How to turn a Dell Wyse into a pirate kiosk with Porteus Kiosk" /><published>2026-07-02T00:00:00+00:00</published><updated>2026-07-02T00:00:00+00:00</updated><id>https://blog.polverini.com.ar/how-to-turn-a-dell-wyse-into-a-pirate-kiosk-with-porteus-kiosk</id><content type="html" xml:base="https://blog.polverini.com.ar/how-to-turn-a-dell-wyse-into-a-pirate-kiosk-with-porteus-kiosk.html"><![CDATA[<h1 id="️-how-to-turn-a-dell-wyse-into-a-pirate-kiosk-with-porteus-kiosk">🏴‍☠️ How to turn a Dell Wyse into a pirate kiosk with Porteus Kiosk</h1>

<blockquote>
  <p>“There are ships born to sail… and there are thin clients born to retire in a warehouse. We chose a different destiny.”</p>
</blockquote>

<p>If you’ve ever bought a <strong>Dell Wyse</strong> for almost nothing on Marketplace, you’ve probably had the same thought as me.</p>

<p>You look at it.</p>

<p>You plug it in.</p>

<p>You think:</p>

<blockquote>
  <p><em>“This has to be good for something more than collecting dust.”</em></p>
</blockquote>

<p>And you were right.</p>

<p>With <strong>Porteus Kiosk</strong> you can turn that little box into an almost indestructible browser for digital signage, home automation, Home Assistant, control panels, reception desks, or any screen that just needs to open a browser and forget the rest.</p>

<hr />

<h1 id="️-before-we-start">☠️ Before we start</h1>

<p>First, a clarification.</p>

<p>Wyse devices come in many versions (7010, 7020, etc.) and often even Dell doesn’t seem to agree.</p>

<p>The easiest way to identify yours is by checking the CPU:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>lscpu
</code></pre></div></div>

<p>or</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cat</span> /proc/cpuinfo | <span class="nb">grep</span> <span class="s2">"model name"</span>
</code></pre></div></div>

<p>With that you usually already know which model you really have.</p>

<hr />

<h1 id="-download-porteus-kiosk">🏴 Download Porteus Kiosk</h1>

<p>The official site is:</p>

<p>https://porteus-kiosk.org/download.html</p>

<p>A few years ago there was a giant button that said <strong>Download ISO</strong>.</p>

<p>Now there isn’t.</p>

<p>Welcome to the modern world.</p>

<p>To download the Community version you need to create a free account in the Customer Panel.</p>

<p>Once logged in, the system generates the ISO associated with your account and only then does the download link appear.</p>

<p>Download the <strong>Porteus Kiosk Standard</strong> version.</p>

<hr />

<h1 id="-preparing-the-disk">⚓ Preparing the disk</h1>

<p>In my case I reused one of those things we all keep “just in case.”</p>

<p>You know those USB external drives that died one day?</p>

<p>Well… inside they have a little SATA-USB board.</p>

<p>I took the board from a drive that had passed away and ended up using that adapter to connect the Wyse SATA module to my laptop.</p>

<p>Recycling at Monkey Island level.</p>

<p>Obviously, if you belong to the capitalist world, there are also SATA-USB adapters you can buy and they work exactly the same.</p>

<hr />

<h1 id="-identify-the-disk">🦜 Identify the disk</h1>

<p>Before connecting the disk we run:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>lsblk
</code></pre></div></div>

<p>For example:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>NAME        SIZE
nvme0n1    512G
</code></pre></div></div>

<p>Now we connect the Wyse disk.</p>

<p>And we run exactly the same command again.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>lsblk
</code></pre></div></div>

<p>Now something like this appears:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>NAME        SIZE
nvme0n1    512G
sdb          16G
</code></pre></div></div>

<p>Perfect!</p>

<p>Comparing both outputs makes it clear which one just showed up.</p>

<p>In my case it was:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sdb
</code></pre></div></div>

<p><strong>VERY IMPORTANT</strong></p>

<p>We are going to use only the disk.</p>

<p>Not the partition.</p>

<p>So:</p>

<p>✔️ <code class="language-plaintext highlighter-rouge">/dev/sdb</code></p>

<p>NOT</p>

<p>❌ <code class="language-plaintext highlighter-rouge">/dev/sdb1</code></p>

<p>Because otherwise we would be writing inside a partition and not to the whole disk.</p>

<hr />

<h1 id="-unmount-the-disk">⚓ Unmount the disk</h1>

<p>Ubuntu usually mounts it automatically.</p>

<p>Before flashing the image it is best to unmount it.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>umount /dev/sdb<span class="k">*</span>
</code></pre></div></div>

<p>(replace the letter with the one that applies).</p>

<hr />

<h1 id="-flash-the-image">💣 Flash the image</h1>

<p>Now comes the famous <code class="language-plaintext highlighter-rouge">dd</code>.</p>

<p>That command has a special skill.</p>

<p>It is incredibly fast…</p>

<p>…and incredibly capable of destroying the wrong disk.</p>

<p>Check the letter twice.</p>

<p>Then a third time.</p>

<p>And only then execute it.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo dd </span><span class="k">if</span><span class="o">=</span>~/Downloads/Porteus-Kiosk-6.x.x-x86_64.iso <span class="nv">of</span><span class="o">=</span>/dev/sdb <span class="nv">bs</span><span class="o">=</span>4M <span class="nv">status</span><span class="o">=</span>progress
</code></pre></div></div>

<p>Where:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">if=</code> → downloaded ISO file.</li>
  <li><code class="language-plaintext highlighter-rouge">of=</code> → destination disk.</li>
  <li><code class="language-plaintext highlighter-rouge">bs=4M</code> → copies much faster.</li>
  <li><code class="language-plaintext highlighter-rouge">status=progress</code> → shows live progress.</li>
</ul>

<p>For several minutes the terminal looks possessed while it copies blocks.</p>

<p>That’s completely normal.</p>

<hr />

<h1 id="-wait-until-its-really-done">⚓ Wait until it’s really done</h1>

<p>When <code class="language-plaintext highlighter-rouge">dd</code> finishes there may still be data pending in the cache.</p>

<p>To force the system to write absolutely everything we run:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sync</span>
</code></pre></div></div>

<p>When the prompt returns…</p>

<p>It’s done.</p>

<p>You can remove the disk.</p>

<hr />

<h1 id="-first-boot">🚀 First boot</h1>

<p>You reinstall the SATA module inside the Wyse.</p>

<p>You connect:</p>

<ul>
  <li>keyboard</li>
  <li>monitor</li>
  <li>network (preferably Ethernet)</li>
</ul>

<p>and turn on the machine.</p>

<p>After a few seconds the Porteus Kiosk wizard appears.</p>

<p>From there you configure:</p>

<ul>
  <li>language</li>
  <li>network</li>
  <li>start URL</li>
  <li>resolution</li>
  <li>browser behavior</li>
  <li>updates</li>
</ul>

<p>In less than ten minutes you have a kiosk up and running.</p>

<hr />

<h1 id="️-why-porteus">☠️ Why Porteus?</h1>

<p>Because it does exactly one thing.</p>

<p>And it does it very well.</p>

<p>No desktop.</p>

<p>No users.</p>

<p>No Office.</p>

<p>No “what did the client touch now?”.</p>

<p>There is a minimal Linux whose only job is to open a browser and keep working for years.</p>

<p>And that, for digital signage, Home Assistant, Grafana dashboards, receptions, or industrial systems, is worth gold.</p>

<hr />

<h1 id="-epilogue">🍺 Epilogue</h1>

<p>While some people install twenty gigabytes of operating system just to open a web page…</p>

<p>…we recycled an office thin client with a disk rescued from an electronic corpse and left it ready to browse for years.</p>

<p>LeChuck would be proud.</p>

<p>Windows… well… is probably still looking for updates.</p>

<hr />

<p><em>“Because every technological problem can be solved with a terminal, a coffee, and the right amount of piracy.”</em></p>]]></content><author><name>Guybrush Threepwood</name></author><category term="linux" /><category term="porteus" /><category term="wyse" /><category term="hardware" /><category term="porteus kiosk" /><category term="wyse" /><category term="dell" /><category term="thin client" /><category term="linux" /><category term="chrome" /><summary type="html"><![CDATA[🏴‍☠️ How to turn a Dell Wyse into a pirate kiosk with Porteus Kiosk]]></summary></entry><entry xml:lang="es"><title type="html">Monkey Island vs el Scroll Invertido: domesticando una Mac con Mos</title><link href="https://blog.polverini.com.ar/monkey-island-vs-el-scroll-invertido-domesticando-una-mac-con-mos.html" rel="alternate" type="text/html" title="Monkey Island vs el Scroll Invertido: domesticando una Mac con Mos" /><published>2026-06-23T00:00:00+00:00</published><updated>2026-06-23T00:00:00+00:00</updated><id>https://blog.polverini.com.ar/monkey-island-vs-el-scroll-invertido-domesticando-una-mac-con-mos</id><content type="html" xml:base="https://blog.polverini.com.ar/monkey-island-vs-el-scroll-invertido-domesticando-una-mac-con-mos.html"><![CDATA[<h1 id="monkey-island-vs-el-scroll-invertido-domesticando-una-mac-con-mos">Monkey Island vs el Scroll Invertido: domesticando una Mac con Mos</h1>

<p>Hay momentos en la vida donde uno debe tomar decisiones difíciles.</p>

<p>Abandonar una startup.
Cambiar de trabajo.
Dejar Windows.</p>

<p>Bueno, tampoco exageremos.</p>

<p>La cuestión es que en esta nueva misión laboral apareció una condición innegociable:</p>

<blockquote>
  <p>“Te damos una Mac.”
Y ahí estaba yo.</p>
</blockquote>

<p>Una nave espacial de aluminio cepillado.
Procesador que parece alimentarse de plutonio.
Batería que dura más que algunos gobiernos latinoamericanos.</p>

<p>Pero con un pequeño problema.</p>

<p><strong>El scroll estaba poseído.</strong></p>

<hr />

<h2 id="el-primer-encuentro-con-la-maldición">El primer encuentro con la maldición</h2>

<p>Los piratas veteranos de Monkey Island saben reconocer una maldición cuando la ven.</p>

<p>Abrí Chrome.
Moví la ruedita del mouse hacia abajo.</p>

<p>La página subió.</p>

<p>Volví a moverla.</p>

<p>La página siguió subiendo.</p>

<p>Pensé que estaba cansado.</p>

<p>Probé otra vez.</p>

<p>No.</p>

<p>La Mac estaba convencida de que mi cerebro funcionaba al revés.</p>

<hr />

<h2 id="la-explicación-oficial-de-apple">La explicación oficial de Apple</h2>

<p>Apple llama a esto:</p>

<blockquote>
  <p>Natural Scrolling
Que es una forma elegante de decir:</p>
</blockquote>

<blockquote>
  <p>“Vamos a asumir que todo el mundo usa trackpad.”
Y ahí está el problema.</p>
</blockquote>

<p>Cuando hacés scroll con los dedos sobre un trackpad, el movimiento tiene cierta lógica:</p>

<ul>
  <li>Empujás el contenido hacia arriba.</li>
  <li>El contenido sube.</li>
  <li>Ves más abajo.
Perfecto.</li>
</ul>

<p>Pero cuando conectás un mouse como una persona civilizada que pasó décadas usando computadoras…</p>

<p>…esa lógica se convierte en una especie de ritual vudú.</p>

<p>Movés la rueda hacia abajo.</p>

<p>La pantalla sube.</p>

<p>Tu cerebro entra en conflicto existencial.</p>

<hr />

<h2 id="el-problema-verdadero">El problema verdadero</h2>

<p>La locura no termina ahí.</p>

<p>macOS tiene una única configuración para ambos dispositivos:</p>

<ul>
  <li>Trackpad</li>
  <li>
    <p>Mouse
Si desactivás el scroll invertido:</p>
  </li>
  <li>El mouse queda bien.</li>
  <li>
    <p>El trackpad queda raro.
Si lo activás:</p>
  </li>
  <li>El trackpad queda bien.</li>
  <li>El mouse queda raro.
Es como si en Monkey Island hubieran decidido que la misma llave abre todas las puertas del Caribe.</li>
</ul>

<hr />

<h2 id="la-solución-mos">La solución: Mos</h2>

<p>Después de recorrer tabernas, cuevas secretas y repositorios de GitHub apareció el objeto mágico.</p>

<h3 id="mos">Mos</h3>

<p>Mos es una utilidad gratuita para macOS que hace dos cosas extremadamente importantes:</p>

<ol>
  <li>Permite configurar el scroll de un mouse por separado.</li>
  <li>Agrega smooth scrolling real.
En otras palabras:</li>
</ol>

<ul>
  <li>Trackpad feliz.</li>
  <li>Mouse feliz.</li>
  <li>Usuario feliz.
Algo que Apple aparentemente consideró opcional.</li>
</ul>

<hr />

<h2 id="instalación">Instalación</h2>

<p>Entramos al sitio oficial:</p>

<h3 id="sitio-oficial">Sitio oficial</h3>
<p>👉 <a href="https://mos.caldis.me/">https://mos.caldis.me</a></p>

<p>O directamente al repositorio:</p>

<p>👉 <a href="https://github.com/Caldis/Mos">https://github.com/Caldis/Mos</a></p>

<p>Descargamos la última versión y la instalamos normalmente.</p>

<p>La primera vez macOS probablemente intente protegerte de vos mismo.</p>

<p>Aparecerá algún mensaje dramático tipo:</p>

<blockquote>
  <p>“Esta aplicación fue descargada de Internet.”
Aceptamos.</p>
</blockquote>

<p>Respiramos.</p>

<p>Seguimos adelante.</p>

<hr />

<h2 id="permisos-necesarios">Permisos necesarios</h2>

<p>Una vez abierto Mos, probablemente solicite permisos de accesibilidad.</p>

<p>Ir a:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>System Settings
→ Privacy &amp; Security
→ Accessibility
</code></pre></div></div>

<p>Y habilitar:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Mos
</code></pre></div></div>

<p>Sin eso no podrá interceptar correctamente los eventos del mouse.</p>

<hr />

<h2 id="configuración-recomendada">Configuración recomendada</h2>

<p>Una vez instalado aparece un ícono en la barra superior.</p>

<p>Abrimos Preferences.</p>

<p>Como en la captura:</p>

<p><a href="https://github.com/assets/img/posts/mos-preferences.png"><img src="https://github.com/assets/img/posts/mos-preferences.png" alt="Preferencias de Mos" /></a></p>

<h3 id="general">General</h3>
<p>Activar:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>☑ Launch on Login
</code></pre></div></div>

<p>Así no tenemos que acordarnos nunca más.</p>

<hr />

<h3 id="scrolling">Scrolling</h3>
<p>Acá está la verdadera magia.</p>

<p>Configurar:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>☑ Smooth Scrolling
☑ Reverse Scrolling (solo para mouse si así lo preferís)
</code></pre></div></div>

<p>La idea es recuperar décadas de memoria muscular sin arruinar la experiencia del trackpad.</p>

<hr />

<h3 id="ajustando-la-sensación">Ajustando la sensación</h3>

<p>Cada mouse es distinto.</p>

<p>Yo recomiendo comenzar con:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Step: Medio
Duration: Medio
Acceleration: Baja
</code></pre></div></div>

<p>Y después ajustar según gusto.</p>

<p>El objetivo no es convertir el scroll en una montaña rusa.</p>

<p>El objetivo es que deje de sentirse como una carretilla sobre adoquines.</p>

<hr />

<h2 id="la-diferencia-después-de-instalarlo">La diferencia después de instalarlo</h2>

<p>Antes:</p>

<ul>
  <li>Scroll raro.</li>
  <li>Saltos bruscos.</li>
  <li>Sensación extraña en Chrome.</li>
  <li>Sensación extraña en VSCode.</li>
  <li>
    <p>Sensación extraña en todo.
Después:</p>
  </li>
  <li>Scroll consistente.</li>
  <li>Movimiento suave.</li>
  <li>Mouse funcionando como cualquier persona esperaría.</li>
  <li>Cerebro dejando de insultar a Apple cada cinco minutos.</li>
</ul>

<hr />

<h2 id="vale-la-pena">¿Vale la pena?</h2>

<p>Absolutamente.</p>

<p>Si venís de Linux o Windows y usás mouse físico todos los días, Mos probablemente sea una de las primeras aplicaciones que deberías instalar.</p>

<p>La Mac seguirá teniendo algunas costumbres peculiares.</p>

<p>Pero al menos dejará de discutir con tu memoria muscular cada vez que intentás bajar una página.</p>

<p>Y en el Caribe digital, como aprendimos hace años, evitar peleas innecesarias siempre deja más tiempo para buscar tesoros.</p>

<hr />

<h2 id="kit-de-supervivencia-del-pirata-recién-llegado-a-macos">Kit de supervivencia del pirata recién llegado a macOS</h2>

<p>Mi lista inicial después de desembarcar en la isla:</p>

<ul>
  <li>Mos → arreglar el scroll.</li>
  <li>Rectangle → manejar ventanas como una persona normal.</li>
  <li>Raycast → reemplazar Spotlight.</li>
  <li>iTerm2 → terminal seria.</li>
  <li>Stats → monitoreo liviano del sistema.
Pero esa es una historia para otro viaje.</li>
</ul>

<hr />

<blockquote>
  <p>“Nunca confíes en un sistema operativo que te diga que mover una rueda hacia abajo significa subir.”</p>

  <p>— Guybrush Threepwood, probablemente.</p>
</blockquote>]]></content><author><name>Guybrush Threepwood</name></author><category term="macos" /><category term="productividad" /><category term="herramientas" /><category term="mac" /><category term="mos" /><category term="smooth-scrolling" /><category term="mouse" /><category term="productividad" /><category term="cambio-laboral" /><summary type="html"><![CDATA[Monkey Island vs el Scroll Invertido: domesticando una Mac con Mos]]></summary></entry><entry xml:lang="en"><title type="html">Monkey Island vs Inverted Scroll: domesticating a Mac with Mos</title><link href="https://blog.polverini.com.ar/monkey-island-vs-inverted-scroll-domesticating-a-mac-with-mos.html" rel="alternate" type="text/html" title="Monkey Island vs Inverted Scroll: domesticating a Mac with Mos" /><published>2026-06-23T00:00:00+00:00</published><updated>2026-06-23T00:00:00+00:00</updated><id>https://blog.polverini.com.ar/monkey-island-vs-inverted-scroll-domesticating-a-mac-with-mos</id><content type="html" xml:base="https://blog.polverini.com.ar/monkey-island-vs-inverted-scroll-domesticating-a-mac-with-mos.html"><![CDATA[<h1 id="monkey-island-vs-inverted-scroll-domesticating-a-mac-with-mos">Monkey Island vs Inverted Scroll: domesticating a Mac with Mos</h1>

<p>There are moments in life when you have to make tough decisions.</p>

<p>Leaving a startup.
Changing jobs.
Quitting Windows.</p>

<p>Well, let’s not exaggerate.</p>

<p>The thing is that in this new job mission an unnegotiable condition appeared:</p>

<blockquote>
  <p>“We give you a Mac.”
And there I was.</p>
</blockquote>

<p>A brushed aluminum spaceship.
A processor that seems fed by plutonium.
A battery that lasts longer than some Latin American governments.</p>

<p>But with one small problem.</p>

<p><strong>The scroll was possessed.</strong></p>

<hr />

<h2 id="the-first-encounter-with-the-curse">The first encounter with the curse</h2>

<p>Monkey Island veterans know a curse when they see one.</p>

<p>I opened Chrome.
I moved the mouse wheel down.</p>

<p>The page scrolled up.</p>

<p>I moved it again.</p>

<p>The page kept going up.</p>

<p>I thought I was tired.</p>

<p>I tried again.</p>

<p>No.</p>

<p>The Mac was convinced my brain worked backward.</p>

<hr />

<h2 id="apples-official-explanation">Apple’s official explanation</h2>

<p>Apple calls this:</p>

<blockquote>
  <p>Natural Scrolling
Which is a fancy way of saying:</p>
</blockquote>

<blockquote>
  <p>“Let’s assume everyone uses a trackpad.”
And there’s the problem.</p>
</blockquote>

<p>When you scroll with your fingers on a trackpad, the movement has a certain logic:</p>

<ul>
  <li>You push the content up.</li>
  <li>The content moves up.</li>
  <li>You see lower content.
Perfect.</li>
</ul>

<p>But when you connect a mouse like a civilized person who spent decades using computers…</p>

<p>…that logic becomes a kind of voodoo ritual.</p>

<p>You move the wheel down.</p>

<p>The screen goes up.</p>

<p>Your brain enters an existential conflict.</p>

<hr />

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

<p>The madness doesn’t end there.</p>

<p>macOS has a single setting for both devices:</p>

<ul>
  <li>Trackpad</li>
  <li>
    <p>Mouse
If you disable inverted scroll:</p>
  </li>
  <li>The mouse behaves.</li>
  <li>
    <p>The trackpad feels weird.
If you enable it:</p>
  </li>
  <li>The trackpad behaves.</li>
  <li>The mouse feels weird.
It’s as if in Monkey Island they decided the same key opens every door in the Caribbean.</li>
</ul>

<hr />

<h2 id="the-solution-mos">The solution: Mos</h2>

<p>After roaming taverns, secret caves, and GitHub repositories, the magical object appeared.</p>

<h3 id="mos">Mos</h3>

<p>Mos is a free utility for macOS that does two extremely important things:</p>

<ol>
  <li>It lets you configure mouse scroll separately.</li>
  <li>It adds real smooth scrolling.
In other words:</li>
</ol>

<ul>
  <li>Trackpad happy.</li>
  <li>Mouse happy.</li>
  <li>User happy.
Something Apple apparently left optional.</li>
</ul>

<hr />

<h2 id="installation">Installation</h2>

<p>We went to the official site:</p>

<h3 id="official-site">Official site</h3>
<p>👉 <a href="https://mos.caldis.me/">https://mos.caldis.me</a></p>

<p>Or directly to the repo:</p>

<p>👉 <a href="https://github.com/Caldis/Mos">https://github.com/Caldis/Mos</a></p>

<p>We downloaded the latest version and installed it normally.</p>

<p>The first time macOS will probably try to protect you from yourself.</p>

<p>A dramatic message like this will appear:</p>

<blockquote>
  <p>“This app was downloaded from the Internet.”
We accept.</p>
</blockquote>

<p>We breathe.</p>

<p>We keep going.</p>

<hr />

<h2 id="required-permissions">Required permissions</h2>

<p>Once Mos is open, it will likely ask for accessibility permissions.</p>

<p>Go to:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>System Settings
→ Privacy &amp; Security
→ Accessibility
</code></pre></div></div>

<p>And enable:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Mos
</code></pre></div></div>

<p>Without that it won’t be able to intercept mouse events correctly.</p>

<hr />

<h2 id="recommended-configuration">Recommended configuration</h2>

<p>Once installed, an icon appears in the top bar.</p>

<p>Open Preferences.</p>

<p>Like in the screenshot:</p>

<p><a href="https://github.com/assets/img/posts/mos-preferences.png"><img src="https://github.com/assets/img/posts/mos-preferences.png" alt="Mos Preferences" /></a></p>

<h3 id="general">General</h3>
<p>Enable:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>☑ Launch on Login
</code></pre></div></div>

<p>So we never have to remember it again.</p>

<hr />

<h3 id="scrolling">Scrolling</h3>
<p>This is where the real magic happens.</p>

<p>Configure:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>☑ Smooth Scrolling
☑ Reverse Scrolling (only for mouse if you prefer)
</code></pre></div></div>

<p>The idea is to recover decades of muscle memory without ruining the trackpad experience.</p>

<hr />

<h3 id="adjusting-the-feel">Adjusting the feel</h3>

<p>Every mouse is different.</p>

<p>I recommend starting with:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Step: Medium
Duration: Medium
Acceleration: Low
</code></pre></div></div>

<p>And then tweak it to taste.</p>

<p>The goal is not to turn scrolling into a roller coaster.</p>

<p>The goal is to make it stop feeling like a wheelbarrow on cobblestones.</p>

<hr />

<h2 id="the-difference-after-installing-it">The difference after installing it</h2>

<p>Before:</p>

<ul>
  <li>Weird scroll.</li>
  <li>Jerky jumps.</li>
  <li>Strange feeling in Chrome.</li>
  <li>Strange feeling in VSCode.</li>
  <li>
    <p>Strange feeling everywhere.
After:</p>
  </li>
  <li>Consistent scroll.</li>
  <li>Smooth movement.</li>
  <li>Mouse working like anyone would expect.</li>
  <li>Brain stops insulting Apple every five minutes.</li>
</ul>

<hr />

<h2 id="is-it-worth-it">Is it worth it?</h2>

<p>Absolutely.</p>

<p>If you come from Linux or Windows and use a physical mouse every day, Mos is probably one of the first apps you should install.</p>

<p>The Mac will still have some peculiar habits.</p>

<p>But at least it will stop arguing with your muscle memory every time you try to scroll down a page.</p>

<p>And in the digital Caribbean, as we learned years ago, avoiding unnecessary fights always leaves more time to hunt for treasure.</p>

<hr />

<h2 id="survival-kit-for-a-pirate-new-to-macos">Survival kit for a pirate new to macOS</h2>

<p>My initial list after landing on the island:</p>

<ul>
  <li>Mos → fix scroll.</li>
  <li>Rectangle → manage windows like a normal person.</li>
  <li>Raycast → replace Spotlight.</li>
  <li>iTerm2 → proper terminal.</li>
  <li>Stats → lightweight system monitoring.
But that is a story for another voyage.</li>
</ul>

<hr />

<blockquote>
  <p>“Never trust an operating system that tells you moving a wheel down means going up.”</p>

  <p>— Guybrush Threepwood, probably.</p>
</blockquote>]]></content><author><name>Guybrush Threepwood</name></author><category term="macos" /><category term="productivity" /><category term="tools" /><category term="mac" /><category term="mos" /><category term="smooth-scrolling" /><category term="mouse" /><category term="productivity" /><category term="career-change" /><summary type="html"><![CDATA[Monkey Island vs Inverted Scroll: domesticating a Mac with Mos]]></summary></entry><entry xml:lang="es"><title type="html">OpenClaw y la maldición del perfil messaging (parte 2: exorcismo completo)</title><link href="https://blog.polverini.com.ar/la-trampa-continua-openclaw-no-tiene-manos.html" rel="alternate" type="text/html" title="OpenClaw y la maldición del perfil messaging (parte 2: exorcismo completo)" /><published>2026-03-19T00:00:00+00:00</published><updated>2026-03-19T00:00:00+00:00</updated><id>https://blog.polverini.com.ar/la-trampa-continua-openclaw-no-tiene-manos</id><content type="html" xml:base="https://blog.polverini.com.ar/la-trampa-continua-openclaw-no-tiene-manos.html"><![CDATA[<p>Si pensabas que la historia terminaba con el perfil <code class="language-plaintext highlighter-rouge">messaging</code>…<br />
dejame decirte algo, camarada:</p>

<p><strong>recién estábamos saliendo del tutorial.</strong></p>

<hr />

<h2 id="-seguía-sin-andar-y-ya-era-personal">🪦 Seguía sin andar (y ya era personal)</h2>

<p>Después de:</p>

<ul>
  <li>cambiar profiles</li>
  <li>pelear con sandbox</li>
  <li>invocar comandos olvidados</li>
  <li>sospechar de Docker que ni estaba instalado</li>
</ul>

<p>OpenClaw seguía igual:</p>

<blockquote>
  <p>hablaba lindo… pero no tocaba nada.</p>
</blockquote>

<p>Ni filesystem, ni shell, ni nada.</p>

<p>Era como tener a Guybrush con toda la actitud…<br />
pero atado a una silla.</p>

<hr />

<h2 id="-plot-twist-no-era-config-era-instalación-rota">🧠 Plot twist: no era config… era instalación rota</h2>

<p>Ahí cae la ficha:</p>

<p>👉 no era que estaba mal configurado<br />
👉 <strong>estaba mal instalado desde el vamos</strong></p>

<p>La one-liner me había dejado un híbrido raro:</p>
<ul>
  <li>sin config persistente</li>
  <li>sin comandos completos</li>
  <li>sin capacidades reales</li>
</ul>

<p>Un OpenClaw… decorativo.</p>

<hr />

<h2 id="-el-exorcismo-borrón-y-cuenta-nueva">🧹 El exorcismo (borrón y cuenta nueva)</h2>

<p>Acá no hay parche que valga.</p>

<p>Esto fue <strong>wipe total nivel “quemar la isla y empezar de nuevo”</strong>:</p>

<h3 id="-step-1--stop--remove-everything">🧨 Step 1 — Stop &amp; Remove Everything</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Stop gateway</span>
openclaw gateway stop <span class="o">||</span> <span class="nb">true</span>

<span class="c"># Uninstall</span>
npm uninstall <span class="nt">-g</span> openclaw

<span class="c"># Limpiar restos</span>
<span class="nb">rm</span> <span class="nt">-f</span> /usr/bin/openclaw
<span class="nb">rm</span> <span class="nt">-rf</span> /usr/lib/node_modules/openclaw

<span class="c"># Borrar TODO estado</span>
<span class="nb">rm</span> <span class="nt">-rf</span> ~/.openclaw ~/.clawdbot ~/.moltbot ~/.molthub
</code></pre></div></div>

<p>Y el golpe final al background service:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Linux</span>
systemctl <span class="nt">--user</span> disable <span class="nt">--now</span> openclaw-gateway.service
<span class="nb">rm</span> <span class="nt">-f</span> ~/.config/systemd/user/openclaw-gateway.service
systemctl <span class="nt">--user</span> daemon-reload
</code></pre></div></div>

<hr />

<h2 id="-step-2--verificar-que-no-quede-ni-el-loro">🔍 Step 2 — Verificar que no quede ni el loro</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">command</span> <span class="nt">-v</span> openclaw <span class="o">||</span> <span class="nb">echo</span> <span class="s2">"Binary removed ✓"</span>
<span class="nb">ls</span> ~/.openclaw 2&gt;/dev/null <span class="o">||</span> <span class="nb">echo</span> <span class="s2">"State dir removed ✓"</span>
</code></pre></div></div>

<p>👉 Si algo sigue ahí… <strong>no terminaste el ritual.</strong></p>

<hr />

<h2 id="-step-3--instalación-limpia-la-posta">📦 Step 3 — Instalación limpia (la posta)</h2>

<p>Con Node 22+:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-fsSL</span> https://openclaw.ai/install.sh | bash
</code></pre></div></div>

<p>o:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>npm <span class="nb">install</span> <span class="nt">-g</span> openclaw@2026.3.13
</code></pre></div></div>

<hr />

<h2 id="-step-4--onboarding-como-persona-civilizada">🚀 Step 4 — Onboarding como persona civilizada</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>openclaw onboard
</code></pre></div></div>

<p>Esto:</p>
<ul>
  <li>crea config real</li>
  <li>configura workspace</li>
  <li>instala gateway</li>
  <li>define skills correctamente</li>
</ul>

<p>Después:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>openclaw doctor
openclaw status
</code></pre></div></div>

<hr />

<h2 id="-resultado-la-parte-linda">⚡ Resultado (la parte linda)</h2>

<p>Y acá viene lo importante:</p>

<p>👉 <strong>sin tocar una sola config manual</strong></p>

<p>OpenClaw empezó a:</p>

<ul>
  <li>✔ acceder al filesystem</li>
  <li>✔ escribir archivos</li>
  <li>✔ usar shell</li>
  <li>✔ laburar como corresponde</li>
</ul>

<p>Desde el workspace… hasta discos.</p>

<hr />

<h2 id="-moraleja-técnica">🧠 Moraleja técnica</h2>

<p>En OpenClaw 2026:</p>

<blockquote>
  <p><strong>si algo no anda, no asumas config… asumí instalación corrupta.</strong></p>
</blockquote>

<p>Porque:</p>
<ul>
  <li>el sistema ahora es declarativo</li>
  <li>el onboarding arma todo</li>
  <li>y tocar JSON a mano es como pelear con espadas usando un pollo de goma</li>
</ul>

<hr />

<h2 id="️-conclusión-final">🏴‍☠️ Conclusión final</h2>

<p>Después de horas debuggeando sandbox, profiles y permisos…</p>

<p>el problema real era simple:</p>

<p>👉 <strong>había invocado al demonio… pero con un círculo mal dibujado.</strong></p>

<hr />

<p>Y recordá, pirata del código:</p>

<blockquote>
  <p>a veces no necesitás arreglar el barco…<br />
necesitás hundirlo y construir uno nuevo.</p>
</blockquote>

<hr />

<p>Y como diría un viejo sabio del Caribe digital:</p>

<p><strong>“Nunca confíes en una instalación que ‘más o menos’ funciona… eso termina peor que usar Windows en alta mar.”</strong></p>]]></content><author><name>Guybrush Threepwood</name></author><category term="openclaw" /><category term="devops" /><category term="virtualbox" /><category term="sandbox" /><category term="debugging" /><category term="monkey-island-vibes" /><summary type="html"><![CDATA[Si pensabas que la historia terminaba con el perfil messaging… dejame decirte algo, camarada:]]></summary></entry><entry xml:lang="en"><title type="html">OpenClaw and the curse of the messaging profile (part 2: full exorcism)</title><link href="https://blog.polverini.com.ar/openclaw-messaging-profile-part-2-full-exorcism.html" rel="alternate" type="text/html" title="OpenClaw and the curse of the messaging profile (part 2: full exorcism)" /><published>2026-03-19T00:00:00+00:00</published><updated>2026-03-19T00:00:00+00:00</updated><id>https://blog.polverini.com.ar/openclaw-messaging-profile-part-2-full-exorcism</id><content type="html" xml:base="https://blog.polverini.com.ar/openclaw-messaging-profile-part-2-full-exorcism.html"><![CDATA[<p>If you thought the story ended with the <code class="language-plaintext highlighter-rouge">messaging</code> profile…</p>

<p>let me tell you something, comrade:</p>

<p><strong>we were barely out of the tutorial.</strong></p>

<hr />

<h2 id="-still-broken-and-now-it-was-personal">🪦 Still broken (and now it was personal)</h2>

<p>After:</p>

<ul>
  <li>switching profiles</li>
  <li>wrestling with the sandbox</li>
  <li>invoking forgotten commands</li>
  <li>suspecting Docker that wasn’t even installed</li>
</ul>

<p>OpenClaw was still the same:</p>

<blockquote>
  <p>talked smooth… but didn’t touch a thing.</p>
</blockquote>

<p>No filesystem, no shell, nothing.</p>

<p>It was like having Guybrush with all the attitude…<br />
but tied to a chair.</p>

<hr />

<h2 id="-plot-twist-it-wasnt-config-it-was-a-broken-install">🧠 Plot twist: it wasn’t config… it was a broken install</h2>

<p>That’s when it clicked:</p>

<p>👉 it wasn’t misconfigured<br />
👉 <strong>it was broken from the very beginning</strong></p>

<p>The one-liner had left me with a weird hybrid:</p>
<ul>
  <li>no persistent config</li>
  <li>no complete commands</li>
  <li>no real capabilities</li>
</ul>

<p>A decorative OpenClaw.</p>

<hr />

<h2 id="-the-exorcism-scorched-earth">🧹 The exorcism (scorched earth)</h2>

<p>No patch is going to fix this.</p>

<p>This was a <strong>total wipe — “burn the island and start over” level</strong>:</p>

<h3 id="-step-1--stop--remove-everything">🧨 Step 1 — Stop &amp; Remove Everything</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Stop gateway</span>
openclaw gateway stop <span class="o">||</span> <span class="nb">true</span>

<span class="c"># Uninstall</span>
npm uninstall <span class="nt">-g</span> openclaw

<span class="c"># Clean up the leftovers</span>
<span class="nb">rm</span> <span class="nt">-f</span> /usr/bin/openclaw
<span class="nb">rm</span> <span class="nt">-rf</span> /usr/lib/node_modules/openclaw

<span class="c"># Wipe ALL state</span>
<span class="nb">rm</span> <span class="nt">-rf</span> ~/.openclaw ~/.clawdbot ~/.moltbot ~/.molthub
</code></pre></div></div>

<p>And the final blow to the background service:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Linux</span>
systemctl <span class="nt">--user</span> disable <span class="nt">--now</span> openclaw-gateway.service
<span class="nb">rm</span> <span class="nt">-f</span> ~/.config/systemd/user/openclaw-gateway.service
systemctl <span class="nt">--user</span> daemon-reload
</code></pre></div></div>

<hr />

<h2 id="-step-2--verify-nothings-left-behind">🔍 Step 2 — Verify nothing’s left behind</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">command</span> <span class="nt">-v</span> openclaw <span class="o">||</span> <span class="nb">echo</span> <span class="s2">"Binary removed ✓"</span>
<span class="nb">ls</span> ~/.openclaw 2&gt;/dev/null <span class="o">||</span> <span class="nb">echo</span> <span class="s2">"State dir removed ✓"</span>
</code></pre></div></div>

<p>👉 If anything’s still there… <strong>the ritual isn’t done yet.</strong></p>

<hr />

<h2 id="-step-3--clean-install-the-real-deal">📦 Step 3 — Clean install (the real deal)</h2>

<p>With Node 22+:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-fsSL</span> https://openclaw.ai/install.sh | bash
</code></pre></div></div>

<p>or:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>npm <span class="nb">install</span> <span class="nt">-g</span> openclaw@2026.3.13
</code></pre></div></div>

<hr />

<h2 id="-step-4--onboarding-like-a-civilized-person">🚀 Step 4 — Onboarding like a civilized person</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>openclaw onboard
</code></pre></div></div>

<p>This:</p>
<ul>
  <li>creates real config</li>
  <li>sets up the workspace</li>
  <li>installs the gateway</li>
  <li>defines skills correctly</li>
</ul>

<p>Then:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>openclaw doctor
openclaw status
</code></pre></div></div>

<hr />

<h2 id="-result-the-good-part">⚡ Result (the good part)</h2>

<p>And here’s the important bit:</p>

<p>👉 <strong>without touching a single config manually</strong></p>

<p>OpenClaw started:</p>

<ul>
  <li>✔ accessing the filesystem</li>
  <li>✔ writing files</li>
  <li>✔ using the shell</li>
  <li>✔ working like it should</li>
</ul>

<p>From the workspace… all the way to disk.</p>

<hr />

<h2 id="-technical-lesson">🧠 Technical lesson</h2>

<p>In OpenClaw 2026:</p>

<blockquote>
  <p><strong>if something doesn’t work, don’t assume config… assume corrupt install.</strong></p>
</blockquote>

<p>Because:</p>
<ul>
  <li>the system is now declarative</li>
  <li>onboarding sets everything up</li>
  <li>and editing JSON by hand is like sword fighting with a rubber chicken</li>
</ul>

<hr />

<h2 id="️-final-conclusion">🏴‍☠️ Final conclusion</h2>

<p>After hours debugging sandbox, profiles, and permissions…</p>

<p>the real problem was simple:</p>

<p>👉 <strong>I had summoned the demon… with a badly drawn circle.</strong></p>

<hr />

<p>And remember, code pirate:</p>

<blockquote>
  <p>sometimes you don’t need to fix the ship…<br />
you need to sink it and build a new one.</p>
</blockquote>

<hr />

<p>As a wise old sage of the digital Caribbean once said:</p>

<p><strong>“Never trust an install that ‘sort of’ works… that ends up worse than running Windows on the high seas.”</strong></p>]]></content><author><name>Guybrush Threepwood</name></author><category term="openclaw" /><category term="devops" /><category term="virtualbox" /><category term="sandbox" /><category term="debugging" /><category term="monkey-island-vibes" /><summary type="html"><![CDATA[If you thought the story ended with the messaging profile…]]></summary></entry><entry xml:lang="es"><title type="html">OpenClaw y la maldición del perfil messaging</title><link href="https://blog.polverini.com.ar/la-trampa-del-messaging-openclaw.html" rel="alternate" type="text/html" title="OpenClaw y la maldición del perfil messaging" /><published>2026-03-18T00:00:00+00:00</published><updated>2026-03-18T00:00:00+00:00</updated><id>https://blog.polverini.com.ar/la-trampa-del-messaging-openclaw</id><content type="html" xml:base="https://blog.polverini.com.ar/la-trampa-del-messaging-openclaw.html"><![CDATA[<p>Hay días en los que uno se levanta con ganas de conquistar el Caribe digital… y otros en los que decide instalar OpenClaw v2026.3.2 en una máquina shieldiada dentro de VirtualBox. Yo, claramente, elegí el segundo. Error táctico digno de un pirata que intenta abrir una puerta empujando donde dice “tirar”.</p>

<p>Todo empezó justo cuando la gobernadora Marley —una especie de Elaine pero con RFCs bajo el brazo— decidió poner reglas claras en la isla. “Orden, seguridad, sandboxing”, decía. Y yo, ingenuo como Guybrush entrando al Scumm Bar por primera vez, pensé: <em>“qué bueno, esto va a andar bárbaro”</em>.</p>

<p>Spoiler: no.</p>

<h2 id="️-el-perfil-maldito-messaging">🏴‍☠️ El perfil maldito: “messaging”</h2>

<p>Instalo OpenClaw, lo levanto… y el bicho se comporta como un loro amaestrado:</p>

<ul>
  <li>habla ✔️</li>
  <li>responde ✔️</li>
  <li>ejecuta algo útil ❌</li>
</ul>

<p>Ahí es donde descubrís la trampa más elegante desde el insulto con espadas: el perfil <code class="language-plaintext highlighter-rouge">messaging</code>.</p>

<p>Este modo es básicamente como contratar a un mercenario que solo te da consejos motivacionales. Está diseñado para “seguridad por defecto”, lo cual en criollo significa:</p>

<blockquote>
  <p>“No te dejo romper nada… pero tampoco te dejo hacer nada.”</p>
</blockquote>

<p>El agente no puede:</p>
<ul>
  <li>ejecutar comandos</li>
  <li>tocar archivos</li>
  <li>ni siquiera mirar de reojo tu sistema</li>
</ul>

<p>Es como tener a LeChuck encerrado en una botella… pero sin magia. Solo inútil.</p>

<h2 id="-el-sandbox-la-isla-dentro-de-la-isla">🧱 El sandbox: la isla dentro de la isla</h2>

<p>Cuando pensás que ya entendiste el problema, aparece el segundo jefe del nivel: el sandbox.</p>

<p>OpenClaw decide que cada sesión viva dentro de su propio mini-mundo:</p>
<ul>
  <li>Docker</li>
  <li>OpenShell</li>
  <li>filesystem fantasma</li>
</ul>

<p>Vos le decís:</p>
<blockquote>
  <p>“che, andá a <code class="language-plaintext highlighter-rouge">/home/ramiro/proyecto</code>”</p>
</blockquote>

<p>Y el agente te mira como Guybrush cuando le hablás de física cuántica:</p>
<blockquote>
  <p>“No conozco ese lugar, capo.”</p>
</blockquote>

<p>Porque claro, está encerrado en su islita virtual. Sin mounts, sin binds, sin nada. Un Robinson Crusoe pero sin Friday.</p>

<h2 id="️-el-ritual-para-devolverle-el-alma">⚙️ El ritual para devolverle el alma</h2>

<p>Después de putear un rato (fase obligatoria), encontrás los conjuros correctos:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>openclaw config <span class="nb">set </span>tools.profile full
openclaw gateway restart
</code></pre></div></div>

<p>Ahí, recién ahí, el bicho empieza a comportarse como un verdadero pirata del código.</p>

<p>Pero no termina ahí. Porque OpenClaw es como un barco viejo: cada vela hay que desplegarla a mano:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>openclaw config <span class="nb">set </span>tools.allow_shell <span class="nb">true
</span>openclaw config <span class="nb">set </span>tools.allow_filesystem <span class="nb">true
</span>openclaw config <span class="nb">set </span>tools.allow_network <span class="nb">true
</span>openclaw config <span class="nb">set </span>tools.allow_exec <span class="nb">true</span>
</code></pre></div></div>

<p>Y finalmente, le marcás el territorio:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>openclaw config <span class="nb">set </span>agents.defaults.workspace <span class="s2">"~/.openclaw/workspace"</span>
</code></pre></div></div>

<p>Ahora sí. Ahora el agente deja de ser un NPC decorativo y pasa a ser tripulación.</p>

<h2 id="-bonus-track-el-fantasma-de-windows">🪟 Bonus track: el fantasma de Windows</h2>

<p>En todo este proceso, hay algo que me quedó claro:<br />
si esto lo intentás en Windows… directamente estás jugando en modo pesadilla.</p>

<p>No lo digo yo, lo dice la experiencia:
es como querer navegar el Caribe con un bote inflable pinchado.</p>

<h2 id="-conclusión-el-verdadero-enemigo-no-era-lechuck">🧠 Conclusión: el verdadero enemigo no era LeChuck</h2>

<p>Uno piensa que el problema es la virtualización, o Docker, o permisos…<br />
pero no.</p>

<p>El verdadero villano era ese pequeño detalle escondido en la config:<br />
<code class="language-plaintext highlighter-rouge">tools.profile = messaging</code></p>

<p>Una línea. Un switch. Una maldición.</p>

<p>Y así fue como, intentando instalar OpenClaw en una VM más blindada que tesoro de pirata, terminé aprendiendo que a veces el problema no es la falta de poder…</p>

<p>…sino que alguien decidió, muy amablemente, que no lo tengas.</p>

<hr />

<p>Y recordá: en el mundo del software, como en Monkey Island, nunca confíes en algo que funciona “por defecto”… salvo que quieras terminar peleando con una gallina de goma con polea en el medio.</p>]]></content><author><name>Guybrush Threepwood</name></author><category term="openclaw" /><category term="devops" /><category term="virtualbox" /><category term="sandbox" /><category term="monkey-island-vibes" /><summary type="html"><![CDATA[Hay días en los que uno se levanta con ganas de conquistar el Caribe digital… y otros en los que decide instalar OpenClaw v2026.3.2 en una máquina shieldiada dentro de VirtualBox. Yo, claramente, elegí el segundo. Error táctico digno de un pirata que intenta abrir una puerta empujando donde dice “tirar”.]]></summary></entry><entry xml:lang="en"><title type="html">OpenClaw and the curse of the messaging profile</title><link href="https://blog.polverini.com.ar/openclaw-and-the-curse-of-the-messaging-profile.html" rel="alternate" type="text/html" title="OpenClaw and the curse of the messaging profile" /><published>2026-03-18T00:00:00+00:00</published><updated>2026-03-18T00:00:00+00:00</updated><id>https://blog.polverini.com.ar/openclaw-and-the-curse-of-the-messaging-profile</id><content type="html" xml:base="https://blog.polverini.com.ar/openclaw-and-the-curse-of-the-messaging-profile.html"><![CDATA[<p>There are days when you wake up ready to conquer the digital Caribbean… and others when you decide to install OpenClaw v2026.3.2 on a shielded machine inside VirtualBox. I, clearly, chose the second. A tactical blunder worthy of a pirate trying to open a door by pushing on the “pull” side.</p>

<p>It all started when Governor Marley — a kind of Elaine but with RFCs under her arm — decided to lay down the law on the island. “Order, security, sandboxing,” she said. And I, as naive as Guybrush walking into the Scumm Bar for the first time, thought: <em>“great, this is going to work perfectly”</em>.</p>

<p>Spoiler: no.</p>

<h2 id="️-the-cursed-profile-messaging">🏴‍☠️ The cursed profile: “messaging”</h2>

<p>I install OpenClaw, fire it up… and the thing behaves like a trained parrot:</p>

<ul>
  <li>talks ✔️</li>
  <li>responds ✔️</li>
  <li>does anything useful ❌</li>
</ul>

<p>That’s when you discover the most elegant trap since the insult sword fight: the <code class="language-plaintext highlighter-rouge">messaging</code> profile.</p>

<p>This mode is basically like hiring a mercenary who only gives you motivational advice. It’s designed for “security by default,” which in plain English means:</p>

<blockquote>
  <p>“I won’t let you break anything… but I won’t let you do anything either.”</p>
</blockquote>

<p>The agent cannot:</p>
<ul>
  <li>execute commands</li>
  <li>touch files</li>
  <li>or even glance sideways at your system</li>
</ul>

<p>It’s like having LeChuck locked in a bottle… but without the magic. Just useless.</p>

<h2 id="-the-sandbox-the-island-within-the-island">🧱 The sandbox: the island within the island</h2>

<p>When you think you’ve understood the problem, the second boss appears: the sandbox.</p>

<p>OpenClaw decides that every session lives inside its own mini-world:</p>
<ul>
  <li>Docker</li>
  <li>OpenShell</li>
  <li>ghost filesystem</li>
</ul>

<p>You tell it:</p>
<blockquote>
  <p>“hey, go to <code class="language-plaintext highlighter-rouge">/home/ramiro/proyecto</code>”</p>
</blockquote>

<p>And the agent looks at you like Guybrush when you bring up quantum physics:</p>
<blockquote>
  <p>“I don’t know that place, mate.”</p>
</blockquote>

<p>Because of course — it’s locked in its little virtual island. No mounts, no binds, nothing. A Robinson Crusoe without Friday.</p>

<h2 id="️-the-ritual-to-restore-its-soul">⚙️ The ritual to restore its soul</h2>

<p>After swearing for a bit (mandatory phase), you find the right spells:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>openclaw config <span class="nb">set </span>tools.profile full
openclaw gateway restart
</code></pre></div></div>

<p>Only then does the thing start behaving like a proper code pirate.</p>

<p>But it doesn’t end there. Because OpenClaw is like an old ship: every sail has to be hoisted by hand:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>openclaw config <span class="nb">set </span>tools.allow_shell <span class="nb">true
</span>openclaw config <span class="nb">set </span>tools.allow_filesystem <span class="nb">true
</span>openclaw config <span class="nb">set </span>tools.allow_network <span class="nb">true
</span>openclaw config <span class="nb">set </span>tools.allow_exec <span class="nb">true</span>
</code></pre></div></div>

<p>And finally, you mark the territory:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>openclaw config <span class="nb">set </span>agents.defaults.workspace <span class="s2">"~/.openclaw/workspace"</span>
</code></pre></div></div>

<p>Now we’re talking. Now the agent stops being a decorative NPC and becomes actual crew.</p>

<h2 id="-bonus-track-the-ghost-of-windows">🪟 Bonus track: the ghost of Windows</h2>

<p>Throughout this whole process, one thing became crystal clear:<br />
if you’re trying this on Windows… you’re playing on nightmare mode.</p>

<p>Not my words — experience talking:<br />
it’s like trying to sail the Caribbean in a punctured inflatable boat.</p>

<h2 id="-conclusion-the-real-enemy-wasnt-lechuck">🧠 Conclusion: the real enemy wasn’t LeChuck</h2>

<p>You think the problem is virtualization, or Docker, or permissions…<br />
but no.</p>

<p>The real villain was that tiny little detail hidden in the config:<br />
<code class="language-plaintext highlighter-rouge">tools.profile = messaging</code></p>

<p>One line. One switch. One curse.</p>

<p>And that’s how, while trying to install OpenClaw in a VM more armored than a pirate’s treasure chest, I learned that sometimes the problem isn’t a lack of power…</p>

<p>…but that someone very kindly decided you shouldn’t have any.</p>

<hr />

<p>And remember: in the world of software, as in Monkey Island, never trust something that works “by default”… unless you want to end up fighting with a rubber chicken on a pulley.</p>]]></content><author><name>Guybrush Threepwood</name></author><category term="openclaw" /><category term="devops" /><category term="virtualbox" /><category term="sandbox" /><category term="monkey-island-vibes" /><summary type="html"><![CDATA[There are days when you wake up ready to conquer the digital Caribbean… and others when you decide to install OpenClaw v2026.3.2 on a shielded machine inside VirtualBox. I, clearly, chose the second. A tactical blunder worthy of a pirate trying to open a door by pushing on the “pull” side.]]></summary></entry></feed>