<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Lindoelio]]></title><description><![CDATA[Lindoelio]]></description><link>https://lindoelio.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 19:36:59 GMT</lastBuildDate><atom:link href="https://lindoelio.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Always Free Kubernetes for Agents with Paperclip, OpenClaw, QwenCode and OpenCode]]></title><description><![CDATA[A technical walkthrough of lindoelio/oci-oke-cluster-for-agents. Claims below map to files in that repository (see Sources). Lab-oriented stack — not a hardened production blueprint.
What you get from]]></description><link>https://lindoelio.hashnode.dev/always-free-kubernetes-for-agents-with-paperclip-openclaw-qwencode-and-opencode</link><guid isPermaLink="true">https://lindoelio.hashnode.dev/always-free-kubernetes-for-agents-with-paperclip-openclaw-qwencode-and-opencode</guid><dc:creator><![CDATA[Lindoélio Lázaro]]></dc:creator><pubDate>Mon, 07 Sep 2026 21:55:55 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/67cec3e4173fb66dd97b4752/c7c7256e-daf2-441e-b5e1-b6befb4e949c.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>A technical walkthrough of</em> <a href="https://github.com/lindoelio/oci-oke-cluster-for-agents"><em>lindoelio/oci-oke-cluster-for-agents</em></a><em>. Claims below map to files in that repository (see Sources). Lab-oriented stack — not a hardened production blueprint.</em></p>
<h2>What you get from one apply</h2>
<p>Fill <code>src/terraform.tfvars</code>, run apply, and you land a child compartment, an Always Free–sized OKE cluster on Oracle ARM, and a working agent lab on top: Paperclip (orchestration UI + Postgres), OpenClaw (operator + instance), OpenCode Web (ARM64 image you build), shared headless Chromium over CDP, Ingress + optional TLS, metrics, and nightly Object Storage backups.</p>
<p>The public README stays intentionally slim. This article is the depth pass: architecture, free-tier math, the non-obvious wiring that makes the stack actually apply on Kubernetes 1.36 / CRI-O, and where to fork next.</p>
<h2>Architecture at a glance</h2>
<img src="https://cdn.hashnode.com/uploads/covers/67cec3e4173fb66dd97b4752/4a1a8491-e635-43fb-b75d-0e31bfa38ca7.png" alt="Architecture overview" style="display:block;margin:0 auto" />

<pre><code class="language-plaintext">OCI Tenancy
└── Child compartment (Terraform-managed, named from project_prefix)
    ├── OKE basic cluster (K8s v1.36, Flannel, public control plane)
    │   ├── 2x VM.Standard.A1.Flex workers (2 OCPU / 12 GB each by default)
    │   ├── kube-system: crio-shortname-fix DaemonSet, metrics-server
    │   ├── ingress-nginx: NGINX + OCI flexible LB (10/10 Mbps)
    │   ├── cert-manager + optional Lets Encrypt ClusterIssuer
    │   ├── paperclip/: UI + Postgres StatefulSet + shared CDP browser
    │   ├── openclaw-system/: openclaw-operator (Helm)
    │   ├── openclaw/: OpenClawInstance + data PVC
    │   ├── opencode/: OpenCode Web Deployment + PVC (+ Ingress)
    │   └── qwen/: optional Qwen Code Web (default off)
    └── Object Storage bucket {prefix}-backups + write/read PARs
</code></pre>
<p>OKE comes from <code>oracle-terraform-modules/oke/oci</code> <strong>v5.4.3</strong> (<code>src/oke.tf</code>). App objects use <code>hashicorp-oss/kubectl</code> — not <code>hashicorp/kubernetes</code> — because the latter hangs on Kubernetes 1.36 (<code>README.md</code>, <code>src/main.tf</code>). That provider choice is the difference between a clean apply and a stuck one.</p>
<h2>Free-tier budget and trade-offs</h2>
<p>Defaults with Paperclip + OpenClaw + OpenCode + browser (Qwen off), from the upstream README table and Terraform defaults:</p>
<table>
<thead>
<tr>
<th>Layer</th>
<th>Default sizing</th>
</tr>
</thead>
<tbody><tr>
<td>Nodes</td>
<td>2x A1.Flex → <strong>4000m / 24Gi</strong>, <strong>50 GB</strong> boot each</td>
</tr>
<tr>
<td>Paperclip + Postgres</td>
<td>limits <strong>1000m / 4Gi</strong>; storage <strong>5Gi + 10Gi</strong></td>
</tr>
<tr>
<td>Shared browser</td>
<td>limits <strong>1000m / 2Gi</strong></td>
</tr>
<tr>
<td>OpenClaw</td>
<td>limits <strong>500m / 2Gi</strong>; PVC <strong>5Gi</strong></td>
</tr>
<tr>
<td>OpenCode</td>
<td>limits <strong>500m / 8Gi</strong>; PVC <strong>5Gi</strong></td>
</tr>
</tbody></table>
<p>Storage sketch (defaults, Qwen off):</p>
<ul>
<li><p>Boots: 2 × 50 GB = 100 GB (<code>worker_shape.boot_volume_size</code> in <code>src/oke.tf</code>)</p>
</li>
<li><p>App PVCs: Paperclip 5Gi + DB 10Gi + OpenClaw 5Gi + OpenCode 5Gi ≈ 25 Gi</p>
</li>
<li><p>Fits a ~200 GB Always Free block narrative with headroom; Qwen adds another 5Gi PVC</p>
</li>
<li><p>Object Storage backups are separate (<code>src/backup.tf</code> bucket + PARs)</p>
</li>
</ul>
<p>Always Free ARM is commonly <strong>4 OCPU + 24 GB</strong> and roughly <strong>200 GB</strong> block. This repo sizes to fit that envelope — not for HA.</p>
<p>Trade-offs worth knowing before you apply:</p>
<ol>
<li><p>Example tfvars sets <code>oci_public_workers = true</code>; <code>variables.tf</code> default is <code>false</code>.</p>
</li>
<li><p>OpenCode’s <strong>8Gi</strong> memory limit is a large slice of 24Gi — intentional for coding sessions, tight if you turn Qwen on.</p>
</li>
<li><p>Qwen stays off by default to protect the envelope.</p>
</li>
<li><p>HTTP until custom domains + ACME email.</p>
</li>
<li><p>Provider tokens land in Kubernetes Secrets (lab posture).</p>
</li>
<li><p>The CRI-O DaemonSet and kubectl provider choice are pragmatic hacks, called out as such.</p>
</li>
</ol>
<h2>Craft that makes the apply work</h2>
<p>These are the details that separate “looks like a blog demo” from “actually provisions on Always Free OKE.”</p>
<h3>kubectl provider, not kubernetes — and a dummy Helm alias</h3>
<p><code>hashicorp/kubernetes</code> hangs against this OKE 1.36 control plane. The stack pins <code>hashicorp-oss/kubectl</code> <strong>0.1.13</strong> for manifests. A dummy <code>helm.oke</code> provider breaks a dependency cycle with the OKE module so <code>terraform init</code> does not hang (<code>src/main.tf</code>). Two OCI providers are declared (default region + <code>alias = home</code>) for home-region compartment work.</p>
<h3>CRI-O short-name fix</h3>
<p>OKE’s CRI-O enforces short-name mode. Without a fix, images like <code>postgres:17-alpine</code> fail with ImageInspectError — a failure mode OpenClaw hits in the upstream troubleshooting list. Privileged DaemonSet <code>crio-shortname-fix</code> appends <code>unqualified-search-registries = ["docker.io"]</code> and restarts CRI-O (<code>src/oke.tf</code>). Lab convenience, not production hardening.</p>
<p><code>control_plane_allowed_cidrs</code> is open to the world in <code>oke.tf</code> — restrict before anything resembling production (<code>SECURITY.md</code>).</p>
<h3>Flexible load balancer at 10 Mbps</h3>
<p>NGINX Ingress chart <strong>4.12.0</strong> sits on an OCI flexible LB with <strong>min=max=10</strong> Mbps (<code>src/ingress.tf</code>). That keeps the LB inside Always Free–friendly bandwidth while still giving a stable public IP for Paperclip, OpenClaw, and OpenCode Ingresses.</p>
<h3>ARM64 image builds for OpenCode (and optional Qwen)</h3>
<p>Workers are A1.Flex (ARM). OpenCode is not a stock multi-arch pull: <code>src/opencode.tf</code> builds via Docker from <code>scripts/opencode.Dockerfile</code> — downloads the <code>anomalyco/opencode</code> <strong>linux-arm64</strong> tarball (default tag <strong>1.17.13</strong>), Ubuntu 24.04 + Node 24 + gh / gcloud / Firebase / glab / neonctl / eas-cli. Entrypoint: <code>opencode web</code> on port <strong>4096</strong>. Permission default <code>allow</code> in baked <code>opencode.json</code>.</p>
<p>Comment in Terraform: <code>docker_registry_image</code> was removed due to a provider digest bug — push to GHCR/Docker Hub may be manual. Ingress path default <code>/opencode</code>, basic auth user <code>opencode</code>.</p>
<p>Qwen (<code>enable_qwen</code>, default <strong>false</strong>) mirrors the pattern with <code>scripts/qwen.Dockerfile</code> (<code>@qwen-code/qwen-code</code>, default <strong>0.22.2</strong>) — another Always Free budget consumer, hence off by default.</p>
<h2>Component deep dive</h2>
<h3>OKE module</h3>
<p><code>module "oke"</code> creates a <strong>basic</strong> cluster, Flannel CNI, public control plane, and a worker pool from variables. Bastion and operator hosts are off. When <code>oci_public_workers</code> is true, NAT is <code>"never"</code>.</p>
<h3>Paperclip — orchestration UI + Postgres</h3>
<p>Deployed <strong>directly</strong> (no operator) in namespace <code>paperclip</code>:</p>
<ul>
<li><p>Random Better Auth + Postgres credentials (<code>prevent_destroy</code> on the random resources)</p>
</li>
<li><p>Postgres <strong>17</strong> Alpine StatefulSet; <code>PGDATA</code> is a subdirectory (avoids InitDB on <code>lost+found</code>)</p>
</li>
<li><p>Init containers: <code>paperclip-onboard</code> (<code>scripts/paperclip_onboard.sh</code> runs onboard and patches public auth URL modes), <code>company-auth-writer</code> (<code>scripts/company_auth_writer.js</code>), optional <code>qmd-setup</code> (<code>@tobilu/qmd@2.5.3</code>), optional <code>firebase-setup</code></p>
</li>
<li><p>Volumes on storage class <code>oci-bv</code></p>
</li>
<li><p>Model-discovery Secret can carry OpenRouter / Ollama Cloud / Alibaba / DeepInfra values for UI model listing</p>
</li>
</ul>
<p>Public URL order: custom domain, then <code>paperclip_public_url</code>, then Ingress IP from <code>scripts/detect_ingress_ip.py</code>.</p>
<p>Post-deploy admin bootstrap is the <code>paperclipai auth bootstrap-ceo</code> flow documented in <code>src/output.tf</code> and the upstream README.</p>
<h3>Shared headless browser (CDP)</h3>
<p><code>src/browser.tf</code> runs Playwright Chromium (<code>mcr.microsoft.com/playwright:v{version}-noble</code>, default <strong>1.62.1</strong>). Chrome CDP binds loopback; <code>scripts/cdp_proxy.js</code> exposes <code>0.0.0.0:9222</code>. Service: <code>paperclip-browser.paperclip.svc.cluster.local:9222</code>.</p>
<p>OpenCode/Qwen install the Playwright <strong>client</strong> on their PVC and run a <code>cdp-forward</code> sidecar to <code>localhost:9222</code> (see <code>src/opencode.tf</code> and OpenCode Dockerfile <code>AGENTS.md</code> instructions).</p>
<p>Terraform browser resources: requests <strong>250m/512Mi</strong>, limits <strong>1000m/2Gi</strong> (upstream README approximates <del>500m/</del>1Gi).</p>
<h3>OpenClaw — operator + instance</h3>
<p>Helm chart <code>openclaw-operator</code> <strong>0.36.5</strong> from <code>oci://ghcr.io/paperclipinc/charts</code> into <code>openclaw-system</code>. Then namespace <code>openclaw</code>, LLM Secret, optional Telegram Secret, ConfigMap with <code>gateway.bind = "lan"</code>, defaults provider <strong>openrouter</strong> and model <code>nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free</code>, CR <code>OpenClawInstance</code> (<code>openclaw.rocks/v1alpha1</code>), explicit data PVC for Always Free reclaim, Ingress on port <strong>18789</strong>, plus a <code>null_resource</code> local-exec that copies models/auth JSON into the pod after ready.</p>
<h3>Ingress, TLS, metrics, backups</h3>
<ul>
<li><p>cert-manager <strong>1.16.2</strong>; ClusterIssuer only if <code>letsencrypt_email</code> set</p>
</li>
<li><p>metrics-server <strong>3.13.1</strong> with <code>--kubelet-insecure-tls</code></p>
</li>
<li><p><code>src/backup.tf</code>: private Object Storage bucket, long-lived write/read PARs (fixed expiry 2031-08-09), CronJobs <code>30 3 * * *</code> (Paperclip pg_dump + data tar) and <code>35 3 * * *</code> (OpenCode data tar). RWO mount caveat noted in-file for multi-node.</p>
</li>
</ul>
<h2>How the pieces fit (runtime story)</h2>
<ol>
<li><p>Fill <code>src/terraform.tfvars</code> from the example (OCIDs, region, keys, registry).</p>
</li>
<li><p>Terraform creates compartment → OKE → waits → configures Helm/kubectl with a generated token (<code>src/main.tf</code> Python via <code>external</code> data).</p>
</li>
<li><p>Ingress LB IP feeds Paperclip’s public URL.</p>
</li>
<li><p>Paperclip onboards; operator runs bootstrap-ceo.</p>
</li>
<li><p>OpenClaw joins via invite (Telegram or direct); agents appear in Paperclip.</p>
</li>
<li><p>OpenCode Web serves coding sessions; agents use the cluster CDP.</p>
</li>
<li><p>Nightly CronJobs upload dumps to Object Storage.</p>
</li>
</ol>
<h2>Local AI harness + IaC workflow</h2>
<p><strong>In-repo evidence:</strong> There is <strong>no</strong> proprietary CI harness or company identity pack in the public tree. <code>AGENTS.md</code> and <code>CONTRIBUTING.md</code> forbid private harnesses and forbid merges from mutating infrastructure. Validation is local.</p>
<p>Supported workflow: paste the <strong>local AI harness prompt</strong> from the slim README into a laptop coding agent so it drafts tfvars, runs init/plan, and applies <strong>only</strong> with explicit human OK. That matches the contribution rules.</p>
<p>The Terraform style is consistent with iterative human+AI editing; the repo does not document a specific generator — this article does not invent one. Use the copy-paste block under <strong>Quick start (preferred: local AI harness)</strong> in <code>README.md</code>. Constraints: ground changes in <code>src/</code>, never commit secrets/state, never apply without explicit approval, leave <code>enable_qwen</code> false unless asked, Always Free node defaults as above.</p>
<h2>Provider and pin map</h2>
<p>From <code>src/main.tf</code> <code>required_providers</code>:</p>
<table>
<thead>
<tr>
<th>Provider</th>
<th>Version</th>
</tr>
</thead>
<tbody><tr>
<td><code>hashicorp/cloudinit</code></td>
<td>2.3.7</td>
</tr>
<tr>
<td><code>kreuzwerker/docker</code></td>
<td>4.5.0</td>
</tr>
<tr>
<td><code>hashicorp/external</code></td>
<td>2.3.5</td>
</tr>
<tr>
<td><code>hashicorp/helm</code></td>
<td>3.1.1</td>
</tr>
<tr>
<td><code>hashicorp-oss/kubectl</code></td>
<td>0.1.13</td>
</tr>
<tr>
<td><code>hashicorp/local</code></td>
<td>2.8.0</td>
</tr>
<tr>
<td><code>hashicorp/null</code></td>
<td>3.2.4</td>
</tr>
<tr>
<td><code>oracle/oci</code></td>
<td>8.9.0</td>
</tr>
<tr>
<td><code>hashicorp/random</code></td>
<td>3.8.1</td>
</tr>
<tr>
<td><code>hashicorp/time</code></td>
<td>0.13.1</td>
</tr>
</tbody></table>
<p>Terraform <code>required_version</code> &gt;= 1.14.0. OKE module <strong>5.4.3</strong> in <code>src/oke.tf</code>. Dummy <code>helm.oke</code> alias avoids provider-cycle hangs.</p>
<h2>Compartment and kube auth plumbing</h2>
<p>If <code>oci_project_compartment_id</code> is empty, Terraform creates a child compartment named <code>project_prefix</code>, sleeps 30s, then builds <code>{prefix}-oke-cluster</code>. Cluster ID lookup and exec token generation use inline Python via <code>data.external</code> calling the OCI CLI (<code>src/main.tf</code>), feeding Helm and kubectl providers without fragile module-output wiring.</p>
<h2>Paperclip runtime environment (selected)</h2>
<p>From <code>src/paperclip.tf</code> and <code>scripts/paperclip_onboard.sh</code>:</p>
<ul>
<li><p>Onboard only runs when marker or config.json is missing; patches deploymentMode authenticated, exposure public, bind lan, host 0.0.0.0, port 3100, and sets auth.baseUrlMode explicit with publicBaseUrl.</p>
</li>
<li><p>Public URL–related env on the main container avoids the auth.baseUrlMode CrashLoop called out in upstream troubleshooting.</p>
</li>
<li><p><code>PAPERCLIP_BROWSER_CDP</code> points agents at the shared browser service when <code>enable_paperclip_browser</code> is true.</p>
</li>
<li><p>Cheap/budget model default for recovery retries: <code>openrouter/nvidia/nemotron-3.5-lightning:free</code> (<code>paperclip_cheap_model</code>).</p>
</li>
<li><p>qmd and firebase-tools installers use <code>node:24-slim</code>; stamp files under the PVC keep restarts idempotent.</p>
</li>
</ul>
<h2>OpenCode image contents worth knowing</h2>
<p><code>src/scripts/opencode.Dockerfile</code> builds an ARM64 Ubuntu 24.04 image with Node 24, GitHub CLI, Google Cloud SDK, Firebase tools, glab, neonctl, eas-cli, and common TypeScript/Python tooling. It bakes OpenCode config with permission set to allow and ships browser CDP guidance in an image-level <code>AGENTS.md</code>. Default OpenCode memory limit in <code>variables.tf</code> is <strong>8Gi</strong> — the largest app limit in the stack.</p>
<h2>OpenClaw auth post-step</h2>
<p><code>null_resource.openclaw_fix_stale_auth</code> in <code>src/openclaw.tf</code> waits for the OpenClaw pod, copies models/auth JSON into the agent directory, then rolls the StatefulSet. Triggers include hashes of the LLM credential and model/provider so rotations re-run the fix. The apply host needs working kubectl to the cluster.</p>
<h2>Configuration surface</h2>
<p>Authoritative defaults: <code>src/variables.tf</code>. Lab example: <code>src/terraform.tfvars.example</code>.</p>
<p>Enable toggles in <code>variables.tf</code>: <code>enable_paperclip</code>, <code>enable_paperclip_qmd</code>, <code>enable_paperclip_firebase_cli</code>, <code>enable_metrics_server</code>, <code>enable_paperclip_browser</code>, <code>enable_openclaw</code>, <code>enable_opencode</code>, <code>enable_opencode_browser</code>, <code>enable_qwen</code>, <code>enable_qwen_browser</code>.</p>
<p>Exposure enums are <code>public</code> | <code>private</code> for Paperclip and OpenCode. Optional developer credentials inject only when non-empty; none are required to bring the cluster up.</p>
<h2>Security and contribution notes</h2>
<p><code>SECURITY.md</code> documents lab defaults: open API CIDR until edited in <code>oke.tf</code>, public workers in the example file, HTTP until custom domains.</p>
<p><code>AGENTS.md</code> / <code>CONTRIBUTING.md</code>: no private company identity or proprietary harnesses; merges do not apply infra; English docs; never mutate a cluster without explicit operator authorization.</p>
<h2>Ops notes</h2>
<p>Post-deploy (also <code>output.post_deploy_instructions</code>): configure kubeconfig; wait for Paperclip Ready then bootstrap-ceo; wire OpenClaw invite; open OpenCode URL + admin password output; optional DNS + domains + Lets Encrypt; verify nodes/pods/ingress/certificates.</p>
<p>Known failure modes (upstream README troubleshooting, still matched by Terraform): Paperclip <code>auth.baseUrlMode</code>, Postgres <code>lost+found</code>/<code>PGDATA</code>, OpenClaw short-name ImageInspectError, OpenClaw Invalid <code>--bind</code>, <code>terraform init</code> hang without <code>helm.oke</code> alias, kubectl provider hang if <code>hashicorp/kubernetes</code> is added, stale null volume fields needing state rm.</p>
<p>Destroy deletes PVCs/Block Volumes; confirm LB gone in console. Backup PARs outlive the cluster until expiry.</p>
<h2>What to evolve next</h2>
<ul>
<li><p>Tighten API CIDRs; prefer private workers with documented NAT cost</p>
</li>
<li><p>Remote state + Vault/external secrets instead of tfvars → cluster Secrets</p>
</li>
<li><p>Qualify images upstream and retire the privileged CRI-O DaemonSet</p>
</li>
<li><p>CSI snapshots instead of RWO CronJob mounts</p>
</li>
<li><p>Restore automated registry push (or a documented one-shot push script)</p>
</li>
<li><p>NetworkPolicies isolating CDP and Postgres</p>
</li>
<li><p>Keep the GitHub README slim; keep this article as the depth layer</p>
</li>
</ul>
<p>If you fork this for a tighter security posture, a smaller memory envelope, or another agent runtime on the same Always Free shape — PRs and experiments that stay inside <code>src/</code> and the contribution rules are welcome. The interesting work is the next hard constraint you remove without breaking the free-tier math.</p>
<h2>Sources</h2>
<table>
<thead>
<tr>
<th>Path</th>
<th>Supports</th>
</tr>
</thead>
<tbody><tr>
<td><code>README.md</code></td>
<td>Features, resource table, troubleshooting, layout</td>
</tr>
<tr>
<td><code>AGENTS.md</code>, <code>CONTRIBUTING.md</code>, <code>SECURITY.md</code></td>
<td>Agent rules, no private harnesses, lab risks</td>
</tr>
<tr>
<td><code>src/main.tf</code></td>
<td>Providers, compartment, kube auth</td>
</tr>
<tr>
<td><code>src/oke.tf</code></td>
<td>OKE 5.4.3, CIDRs, CRI-O DaemonSet</td>
</tr>
<tr>
<td><code>src/variables.tf</code>, <code>src/terraform.tfvars.example</code></td>
<td>Defaults and example sizing</td>
</tr>
<tr>
<td><code>src/paperclip.tf</code></td>
<td>Direct deploy, Postgres 17, initContainers</td>
</tr>
<tr>
<td><code>src/browser.tf</code>, <code>src/scripts/cdp_proxy.js</code></td>
<td>Shared CDP</td>
</tr>
<tr>
<td><code>src/openclaw.tf</code>, <code>src/openclaw-ingress.tf</code></td>
<td>Operator, CR, Telegram, auth fix</td>
</tr>
<tr>
<td><code>src/opencode.tf</code>, <code>src/scripts/opencode.Dockerfile</code></td>
<td>Image build, Ingress, CDP sidecar</td>
</tr>
<tr>
<td><code>src/qwen.tf</code>, <code>src/scripts/qwen.Dockerfile</code></td>
<td>Optional Qwen</td>
</tr>
<tr>
<td><code>src/ingress.tf</code>, <code>src/cert-manager.tf</code>, <code>src/metrics-server.tf</code></td>
<td>LB, ACME, metrics</td>
</tr>
<tr>
<td><code>src/backup.tf</code></td>
<td>Bucket, PARs, CronJobs</td>
</tr>
<tr>
<td><code>src/output.tf</code></td>
<td>Post-deploy instructions</td>
</tr>
<tr>
<td><code>src/scripts/paperclip_onboard.sh</code></td>
<td>First-boot public config patch</td>
</tr>
<tr>
<td><code>LICENSE</code></td>
<td>MIT (Copyright 2026 lindoelio)</td>
</tr>
</tbody></table>
]]></content:encoded></item></channel></rss>