{"id":600,"date":"2026-06-04T14:33:51","date_gmt":"2026-06-04T12:33:51","guid":{"rendered":"https:\/\/techbygiusi.com\/?p=600"},"modified":"2026-06-04T15:25:06","modified_gmt":"2026-06-04T13:25:06","slug":"why-i-built-labby","status":"publish","type":"post","link":"https:\/\/techbygiusi.com\/index.php\/project\/why-i-built-labby\/","title":{"rendered":"Why I Built Labby"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I have worked on many small tools, scripts and experiments over time, but <strong>Labby<\/strong> is the biggest project I have built so far.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Labby is a self-hosted homelab inventory, rack and topology tool. It helps you document your hardware, virtual machines, LXCs, apps, networks, IP addresses, rack layouts and relationships in one place.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"#lb-1-9e80a6aa\" class=\"lb-thumb\" aria-label=\"Bild vergr\u00f6\u00dfern\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/Labby-1-1024x576.png\" alt=\"\" class=\"wp-image-601\" srcset=\"https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/Labby-1-1024x576.png 1024w, https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/Labby-1-300x169.png 300w, https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/Labby-1-768x432.png 768w, https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/Labby-1-1536x864.png 1536w, https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/Labby-1-2048x1152.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\"><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">You can try the demo here:<\/p>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-bc43f0fd wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link has-text-align-center wp-element-button\" href=\"https:\/\/www.my-labby.com\" target=\"_blank\" rel=\"noreferrer noopener\">my-labby.com<\/a><\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">The demo saves everything in your browser only. The self-hosted version uses persistent backend storage, so all devices and browsers can access the same data.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why I Built Labby<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Like many homelab users, I reached a point where my setup had grown beyond \u201cI remember where everything is.\u201d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">At first, a few notes were enough. Then came more servers, VMs, containers, services, VLANs, IP addresses, ports, reverse proxies and backup systems.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">At some point, you start asking yourself:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u201cWhere is this app running?\u201d<br>\u201cWhich VM hosts this service?\u201d<br>\u201cWhat IP did I give this device?\u201d<br>\u201cWhich server is in which rack?\u201d<br>\u201cIs this service still online?\u201d<br>\u201cWhere did I write down that URL?\u201d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I wanted one simple tool that answers these questions without becoming complicated.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That is how Labby started.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What Labby Does<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Labby lets you map your homelab in a structured way.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can add:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Hardware<\/li>\n\n\n\n<li>Virtual Machines<\/li>\n\n\n\n<li>LXCs<\/li>\n\n\n\n<li>Apps<\/li>\n\n\n\n<li>Networks<\/li>\n\n\n\n<li>Locations<\/li>\n\n\n\n<li>Racks<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Each resource can have metadata like manufacturer, operating system, CPU, RAM, disks, notes, IP addresses, ports and URLs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But Labby is not only an inventory list. The important part is the relationship between everything.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">An app can run on a VM.<br>A VM can run on a Proxmox host.<br>A Proxmox host can be connected to a switch.<br>The switch can be connected to a router.<br>The router belongs to a network.<br>And the device can also be placed inside a rack.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Labby tries to make this visible.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tree View and Graph View<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">One of the most useful features is the relationship view.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The <strong>Tree View<\/strong> shows your infrastructure in a classic structured way. This is useful when you want to see which VMs or LXCs belong to which hardware host, and which apps belong to which VM or container.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The <strong>Graph View<\/strong> gives a more visual overview. Resources are shown as connected bubbles, and Labby tries to center and zoom the graph so the most important part of the topology is visible immediately.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Names are shown directly under the bubbles, and clicking a node opens the resource for editing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This was one of the more difficult parts to get right because a real homelab graph is rarely clean. Some nodes have many children, some relationships are wide, and some connections create long branches. Making the graph useful by default took a lot of iteration.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"#lb-2-6b722ac6\" class=\"lb-thumb\" aria-label=\"Bild vergr\u00f6\u00dfern\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-04-121546-1024x576.png\" alt=\"\" class=\"wp-image-602\" srcset=\"https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-04-121546-1024x576.png 1024w, https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-04-121546-300x169.png 300w, https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-04-121546-768x432.png 768w, https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-04-121546-1536x864.png 1536w, https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-04-121546-2048x1152.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\"><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">IP View<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Another feature I wanted from the beginning was a proper <strong>IP View<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of searching through cards manually, Labby can show all used IP addresses grouped by subnet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This makes it easy to see:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>which IPs are already used<\/li>\n\n\n\n<li>which device owns an address<\/li>\n\n\n\n<li>which app uses which port<\/li>\n\n\n\n<li>which subnet something belongs to<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">You can also search by hostname, IP address or port.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is especially useful when dealing with apps like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>192.168.20.21:9000\n192.168.20.22:8096\n192.168.10.40:3000<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Rack View<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The newest big feature is <strong>Rack View<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This was important to me because many homelab diagrams stop at the logical level. They show services and hosts, but not where things physically live.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With Rack View, you can create locations and racks, then place equipment into front and rear rack layouts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Labby supports rack components like:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>servers<\/li>\n\n\n\n<li>switches<\/li>\n\n\n\n<li>routers<\/li>\n\n\n\n<li>patch panels<\/li>\n\n\n\n<li>cable management<\/li>\n\n\n\n<li>UPS<\/li>\n\n\n\n<li>PDU<\/li>\n\n\n\n<li>KVM<\/li>\n\n\n\n<li>blank panels<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">You can also link rack components to existing Labby resources. So the server in your rack is not just a drawing. It can be connected to the actual hardware entry in your inventory.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Themes and Customization<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Labby also includes a theme system.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There are multiple built-in themes, and you can create your own custom themes inside the UI. Custom themes are saved and included when exporting your config.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The active theme is also exported and restored on import.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This sounds like a small feature, but for a tool you might keep open often, appearance matters. A homelab dashboard should feel like your own.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"#lb-3-f57a23d2\" class=\"lb-thumb\" aria-label=\"Bild vergr\u00f6\u00dfern\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-04-121533-1024x576.png\" alt=\"\" class=\"wp-image-603\" srcset=\"https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-04-121533-1024x576.png 1024w, https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-04-121533-300x169.png 300w, https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-04-121533-768x432.png 768w, https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-04-121533-1536x864.png 1536w, https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-04-121533-2048x1152.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\"><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Import, Export and Persistent Storage<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The self-hosted version stores data server-side in a Docker volume.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That means your data is not tied to one browser. You can open Labby from another device and still see the same homelab map.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Labby also supports JSON export and import. The export includes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>resources<\/li>\n\n\n\n<li>locations<\/li>\n\n\n\n<li>racks<\/li>\n\n\n\n<li>custom themes<\/li>\n\n\n\n<li>active theme<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">This makes backup and migration simple.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Older localStorage exports from earlier versions can also still be imported.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"#lb-4-e13d7b0c\" class=\"lb-thumb\" aria-label=\"Bild vergr\u00f6\u00dfern\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-04-121528-1024x576.png\" alt=\"\" class=\"wp-image-604\" srcset=\"https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-04-121528-1024x576.png 1024w, https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-04-121528-300x169.png 300w, https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-04-121528-768x432.png 768w, https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-04-121528-1536x864.png 1536w, https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-04-121528-2048x1152.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\"><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Demo Version<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">I also created a demo version at:<\/p>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-bc43f0fd wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link has-text-align-center wp-element-button\" href=\"https:\/\/www.my-labby.com\" target=\"_blank\" rel=\"noreferrer noopener\">my-labby.com<\/a><\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">The demo is intentionally different from the self-hosted version. It stores data only in the browser and automatically loads demo entries.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This lets people try Labby without installing anything.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The demo includes example networks, hardware, apps and racks, so visitors can immediately see what Labby is meant to do.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Built With AI Assistance<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">One thing I want to be transparent about: Labby is a vibe-coded project built mainly with help from Codex by OpenAI and Claude by Anthropic.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I used AI heavily during development, but the project direction, testing, feature decisions and iteration came from my own needs and ideas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This workflow helped me move much faster than I could have alone. At the same time, it also meant I had to test a lot, fix many small issues and continuously refine the UI until it worked the way I wanted.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Installation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Labby can be self-hosted with Docker.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker compose up --build -d<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then open:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:\/\/localhost:8080<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">To stop it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker compose down<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Data is stored in a Docker volume and survives container restarts.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How Labby Works<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Labby has a clean architecture: <strong>Frontend-first with optional backend.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When you add a resource, the frontend displays it instantly. Changes sync to the backend, which stores your data permanently as JSON. This means you can access the same homelab map from any device.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"#lb-5-98498c06\" class=\"lb-thumb\" aria-label=\"Bild vergr\u00f6\u00dfern\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"594\" src=\"https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/image-1024x594.png\" alt=\"\" class=\"wp-image-605\" srcset=\"https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/image-1024x594.png 1024w, https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/image-300x174.png 300w, https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/image-768x446.png 768w, https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/image-1536x891.png 1536w, https:\/\/techbygiusi.com\/wp-content\/uploads\/2026\/06\/image-2048x1188.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\"><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Live Monitoring<\/strong> is one of the unique features. You can set a resource\u2019s status to \u201cLive\u201d and Labby automatically pings IPs and checks URLs every 5 seconds. Status updates appear on your cards in real-time-\ud83d\udfe2 online, \ud83d\udd34 offline.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Everything connects.<\/strong> An app runs on a VM. The VM runs on a Proxmox host. The host connects to a switch. The switch belongs to a network. This relationship data powers Tree View, Graph View, and IP tracking. One array stores all connections, and the UI visualizes them automatically.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The self-hosted version stores data in Docker, so your homelab map persists and syncs across devices. The demo version uses browser storage only\u2014no installation needed to try it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Final Thoughts<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Labby started as a simple idea: I wanted a better way to map my homelab.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It has now grown into my biggest project so far, with inventory management, topology views, IP tracking, rack layouts, themes, mobile support and persistent storage.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There is still more I want to improve, but I am proud of how far it has come.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you run a homelab and want a clean way to document it, give Labby a try:<\/p>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-bc43f0fd wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link has-text-align-center wp-element-button\" href=\"https:\/\/www.my-labby.com\" target=\"_blank\" rel=\"noreferrer noopener\">my-labby.com<\/a><\/div>\n\n\n\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link has-text-align-center wp-element-button\" href=\"https:\/\/github.com\/techbygiusi\/Labby\" target=\"_blank\" rel=\"noreferrer noopener\">github<\/a><\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">And if you want permanent storage, self-host it.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I have worked on many small tools, scripts and experiments over time, but Labby is the biggest project I have built so far. Labby is a self-hosted homelab inventory, rack and topology tool. It helps you document your hardware, virtual machines, LXCs, apps, networks, IP addresses, rack layouts and relationships in one place. You can [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[35,18,12],"class_list":["post-600","post","type-post","status-publish","format-standard","hentry","category-project","tag-documentation","tag-homelab","tag-linux"],"_links":{"self":[{"href":"https:\/\/techbygiusi.com\/index.php\/wp-json\/wp\/v2\/posts\/600","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/techbygiusi.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/techbygiusi.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/techbygiusi.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/techbygiusi.com\/index.php\/wp-json\/wp\/v2\/comments?post=600"}],"version-history":[{"count":4,"href":"https:\/\/techbygiusi.com\/index.php\/wp-json\/wp\/v2\/posts\/600\/revisions"}],"predecessor-version":[{"id":612,"href":"https:\/\/techbygiusi.com\/index.php\/wp-json\/wp\/v2\/posts\/600\/revisions\/612"}],"wp:attachment":[{"href":"https:\/\/techbygiusi.com\/index.php\/wp-json\/wp\/v2\/media?parent=600"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/techbygiusi.com\/index.php\/wp-json\/wp\/v2\/categories?post=600"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/techbygiusi.com\/index.php\/wp-json\/wp\/v2\/tags?post=600"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}