[
  {
    "title":   "Why I Use NO-IP Dynamic DNS in My Lab",
    "url":     "https://thedigitaldown.com/posts/how-i-used-noip-sevices/",
    "summary": " What This Is Link to heading I use NO-IP Dynamic DNS (DDNS) to give my home lab a stable hostname, even though my public IP changes.\nInstead of chasing a changing IP address, I use:\nechobase.ditchyourip.com\nWhy It Matters Link to heading Most residential internet connections don’t have a static public IP.\nThat means your external IP can change at any time.\n",
    "content": " What This Is Link to heading I use NO-IP Dynamic DNS (DDNS) to give my home lab a stable hostname, even though my public IP changes.\nInstead of chasing a changing IP address, I use:\nechobase.ditchyourip.com\nWhy It Matters Link to heading Most residential internet connections don’t have a static public IP.\nThat means your external IP can change at any time.\nWithout DDNS:\nRemote access breaks VPN connections fail Anything exposed externally becomes unreliable With DDNS:\nYou always connect to the same hostname NO-IP keeps it updated behind the scenes How It Works Link to heading A DDNS client runs on my network (router or server) It checks my current public IP If the IP changes, it updates NO-IP automatically DNS updates propagate quickly (low TTL) So anytime I hit:\nping echobase.ditchyourip.com ",
    "tags":    ["networking","ddns","noip","homelab","infrastructure"],
    "date":    "March 19, 2026"
  },
  {
    "title":   "Building My Homelab: TrueNAS, Proxmox, and a 10GbE Storage Fabric",
    "url":     "https://thedigitaldown.com/posts/building-my-homelab-truenas-proxmox-10gbe/",
    "summary": "I\u0026rsquo;ve been running a single Proxmox node at home for a while now — good enough to spin up VMs, mess around with things, break things, fix them. But it\u0026rsquo;s always bothered me that everything was sitting on local storage with no shared backend, no live migration, no HA. Basically a very expensive way to run a few VMs.\nSo I decided to fix that. The goal: build a TrueNAS SCALE server, connect it to my Proxmox environment over a dedicated 10GbE storage fabric, migrate all my VMs off local storage, and then eventually stand up a second Proxmox node and form a proper cluster. This is part one — getting the network fabric up and the storage interfaces configured.\n",
    "content": "I\u0026rsquo;ve been running a single Proxmox node at home for a while now — good enough to spin up VMs, mess around with things, break things, fix them. But it\u0026rsquo;s always bothered me that everything was sitting on local storage with no shared backend, no live migration, no HA. Basically a very expensive way to run a few VMs.\nSo I decided to fix that. The goal: build a TrueNAS SCALE server, connect it to my Proxmox environment over a dedicated 10GbE storage fabric, migrate all my VMs off local storage, and then eventually stand up a second Proxmox node and form a proper cluster. This is part one — getting the network fabric up and the storage interfaces configured.\nThe Hardware Link to heading I sourced everything from eBay. This is a homelab, not a datacenter — there\u0026rsquo;s no reason to buy new when used enterprise gear exists at a fraction of the price.\nComponent What it\u0026rsquo;s for HP Z620 Workstation (Xeon E5-1650, 64GB RAM) TrueNAS SCALE host 4x Hitachi 3TB 7.2K SAS 3.5\u0026quot; HDD ZFS storage pool 3x Mellanox MCX311A-XCAT ConnectX-3 10GbE SFP+ NIC One per host (TrueNAS, PRX01, PRX02) MikroTik CRS305-1G-4S+IN 10GbE SFP+ switch 3x 10GbE SFP+ SR transceivers 850nm, for OM3 fiber OM3 LC-LC fiber patch cables (0.5m, 5-pack) Short runs between hosts and switch SATA cables OS boot drive on TrueNAS Total damage: around $585 before tax. Not bad for a full 10GbE storage fabric.\nA few notes on the hardware choices:\nThe HP Z620 is a workstation, not a server. No IPMI, no hot-swap bays, aggressive fan curves. I know what I\u0026rsquo;m signing up for. It\u0026rsquo;s what I could get at the right price point with enough RAM and a SAS controller onboard. Speaking of which — the Z620 has an onboard LSI SAS2308 which needs to be in IT mode (passthrough) for ZFS to work properly. TrueNAS needs direct access to the drives; if the controller is in IR mode doing its own RAID thing, ZFS can\u0026rsquo;t do its job. Verifying and flashing that controller is its own adventure and worth a separate post.\nThe Mellanox ConnectX-3 cards are workhorses. Well supported in Linux, solid 10GbE performance, and cheap on the used market. One for each host — TrueNAS, my existing Proxmox node (echobase-hv-prx01), and a spare for the second Proxmox node coming later.\nThe MikroTik CRS305 is the glue. Four SFP+ ports for the storage fabric and one GLAN RJ45 port for management. It\u0026rsquo;s managed via its own IP on my regular LAN — no VLAN gymnastics needed for this use case since the storage fabric is physically isolated on the SFP+ ports.\nNetwork Design Link to heading The core idea is simple: keep storage traffic completely off the management network. Dedicated NICs, dedicated subnet, dedicated switch. Nothing on your production LAN needs to know this network exists.\nHere\u0026rsquo;s the addressing I settled on:\nTrueNAS (echobase-truenas01) → 10.10.10.10/24 PRX01 (echobase-hv-prx01) → 10.10.10.11/24 PRX02 (echobase-hv-prx02) → 10.10.10.12/24 MikroTik (management via LAN) → 10.125.11.x/24 The MikroTik doesn\u0026rsquo;t get a 10.10.10.x address — it lives on my management subnet via its GLAN port. The SFP+ ports just bridge storage traffic between hosts, no routing involved.\nAll interfaces are configured with MTU 9000 (jumbo frames). ConnectX-3 supports it natively and it makes a meaningful difference for large sequential storage I/O. The key thing to remember is that MTU has to match end-to-end — TrueNAS, both Proxmox nodes, and the MikroTik all need to agree on 9000 or you\u0026rsquo;ll get mysterious performance problems and dropped packets.\nConfiguring Proxmox — PRX01 Link to heading On Proxmox, network config lives in /etc/network/interfaces. Before touching anything, always read the file first:\ncat /etc/network/interfaces On PRX01 the Mellanox showed up as enp179s0 — confirmed with ip link show and lspci | grep -i mellanox. It was present but DOWN with no config, exactly what you want before you start.\nI added the following to the bottom of /etc/network/interfaces, before the source line:\nauto enp179s0 iface enp179s0 inet manual mtu 9000 auto vmbr2 iface vmbr2 inet static address 10.10.10.11/24 bridge-ports enp179s0 bridge-stp off bridge-fd 0 mtu 9000 # SFP for storage network The pattern here is: configure the physical NIC as manual (no IP, just bring it up), then create a Linux bridge (vmbr2) on top of it with the actual IP. Proxmox uses bridges for all its networking — VMs attach to bridges, not directly to physical NICs. By putting the storage NIC behind a bridge, I can later attach VMs directly to the storage network if needed.\nApply the config without rebooting:\nifreload -a Verify it took:\nip addr show vmbr2 Expected output:\n34: vmbr2: \u0026lt;NO-CARRIER,BROADCAST,MULTICAST,UP\u0026gt; mtu 9000 qdisc noqueue state DOWN group default qlen 1000 link/ether ec:0d:9a:1b:0b:d0 brd ff:ff:ff:ff:ff:ff inet 10.10.10.11/24 scope global vmbr2 valid_lft forever preferred_lft forever NO-CARRIER is correct — nothing is plugged into the SFP+ port yet. The interface is configured and waiting.\nConfiguring Proxmox — PRX02 Link to heading PRX02 was similar but with one difference — the Mellanox showed up as nic2 (with enp7s0 as an altname). This machine uses nic0/nic1/nic2 naming instead of the enp convention. Always verify with ip link show before assuming interface names.\nThe existing file already had iface nic2 inet manual as a bare entry. Rather than duplicate it, I replaced that line entirely with the full block:\nauto nic2 iface nic2 inet manual mtu 9000 auto vmbr2 iface vmbr2 inet static address 10.10.10.12/24 bridge-ports nic2 bridge-stp off bridge-fd 0 mtu 9000 # SFP for storage network Same ifreload -a and same verification. Same result — NO-CARRIER, IP assigned, MTU 9000, valid forever.\nConfiguring TrueNAS SCALE Link to heading TrueNAS is different — you do not edit config files directly. TrueNAS manages its own network config and will overwrite manual changes. Everything goes through the WebUI.\nThe Mellanox showed up as ens1 (altname enp7s0) in the shell. To configure it:\nNetwork → Interfaces → Add\nName: ens1 Description: SFP for storage DHCP: off — select \u0026ldquo;Define Static IP Addresses\u0026rdquo; IP Address: 10.10.10.10 / 24 MTU: 9000 Autoconfigure IPv6: unchecked Save, then confirm the test within 60 seconds. TrueNAS gives you a safety window here — if you lose connectivity to the WebUI after a network change, it rolls back automatically after the timer expires. Since we\u0026rsquo;re only adding a new interface and not touching the management NIC, there\u0026rsquo;s no risk of lockout.\nVerify in the shell:\nip addr show ens1 3: ens1: \u0026lt;NO-CARRIER,BROADCAST,MULTICAST,UP\u0026gt; mtu 9000 qdisc mq state DOWN group default qlen 1000 link/ether ec:0d:9a:b8:f9:a0 brd ff:ff:ff:ff:ff:ff inet 10.10.10.10/24 brd 10.10.10.255 scope global ens1 valid_lft forever preferred_lft forever Where Things Stand Link to heading All three hosts are configured and waiting for the MikroTik switch to arrive:\nTrueNAS ens1 10.10.10.10/24 ✅ configured, waiting for cable PRX01 vmbr2 10.10.10.11/24 ✅ configured, waiting for cable PRX02 vmbr2 10.10.10.12/24 ✅ configured, waiting for cable When the CRS305 lands, the plan is straightforward:\nPlug GLAN into the home router, assign it a management IP on 10.125.11.0/24 Plug fiber: TrueNAS → SFP+1, PRX01 → SFP+2, PRX02 → SFP+3 Watch all three interfaces flip from NO-CARRIER to UP automatically Run ping 10.10.10.10 from each Proxmox node to verify end-to-end connectivity Run an iperf3 test to confirm 10GbE throughput After that it\u0026rsquo;s on to the ZFS pool, NFS share configuration, adding TrueNAS as storage in Proxmox, and migrating VMs off local storage. Then eventually — the part I\u0026rsquo;m most looking forward to — standing up the cluster, enabling HA, and testing live migration.\nMore to come.\nPart of an ongoing series on building out a proper homelab from scratch on a budget. All management IPs shown are representative — don\u0026rsquo;t use these ranges without checking for conflicts in your own environment.\n",
    "tags":    ["proxmox","truenas","homelab","networking","10gbe","zfs","infrastructure"],
    "date":    "March 18, 2026"
  },
  {
    "title":   "How I Set Up Audio Narration on This Site",
    "url":     "https://thedigitaldown.com/posts/how-i-set-up-audio-narration/",
    "summary": "One of the things I wanted from the start with The Digital Down was to make it easy for people who prefer listening over reading. Smart but lazy, as I like to say. Here is how I set up automated audio narration for every post on this Hugo site.\nThe Goal Link to heading Write a post in markdown, run one command, and have a clean audio player appear automatically above the content. No manual work after setup.\n",
    "content": "One of the things I wanted from the start with The Digital Down was to make it easy for people who prefer listening over reading. Smart but lazy, as I like to say. Here is how I set up automated audio narration for every post on this Hugo site.\nThe Goal Link to heading Write a post in markdown, run one command, and have a clean audio player appear automatically above the content. No manual work after setup.\nThe Stack Link to heading Hugo — static site generator ElevenLabs API — text to speech generation (free tier works for a hobby blog) Python script — automation glue between Hugo and ElevenLabs Fuse.js — client-side search on the Blog page Where Everything Lives Link to heading thedigitaldown.com/ ├── generate_audio.py ← the automation script, run this after writing a post ├── start-session.bat ← double-click to start a dev session with API key loaded ├── hugo.toml ← site config │ ├── content/posts/ ← your markdown posts live here │ ├── static/audio/ ← generated MP3 files live here (source of truth) │ └── post-slug.mp3 │ ├── data/ │ └── audio.json ← auto-generated index Hugo uses to find audio files │ ├── layouts/ │ ├── partials/ │ │ └── audio-player.html ← the audio player widget injected into every post │ ├── posts/ │ │ ├── single.html ← post template (has the partial call added) │ │ └── list.html ← blog list page with search bar │ └── _default/ │ └── index.json ← search index template Hugo builds at compile time │ └── public/ ← Hugo builds into here, do not edit directly └── audio/ ← MP3s copied here from static/audio/ on hugo build How It Works Link to heading 1. The Python Script Link to heading generate_audio.py does the following when you run it:\nScans content/posts/ for all markdown files Parses the TOML frontmatter (the +++ block) to get the title Strips markdown syntax so the voice reads clean prose Calls the ElevenLabs API with the cleaned text Saves the MP3 to static/audio/post-slug.mp3 Updates data/audio.json so Hugo knows the audio exists 2. The Hugo Partial Link to heading layouts/partials/audio-player.html checks data/audio.json for a matching entry using the post slug. If it finds one it renders the player. If not it renders nothing. This means you never get a broken player on posts without audio.\n3. The Post Template Link to heading layouts/posts/single.html has this line added just above {{ .Content }}:\n{{ partial \u0026#34;audio-player.html\u0026#34; . }} That one line is all Hugo needs to inject the player on every post automatically.\nDaily Workflow Link to heading Starting a session Link to heading Double-click start-session.bat in the site root. This opens PowerShell in the right directory with your ElevenLabs API key already loaded.\nWriting and publishing a post Link to heading # 1. Write your post in content/posts/my-new-post.md # 2. Generate audio for any new posts python generate_audio.py # 3. Rebuild the site hugo # 4. Deploy (sync public/ to your host) Useful script flags Link to heading # Generate audio for one specific post by slug python generate_audio.py --post my-post-slug # Regenerate all audio (overwrites existing, uses ElevenLabs credits) python generate_audio.py --all ElevenLabs Setup Link to heading Sign up free at elevenlabs.io Choose ElevenCreative platform Go to Developers in the sidebar Create an API key with Text to Speech access enabled Free tier: ~10,000 characters per month (roughly 7-15 average posts) The voice currently used is George (Voice ID: JBFqnCBsd6RMkjVDRZzb) — a free tier voice that works well for tech and personal content. To change voices, update ELEVENLABS_VOICE_ID at the top of generate_audio.py.\nThe API Key Link to heading The API key is set as an environment variable each session. It is stored in start-session.bat so it loads automatically. Never commit this file to a public git repository.\n# If you ever need to set it manually $env:ELEVENLABS_API_KEY=\u0026#34;your_key_here\u0026#34; Rebuilding From Scratch Link to heading If you ever need to wipe the public folder and rebuild everything cleanly:\nRemove-Item -Recurse -Force public hugo The MP3 files are safe in static/audio/ and will be copied back into public/audio/ on the next hugo build. You do not need to regenerate audio from ElevenLabs when doing a clean rebuild.\nSearch Link to heading The Blog page has full-content search powered by Fuse.js. It reads from public/search.json which Hugo generates automatically at build time from layouts/_default/index.json. No additional setup needed — it just works after every hugo build. +++\n",
    "tags":    ["hugo","elevenlabs","tts","infrastructure","meta"],
    "date":    "March 14, 2026"
  },
  {
    "title":   "How I Ended Up in I T",
    "url":     "https://thedigitaldown.com/posts/how-i-ended-up-in-it/",
    "summary": "My path into IT wasn’t something I planned. In a lot of ways, it started long before I ever had a job in technology.\nWhen I was a teenager, my mother worked as an adult educator teaching people how to use computers, both Macs and PCs. She had a remarkable mind for organization and patterns. She could sit at the piano playing classical music, reading sheet music, singing, and never once look down at the keys. Computers were the same way for her. At one point she became very good at coding and scripting, building websites and writing JavaScript programs almost effortlessly.\n",
    "content": "My path into IT wasn’t something I planned. In a lot of ways, it started long before I ever had a job in technology.\nWhen I was a teenager, my mother worked as an adult educator teaching people how to use computers, both Macs and PCs. She had a remarkable mind for organization and patterns. She could sit at the piano playing classical music, reading sheet music, singing, and never once look down at the keys. Computers were the same way for her. At one point she became very good at coding and scripting, building websites and writing JavaScript programs almost effortlessly.\nThat environment had a huge influence on me.\nI started tearing computers apart and putting them back together as soon as I could get my hands on a few spare parts. What fascinated me most was the idea that you could install an operating system from a disk and start over from nothing. A machine could be completely rebuilt from scratch. That concept stuck with me.\nDespite that interest, my early career took a different direction.\nIn my twenties I became a pattern maker, a skilled trade centered around precision geometry and manufacturing. It was deeply technical work and I enjoyed it, but the industry was slowly changing. CNC machines were beginning to automate more and more of what we did by hand. After about seven years in the trade, I was laid off.\nLike a lot of people at that stage of life, I had a mortgage and bills to pay, and things were getting tight.\nA good friend of mine helped me out. He said, “This probably isn’t something you’ll want to do, but I can offer it.” The job was in a warehouse loading trucks with hardwood flooring and sweeping the floors. It wasn’t glamorous work, but it was honest work and it kept things moving while I figured out the next step.\nEven then, I couldn’t leave technology alone.\nEvery time something came up that required help from the company’s IT person, it seemed like things stalled. More than once I found myself explaining how to fix the problem or showing how something should be done.\nAfter a couple of months, the company’s VP asked me how I liked the job.\nI laughed and told him the truth.\n“I’ve been doing complex geometry for the past seven years,” I said. “I hate this job. And as soon as I can leave, it won’t be a day too late.”\nInstead of being offended, he loved the response. He asked me what I actually wanted to do.\nMy answer came pretty naturally: computers had helped automate my previous job, so maybe computers were the direction I should go.\nNot long after that conversation, I landed my first official IT role.\nOver the next thirteen years I ended up managing nearly all of the IT operations for a small Midwestern flooring company. It was the kind of environment where you learn everything: servers, networking, troubleshooting, deployments, infrastructure, and support, because there is no one else to do it.\nEventually an opportunity opened up that changed the trajectory of my career.\nThrough a connection I had made during that time, I landed my first corporate IT job. It came with a significant pay increase and, more importantly, the chance to work with people who I still believe are some of the smartest engineers I’ve ever met.\nFor about six years I worked alongside an IT director and an infrastructure manager who were both extremely hands-on. The infrastructure manager in particular was the kind of mentor every engineer hopes to find: patient, sharp, and willing to teach anyone who genuinely wanted to learn.\nAnd that was me.\nI probably arrived a little cocky, but those guys had a way of bringing you back down to earth without discouraging you. One thing my mentor said stuck with me:\n“If I had a crystal ball, I could show you how your idea is good, but not long term.”\nThat period of my career shaped how I think about technology. I moved into roles as a help desk supervisor and support engineer, working on monitoring systems, leading change control processes, and traveling to different sites to help ensure IT delivery.\nThen COVID hit.\nLike many organizations, our teams shrank and responsibilities grew. My help desk staff was reduced, and eventually it became clear that the workload was not sustainable. I needed to find a better balance between work and life.\nThat change led me into a more localized IT role where my experience quickly pushed me into broader responsibility. Today I work in infrastructure leadership, balancing tools, skill sets, budgets, personalities, and the constant stream of daily issues that come with running technology at scale.\nIt’s a strange job sometimes.\nI often joke that I don’t know why I punish myself with the workload, but for some reason I enjoy it the way kids enjoy cake.\nSomewhere along the way, the challenge itself became the reward.\nThis is part of why thedigitaldown.com exists: to document the work, the lessons, the projects, and the thinking that come out of a life spent in and around technology.\n",
    "tags":    ["career","it","infrastructure","personal"],
    "date":    "March 13, 2026"
  }
]
