<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Informer Tech</title>
    <description>The latest articles on DEV Community by Informer Tech (@informertech).</description>
    <link>https://dev.to/informertech</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3742981%2F7c384c1d-9b16-4211-8da2-dc197145c143.png</url>
      <title>DEV Community: Informer Tech</title>
      <link>https://dev.to/informertech</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/informertech"/>
    <language>en</language>
    <item>
      <title>Keyv and Cacheable npm Supply Chain Compromise</title>
      <dc:creator>Informer Tech</dc:creator>
      <pubDate>Wed, 05 Aug 2026 20:00:00 +0000</pubDate>
      <link>https://dev.to/informertech/keyv-and-cacheable-npm-supply-chain-compromise-4n6e</link>
      <guid>https://dev.to/informertech/keyv-and-cacheable-npm-supply-chain-compromise-4n6e</guid>
      <description>&lt;p&gt;An active npm supply chain compromise affected widely used packages in the &lt;code&gt;keyv&lt;/code&gt; and &lt;code&gt;cacheable&lt;/code&gt; ecosystems, along with packages owned by other maintainers. At least ten packages were published with a malicious &lt;code&gt;preinstall&lt;/code&gt; hook named &lt;code&gt;setup.mjs&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The hook downloads a standalone Bun runtime, runs an obfuscated second-stage payload, collects cloud and CI credentials, and can publish trojanized versions of additional npm packages reachable through a stolen npm token. The affected packages collectively receive tens of millions of weekly downloads, and additional malicious packages may continue to appear.&lt;/p&gt;

&lt;p&gt;Evidence indicates that the &lt;code&gt;Jaredwray&lt;/code&gt; maintainer account was compromised. Activity began across the &lt;code&gt;keyv&lt;/code&gt; and &lt;code&gt;cacheable&lt;/code&gt; package families before spreading through stolen npm credentials to packages outside those namespaces.&lt;/p&gt;

&lt;p&gt;The malicious payload can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Collect cloud, CI, GitHub, npm, Vault, and Kubernetes credentials.&lt;/li&gt;
&lt;li&gt;  Repackage and republish npm packages with the same malicious install hook.&lt;/li&gt;
&lt;li&gt;  Send encrypted stolen data to GitHub repositories and DNS-resolved destinations.&lt;/li&gt;
&lt;li&gt;  Add autostart files to cloned repositories through &lt;code&gt;.claude&lt;/code&gt; and &lt;code&gt;.vscode&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  Install a host-level credential-monitoring persistence mechanism.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Affected package artifacts were detected an average of five minutes and 18 seconds after publication. The ongoing affected-package list is available at:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://socket.dev/supply-chain-attacks/keyv-and-cacheable-compromise" rel="noopener noreferrer"&gt;https://socket.dev/supply-chain-attacks/keyv-and-cacheable-compromise&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Keyv and Cacheable Package Background
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;keyv&lt;/code&gt; is a key-value storage abstraction that supports adapters for Redis, SQLite, Postgres, MongoDB, and other systems.&lt;/p&gt;

&lt;p&gt;The related &lt;code&gt;cacheable&lt;/code&gt;, &lt;code&gt;cacheable-request&lt;/code&gt;, &lt;code&gt;flat-cache&lt;/code&gt;, and &lt;code&gt;file-entry-cache&lt;/code&gt; packages are caching libraries maintained within the same ecosystem. These packages often sit far down dependency trees, so many affected projects may not install them directly.&lt;/p&gt;

&lt;p&gt;One dependency path described in the investigation is:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;eslint&lt;/code&gt; → &lt;code&gt;file-entry-cache&lt;/code&gt; → &lt;code&gt;flat-cache&lt;/code&gt; → &lt;code&gt;keyv&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;That indirect reach increases the number of environments that may install an affected package as part of a broader dependency set.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supply Chain Attack Timeline
&lt;/h2&gt;

&lt;p&gt;The scoped &lt;code&gt;@keyv/*&lt;/code&gt; packages, including &lt;code&gt;@keyv/redis&lt;/code&gt;, &lt;code&gt;@keyv/sqlite&lt;/code&gt;, and &lt;code&gt;@keyv/mongo&lt;/code&gt;, published &lt;code&gt;6.0.0&lt;/code&gt; tarballs shortly before the malicious activity identified in &lt;code&gt;keyv@6.0.0&lt;/code&gt;. Those scoped tarballs did not contain the confirmed &lt;code&gt;preinstall&lt;/code&gt; hook, but they should still be treated as suspect because the maintainer account was compromised.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;keyv@6.0.0&lt;/code&gt; was the first confirmed version containing the malicious &lt;code&gt;preinstall&lt;/code&gt; hook. It was flagged shortly after publication, before a larger publishing burst involving the &lt;code&gt;cacheable&lt;/code&gt; package family.&lt;/p&gt;

&lt;p&gt;A package outside the two main namespaces, &lt;code&gt;@thiennq/docs-viewer@1.6.2&lt;/code&gt;, was also published during the campaign. This showed that the compromise had reached at least one additional account.&lt;/p&gt;

&lt;p&gt;Repository activity for &lt;code&gt;jaredwray/keyv&lt;/code&gt; included force pushes to &lt;code&gt;main&lt;/code&gt;, repeated deletion of the &lt;code&gt;v6.0.0&lt;/code&gt; tag, a commit referencing &lt;code&gt;setup.mjs&lt;/code&gt; and &lt;code&gt;Math_Symbol.js&lt;/code&gt;, and further activity on the &lt;code&gt;v5&lt;/code&gt; release branch. The activity indicates that the threat actor retained access to the account and its CI workflow while modifying repository history.&lt;/p&gt;

&lt;p&gt;The affected &lt;code&gt;cacheable&lt;/code&gt; package burst included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;@cacheable/net@2.1.1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;@cacheable/node-cache@3.1.2&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;cacheable@2.5.1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;flat-cache@6.1.24&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;cacheable-request@13.0.20&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;@cacheable/memory@2.2.1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;file-entry-cache@11.1.6&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;@cacheable/utils@2.5.1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;cache-manager@7.2.10&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How the Malicious npm Packages Work
&lt;/h2&gt;

&lt;p&gt;The compromise is delivered through the npm lifecycle process rather than through changes to the library’s distributed code.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;dist/&lt;/code&gt; output in the compromised package was byte-identical, by SHA-256, to the clean &lt;code&gt;6.0.0-rc.1&lt;/code&gt; build. The malicious changes were limited to &lt;code&gt;package.json&lt;/code&gt; and two added lifecycle files. As a result, the package can appear to work normally after installation even though the host has already been compromised.&lt;/p&gt;

&lt;p&gt;The modified package configuration adds &lt;code&gt;setup.mjs&lt;/code&gt; and &lt;code&gt;Math_Symbol.js&lt;/code&gt;, then runs the loader through:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"preinstall"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node setup.mjs"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Stage One: &lt;code&gt;setup.mjs&lt;/code&gt; Bun Loader
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;setup.mjs&lt;/code&gt; is a lightly obfuscated Node script. If Bun is unavailable on the system, it downloads a matching standalone Bun runtime and uses it to execute the second-stage payload.&lt;/p&gt;

&lt;p&gt;Node launches the loader first, but Bun runs the subsequent payload. That process chain may avoid controls focused only on Node activity.&lt;/p&gt;

&lt;p&gt;The loader detects the operating system and system architecture. It also checks for Alpine and musl environments through &lt;code&gt;ldd --version&lt;/code&gt; and &lt;code&gt;/etc/os-release&lt;/code&gt;. It can extract the downloaded runtime with the system &lt;code&gt;unzip&lt;/code&gt; utility, Windows PowerShell &lt;code&gt;Expand-Archive&lt;/code&gt;, or a built-in JavaScript ZIP parser.&lt;/p&gt;

&lt;p&gt;The Bun runtime is downloaded over HTTPS without checksum or signature validation. After execution, the loader removes its &lt;code&gt;bun-dl-*&lt;/code&gt; temporary directory, reducing the number of artifacts left on disk.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage Two: &lt;code&gt;Math_Symbol.js&lt;/code&gt; Payload
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Math_Symbol.js&lt;/code&gt; is a Bun bundle of roughly 728 KB. It protects strings through polymorphic basE91 encoding, using a shared numeric opcode table and per-scope alphabets that are decoded only when needed.&lt;/p&gt;

&lt;p&gt;The recovered internal module tags include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;[collector]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;[dispatcher]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;[provenance]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;[publish]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The payload actively queries AWS instance metadata endpoints and reads AWS credential chains and Secrets Manager data across regions. It also targets GCP service account private keys and Azure client secrets through regular-expression and file-based collection.&lt;/p&gt;

&lt;p&gt;Other credential targets include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  HashiCorp Vault tokens&lt;/li&gt;
&lt;li&gt;  Kubernetes service account tokens&lt;/li&gt;
&lt;li&gt;  npm tokens&lt;/li&gt;
&lt;li&gt;  GitHub Actions organization and repository secret metadata&lt;/li&gt;
&lt;li&gt;  Environment variables, files, and running processes on CI runners&lt;/li&gt;
&lt;li&gt;  Generic keys, bearer tokens, and private-key blocks found through a TruffleHog-style regex sweep&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  npm Token Theft and Self-Propagation
&lt;/h2&gt;

&lt;p&gt;The payload uses stolen npm credentials to search for packages maintained by the victim, download their tarballs, inject the malicious files and &lt;code&gt;preinstall&lt;/code&gt; hook, update integrity and shasum fields, increase package versions, and publish the altered packages to npm.&lt;/p&gt;

&lt;p&gt;It uses npm OIDC trusted publishing to obtain publish credentials during this process.&lt;/p&gt;

&lt;p&gt;A provenance component can create DSSE attestation envelopes, request Fulcio signing certificates, and submit entries to the Rekor transparency log. This allows republished packages to include newly issued, verifiable Sigstore provenance.&lt;/p&gt;

&lt;p&gt;The investigation separately confirmed that &lt;code&gt;keyv@6.0.0&lt;/code&gt; had a passing attestation because the legitimate release workflow built source that had already been trojanized. The payload’s republishing capability and the observed &lt;code&gt;keyv&lt;/code&gt; provenance are separate findings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Exfiltration and Repository Persistence
&lt;/h2&gt;

&lt;p&gt;The payload does not use a fixed command-and-control host.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;GitHubSender&lt;/code&gt; component creates GitHub repositories through &lt;code&gt;POST /user/repos&lt;/code&gt; and commits stolen data through the GraphQL &lt;code&gt;createCommitOnBranch&lt;/code&gt; mutation. A separate &lt;code&gt;DomainSender&lt;/code&gt; resolves destinations through DNS, checks their availability, and then sends encrypted data.&lt;/p&gt;

&lt;p&gt;The bundle contains an operator-controlled public key encrypted as a constant and decrypted at runtime. Collected information is handled with AES-256-GCM using a 12-byte IV, 16-byte tag, and ciphertext. GitHub repositories and DNS-resolved destinations receive encrypted output rather than plaintext findings.&lt;/p&gt;

&lt;p&gt;The source repository also adds autostart files that can execute the loader when someone clones and opens it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;.claude/settings.json&lt;/code&gt; adds a &lt;code&gt;SessionStart&lt;/code&gt; hook.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;.vscode/tasks.json&lt;/code&gt; adds a &lt;code&gt;folderOpen&lt;/code&gt; task.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These hooks can run when a developer or AI coding agent opens the repository, without requiring &lt;code&gt;npm install&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Host-Level Dead-Man’s Switch
&lt;/h2&gt;

&lt;p&gt;The payload installs a host-level persistence mechanism that monitors a stolen GitHub token.&lt;/p&gt;

&lt;p&gt;It stores the token and handler command under:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;~/.config/gh-token-monitor/token&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;~/.config/gh-token-monitor/handler&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The files use mode &lt;code&gt;600&lt;/code&gt;. On macOS, the payload persists through a LaunchAgent named &lt;code&gt;com.user.gh-token-monitor&lt;/code&gt;. On Linux, it creates a systemd user service and enables lingering through &lt;code&gt;loginctl enable-linger&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A watcher at &lt;code&gt;~/.local/bin/gh-token-monitor.sh&lt;/code&gt; checks the GitHub API with the stolen token every 60 seconds. If the token begins returning an HTTP 4xx response, such as after revocation or rotation, the watcher evaluates a remotely supplied handler string. It then removes its state and exits.&lt;/p&gt;

&lt;p&gt;The watcher also removes itself after a 24-hour time-to-live period.&lt;/p&gt;

&lt;p&gt;The LaunchAgent and systemd service use names that resemble a developer utility, but the behavior is materially different: it watches for its own stolen credential to be invalidated and then runs a remote-supplied command.&lt;/p&gt;

&lt;h2&gt;
  
  
  Impact of the Keyv and Cacheable Compromise
&lt;/h2&gt;

&lt;p&gt;Any environment that installed an affected version and ran installation scripts should be treated as compromised.&lt;/p&gt;

&lt;p&gt;On developer workstations and CI runners, the payload can collect cloud-provider credentials, Vault and Kubernetes tokens, GitHub and npm credentials, and secrets matched by its regular-expression scan.&lt;/p&gt;

&lt;p&gt;Because the worm republishes packages under the victim’s own npm identity, one compromised CI token can spread the campaign to other packages. The presence of &lt;code&gt;keyv&lt;/code&gt; and &lt;code&gt;cacheable&lt;/code&gt; in common dependency trees increases the potential blast radius.&lt;/p&gt;

&lt;p&gt;The incident also shows a limitation of build provenance. Provenance attests to build integrity, not the integrity of the source supplied to the build. A signed and verifiable attestation can still cover malware when the source code was already compromised before the release workflow ran.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recommended Response Steps
&lt;/h2&gt;

&lt;h3&gt;
  
  
  For Developers
&lt;/h3&gt;

&lt;p&gt;Pin affected dependencies to the version immediately before the compromised release and rebuild lockfiles. Use exact versions and lock dependencies by integrity hash.&lt;/p&gt;

&lt;p&gt;Avoid caret ranges, tilde ranges, and &lt;code&gt;npm update&lt;/code&gt; while the maintainer account remains compromised. Where practical, block the &lt;code&gt;keyv&lt;/code&gt;, &lt;code&gt;@keyv&lt;/code&gt;, and &lt;code&gt;cacheable&lt;/code&gt; scopes in a registry proxy or allowlist instead of blocking individual versions alone.&lt;/p&gt;

&lt;h3&gt;
  
  
  For Security Teams
&lt;/h3&gt;

&lt;p&gt;Remove the host-level dead-man’s switch before rotating credentials. Revoking or rotating a stolen token can trigger the watcher’s remote-supplied handler.&lt;/p&gt;

&lt;p&gt;Check for and remove:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;~/.local/bin/gh-token-monitor.sh&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;~/.config/gh-token-monitor/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;~/Library/LaunchAgents/com.user.gh-token-monitor.plist&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;~/.config/systemd/user/gh-token-monitor.service&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;/tmp/gh-token-monitor.{out,err}.log&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On macOS, unload the associated LaunchAgent. On Linux, disable lingering with &lt;code&gt;loginctl disable-linger&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Also investigate and remove the installer and related artifacts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;node setup.mjs&lt;/code&gt; spawning a downloaded Bun runtime&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;bun-dl-*&lt;/code&gt; temporary directories&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;Math_Symbol.js&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;math_init.js&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;.claude/settings.json&lt;/code&gt; autostart hooks&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;.vscode/tasks.json&lt;/code&gt; autostart hooks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After removing the implant and monitor, rotate every credential accessible from the affected host. This includes npm tokens, GitHub personal access tokens, &lt;code&gt;GITHUB_TOKEN&lt;/code&gt;, AWS, GCP, and Azure credentials, Vault tokens, Kubernetes service account tokens, and CI organization and repository secrets.&lt;/p&gt;

&lt;p&gt;npm and GitHub tokens should be revoked rather than only rotated. Review npm accounts for unexpected package releases and audit GitHub for newly created repositories or unexpected commits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Indicators of Compromise
&lt;/h2&gt;

&lt;h3&gt;
  
  
  File Hashes
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SHA-256&lt;/td&gt;
&lt;td&gt;Associated File&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;54dc7ea54a1317cca0e890a2770630cf7fa6c97813e0cb9d2caa93012b350668&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;setup.mjs&lt;/code&gt; npm tarball preinstall loader&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fd3ca4007b225fdf8de7af4345a19179d5efa8c4bb9205f88cda806e5684b1eb&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;setup.mjs&lt;/code&gt; loader in &lt;code&gt;.claude&lt;/code&gt; and &lt;code&gt;.vscode&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;9fc2570b7cef51c1b8df116d144d11ff4096357be7d2c4c6367cfc2509cf1bcc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Math_Symbol.js&lt;/code&gt; and &lt;code&gt;math_init.js&lt;/code&gt; payload&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Tarball Hash
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;keyv-6.0.0.tgz&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    37f9f847e9c3e520b47d83a9029e199dbc30c6a195a1d80467d0fb1a6fd5068728ad4d1a422995ca578359263afdac5d3b4fed7a6b9befad27de19cca6966952

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Network Indicators&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;169[.]254[.]169[.]254&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;169[.]254[.]170[.]2&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;github[.]com/oven-sh/bun/releases/download/bun-v1.3.13/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;registry[.]npmjs[.]org/-/whoami&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;registry[.]npmjs[.]org/-/npm/v1/tokens&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;registry[.]npmjs[.]org/-/npm/v1/oidc/token/exchange/package/&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cybersecurity</category>
      <category>webdev</category>
      <category>npm</category>
    </item>
    <item>
      <title>How I Built an n8n Scraper That Saved Me Hours Every Week</title>
      <dc:creator>Informer Tech</dc:creator>
      <pubDate>Thu, 02 Jul 2026 18:17:00 +0000</pubDate>
      <link>https://dev.to/informertech/how-i-built-an-n8n-scraper-that-saved-me-hours-every-week-56d8</link>
      <guid>https://dev.to/informertech/how-i-built-an-n8n-scraper-that-saved-me-hours-every-week-56d8</guid>
      <description>&lt;p&gt;Every week I was burning the same hours doing the same thing: opening tabs, copying data, pasting it into a spreadsheet and starting over. The work was mindless. It was repetitive. It was exactly the kind of task that shouldn't require a human being in 2024. So I built an n8n scraper workflow that now handles all of it automatically — and here's exactly how I did it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem Worth Automating
&lt;/h2&gt;

&lt;p&gt;Keeping product data current is non-negotiable for tech content research. Specs change. Prices shift overnight. Availability fluctuates without warning. Before automation, that meant manually visiting product pages and logging updates into a tracking sheet — a process that consumed three to five hours every single week.&lt;/p&gt;

&lt;p&gt;The inefficiency compounded fast. I missed updates between check-ins. Formatting stayed inconsistent across entries. The cognitive overhead of context-switching between dozens of tabs left me mentally depleted before I even reached the analytical work. Data collection wasn't just slow — it actively degraded everything downstream.&lt;/p&gt;

&lt;p&gt;Something had to change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why n8n and Not Something Else
&lt;/h2&gt;

&lt;p&gt;I evaluated several tools before committing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zapier&lt;/strong&gt; is polished but expensive at scale and frustratingly rigid with custom HTTP behavior. &lt;strong&gt;Make&lt;/strong&gt; (formerly Integromat) offers more flexibility yet its pricing model penalizes heavy usage quickly. &lt;strong&gt;Python scripts&lt;/strong&gt; give you full control but demand ongoing maintenance and provide no visual debugging environment for non-engineers.&lt;/p&gt;

&lt;p&gt;n8n threads the needle cleanly. It's open-source and fully self-hostable so there are no per-task fees regardless of volume. Its visual node editor makes workflow logic instantly readable. Its native HTTP Request node handles custom headers, authentication and response parsing without a line of external code. For a scraping workflow that needs to stay reliable, repeatable and maintainable — n8n was the clear answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the Scraper — Step by Step
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1 — Schedule the Trigger
&lt;/h3&gt;

&lt;p&gt;Every automated workflow needs a starting point. I used n8n's built-in &lt;strong&gt;Schedule Trigger&lt;/strong&gt; node set to run once every morning at 7 a.m. This single node eliminates any external cron job or server-side scheduling requirement. Start simple: daily execution is more than enough to validate the entire workflow before you push toward tighter intervals.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2 — Fetch Data with the HTTP Request Node
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;HTTP Request&lt;/strong&gt; node is the engine of the whole operation. I configured it with the target URL and a standard User-Agent header to mimic normal browser behavior. Before you do any of this: check the site's &lt;code&gt;robots.txt&lt;/code&gt; and terms of service. Ethical scraping is non-negotiable — it's a foundational practice and not a technicality.&lt;/p&gt;

&lt;p&gt;I inserted an &lt;strong&gt;n8n Wait node&lt;/strong&gt; between requests to introduce a deliberate delay. Rapid-fire requests are both inconsiderate and counterproductive because most sites rate-limit or block aggressive traffic within minutes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3 — Extract What You Actually Need
&lt;/h3&gt;

&lt;p&gt;Raw HTML is noise. The &lt;strong&gt;HTML Extract&lt;/strong&gt; node cuts through it by targeting specific CSS selectors: product name, current price, availability status. For endpoints that return structured JSON, the &lt;strong&gt;Set&lt;/strong&gt; and &lt;strong&gt;Code&lt;/strong&gt; nodes handle field mapping cleanly. The output of this step is a tidy data object that every downstream node can consume without additional transformation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4 — Store It and Surface What Matters
&lt;/h3&gt;

&lt;p&gt;Extracted data routes into a &lt;strong&gt;Google Sheets&lt;/strong&gt; node that appends a new timestamped row with each run — building a clean historical log automatically. A conditional &lt;strong&gt;IF node&lt;/strong&gt; then compares the current value against the previous entry and triggers a &lt;strong&gt;Slack notification&lt;/strong&gt; only when something actually changes.&lt;/p&gt;

&lt;p&gt;No change means silence. A meaningful shift means an immediate alert.&lt;/p&gt;

&lt;p&gt;This conditional logic is where n8n earns its reputation. Notifications without conditions are just noise.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Results
&lt;/h2&gt;

&lt;p&gt;The workflow eliminated roughly four hours of manual work per week — more than 200 hours per year reclaimed from a task that produced zero original thinking. Data quality improved immediately: no missed updates, no formatting inconsistencies and no human error introduced by copy-paste fatigue.&lt;/p&gt;

&lt;p&gt;The unexpected benefit was perspective. Watching data accumulate automatically revealed pricing patterns and availability cycles that were completely invisible during manual collection. Automation didn't just save time — it surfaced intelligence that didn't exist before.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd Do Differently
&lt;/h2&gt;

&lt;p&gt;Build error handling on day one. Add an &lt;strong&gt;Error Trigger&lt;/strong&gt; node before anything else so you receive an alert whenever any node fails. Without it, silent failures are invisible and data gaps accumulate undetected for days.&lt;/p&gt;

&lt;p&gt;Log everything. A lightweight logging node recording the timestamp and status of each run costs almost nothing to build and saves enormous debugging time later.&lt;/p&gt;

&lt;p&gt;Finally, audit your CSS selectors monthly. Sites redesign their HTML without notice and a changed class name will break the entire extraction step with zero warning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;n8n turns repetitive, browser-based data collection into a set-and-forget system that operates without supervision. The setup investment is a few focused hours. The return compounds across every week that follows.&lt;/p&gt;

&lt;p&gt;If you're considering tools like n8n or want unbiased, hands-on takes on automation software and tech products, &lt;a href="https://www.informertech.com/" rel="noopener noreferrer"&gt;Informer Tech&lt;/a&gt; offers transparent reviews designed for those who value clarity over marketing speak. Smart choices begin with trustworthy information.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>productivity</category>
      <category>nocode</category>
    </item>
    <item>
      <title>The AI Tools That Actually Saved Me Hours as a Developer — and the Ones That Didn't</title>
      <dc:creator>Informer Tech</dc:creator>
      <pubDate>Tue, 30 Jun 2026 17:17:00 +0000</pubDate>
      <link>https://dev.to/informertech/the-ai-tools-that-actually-saved-me-hours-as-a-developer-and-the-ones-that-didnt-j3j</link>
      <guid>https://dev.to/informertech/the-ai-tools-that-actually-saved-me-hours-as-a-developer-and-the-ones-that-didnt-j3j</guid>
      <description>&lt;p&gt;Every week, another AI tool lands on Product Hunt promising to "10x your developer productivity." Most of them don't. I tested seven of the most-hyped tools in my actual workflow — not a sandbox, not a demo project — and the results split cleanly. Four genuinely gave me time back. Three quietly consumed more of it than they saved.&lt;/p&gt;

&lt;p&gt;Here's the honest breakdown.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI Tools That Actually Delivered
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. GitHub Copilot — The Baseline Everything Else Gets Measured Against
&lt;/h3&gt;

&lt;p&gt;Copilot earns its reputation not through flashy features but through relentless usefulness. It accelerates boilerplate generation, scaffolds unit tests intelligently and auto-completes repetitive logic patterns before you finish typing the function signature. Its deep integration with VS Code and JetBrains makes it feel native rather than bolted on — it reads your open files and tailors suggestions to your immediate context.&lt;/p&gt;

&lt;p&gt;The honest caveat: it hallucinates on niche or recently released libraries. Treat its output on unfamiliar packages the way you'd treat advice from a confident intern — always review before you commit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Time saved: Significant.&lt;/strong&gt; The cognitive overhead of writing boilerplate simply disappears.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Cursor — The Editor That Thinks Across Your Entire Codebase
&lt;/h3&gt;

&lt;p&gt;Where Copilot operates at the file level, Cursor operates at the project level. Its most powerful feature is whole-codebase context — you can describe a refactor in plain English and it executes changes across multiple files simultaneously. The built-in AI chat references your actual codebase rather than answering in a vacuum.&lt;/p&gt;

&lt;p&gt;For senior developers working on complex or legacy codebases, this distinction is enormous. It transforms multi-file refactoring from a tedious afternoon into a focused thirty-minute session.&lt;/p&gt;

&lt;p&gt;The caveat: Cursor is resource-intensive and the subscription cost accumulates quickly for teams. It earns the cost only if you're doing the kind of complex structural work where cross-file context delivers real leverage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Time saved: Exceptional on architectural tasks.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Perplexity AI — The Research Layer Developers Didn't Know They Needed
&lt;/h3&gt;

&lt;p&gt;Perplexity doesn't write code. It does something more immediately valuable for daily development work: it kills the five-tab research spiral. API documentation lookup, library comparison, error diagnosis — all of it returns cited, verifiable answers in seconds rather than minutes of Stack Overflow archaeology.&lt;/p&gt;

&lt;p&gt;Pair it with a dedicated code tool and it becomes a powerful research co-pilot. Use it alone and you'll feel its limits quickly. It belongs in your workflow as a specialist rather than a generalist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Time saved: Substantial on research-heavy work.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Warp — The Terminal That Finally Has an Opinion
&lt;/h3&gt;

&lt;p&gt;Warp re-imagines the terminal with AI command suggestions built directly into the interface. Forgotten a complex &lt;code&gt;git&lt;/code&gt; command or a bash one-liner you wrote six months ago? Describe what you need in natural language and Warp returns the exact syntax. The zero-friction workflow — no copy-pasting between a chat interface and your terminal — is what separates it from using ChatGPT for the same purpose.&lt;/p&gt;

&lt;p&gt;The caveat: Warp remains Mac-first and its Linux support is still maturing. Windows developers are largely locked out for now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Time saved: Real, particularly for command-line-heavy workflows.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI Tools That Overpromised and Underdelivered
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5. Amazon Q Developer — Powerful Inside AWS, Redundant Everywhere Else
&lt;/h3&gt;

&lt;p&gt;Amazon Q Developer delivers genuine value if your stack lives entirely within the AWS ecosystem. Outside it, the experience narrows sharply. Suggestions missed context in general-purpose codebases and the AWS-adjacent bias made it feel like a specialist tool pressed into generalist service. Copilot outperformed it consistently on the same tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Solid within its lane. Unnecessary outside it.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Codeium — The Free Tier That Costs You in Accuracy
&lt;/h3&gt;

&lt;p&gt;Codeium's zero-dollar entry point attracts developers reasonably. The problem is a hallucination rate that runs high enough on framework-specific code to make verification mandatory for nearly every suggestion. High confidence paired with low accuracy is the most dangerous combination in a coding assistant — it erodes trust and slows you down precisely when you expect speed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Viable for learning and exploration. A liability on production-adjacent work.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Replit AI Agent — Impressive in Demos, Unreliable in Practice
&lt;/h3&gt;

&lt;p&gt;Replit's AI Agent performs beautifully on isolated greenfield projects. Feed it a complex existing codebase with real dependency trees and the experience deteriorates fast. Agent loops, contradictory multi-step edits and incomplete execution left workflows messier than when I started. The hours lost debugging agent-generated chaos exceeded any hours it saved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Useful for rapid prototyping sprints. Not a daily driver for serious development.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Separates a Keeper From a Delete
&lt;/h2&gt;

&lt;p&gt;Three criteria predict whether an AI dev tool earns its place in your workflow or becomes expensive clutter.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Context depth&lt;/strong&gt; — Does it understand your project or only your cursor position?&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Integration friction&lt;/strong&gt; — Does it live inside your existing workflow or pull you out of it constantly?&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Accuracy-to-confidence ratio&lt;/strong&gt; — Does it know when it doesn't know?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tools that score well on all three become invisible infrastructure. The rest become distractions with good marketing.&lt;/p&gt;

&lt;p&gt;The AI productivity gains are real — but they're uneven and deeply dependent on tool selection and workflow discipline. Choose deliberately and the hours compound. Choose carelessly and you'll spend those hours reviewing hallucinations.&lt;/p&gt;

&lt;p&gt;For the &lt;a href="https://www.informertech.com/" rel="noopener noreferrer"&gt;latest tech news&lt;/a&gt; and easy-to-follow guides, visit us at &lt;a href="https://www.informertech.com/" rel="noopener noreferrer"&gt;Informer Tech&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What's your experience with AI dev tools? Drop your honest take in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>webdev</category>
      <category>devtools</category>
      <category>aitools</category>
    </item>
    <item>
      <title>Build Your First Home Lab: The Developer's Budget Hardware Guide</title>
      <dc:creator>Informer Tech</dc:creator>
      <pubDate>Sun, 28 Jun 2026 04:19:14 +0000</pubDate>
      <link>https://dev.to/informertech/build-your-first-home-lab-the-developers-budget-hardware-guide-2djf</link>
      <guid>https://dev.to/informertech/build-your-first-home-lab-the-developers-budget-hardware-guide-2djf</guid>
      <description>&lt;p&gt;Cloud compute costs are climbing and local environments are making a powerful comeback. Every staging instance and every CI pipeline you run on rented infrastructure carries a recurring price tag. A home lab eliminates that overhead entirely while giving you something cloud providers fundamentally cannot: unrestricted, consequence-free experimentation on hardware you own. This guide delivers concrete, budget-conscious hardware picks organized by real developer use cases — so you spend once and build right.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Developers Are Returning to Home Labs
&lt;/h2&gt;

&lt;p&gt;The economics shifted. A modest cloud VM running continuously now costs more annually than a capable mini PC purchased outright. Beyond cost, home labs restore control. You configure the kernel parameters, stress-test the network topology and simulate production failures without filing a support ticket or triggering a billing alert.&lt;/p&gt;

&lt;p&gt;There is also a credibility dimension job seekers frequently underestimate. Candidates who demonstrate hands-on infrastructure ownership — Kubernetes clusters, self-hosted CI pipelines, custom DNS setups — consistently stand out in technical interviews. Self-hosted tools compound the value further: running Gitea or Bitwarden locally transforms your lab from a learning sandbox into genuinely useful daily infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Define Your Use Case Before You Buy
&lt;/h2&gt;

&lt;p&gt;Hardware decisions follow use case decisions — not the other way around. Buying a power-hungry server before you understand your workload is how first home labs become expensive dust collectors.&lt;/p&gt;

&lt;p&gt;Four archetypes cover most developer scenarios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Web Dev / CI-CD Lab&lt;/strong&gt; — Local Docker stacks, staging environments and Jenkins or Gitea pipelines. Prioritize NVMe storage and RAM over raw CPU cores.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;DevOps / Kubernetes Lab&lt;/strong&gt; — Multi-node clusters and service mesh experimentation. Two budget mini PCs outperform one expensive machine.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Homeserver / NAS&lt;/strong&gt; — Media hosting and self-hosted apps like Plex or Nextcloud. Drive capacity and endurance matter most.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Networking Lab&lt;/strong&gt; — VLAN configuration and pfSense practice. A managed switch matters far more than powerful compute here.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three budget tiers anchor your planning: under $150 for entry-level micro-form setups, $150–$400 for capable mini PCs and $400–$700 for multi-node configurations.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Budget Home Lab Hardware Stack
&lt;/h2&gt;

&lt;p&gt;Smart builders match hardware to workload — not specs to ego.&lt;/p&gt;

&lt;h3&gt;
  
  
  Compute: Mini PCs and Repurposed Desktops
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Raspberry Pi 5 (8GB)&lt;/strong&gt; is the cleanest entry point at roughly $80. Its low thermal draw makes it viable running 24/7 and it handles lightweight server tasks, DNS filtering and Git hosting without complaint.&lt;/p&gt;

&lt;p&gt;For developers targeting Proxmox or containerized workloads, the &lt;strong&gt;Beelink SER5 Pro or SER6&lt;/strong&gt; (AMD Ryzen-based, $150–$250) is the current value leader. It runs quietly under sustained load and accepts up to 64GB of RAM.&lt;/p&gt;

&lt;p&gt;Consider &lt;strong&gt;used Dell OptiPlex or Lenovo ThinkCentre machines&lt;/strong&gt; at $50–$120 refurbished. Enterprise-grade build quality meets consumer throwaway prices and both lines carry well-documented Linux driver support.&lt;/p&gt;

&lt;p&gt;Minimum viable targets: 8–16GB RAM, one NVMe slot and virtualization extensions enabled in BIOS.&lt;/p&gt;

&lt;h3&gt;
  
  
  Networking: Managed Switches and Budget Routers
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;TP-Link TL-SG108E&lt;/strong&gt; delivers 8-port managed switching with VLAN support for around $30 — the highest-impact network upgrade available at that price point. For routing, the GL.iNet lineup and used Ubiquiti EdgeRouter X units offer advanced capabilities without enterprise pricing. Gigabit Ethernet throughout is non-negotiable; wireless introduces latency variability that corrupts meaningful performance benchmarks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Storage: Choosing the Right Drive for the Job
&lt;/h3&gt;

&lt;p&gt;Dedicate a NVMe SSD to the operating system and hypervisor layer. Mechanical drives — specifically the &lt;strong&gt;WD Red Plus or Seagate IronWolf&lt;/strong&gt; — cover bulk storage economically and are built for continuous write cycles. Configure a ZFS mirror for any data you cannot afford to lose. Redundancy at home costs far less than recovery.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Software Stack That Activates Your Hardware
&lt;/h2&gt;

&lt;p&gt;Hardware sets the ceiling but software determines how much of it you actually reach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Proxmox VE&lt;/strong&gt; converts a single mini PC into a multi-VM environment at no cost — the fastest path from bare metal to production-equivalent experience. &lt;strong&gt;TrueNAS SCALE&lt;/strong&gt; pairs naturally with storage-centric builds and includes integrated Docker support. &lt;strong&gt;Ubuntu Server LTS&lt;/strong&gt; provides a stable, well-documented baseline for most developer workloads. Layer &lt;strong&gt;Docker with Portainer&lt;/strong&gt; on top and you reduce the iteration cost of spinning up experimental services to minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Mistakes First-Time Builders Make
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Overbuying upfront.&lt;/strong&gt; Start with one machine and a clear use case then expand when real workload demands justify it — not when your wishlist does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ignoring power consumption.&lt;/strong&gt; A 300W system running continuously adds $20–$40 per month to your electricity bill. TDP belongs in every hardware decision at the planning stage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skipping documentation.&lt;/strong&gt; Label your cables. Record your IP assignments. Maintain a minimal runbook. That habit pays compounding dividends the first time you troubleshoot a broken subnet at 2 AM.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start Small — Scale With Purpose
&lt;/h2&gt;

&lt;p&gt;The best home lab is not the most powerful one. It is the one you actually build and use consistently. A Raspberry Pi with a clear use case delivers more practical learning than a rack of unracked enterprise gear.&lt;/p&gt;

&lt;p&gt;Before you purchase your first component, check the latest hardware benchmarks and budget buyer's guides at &lt;a href="https://www.informertech.com" rel="noopener noreferrer"&gt;Informer Tech&lt;/a&gt; — curated picks across every price point so you buy with confidence.&lt;/p&gt;

&lt;p&gt;A home lab is not just a sandbox. It is a compounding career asset and the return on investment begins the moment you power it on.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>beginners</category>
      <category>homelab</category>
    </item>
  </channel>
</rss>
