<?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: Roger Castro</title>
    <description>The latest articles on DEV Community by Roger Castro (@rogercastro).</description>
    <link>https://dev.to/rogercastro</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3916066%2F00f6d018-b202-4946-a5cc-c91899617488.png</url>
      <title>DEV Community: Roger Castro</title>
      <link>https://dev.to/rogercastro</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rogercastro"/>
    <language>en</language>
    <item>
      <title>I Thought Portfolios Weren't for People Like Me. So I Built a Wiki Instead.</title>
      <dc:creator>Roger Castro</dc:creator>
      <pubDate>Wed, 06 May 2026 19:17:48 +0000</pubDate>
      <link>https://dev.to/rogercastro/i-thought-portfolios-werent-for-people-like-me-so-i-built-a-wiki-instead-4daf</link>
      <guid>https://dev.to/rogercastro/i-thought-portfolios-werent-for-people-like-me-so-i-built-a-wiki-instead-4daf</guid>
      <description>&lt;p&gt;For a long time I operated under a quiet assumption: portfolios are for developers. They're for people who build things — apps, tools, open source projects. People who have something to show.&lt;/p&gt;

&lt;p&gt;I'm in IT support. I fix things. I troubleshoot. I answer tickets. What was I going to put on a portfolio page — a screenshot of a closed ticket?&lt;/p&gt;

&lt;p&gt;So when I started wanting a way to document and showcase my work, I didn't build a portfolio. I built a wiki.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I Started Documenting
&lt;/h2&gt;

&lt;p&gt;My homelab had been growing for a while. pfSense for routing, Pi-hole for DNS, a dedicated Docker host, a storage server, Tailscale for remote access. It was becoming real infrastructure — and real infrastructure has a way of becoming mysterious over time.&lt;/p&gt;

&lt;p&gt;I'd seen it professionally at Datto too, just from a different angle. In technical support, documentation wasn't about managing someone else's environment — it was about continuity. When a partner called in on an ongoing ticket, good notes meant you knew exactly what had been tried, where things stood, and what to do next. When you hit a wall diagnosing something, you could search past tickets and find a case where someone else had solved the same thing. Documentation wasn't optional — it was the difference between resolving a ticket efficiently and spinning your wheels every time someone called in.&lt;/p&gt;

&lt;p&gt;I didn't want that to happen to my own network. So I set up &lt;strong&gt;BookStack&lt;/strong&gt; — a self-hosted, open source wiki — in a Docker container and started writing things down.&lt;/p&gt;

&lt;p&gt;The first entries were practical. How the network is laid out. What IP addresses belong to what. How services are connected. The kind of information that feels obvious when you set something up and completely vanishes six months later when something breaks at 11pm and you're staring at a config file wondering what past-you was thinking.&lt;/p&gt;




&lt;h2&gt;
  
  
  It Grew Into Something More
&lt;/h2&gt;

&lt;p&gt;What started as homelab documentation didn't stay there.&lt;/p&gt;

&lt;p&gt;BookStack's structure — shelves containing books, books containing chapters, chapters containing pages — made it easy to expand into other areas. I added a &lt;strong&gt;Recipes shelf&lt;/strong&gt; for cooking. A &lt;strong&gt;Subway Knowledge Base shelf&lt;/strong&gt; for the SOPs and scripts I was writing at work, partly for reference and partly so I had a record of the processes I'd built or improved.&lt;/p&gt;

&lt;p&gt;That work shelf in particular felt significant. I was documenting the Autopilot reimaging workflow I'd fixed, the processes I'd written up, the tools I'd built. I was building a record of my own professional contributions — not because anyone asked me to, but because I wanted it to exist.&lt;/p&gt;

&lt;p&gt;I also started an &lt;strong&gt;Apollo Archives shelf&lt;/strong&gt; — a growing reference library for certifications and courses I'm working toward, collected and organized for when I'm ready to dig in.&lt;/p&gt;

&lt;p&gt;At some point I realized what I was actually doing. I was building a portfolio. I just hadn't called it that.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Assumption I Had Wrong
&lt;/h2&gt;

&lt;p&gt;Here's what I'd gotten wrong about portfolios: I thought they were about &lt;em&gt;showing off projects&lt;/em&gt;. Things you built from scratch. Code you wrote. Apps you deployed.&lt;/p&gt;

&lt;p&gt;But a portfolio is really just evidence of how you think and what you've done. It doesn't have to be a GitHub repo. It can be documentation. It can be a write-up of a problem you solved. It can be a structured record of the processes you've improved and the things you've learned.&lt;/p&gt;

&lt;p&gt;IT support people build things all the time. We build processes. We build runbooks. We build muscle memory for diagnosing problems that would take other people hours. We just rarely write it down in a way that's visible to anyone else.&lt;/p&gt;

&lt;p&gt;The wiki forced me to write it down.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's in There Now
&lt;/h2&gt;

&lt;p&gt;The nora.local Homelab shelf documents everything about my home network — infrastructure overview, network and DNS configuration, services and containers, backup and recovery procedures, a running change log, and a troubleshooting section for issues I've worked through.&lt;/p&gt;

&lt;p&gt;Every Docker container gets a page. Every significant config change gets a change log entry. If I make a decision — why I chose Unbound over a forwarding resolver, why I run ZFS on both servers, why I set up WeTTY instead of direct SSH — I write down the reasoning, not just the steps.&lt;/p&gt;

&lt;p&gt;That last part matters more than I expected. Steps tell you &lt;em&gt;what&lt;/em&gt; was done. Reasoning tells you &lt;em&gt;why&lt;/em&gt;, and why is what you actually need when something breaks or you're deciding whether to change it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Unexpected Side Effect
&lt;/h2&gt;

&lt;p&gt;When I eventually decided to build an actual portfolio site — after realizing that yes, IT support people can have portfolios, and yes, I had more to show than I thought — the wiki had already done most of the work.&lt;/p&gt;

&lt;p&gt;The project descriptions, the process write-ups, the technical details I needed to articulate my experience clearly — it was all there. Years of documenting my own work, organized and searchable, in my own words.&lt;/p&gt;

&lt;p&gt;I didn't have to reconstruct what I'd done. I'd been writing it down the whole time.&lt;/p&gt;




&lt;h2&gt;
  
  
  If You're in IT and You're Not Documenting
&lt;/h2&gt;

&lt;p&gt;Start.&lt;/p&gt;

&lt;p&gt;You don't need BookStack specifically. A Notion workspace, a simple GitHub repo with markdown files, even a folder of well-named text documents — the tool matters less than the habit.&lt;/p&gt;

&lt;p&gt;Document what you build. Document what you fix. Document the decisions you make and why you made them. Write it for future-you who will absolutely forget, and write it like someone else might need to understand it someday.&lt;/p&gt;

&lt;p&gt;Because they might. And that someone might be a hiring manager.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Are you in IT support and wondering whether a portfolio is even worth building? I'd love to hear where you're at in the comments — this is a conversation I think our corner of the industry needs to have more.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>homelab</category>
      <category>selfhosted</category>
      <category>documentation</category>
      <category>career</category>
    </item>
    <item>
      <title>How I Finally Got Remote Access to My Homelab (And the Workaround That Made It Actually Work)</title>
      <dc:creator>Roger Castro</dc:creator>
      <pubDate>Wed, 06 May 2026 18:41:04 +0000</pubDate>
      <link>https://dev.to/rogercastro/how-i-finally-got-remote-access-to-my-homelab-and-the-workaround-that-made-it-actually-work-4oad</link>
      <guid>https://dev.to/rogercastro/how-i-finally-got-remote-access-to-my-homelab-and-the-workaround-that-made-it-actually-work-4oad</guid>
      <description>&lt;p&gt;For a long time, my homelab had a dirty secret: I couldn't access it remotely.&lt;/p&gt;

&lt;p&gt;Well, that's not entirely true. I &lt;em&gt;used&lt;/em&gt; to have a solution — Google Remote Desktop into my main PC, then SSH from there into my servers using XShell. It worked, but it was clunky, dependent on my desktop being on and reachable, and felt like the wrong answer. When I eventually rebuilt my PC, I never bothered to set it up again.&lt;/p&gt;

&lt;p&gt;So for a while, if I wasn't home, I wasn't in my homelab. For a network I'd put real effort into building — pfSense firewall, Pi-hole, Unbound, a dedicated Docker host, a storage server — that felt like a gap worth closing.&lt;/p&gt;

&lt;p&gt;The solution turned out to be Tailscale. Getting it fully working took a detour I didn't expect.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Tailscale
&lt;/h2&gt;

&lt;p&gt;I'd heard about Tailscale for a while before actually setting it up. The pitch is simple: install it on your devices, and they form a secure mesh VPN — no port forwarding, no dynamic DNS headaches, no managing certificates. Each device gets a stable Tailscale IP that works anywhere.&lt;/p&gt;

&lt;p&gt;What sold me was installing it on my pfSense router (&lt;strong&gt;fireclaw&lt;/strong&gt; in my homelab, following a Horizon Zero Dawn naming convention I use throughout). Installing Tailscale at the router level means every device on my local network is reachable through Tailscale — not just the ones with the client installed. One install, whole network covered.&lt;/p&gt;

&lt;p&gt;After setting it up, I could reach my services from my phone or laptop from anywhere. Portainer, Uptime Kuma, Nginx Proxy Manager, BookStack — all accessible as if I was sitting at home. For a homelab that had been effectively offline to me whenever I left the house, this was a big deal.&lt;/p&gt;




&lt;h2&gt;
  
  
  The SSH Problem
&lt;/h2&gt;

&lt;p&gt;With Tailscale on pfSense working well for web-based services, the next thing I wanted was SSH access to my servers — specifically &lt;strong&gt;minerva&lt;/strong&gt; (Docker host) and &lt;strong&gt;zero-dawn&lt;/strong&gt; (storage server).&lt;/p&gt;

&lt;p&gt;This is where things got interesting.&lt;/p&gt;

&lt;p&gt;When I tried to SSH directly into minerva from my laptop (&lt;strong&gt;hephaestus&lt;/strong&gt;) over Tailscale, it would time out. Connection refused. Couldn't be reached. This was confusing — Tailscale was working fine for everything else, both hephaestus and fireclaw had Tailscale installed and connected, so why couldn't I reach minerva?&lt;/p&gt;

&lt;p&gt;The suspected culprit: a routing loop. Traffic from hephaestus was hitting Tailscale, routing through fireclaw, and somewhere in the handoff between Tailscale and the local network it was getting lost — likely looping back into pfSense without finding its way to minerva. Firewall rules and routing tables on pfSense can get opinionated about traffic that arrives and leaves on the same interface.&lt;/p&gt;

&lt;p&gt;The obvious fix was to install Tailscale directly on minerva, giving it its own Tailscale IP that hephaestus could reach directly without routing through pfSense at all. I tried it. SSH worked.&lt;/p&gt;

&lt;p&gt;But something else broke.&lt;/p&gt;




&lt;h2&gt;
  
  
  One Fix, One New Problem
&lt;/h2&gt;

&lt;p&gt;Installing Tailscale directly on minerva interfered with how its Docker containers were being reached. The details got murky fast — container networking, Tailscale's network interface, and pfSense all have opinions about routing, and they weren't agreeing. Services that had been working fine were suddenly unreachable.&lt;/p&gt;

&lt;p&gt;At this point I had two options: dig into the networking conflict and try to resolve it, or find a different path to SSH that didn't require touching minerva's network config.&lt;/p&gt;

&lt;p&gt;I chose the workaround.&lt;/p&gt;




&lt;h2&gt;
  
  
  WeTTY: Browser-Based SSH in a Docker Container
&lt;/h2&gt;

&lt;p&gt;The insight was simple: I could already reach Docker containers on minerva through Tailscale without any issues. What if one of those containers &lt;em&gt;was&lt;/em&gt; the SSH client?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WeTTY&lt;/strong&gt; (Web TTY) is a Docker container that runs a terminal emulator in the browser. You access it over HTTP/HTTPS, and from inside it you can SSH into other machines on the same network. Since WeTTY and minerva are on the same local network, an SSH connection from WeTTY to minerva is just local traffic — no Tailscale routing involved, no pfSense interference.&lt;/p&gt;

&lt;p&gt;The flow became:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Connect to Tailscale on hephaestus (or just have it running in the background)&lt;/li&gt;
&lt;li&gt;Open a browser, navigate to the WeTTY container via its Tailscale-accessible address&lt;/li&gt;
&lt;li&gt;SSH into minerva from WeTTY&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It's one extra hop, but it's invisible in practice. From my laptop, opening a browser and navigating to WeTTY feels no different than opening a terminal — and I get a full SSH session into minerva from anywhere in the world.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Setup Looks Like Now
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tailscale on fireclaw (pfSense)&lt;/strong&gt; — whole network reachable remotely&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WeTTY in Docker on minerva&lt;/strong&gt; — browser-based SSH terminal, accessible via Tailscale&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailscale on hephaestus&lt;/strong&gt; — laptop connects to the mesh from anywhere&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From my phone I can check Uptime Kuma, manage containers in Portainer, and browse my BookStack wiki. From my laptop I can do all of that plus SSH into minerva via WeTTY for anything that needs a terminal.&lt;/p&gt;

&lt;p&gt;It's not a perfect architecture. Ideally I'd resolve the routing conflict properly and SSH directly into minerva. But it works reliably, it's low maintenance, and it solved the actual problem: I can now manage my homelab from anywhere without being tethered to my desk at home.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;Sometimes the clean solution creates new problems, and the workaround is the right answer — at least for now. Homelab work is iterative. The goal isn't a perfect network on paper, it's a network that actually does what you need it to do.&lt;/p&gt;

&lt;p&gt;Tailscale made remote access trivially easy. WeTTY filled the one gap Tailscale's pfSense integration left open. Together they gave me something I should have had a long time ago.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Running a similar setup or hit the same pfSense routing issue? I'd love to hear how you solved it in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>homelab</category>
      <category>networking</category>
      <category>tailscale</category>
      <category>selfhosted</category>
    </item>
    <item>
      <title>We Were Reimaging Laptops the Hard Way for 3 Years. I Fixed It in an Afternoon.</title>
      <dc:creator>Roger Castro</dc:creator>
      <pubDate>Wed, 06 May 2026 18:11:32 +0000</pubDate>
      <link>https://dev.to/rogercastro/we-were-reimaging-laptops-the-hard-way-for-3-years-i-fixed-it-in-an-afternoon-2fn9</link>
      <guid>https://dev.to/rogercastro/we-were-reimaging-laptops-the-hard-way-for-3-years-i-fixed-it-in-an-afternoon-2fn9</guid>
      <description>&lt;p&gt;When I joined the IT team at a corporate headquarters, one of my first tasks was learning the reimaging process. We had a long counter lined with 12 to 18 laptops at a time, and the process went something like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to Intune, delete the device record, enrollment record, and Azure AD record&lt;/li&gt;
&lt;li&gt;Walk to the laptop, boot from a Windows 11 USB installer, perform a clean install&lt;/li&gt;
&lt;li&gt;Wait. Perform all Windows Updates — drivers too — while the device is unmanaged&lt;/li&gt;
&lt;li&gt;Walk back to the laptop, run a PowerShell script to capture the hardware hash, which exports to a CSV on a USB drive&lt;/li&gt;
&lt;li&gt;Walk back to your desk, manually upload the CSV to Intune to recreate the enrollment record&lt;/li&gt;
&lt;li&gt;Walk back to the laptop, initiate Autopilot pre-provisioning&lt;/li&gt;
&lt;li&gt;Wait for provisioning to complete&lt;/li&gt;
&lt;li&gt;Reseal the laptop, put it on the shelf&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Start to finish: roughly &lt;strong&gt;6 hours per batch&lt;/strong&gt;, assuming no hiccups. And there were always hiccups.&lt;/p&gt;




&lt;h2&gt;
  
  
  Something Felt Off
&lt;/h2&gt;

&lt;p&gt;A few things didn't sit right with me from the start.&lt;/p&gt;

&lt;p&gt;Why were we deleting the device record and starting completely from scratch? Why were we installing an &lt;em&gt;old&lt;/em&gt; version of Windows 11 from a USB, only to spend hours downloading updates to get it current again? Why were we making three or four trips back and forth between the desk and the counter for every single batch?&lt;/p&gt;

&lt;p&gt;And most importantly — Windows has built-in features specifically designed for this use case. &lt;strong&gt;Autopilot Reset&lt;/strong&gt; and &lt;strong&gt;Fresh Start&lt;/strong&gt; exist precisely so you don't have to blow everything away and start over. Why weren't we using them?&lt;/p&gt;

&lt;p&gt;So I asked.&lt;/p&gt;

&lt;p&gt;The answer I got from the engineers: &lt;em&gt;"Because it doesn't work."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Okay. When was the last time you tried?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"About three years ago. Now we just do it manually."&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  I Just... Tried It
&lt;/h2&gt;

&lt;p&gt;No lengthy investigation. No ticket. I grabbed a test device, initiated an &lt;strong&gt;Autopilot Reset&lt;/strong&gt;, and waited.&lt;/p&gt;

&lt;p&gt;It worked.&lt;/p&gt;

&lt;p&gt;Autopilot Reset wiped the device, preserved the Windows version and existing updates, kept the Intune enrollment record intact, and left the laptop clean and ready for the next user — all without touching Intune, uploading a CSV, or reinstalling Windows from scratch.&lt;/p&gt;

&lt;p&gt;Then I tried &lt;strong&gt;Fresh Start&lt;/strong&gt; as well, for cases where a deeper clean was warranted. That worked too.&lt;/p&gt;

&lt;p&gt;The reason the engineers had written it off three years ago? Likely a policy misconfiguration or a known Autopilot bug from that era that had long since been resolved. Nobody had ever gone back to verify. The broken process had just become &lt;em&gt;the process&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The New Workflow
&lt;/h2&gt;

&lt;p&gt;We settled on &lt;strong&gt;Autopilot Reset&lt;/strong&gt; as the standard for reimaging, with Fresh Start available as a fallback for more stubborn devices.&lt;/p&gt;

&lt;p&gt;The new process:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Initiate Autopilot Reset on the device&lt;/li&gt;
&lt;li&gt;Wait for the wipe and reset to complete&lt;/li&gt;
&lt;li&gt;Pre-provision via Autopilot&lt;/li&gt;
&lt;li&gt;Reseal and shelf&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it.&lt;/p&gt;

&lt;p&gt;Because the device was already enrolled in Intune and already up to date before the reset, we skipped the USB install, skipped the hours of Windows Updates, skipped the hash capture and CSV upload, and eliminated most of the back-and-forth. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6 hours down to 2.&lt;/strong&gt; For a batch of 12 to 18 laptops, that's a significant chunk of time back in everyone's day.&lt;/p&gt;




&lt;h2&gt;
  
  
  Writing It Up
&lt;/h2&gt;

&lt;p&gt;After validating the new workflow, I wrote it up as a formal KB article and worked with the team to train other staff on the updated process. Autopilot Reset became the new SOP for device reimaging across the organization.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Lesson
&lt;/h2&gt;

&lt;p&gt;This wasn't a complex fix. It didn't require deep technical knowledge or a clever workaround. It just required someone to ask &lt;em&gt;why&lt;/em&gt; — and then actually try the thing that everyone had assumed was broken.&lt;/p&gt;

&lt;p&gt;Assumptions have an expiration date. Autopilot and Intune have both changed significantly over the past three years. Something that was broken or unreliable in 2021 might work perfectly fine today.&lt;/p&gt;

&lt;p&gt;If your team has a process that exists because &lt;em&gt;"we tried the right way once and it didn't work"&lt;/em&gt; — it might be worth trying again.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you inherited a broken process that turned out to have a simple fix? I'd love to hear about it in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>windows</category>
      <category>intune</category>
      <category>autopilot</category>
      <category>sysadmin</category>
    </item>
  </channel>
</rss>
