Compare commits

..

21 Commits

Author SHA1 Message Date
6dd2209e21 chore(deps): update deps
All checks were successful
test-build / guarddog (push) Successful in 1m40s
renovate / renovate (push) Successful in 1m43s
test-build / build (push) Successful in 2m39s
2026-02-26 15:01:24 -06:00
93bf44f89a feat: move categories to directus 2026-02-26 15:00:52 -06:00
734e9cacae feat: remove emoji 2026-02-26 14:11:42 -06:00
c69eb58a49 feat: release 2.16.0
All checks were successful
test-build / guarddog (push) Successful in 53s
renovate / renovate (push) Successful in 1m42s
release-image-gitea / build (push) Successful in 3m1s
release-image-harbor / build (push) Successful in 2m55s
test-build / build (push) Successful in 4m38s
release-image-harbor / release (push) Successful in 5m39s
release-image-gitea / release (push) Successful in 9m19s
2026-02-25 20:02:41 -06:00
543b57647b chore(deps): update node 2026-02-25 20:02:13 -06:00
01cbfab2f7 Merge pull request 'chore(deps): update dependency node to v24.14.0' (#354) from renovate/node-24.x into main
Some checks failed
renovate / renovate (push) Has been cancelled
test-build / build (push) Has been cancelled
test-build / guarddog (push) Has been cancelled
Reviewed-on: #354
2026-02-26 02:01:34 +00:00
b4ecac7396 Merge pull request 'chore(deps): update dependency shiki to v3.23.0' (#359) from renovate/shiki-monorepo into main
Some checks failed
renovate / renovate (push) Has been cancelled
test-build / build (push) Has been cancelled
test-build / guarddog (push) Has been cancelled
Reviewed-on: #359
2026-02-26 02:01:10 +00:00
1a51ccb516 Merge pull request 'chore(deps): update dependency astro to v5.18.0' (#358) from renovate/astro-monorepo into main
Some checks failed
renovate / renovate (push) Has been cancelled
test-build / build (push) Has been cancelled
test-build / guarddog (push) Has been cancelled
Reviewed-on: #358
2026-02-26 02:00:44 +00:00
522cd20fe3 chore(deps): update preline
Some checks failed
renovate / renovate (push) Has been cancelled
test-build / guarddog (push) Has been cancelled
test-build / build (push) Has been cancelled
2026-02-25 19:57:11 -06:00
d8bad121f6 chore(deps): update dependency shiki to v3.23.0
Some checks are pending
renovate/stability-days Updates have not met minimum release age requirement
test-build / guarddog (pull_request) Successful in 2m0s
test-build / build (pull_request) Successful in 3m20s
2026-02-26 01:56:28 +00:00
d6176bd89d chore(deps): update dependency node to v24.14.0
All checks were successful
test-build / guarddog (pull_request) Successful in 1m33s
test-build / build (pull_request) Successful in 3m35s
2026-02-26 01:54:37 +00:00
594ff43110 chore(deps): update dependency astro to v5.18.0
Some checks are pending
renovate/stability-days Updates have not met minimum release age requirement
test-build / guarddog (pull_request) Successful in 1m8s
test-build / build (pull_request) Successful in 3m54s
2026-02-26 01:54:20 +00:00
7fd443535a Merge pull request 'chore(deps): update dependency eslint-plugin-format to v2' (#356) from renovate/eslint-plugin-format-2.x into main
Some checks failed
test-build / guarddog (push) Successful in 40s
test-build / build (push) Successful in 3m37s
renovate / renovate (push) Has been cancelled
Reviewed-on: #356
2026-02-26 01:52:55 +00:00
f8d926199f chore(deps): update dependency eslint-plugin-format to v2
All checks were successful
renovate/stability-days Updates have met minimum release age requirement
test-build / guarddog (pull_request) Successful in 1m17s
test-build / build (pull_request) Successful in 3m3s
2026-02-26 01:47:46 +00:00
8c57f970d6 Merge pull request 'chore(deps): update dependency eslint-plugin-format to v1.5.0' (#353) from renovate/eslint-plugin-format-1.x-lockfile into main
All checks were successful
test-build / guarddog (push) Successful in 47s
renovate / renovate (push) Successful in 3m12s
test-build / build (push) Successful in 3m23s
Reviewed-on: #353
2026-02-26 01:44:57 +00:00
779946cfec Merge pull request 'chore(deps): update tailwindcss monorepo to v4.2.1' (#351) from renovate/tailwindcss-monorepo into main
Some checks failed
renovate / renovate (push) Has been cancelled
test-build / guarddog (push) Has been cancelled
test-build / build (push) Has been cancelled
Reviewed-on: #351
2026-02-26 01:44:02 +00:00
1f926d4184 Merge pull request 'chore(deps): update dependency typescript-eslint to v8.56.1' (#350) from renovate/typescript-eslint-monorepo into main
Some checks failed
renovate / renovate (push) Has been cancelled
test-build / build (push) Has been cancelled
test-build / guarddog (push) Has been cancelled
Reviewed-on: #350
2026-02-26 01:43:43 +00:00
f99638ffe2 Merge pull request 'chore(deps): update dependency eslint-plugin-react-refresh to v0.5.2' (#349) from renovate/eslint-plugin-react-refresh-0.x-lockfile into main
Some checks failed
renovate / renovate (push) Has been cancelled
test-build / build (push) Has started running
test-build / guarddog (push) Has been cancelled
Reviewed-on: #349
2026-02-26 01:43:33 +00:00
eda954542b chore(deps): update dependency eslint-plugin-format to v1.5.0
Some checks failed
renovate/stability-days Updates have met minimum release age requirement
test-build / guarddog (pull_request) Successful in 1m32s
test-build / build (pull_request) Failing after 3m29s
2026-02-26 00:07:59 +00:00
af79a0d4c4 chore(deps): update dependency typescript-eslint to v8.56.1
All checks were successful
renovate/stability-days Updates have met minimum release age requirement
test-build / guarddog (pull_request) Successful in 1m35s
test-build / build (pull_request) Successful in 3m29s
2026-02-26 00:05:56 +00:00
46c69d30aa chore(deps): update dependency eslint-plugin-react-refresh to v0.5.2
All checks were successful
renovate/stability-days Updates have met minimum release age requirement
test-build / guarddog (pull_request) Successful in 1m30s
test-build / build (pull_request) Successful in 3m35s
2026-02-25 00:08:18 +00:00
23 changed files with 792 additions and 719 deletions

View File

@@ -22,7 +22,7 @@ jobs:
- name: Set up Node.js
uses: actions/setup-node@v6
with:
node-version: 24.13.1
node-version: 24.14.0
cache: pnpm
- name: Install Dependencies

View File

@@ -22,7 +22,7 @@ jobs:
- name: Set up Node.js
uses: actions/setup-node@v6
with:
node-version: 24.13.1
node-version: 24.14.0
cache: pnpm
- name: Install Dependencies

View File

@@ -24,7 +24,7 @@ jobs:
- name: Set up Node.js
uses: actions/setup-node@v6
with:
node-version: 24.13.1
node-version: 24.14.0
cache: pnpm
- name: Install Dependencies

View File

@@ -1,4 +1,4 @@
FROM docker.io/node:24.13.1-alpine AS builder
FROM docker.io/node:24.14.0-alpine AS builder
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
@@ -17,12 +17,12 @@ FROM build-deps AS build
COPY . .
RUN pnpm run build
FROM dhi.io/node:24.13.1 AS runtime
FROM dhi.io/node:24.14.0 AS runtime
WORKDIR /app
COPY --from=prod-deps /app/node_modules /app/node_modules
COPY --from=build /app/dist /app/dist
LABEL version="2.15.1"
LABEL version="2.16.0"
LABEL description="Astro based personal website"
ENV HOST=0.0.0.0

View File

@@ -1,7 +1,7 @@
{
"name": "site-profile",
"type": "module",
"version": "2.15.1",
"version": "2.16.0",
"homepage": "https://www.alexlebens.dev",
"bugs": {
"url": "https://gitea.alexlebens.dev/alexlebens/site-profile/issues",
@@ -28,7 +28,7 @@
},
"dependencies": {
"@astrojs/check": "^0.9.6",
"@astrojs/node": "^9.5.3",
"@astrojs/node": "^9.5.4",
"@astrojs/partytown": "^2.1.4",
"@astrojs/react": "^4.4.2",
"@astrojs/rss": "^4.0.15",
@@ -37,44 +37,44 @@
"@giscus/react": "^3.1.0",
"@iconify-json/mdi": "^1.2.3",
"@iconify-json/pajamas": "^1.2.15",
"@iconify-json/simple-icons": "^1.2.70",
"@iconify-json/simple-icons": "^1.2.71",
"@playform/compress": "^0.2.1",
"@swup/astro": "^1.8.0",
"@tailwindcss/postcss": "^4.1.18",
"@tailwindcss/vite": "^4.1.18",
"@tailwindcss/postcss": "^4.2.1",
"@tailwindcss/vite": "^4.2.1",
"@types/react": "^19.2.14",
"@types/unist": "^3.0.3",
"astro": "^5.17.2",
"astro": "^5.18.0",
"astro-icon": "^1.1.5",
"marked": "^17.0.2",
"marked": "^17.0.3",
"marked-shiki": "^1.2.1",
"mdast-util-to-string": "^4.0.0",
"preline": "^4.0.1",
"preline": "^4.1.1",
"react": "^19.2.4",
"react-dom": "^19.2.4",
"reading-time": "^1.5.0",
"sharp": "^0.34.5",
"sharp-ico": "^0.1.5",
"shiki": "^3.22.0",
"tailwindcss": "^4.1.18",
"shiki": "^3.23.0",
"tailwindcss": "^4.2.1",
"ultrahtml": "^1.6.0"
},
"devDependencies": {
"@eslint-react/eslint-plugin": "^2.13.0",
"@tailwindcss/forms": "^0.5.11",
"@tailwindcss/typography": "^0.5.19",
"eslint": "^10.0.0",
"eslint": "^10.0.2",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-astro": "^1.6.0",
"eslint-plugin-format": "^1.4.0",
"eslint-plugin-format": "^2.0.1",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^7.0.1",
"eslint-plugin-react-refresh": "^0.5.0",
"eslint-plugin-react-refresh": "^0.5.2",
"prettier": "^3.8.1",
"prettier-plugin-astro": "^0.14.1",
"prettier-plugin-tailwindcss": "^0.7.2",
"timeago.js": "^4.0.2",
"typescript": "^5.9.3",
"typescript-eslint": "^8.55.0"
"typescript-eslint": "^8.56.1"
}
}

1359
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,8 +1,7 @@
---
import { getCollection } from 'astro:content';
import { readItems } from '@directus/sdk';
import type { Post } from '@lib/directusTypes';
import type { Post, Category } from '@lib/directusTypes';
import CategoryCard from '@components/cards/CategoryCard.astro';
import directus from '@lib/directus';
@@ -43,7 +42,7 @@ const postMap: Map<string, Post[]> = posts
return acc;
}, new Map<string, Post[]>());
const categories = (await getCollection('categories'))
const categories = (await directus.request(readItems('categories')))
.sort((a, b) => {
const aCount = postMap.get(a.slug)?.length ?? 0;
const bCount = postMap.get(b.slug)?.length ?? 0;
@@ -81,8 +80,8 @@ const categories = (await getCollection('categories'))
>
<CategoryCard
slug={category.slug}
title={category.data.title}
description={category.data.description}
title={category.title}
description={category.description}
count={postMap.get(category.slug)?.length ?? 0}
publishDate={timeago(postMap.get(category.slug)?.[0]?.published_date)}
/>

View File

@@ -1,4 +0,0 @@
---
title: 'Books 📖'
description: 'Books I have read or listened to'
---

View File

@@ -1,4 +0,0 @@
---
title: 'Cloud ☁️'
description: "Its just someone else's server"
---

View File

@@ -1,4 +0,0 @@
---
title: 'Homelab 🏠'
description: 'What happens when rack servers find a home'
---

View File

@@ -1,4 +0,0 @@
---
title: 'Kubernetes ☸️'
description: 'The container orchestration system'
---

View File

@@ -1,4 +0,0 @@
---
title: 'Life 🏃🏻'
description: 'Just random musings on everyday stuff'
---

View File

@@ -1,4 +0,0 @@
---
title: 'Minnesota 🌳'
description: 'Land of 10,000 Lakes'
---

View File

@@ -1,4 +0,0 @@
---
title: 'PostgreSQL'
description: 'PostgreSQL is an open-source relational database management system (RDBMS)'
---

View File

@@ -1,4 +0,0 @@
---
title: 'Python 🐍'
description: 'Generally my go to language'
---

View File

@@ -1,4 +0,0 @@
---
title: 'Tool 🪜'
description: 'Usually just the software kind'
---

View File

@@ -1,4 +0,0 @@
---
title: 'What Is?'
description: 'A series on discovery'
---

View File

@@ -1,12 +0,0 @@
import { defineCollection, z } from 'astro:content';
const categoryCollection = defineCollection({
type: 'content',
schema: () =>
z.object({
title: z.string(),
description: z.string(),
}),
});
export const collections = { categories: categoryCollection };

View File

@@ -4,6 +4,7 @@ import type {
Global,
Weather,
Post,
Category,
Application,
Experience,
Education,
@@ -18,6 +19,7 @@ type Schema = {
site_global: Global;
site_weather: Weather;
posts: Post[];
categories: Category[];
site_applications: Application;
site_experience: Experience;
site_education: Education;

View File

@@ -49,6 +49,12 @@ export type Post = {
updated_date: Date;
};
export type Category = {
slug: string;
title: string;
description: string;
};
export type Application = {
id: string;
name: string;

View File

@@ -1,5 +1,5 @@
---
import { type CollectionEntry, getCollection } from 'astro:content';
import { Image } from 'astro:assets';
import getReadingTime from 'reading-time';
import { marked } from 'marked';
@@ -7,6 +7,8 @@ import markedShiki from 'marked-shiki';
import { createHighlighter } from 'shiki';
import { readItems, readSingleton } from '@directus/sdk';
import type { Category } from '@lib/directusTypes';
import SocialShareButton from '@components/buttons/SocialShareButton.astro';
import BaseLayout from '@layouts/BaseLayout.astro';
import directus from '@lib/directus';
@@ -24,11 +26,14 @@ export async function getStaticPaths() {
}
const global = await directus.request(readSingleton('site_global'));
const category: CollectionEntry<'categories'> = (await getCollection('categories'))
.filter((c) => c.slug === post.category)
.pop() as CollectionEntry<'categories'>;
const [category] = post.category ? await directus.request(
readItems('categories', {
filter: { slug: { _eq: post.category },},
limit: 1,
}))
: [];
const readingTime = getReadingTime(post.content);
const readingTime = getReadingTime(post.content || '');
const highlighter = await createHighlighter({
themes: ['github-light', 'github-dark'],
@@ -48,7 +53,7 @@ marked.use(markedShiki({
}
}));
const content = marked.parse(post.content);
const content = marked.parse(post.content || '');
---
<BaseLayout
@@ -100,18 +105,20 @@ const content = marked.parse(post.content);
{post.title}
</h2>
<ol class="flex items-center justify-center sm:justify-start whitespace-nowrap gap-2 sm:gap-0 mt-6 sm:mt-4">
{category && (
<li class="inline-flex items-center">
<a
class="inline-flex items-center text-secondary hover:text-secondary-hover text-sm transition-all duration-300"
href=`/categories/${category.slug}`
data-astro-prefetch
>
{category?.data?.title}
{category.title}
</a>
<span class="shrink-0 text-secondary text-sm mx-2 sm:mx-4">
/
</span>
</li>
)}
<li class="inline-flex items-center">
<span class="shrink-0 text-secondary text-sm">
{formatDate(post.published_date)}

View File

@@ -1,21 +1,20 @@
---
import { getCollection } from 'astro:content';
import { readItems, readSingleton } from '@directus/sdk';
import type { Post } from '@lib/directusTypes';
import type { Post, Category } from '@lib/directusTypes';
import HeaderSection from '@components/sections/HeaderSection.astro';
import BlogCard from '@components/cards/BlogCard.astro';
import BaseLayout from '@layouts/BaseLayout.astro';
import directus from '@lib/directus';
const { category } = Astro.props;
const category = Astro.props;
export async function getStaticPaths() {
const categories = await getCollection('categories');
const categories = await directus.request(readItems('categories'));
return categories.map((category) => ({
params: { slug: category.slug },
props: { category },
props: category,
}));
}
@@ -36,16 +35,16 @@ const categoriesPosts = posts
---
<BaseLayout
title={category.data.title}
description={category.data.description}
title={category.title}
description={category.description}
structuredData={{
'@context': 'https://schema.org',
'@type': 'WebPage',
inLanguage: 'en-US',
'@id': Astro.url.href,
url: Astro.url.href,
name: `${category.data.title} | ${global.name}`,
description: category.data.description,
name: `${category.title} | ${global.name}`,
description: category.description,
isPartOf: {
url: `${global.site_url}/categories`,
name: global.name,
@@ -55,8 +54,8 @@ const categoriesPosts = posts
>
<HeaderSection
title={category.data.title}
subTitle={category.data.description}
title={category.title}
subTitle={category.description}
btnExists
btnTitle="Back to Categories"
btnURL="/categories"

View File

@@ -1,5 +1,4 @@
@import 'tailwindcss';
@import 'preline/variants.css';
@import './utilities.css';
@plugin '@tailwindcss/typography';