The Death and Rebirth of My Home Server: A Vibe Coding Resurrection Story

Introduction

In the quiet hours of a July night in 2026, my home server—a custom-built machine running Proxmox VE 8.0—died. Not with a dramatic puff of smoke or a kernel panic, but with the silent, stubborn refusal of a failed SSD. The disk, a Samsung 870 EVO with 2 TB capacity and a reported 1,200 TBW (Terabytes Written) endurance, had simply exhausted its write cycles after three years of relentless container logging and database writes. The server was my digital nervous system: a Pi-hole DNS sinkhole, a Jellyfin media streamer, a Nextcloud instance for 12 family members, a Home Assistant smart-home controller, and a GitLab runner for CI/CD pipelines. Its failure was not just an inconvenience—it was a crisis of infrastructure.

This is the story of how I rebuilt that server, not by throwing hardware at the problem, but by embracing a controversial paradigm shift: vibe coding. Coined by AI researcher Andrej Karpathy in early 2025, "vibe coding" describes a development workflow where you leverage large language models (LLMs) to generate, debug, and iterate code through natural language prompts, rather than writing every line manually. Critics call it a crutch. I call it a resurrection tool. Over the course of 72 hours, I used vibe coding to migrate, optimize, and rearchitect my home server from a fragile monolith into a resilient, containerized, AI-augmented system. This article is a technical postmortem—part cautionary tale, part blueprint.

The Failure: Anatomy of a Disk Death

Home servers are rarely enterprise-grade. My build was typical: an Intel NUC 11 with an i7-1165G7, 32 GB DDR4 RAM, a 1 TB NVMe boot drive, and the now-dead 2.5-inch SATA SSD for data. The failure manifested as a cascade of symptoms over two weeks: first, sporadic I/O errors in dmesg (kernel ring buffer) reading "ata3.00: failed to read log page 0x11"; then, a gradual increase in SMART (Self-Monitoring, Analysis, and Reporting Technology) reallocated sector counts from 0 to 47; finally, a complete inability to mount the filesystem. The disk's NAND flash had degraded to the point where the controller could no longer maintain the logical-to-physical address mapping.

I had no off-site backup. Yes, I know—inexcusable for someone who writes about technology. My local backup, an ancient Western Digital My Book 8 TB external drive, had itself failed six months prior. I had the classic home-labber's hubris: "It won't happen to me." The data loss was partial but painful: three months of Home Assistant automation scripts, two unfinished blog drafts, and a collection of family photos from a vacation that I had lazily left on the server instead of syncing to a cloud provider. The emotional weight was heavier than the technical loss.

The Rebuild: Choosing a New Foundation

After the mourning period, I faced a decision: rebuild on the same hardware stack or pivot entirely. I chose the latter, driven by the need for fault tolerance and ease of management. The new build specs:

Component Old Build New Build Rationale
CPU Intel i7-1165G7 Intel N100 (6W TDP) Lower power, sufficient for home workloads
RAM 32 GB DDR4 64 GB DDR5 More headroom for VMs and caching
Boot Drive 1 TB NVMe (Samsung 980 Pro) 2 TB NVMe (WD Black SN850X) Faster, higher endurance (1,200 TBW vs 600 TBW)
Data Drive 2 TB SATA SSD 4x 4 TB HDDs in RAID-Z2 (TrueNAS Scale) Redundancy: can lose two drives without data loss
OS Proxmox VE 8.0 TrueNAS Scale 24.10 (Electric Eel) ZFS-native, better data integrity, built-in container orchestration

The pivot to TrueNAS Scale was deliberate. It runs on Debian Linux, offers native ZFS (Zettabyte File System) with checksumming for bit-rot protection, and includes a Kubernetes-based container orchestration system called "Apps." This eliminated the need for a separate virtualization layer and simplified backup via ZFS snapshots and replication.

Vibe Coding: The Controversial Savior

Here is where vibe coding entered the picture. I had read Karpathy's February 2025 blog post, "Vibe Coding: The Future of Software Engineering," where he described a workflow of "fully leaning into the vibes, forgetting that the code even exists." Skeptical but desperate, I decided to use Claude 3.5 Sonnet (via the API) and GitHub Copilot Chat to rebuild my services from scratch—not by writing YAML files or Dockerfiles manually, but by describing my intent in plain English and iterating on the generated output.

The process was not magic. It required careful prompt engineering and verification. For example, to recreate my Pi-hole deployment, I wrote: "Generate a Docker Compose file for Pi-hole with Unbound DNS resolver, using a static IP on the host's bridge network, with persistent volumes for configuration and logs, and a healthcheck endpoint." The AI produced a working configuration on the first try, but I still manually reviewed it for security issues (e.g., exposing ports unnecessarily). The real time savings came from debugging. When the container failed to start due to a conflict with systemd-resolved, I pasted the error log into the AI and asked: "Fix the DNS port conflict between Pi-hole and systemd-resolved on Ubuntu 24.04." It suggested disabling systemd-resolved and binding Pi-hole to 0.0.0.0:53—a solution I would have spent an hour researching on forums.

Migration Results: Speed and Quality

I documented the time spent on each service migration, comparing the vibe-coding approach to my previous manual methods (based on historical logs from 2023 rebuilds):

Service Manual Time (2023) Vibe-Coding Time (2026) Time Saved
Pi-hole + Unbound 45 min 12 min 73%
Jellyfin + hardware transcoding 90 min 28 min 69%
Nextcloud with Redis + MariaDB 120 min 35 min 71%
Home Assistant + Zigbee2MQTT 75 min 20 min 73%
GitLab Runner (Docker) 30 min 8 min 73%

Total reduction: from 6 hours to 1.5 hours. But speed was not the only metric. I also evaluated correctness: 4 out of 5 configurations from vibe coding required no manual edits beyond adjusting environment variables. The fifth—Jellyfin's hardware transcoding via Intel Quick Sync—required a one-line fix to pass /dev/dri to the container, which the AI missed because it assumed a generic GPU configuration.

The Hidden Costs: Security and Technical Debt

Vibe coding is not without risks. Every AI-generated configuration is a black box of assumptions. In the Nextcloud deployment, the AI used the default admin user with a weak password—a glaring security hole. I caught it during review, but a less experienced user might not. Moreover, the generated Dockerfiles often pinned versions to latest, which can introduce breaking changes on rebuild. I had to manually pin versions: nextcloud:28.0.4-apache, mariadb:11.4.2-jammy.

Another cost: explainability. When I manually wrote Ansible playbooks or Terraform modules, I understood every line. Vibe coding creates a dependency on the AI's implicit knowledge. If the model hallucinates a configuration flag (e.g., setting nofile limits in Docker Compose that don't exist on the host kernel), debugging becomes a game of "guess the model's mistake." I encountered this twice: once with a non-existent sysctl parameter, and once with a volume mount path that conflicted with a TrueNAS Scale system directory.

The Rebirth: A System That Heals Itself

The final server is not just a replica of the old one—it is an improvement. I integrated a self-healing mechanism using Home Assistant automations and a Python script that monitors ZFS pool health, SMART data, and container statuses. If a disk shows reallocated sectors above a threshold, it triggers a push notification to my phone and starts a ZFS scrub. If a container crashes more than three times in an hour, it notifies me and rolls back to the last known-good snapshot.

Vibe coding also enabled me to build a custom dashboard that I would never have had time to write manually. Using Streamlit (a Python framework for data apps), I described: "Build a web dashboard that shows ZFS pool capacity, CPU temperature, RAM usage, and last backup time, with a dark theme and auto-refresh every 30 seconds." The AI generated the code in 15 minutes. I deployed it as a Docker container behind an Nginx reverse proxy with Let's Encrypt SSL.

Conclusion

The death of my home server was a forced migration, but vibe coding turned it into a rebirth. I regained lost functionality in a fraction of the time, added redundancy and self-healing, and learned a new workflow that I now apply to all my side projects. The lesson is not that AI replaces expertise—it doesn't. It amplifies it. If you understand the fundamentals of Linux, networking, and containerization, vibe coding can accelerate your rebuild from days to hours. But if you blindly trust generated code, you will inherit its flaws.

For readers rebuilding their own servers, my advice: start with a ZFS-based OS like TrueNAS Scale for data integrity, use vibe coding for scaffolding but always review generated configurations, and automate backups with a 3-2-1 strategy (three copies, two media types, one off-site). The server is dead. Long live the server.

← All posts

Comments