update tag styling to be consistent
All checks were successful
Build and Deploy / build (push) Successful in 30s
All checks were successful
Build and Deploy / build (push) Successful in 30s
This commit is contained in:
parent
09b838819b
commit
6497f5dfb8
@ -50,13 +50,13 @@ const sourceUrl = generateSourceUrl(frontmatter.filename, "blog");
|
|||||||
<Prose>
|
<Prose>
|
||||||
<slot />
|
<slot />
|
||||||
</Prose>
|
</Prose>
|
||||||
<div class="flex flex-wrap gap-2 mt-4">
|
<div class="flex flex-wrap gap-2 w-full mt-8 mb-4">
|
||||||
{frontmatter.tags?.map((tag) => (
|
{frontmatter.tags?.map((tag) => (
|
||||||
<span class="-zag-text -zag-bg zag-transition px-2 py-1 text-sm font-semibold">
|
<span class="-zag-text -zag-bg zag-transition px-2 py-1 text-sm font-semibold rounded-md whitespace-nowrap overflow-hidden text-ellipsis max-w-[150px]" title={tag}>
|
||||||
{tag}
|
{tag}
|
||||||
</span>
|
</span>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
<p class="pt-8">~{GLOBAL.username}</p>
|
<p class="pt-4">~{GLOBAL.username}</p>
|
||||||
</Section>
|
</Section>
|
||||||
</Layout>
|
</Layout>
|
||||||
|
@ -37,11 +37,11 @@ const sourceUrl = generateSourceUrl(frontmatter.filename, "projects");
|
|||||||
<h1 class="text-3xl sm:text-4xl leading-tight font-display">
|
<h1 class="text-3xl sm:text-4xl leading-tight font-display">
|
||||||
{frontmatter.title}
|
{frontmatter.title}
|
||||||
</h1>
|
</h1>
|
||||||
<div class="flex text-sm gap-2">
|
<div class="flex flex-wrap gap-2 w-full">
|
||||||
{
|
{
|
||||||
frontmatter.tags
|
frontmatter.tags
|
||||||
? frontmatter.tags.map((tag) => (
|
? frontmatter.tags.map((tag) => (
|
||||||
<span class="-zag-text -zag-bg zag-transition font-semibold py-1 px-2">
|
<span class="-zag-text -zag-bg zag-transition px-2 py-1 text-sm font-semibold rounded-md whitespace-nowrap overflow-hidden text-ellipsis max-w-[150px]" title={tag}>
|
||||||
{tag}
|
{tag}
|
||||||
</span>
|
</span>
|
||||||
))
|
))
|
||||||
|
@ -28,6 +28,7 @@ export const processContentInDir = async <T extends object, K>(
|
|||||||
.filter((file: string) => file.endsWith(".md"))
|
.filter((file: string) => file.endsWith(".md"))
|
||||||
.map((file) => file.split(".")[0]);
|
.map((file) => file.split(".")[0]);
|
||||||
const readMdFileContent = async (file: string) => {
|
const readMdFileContent = async (file: string) => {
|
||||||
|
try {
|
||||||
if (contentType === "projects") {
|
if (contentType === "projects") {
|
||||||
const content = import.meta
|
const content = import.meta
|
||||||
.glob(`/src/pages/projects/*.md`)
|
.glob(`/src/pages/projects/*.md`)
|
||||||
@ -37,6 +38,13 @@ export const processContentInDir = async <T extends object, K>(
|
|||||||
file: string;
|
file: string;
|
||||||
url: string;
|
url: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Validate frontmatter before processing
|
||||||
|
if (!data || !data.frontmatter) {
|
||||||
|
console.warn(`Warning: Missing or invalid frontmatter in ${file}.md`);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
return processFn(data);
|
return processFn(data);
|
||||||
} else {
|
} else {
|
||||||
const content = import.meta
|
const content = import.meta
|
||||||
@ -47,10 +55,23 @@ export const processContentInDir = async <T extends object, K>(
|
|||||||
file: string;
|
file: string;
|
||||||
url: string;
|
url: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Validate frontmatter before processing
|
||||||
|
if (!data || !data.frontmatter) {
|
||||||
|
console.warn(`Warning: Missing or invalid frontmatter in ${file}.md`);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
return processFn(data);
|
return processFn(data);
|
||||||
}
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`Error processing ${file}.md:`, error);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
return await Promise.all(markdownFiles.map(readMdFileContent));
|
const results = await Promise.all(markdownFiles.map(readMdFileContent));
|
||||||
|
// Filter out null results from files with errors
|
||||||
|
return results.filter(result => result !== null) as K[];
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2,9 +2,58 @@
|
|||||||
layout: ../../layouts/BlogLayout.astro
|
layout: ../../layouts/BlogLayout.astro
|
||||||
title: No, We Have Netflix at Home
|
title: No, We Have Netflix at Home
|
||||||
description: How my exasperation at paying for an ever growing number of streaming services led to a deep obsession
|
description: How my exasperation at paying for an ever growing number of streaming services led to a deep obsession
|
||||||
tags: ["code", "htmlf"]
|
tags: ["code", "html", "homelab"]
|
||||||
time: 4
|
time: 4
|
||||||
featured: true
|
featured: true
|
||||||
timestamp: 2024-12-18T02:39:03+00:00
|
timestamp: 2024-12-18T02:39:03+00:00
|
||||||
filename: html-intro
|
filename: html-intro
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## The Beginning of an Obsession
|
||||||
|
|
||||||
|
It all started with a simple thought: "Why am I paying for so many streaming services?" Netflix, Hulu, Disney+, HBO Max, Apple TV+, and the list goes on. Each one offering just enough exclusive content to justify its monthly fee, but collectively draining my wallet.
|
||||||
|
|
||||||
|
That's when I decided to take matters into my own hands and build my own media server. Little did I know this would be the gateway to a much deeper homelab obsession.
|
||||||
|
|
||||||
|
## The First Steps
|
||||||
|
|
||||||
|
I started with a simple Plex server running on an old laptop. It wasn't much, but it was mine. I could store my legally obtained media and stream it to any device in my home. The convenience was immediately apparent, and the satisfaction of building something myself was addictive.
|
||||||
|
|
||||||
|
But as with any tech hobby, it didn't stop there. Soon I was researching NAS solutions, RAID configurations, and the best hard drives for 24/7 operation. My simple media server was evolving into something much more complex.
|
||||||
|
|
||||||
|
## Expanding Horizons
|
||||||
|
|
||||||
|
As my collection grew, so did my ambitions. I found myself exploring other self-hosted applications:
|
||||||
|
|
||||||
|
- **Sonarr and Radarr** for managing TV shows and movies
|
||||||
|
- **Jackett** for indexing
|
||||||
|
- **Ombi** for allowing family members to request content
|
||||||
|
- **Tautulli** for monitoring Plex usage
|
||||||
|
|
||||||
|
Each new addition made my system more powerful and more tailored to my specific needs. I was no longer just replicating Netflix; I was building something better.
|
||||||
|
|
||||||
|
## The Current Setup
|
||||||
|
|
||||||
|
Today, my homelab has expanded well beyond just media. It now includes:
|
||||||
|
|
||||||
|
- A proper NAS with redundant storage
|
||||||
|
- Docker containers for various services
|
||||||
|
- Home automation integration
|
||||||
|
- VPN for remote access
|
||||||
|
- Automated backups
|
||||||
|
|
||||||
|
The journey from "I don't want to pay for Netflix" to "I need more hard drives for my server rack" happened almost without me noticing. But I wouldn't have it any other way.
|
||||||
|
|
||||||
|
## Lessons Learned
|
||||||
|
|
||||||
|
If you're considering starting your own homelab journey, here's what I've learned:
|
||||||
|
|
||||||
|
1. **Start small** - You don't need enterprise hardware to begin
|
||||||
|
2. **Document everything** - You'll thank yourself later
|
||||||
|
3. **Backup, backup, backup** - Data loss is painful
|
||||||
|
4. **Join the community** - r/homelab and other forums are invaluable resources
|
||||||
|
5. **Enjoy the process** - The learning is half the fun
|
||||||
|
|
||||||
|
So while my family jokes about having "Netflix at home," I smile knowing that what we have is so much more than just another streaming service. It's a hobby, a learning experience, and a constantly evolving project that brings me joy.
|
||||||
|
|
||||||
|
And yes, it's probably cost me more than just paying for those streaming services would have. But where's the fun in that?
|
||||||
|
Loading…
x
Reference in New Issue
Block a user