diff --git a/README.md b/README.md
index 14d9537..687398c 100644
--- a/README.md
+++ b/README.md
@@ -2,4 +2,4 @@
My personal website and blog.
-Vist the site at https://justin.deal
\ No newline at end of file
+Visit the site at https://justin.deal
\ No newline at end of file
diff --git a/src/components/common/ServiceCard.astro b/src/components/common/ServiceCard.astro
new file mode 100644
index 0000000..f7d05e2
--- /dev/null
+++ b/src/components/common/ServiceCard.astro
@@ -0,0 +1,19 @@
+---
+const { name, href, img, alt } = Astro.props;
+---
+
+
+
+ {name}
+
diff --git a/src/lib/variables.ts b/src/lib/variables.ts
index 7be82e9..3c13d4e 100644
--- a/src/lib/variables.ts
+++ b/src/lib/variables.ts
@@ -39,6 +39,7 @@ export const GLOBAL = {
home: "/",
blog: "/blog",
projects: "/projects",
+ homelab: "/homelab",
// about: "/about",
// code: "https://code.justin.deal",
// videos: "https://www.youtube.com/@justin_deal",
diff --git a/src/pages/blog/html-intro.md b/src/pages/blog/html-intro.md
index f95260c..a198c1d 100644
--- a/src/pages/blog/html-intro.md
+++ b/src/pages/blog/html-intro.md
@@ -7,12 +7,4 @@ time: 4
featured: true
timestamp: 2024-12-18T02:39:03+00:00
filename: html-intro
----
-
-
- {tags.map((tag) => (
-
- {tag}
-
- ))}
-
\ No newline at end of file
+---
\ No newline at end of file
diff --git a/src/pages/homelab/index.astro b/src/pages/homelab/index.astro
new file mode 100644
index 0000000..de51974
--- /dev/null
+++ b/src/pages/homelab/index.astro
@@ -0,0 +1,52 @@
+---
+import { GLOBAL } from "../../lib/variables";
+import Layout from "../../layouts/Layout.astro";
+import Section from "../../components/common/Section.astro";
+import ServiceCard from "../../components/common/ServiceCard.astro";
+import { services } from "./services.ts";
+---
+
+
+
+ {GLOBAL.username} • {GLOBAL.shortDescription}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Homelab
+
+
+ {Object.entries(services).map(([category, apps]) => (
+
+
{category}
+
+ {apps.length > 0 ? (
+ apps.map(app => (
+
+ ))
+ ) : (
+
Coming soon...
+ )}
+
+
+ ))}
+
+
diff --git a/src/pages/homelab/services.ts b/src/pages/homelab/services.ts
new file mode 100644
index 0000000..395d0ec
--- /dev/null
+++ b/src/pages/homelab/services.ts
@@ -0,0 +1,126 @@
+export const services = {
+ Websites: [
+ {
+ name: "https://justin.deal",
+ link: "https://justin.deal",
+ icon: "/public/pixel_avatar.png",
+ alt: "Personal Website"
+ }
+ ],
+ Utilities: [
+ {
+ name: "Silverbullet",
+ link: "https://notes.justin.deal",
+ icon: "https://cdn.jsdelivr.net/gh/selfhst/icons/png/silverbullet.png",
+ alt: "Silverbullet"
+ },
+ {
+ name: "Vikunja",
+ link: "https://todo.justin.deal",
+ icon: "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/vikunja.svg",
+ alt: "Vikunja"
+ },
+ {
+ name: "Actual",
+ link: "https://budget.justin.deal",
+ icon: "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/actual-budget.svg",
+ alt: "Actual"
+ },
+ {
+ name: "Searxng",
+ link: "https://search.justin.deal",
+ icon: "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/searxng.svg",
+ alt: "Searxng"
+ },
+ {
+ name: "TeslaMate",
+ link: "https://tesla.justin.deal",
+ icon: "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/teslamate.svg",
+ alt: "TeslaMate"
+ },
+ {
+ name: "BaiKal",
+ link: "https://dav.justin.deal",
+ icon: "https://cdn.jsdelivr.net/gh/selfhst/icons/png/baikal.png",
+ alt: "BaiKal"
+ },
+ {
+ name: "Cryptpad",
+ link: "https://docs.justin.deal",
+ icon: "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/cryptpad.svg",
+ alt: "Cryptpad"
+ }
+ ],
+ Development: [
+ {
+ name: "Gitea",
+ link: "https://code.justin.deal",
+ icon: "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/gitea.svg",
+ alt: "Gitea"
+ },
+ {
+ name: "OpenGist",
+ link: "https://snippets.justin.deal",
+ icon: "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/opengist.svg",
+ alt: "OpenGist"
+ },
+ {
+ name: "IT-Tools",
+ link: "https://tools.justin.deal",
+ icon: "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/it-tools.svg",
+ alt: "IT-Tools"
+ }
+ ],
+ Media: [
+ {
+ name: "Jellyfin",
+ link: "https://watch.justin.deal",
+ icon: "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/jellyfin.svg",
+ alt: "Jellyfin"
+ },
+ {
+ name: "Calibre-Web",
+ link: "https://books.justin.deal",
+ icon: "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/calibre-web.svg",
+ alt: "Calibre-Web"
+ }
+ ],
+ Infrastructure: [
+ {
+ name: "Pi-hole",
+ link: "https://pihole.justin.deal",
+ icon: "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/pi-hole.svg",
+ alt: "Pi-hole"
+ },
+ {
+ name: "Ntfy",
+ link: "https://ntfy.justin.deal",
+ icon: "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/ntfy.svg",
+ alt: "Ntfy"
+ },
+ {
+ name: "Vaultwarden",
+ link: "https://passwords.justin.deal",
+ icon: "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/vaultwarden.svg",
+ alt: "Vaultwarden"
+ },
+ {
+ name: "Uptime Kuma",
+ link: "https://status.justin.deal",
+ icon: "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/uptime-kuma.svg",
+ alt: "Uptime Kuma"
+ },
+ {
+ name: "Authentik",
+ link: "https://auth.justin.deal",
+ icon: "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/authentik.svg",
+ alt: "Authentik"
+ },
+ {
+ name: "Traefik",
+ link: "https://proxy.justin.deal:8080",
+ icon: "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/traefik.svg",
+ alt: "Traefik"
+ }
+ ]
+ };
\ No newline at end of file