Compare commits

...

13 Commits

Author SHA1 Message Date
a0c04c7930 Update actions/checkout action to v5
Some checks failed
test-build / build (pull_request) Failing after 2s
2025-08-12 02:12:22 +00:00
b58cbdbe0a remove old files
All checks were successful
renovate / renovate (push) Successful in 38s
test-build / build (push) Successful in 1m15s
2025-08-11 21:11:44 -05:00
49e2376dbf release 2.0.5
All checks were successful
renovate / renovate (push) Successful in 25s
test-build / build (push) Successful in 55s
release-image / release (push) Successful in 4m45s
2025-08-11 19:37:01 -05:00
6b1eaa439a fix value
Some checks failed
renovate / renovate (push) Has been cancelled
test-build / build (push) Has been cancelled
2025-08-11 19:36:44 -05:00
f92f911360 release 2.0.4
Some checks failed
renovate / renovate (push) Successful in 46s
test-build / build (push) Failing after 47s
release-image / release (push) Failing after 1m26s
2025-08-11 19:34:59 -05:00
1cdbbd4a11 use double quotes
Some checks failed
test-build / build (push) Has been cancelled
renovate / renovate (push) Has been cancelled
2025-08-11 19:34:43 -05:00
da7c5c4a58 release 2.0.3
Some checks failed
renovate / renovate (push) Successful in 26s
test-build / build (push) Failing after 33s
release-image / release (push) Failing after 1m18s
2025-08-11 19:29:43 -05:00
931d1009ed support published value
Some checks failed
renovate / renovate (push) Has been cancelled
test-build / build (push) Has been cancelled
2025-08-11 19:29:26 -05:00
43ff986963 release 2.0.2
Some checks failed
renovate / renovate (push) Successful in 34s
test-build / build (push) Failing after 35s
release-image / release (push) Failing after 1m11s
2025-08-11 19:11:27 -05:00
b9d85a5520 fix layout
Some checks failed
renovate / renovate (push) Successful in 31s
test-build / build (push) Failing after 39s
2025-08-11 19:10:46 -05:00
9836b40531 fix height 2025-08-11 18:48:08 -05:00
ea1c3d9f1a 2.0.1 release
All checks were successful
test-build / build (push) Successful in 1m18s
release-image / release (push) Successful in 2m26s
renovate / renovate (push) Successful in 45s
2025-08-11 18:14:00 -05:00
28f73be784 update content 2025-08-11 18:13:22 -05:00
35 changed files with 65 additions and 164 deletions

View File

@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v5
- name: Login to Registry - name: Login to Registry
uses: docker/login-action@v3 uses: docker/login-action@v3

View File

@@ -16,7 +16,7 @@ jobs:
container: ghcr.io/renovatebot/renovate:41 container: ghcr.io/renovatebot/renovate:41
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v5
- name: Renovate - name: Renovate
run: renovate run: renovate

View File

@@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v5
- name: Set up pnpm - name: Set up pnpm
uses: pnpm/action-setup@v4 uses: pnpm/action-setup@v4

View File

@@ -1,7 +1,7 @@
ARG REGISTRY=docker.io ARG REGISTRY=docker.io
FROM ${REGISTRY}/node:22.18.0-alpine3.22 AS base FROM ${REGISTRY}/node:22.18.0-alpine3.22 AS base
LABEL version="2.0.0" LABEL version="2.0.5"
LABEL description="Astro based personal website" LABEL description="Astro based personal website"
ENV PNPM_HOME="/pnpm" ENV PNPM_HOME="/pnpm"

View File

@@ -1,23 +0,0 @@
# MIT License
Copyright (c) 2025 Lê Vĩnh Khang
Copyright (c) 2025 Alex Lebens
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -1,7 +1,7 @@
{ {
"name": "site-profile", "name": "site-profile",
"type": "module", "type": "module",
"version": "2.0.0", "version": "2.0.5",
"homepage": "https://www.alexlebens.dev", "homepage": "https://www.alexlebens.dev",
"bugs": { "bugs": {
"url": "https://gitea.alexlebens.dev/alexlebens/site-profile/issues", "url": "https://gitea.alexlebens.dev/alexlebens/site-profile/issues",

View File

@@ -27,13 +27,13 @@ const currentYear = new Date().getFullYear();
</div> </div>
<span class="ml-3 text-xl font-bold text-neutral-800 dark:text-neutral-200"> <span class="ml-3 text-xl font-bold text-neutral-800 dark:text-neutral-200">
Blog {global.name}
</span> </span>
</div> </div>
</a> </a>
<p class="mt-4 text-sm leading-relaxed text-neutral-600 dark:text-neutral-400"> <p class="mt-4 text-sm leading-relaxed text-neutral-600 dark:text-neutral-400">
A description of something. {global.about}
</p> </p>
</div> </div>
<!-- Left links --> <!-- Left links -->

View File

@@ -5,21 +5,9 @@ interface Props {
description: string; description: string;
count: number; count: number;
publishDate: string; publishDate: string;
layoutPattern?: {
smCol: number;
mdCol: number;
row: number;
index: number;
};
} }
const { slug, layoutPattern, title, description, count, publishDate } = Astro.props; const { slug, title, description, count, publishDate } = Astro.props;
const isSingleItem =
layoutPattern &&
layoutPattern.row === 1 &&
(layoutPattern.smCol === 1 || layoutPattern.mdCol === 1);
const formatedDescription = isSingleItem ? `No description available` : description;
const baseClasses = const baseClasses =
'group group-hover rounded-xl flex h-full min-h-[220px] cursor-pointer flex-col overflow-hidden'; 'group group-hover rounded-xl flex h-full min-h-[220px] cursor-pointer flex-col overflow-hidden';
@@ -32,17 +20,17 @@ const bgColorClasses =
<div <div
class={`relative min-h-0 flex-grow overflow-hidden transition-all duration-300 ${bgColorClasses}`} class={`relative min-h-0 flex-grow overflow-hidden transition-all duration-300 ${bgColorClasses}`}
> >
<div class="absolute inset-1 flex flex-col justify-end p-3 md:p-4 lg:p-5"> <div class="absolute inset-1 flex flex-col p-3 md:p-4 lg:p-5">
<h2 <div class="overflow-hidden">
class="group-hover:text-steel dark:group-hover:text-bermuda transition-text mb-4 text-4xl font-extrabold tracking-tight text-balance text-neutral-800 duration-300 dark:text-neutral-200" <h2
> class="group-hover:text-steel dark:group-hover:text-bermuda transition-text mb-4 text-4xl font-extrabold tracking-tight text-balance whitespace-nowrap text-neutral-800 duration-300 dark:text-neutral-200"
{title} >
</h2> {title}
<p </h2>
class=`mb-4 ${isSingleItem ? 'hidden lg:block' : ''} max-w-prose text-pretty font-light text-neutral-600 dark:text-neutral-400 sm:text-lg` <p class="mb-4 font-light text-neutral-600 sm:text-lg dark:text-neutral-400">
> {description}
{formatedDescription} </p>
</p> </div>
<div <div
class="mt-auto flex items-center justify-between pt-1 text-xs text-neutral-600 md:pt-2 dark:text-neutral-300" class="mt-auto flex items-center justify-between pt-1 text-xs text-neutral-600 md:pt-2 dark:text-neutral-300"
> >

View File

@@ -7,8 +7,6 @@ interface Props {
} }
const { posts } = Astro.props; const { posts } = Astro.props;
const description = 'Here are a few articles that I think are not bad, hope you like too.';
--- ---
<section class="mx-auto mb-10 max-w-[85rem] px-4 py-8 sm:px-6 lg:px-8 2xl:max-w-full"> <section class="mx-auto mb-10 max-w-[85rem] px-4 py-8 sm:px-6 lg:px-8 2xl:max-w-full">
@@ -17,13 +15,8 @@ const description = 'Here are a few articles that I think are not bad, hope you
id="selected-articel" id="selected-articel"
class="smooth-reveal-2 mb-4 text-5xl font-extrabold tracking-tight text-balance text-neutral-800 dark:text-neutral-200" class="smooth-reveal-2 mb-4 text-5xl font-extrabold tracking-tight text-balance text-neutral-800 dark:text-neutral-200"
> >
Posts Older Articles
</h2> </h2>
<p
class="smooth-reveal-2 mb-8 max-w-prose font-light text-pretty text-neutral-600 sm:text-xl dark:text-neutral-400"
>
{description}
</p>
</div> </div>
<div class="flex flex-col md:flex-row md:space-x-12 lg:space-x-16"> <div class="flex flex-col md:flex-row md:space-x-12 lg:space-x-16">

View File

@@ -10,7 +10,7 @@ interface Props {
const { title, description, url, icon } = Astro.props; const { title, description, url, icon } = Astro.props;
const baseClasses = 'smooth-reveal-2 group group-hover flex flex-col'; const baseClasses = 'smooth-reveal-2 group group-hover flex flex-col ';
const borderClasses = 'border border-neutral-100 dark:border-stone-500/20'; const borderClasses = 'border border-neutral-100 dark:border-stone-500/20';
const bgColorClasses = const bgColorClasses =
'bg-neutral-100/80 hover:bg-neutral-100 dark:bg-neutral-800/60 dark:hover:bg-neutral-800/90'; 'bg-neutral-100/80 hover:bg-neutral-100 dark:bg-neutral-800/60 dark:hover:bg-neutral-800/90';
@@ -19,7 +19,7 @@ const shadowClasses = 'shadow-xs hover:shadow-md dark:shadow-md dark:hover:shado
<div class={`${baseClasses}`}> <div class={`${baseClasses}`}>
<a <a
class={`rounded-xl duration-300 transition-all ${borderClasses} ${bgColorClasses} ${shadowClasses}`} class={`rounded-xl duration-300 transition-all h-30 ${borderClasses} ${bgColorClasses} ${shadowClasses}`}
href={url} href={url}
data-astro-prefetch data-astro-prefetch
> >

View File

@@ -15,19 +15,19 @@ const global = await directus.request(readSingleton('site_global'));
<div class="grid gap-3 sm:grid-cols-2 sm:gap-6 lg:grid-cols-3"> <div class="grid gap-3 sm:grid-cols-2 sm:gap-6 lg:grid-cols-3">
<FeaturesCard <FeaturesCard
title="Cloud Engineer" title="Cloud Engineer"
description="Full stack and multi cloud engineer" description="Full stack and cloud engineer."
url="#" url="/about"
icon="mdi:cloud-outline" icon="mdi:cloud-outline"
/> />
<FeaturesCard <FeaturesCard
title="Homelab" title="Homelab"
description="Tinkering, testing, deploying, etc, etc ..." description="Tinkering, testing, deploying, etc, etc ..."
url="#" url="/categories/homelab/"
icon="mdi:home-variant-outline" icon="mdi:home-variant-outline"
/> />
<FeaturesCard <FeaturesCard
title="Email Me" title="Email"
description={`Reach me at ${global.email}`} description={`Send me a message.`}
url=`mailto:${global.email}` url=`mailto:${global.email}`
icon="mdi:email-fast" icon="mdi:email-fast"
/> />

View File

@@ -7,6 +7,7 @@ import BlogCard from '@components/blog/BlogCard.astro';
const posts = await directus.request( const posts = await directus.request(
readItems('posts', { readItems('posts', {
filter: { published: { _eq: true } },
fields: ['*'], fields: ['*'],
sort: ['-published_date'], sort: ['-published_date'],
}) })

View File

@@ -1,4 +1,4 @@
--- ---
title: '二愣的小书屋 🔖' title: 'Books 📖'
description: '生活总是这样,不能让人处处都满意但我们还要热情地活下去' description: 'Books I have read or listened to'
--- ---

View File

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

View File

@@ -1,4 +0,0 @@
---
title: 'Golang 🚀'
description: 'Go 语言的词法分析与语法分析及折腾下 Go 编译原理吗'
---

View File

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

View File

@@ -1,4 +1,4 @@
--- ---
title: 'kubernetes 💩' title: 'Kubernetes ☸️'
description: 'Kubernetes 是一个开源系统,用于自动化部署、扩展和管理容器化应用程序。' description: 'The container orchestration system'
--- ---

View File

@@ -1,4 +0,0 @@
---
title: 'Laravel 🐛'
description: '最优雅的 PHP 框架'
---

View File

@@ -1,4 +1,4 @@
--- ---
title: '生活 💃' title: 'Life 🏃🏻'
description: '房贷要还的,水电费要交的,小孩学费也贵的,钱肯定要不够的呀。所以工作不敢扔,我大部分的快乐,都是来自于生活的夹缝。' description: 'Just random musings on everyday stuff'
--- ---

View File

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

View File

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

View File

@@ -1,4 +0,0 @@
---
title: 'Nginx 🐕‍🦺'
description: '高性能的 HTTP 和反向代理 Web 服务器,奈何反向代理的 PHP-FMP 服务太慢。'
---

View File

@@ -1,4 +0,0 @@
---
title: 'PHP 🐘'
description: 'PHP is a popular general-purpose scripting language that is especially suited to web development.'
---

View File

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

View File

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

View File

@@ -1,4 +1,4 @@
--- ---
title: 'Tool 🪜' title: 'Tool 🪜'
description: '停止折腾就老了吧' description: 'Usually just the software kind'
--- ---

View File

@@ -1,4 +1,4 @@
--- ---
title: 'What Is?' title: 'What Is?'
description: '什么是快乐星球,什么是快乐星球,什么是快乐星球' description: 'A series on discovery'
--- ---

5
src/env.d.ts vendored
View File

@@ -1,8 +1,3 @@
<<<<<<< HEAD
/// <reference path="../.astro/types.d.ts" /> /// <reference path="../.astro/types.d.ts" />
/// <reference types="astro/client" /> /// <reference types="astro/client" />
/// <reference types="astro/content" /> /// <reference types="astro/content" />
=======
/// <reference types="astro/client" />
/// <reference path="../.astro/types.d.ts" />
>>>>>>> 184f0c7 (fix path)

View File

@@ -25,6 +25,7 @@ export type Post = {
tags: string[]; tags: string[];
category: string; category: string;
selected: boolean; selected: boolean;
published: boolean;
content: string; content: string;
image: string; image: string;
image_alt: string; image_alt: string;

View File

@@ -13,6 +13,7 @@ import blogImg from '@images/autumn_tree.png';
const global = await directus.request(readSingleton('site_global')); const global = await directus.request(readSingleton('site_global'));
const posts = await directus.request( const posts = await directus.request(
readItems('posts', { readItems('posts', {
filter: { published: { _eq: true } },
fields: ['*'], fields: ['*'],
sort: ['-published_date'], sort: ['-published_date'],
}) })
@@ -20,7 +21,7 @@ const posts = await directus.request(
const selectedPosts: Post[] = posts.filter((p) => p.selected); const selectedPosts: Post[] = posts.filter((p) => p.selected);
const description = const description =
'Here are some articles that Alex Lebens believes are not bad, hope you enjoy them.'; "Sharing what I've learned, one post at a time. I hope you find something useful.";
--- ---
<BaseLayout <BaseLayout

View File

@@ -21,6 +21,7 @@ const { category } = Astro.props;
const global = await directus.request(readSingleton('site_global')); const global = await directus.request(readSingleton('site_global'));
const posts = await directus.request( const posts = await directus.request(
readItems('posts', { readItems('posts', {
filter: { published: { _eq: true } },
fields: ['*'], fields: ['*'],
sort: ['-published_date'], sort: ['-published_date'],
}) })

View File

@@ -14,6 +14,7 @@ import categoryImg from '@images/autumn_bench.png';
const global = await directus.request(readSingleton('site_global')); const global = await directus.request(readSingleton('site_global'));
const posts = await directus.request( const posts = await directus.request(
readItems('posts', { readItems('posts', {
filter: { published: { _eq: true } },
fields: ['*'], fields: ['*'],
sort: ['-published_date'], sort: ['-published_date'],
}) })
@@ -74,7 +75,7 @@ const categories = (await getCollection('categories'))
}); });
const description = const description =
'Here are some categories that I am interested in, including Laravel, Golang, and my life.'; 'Here are some of the general categories that I am interested in, including homelabs, technology, and Minnesota.';
--- ---
<BaseLayout <BaseLayout
@@ -118,7 +119,6 @@ const description =
description={category.data.description} description={category.data.description}
count={postMap.get(category.slug)?.length ?? 0} count={postMap.get(category.slug)?.length ?? 0}
publishDate={timeago(postMap.get(category.slug)?.[0]?.published_date)} publishDate={timeago(postMap.get(category.slug)?.[0]?.published_date)}
layoutPattern={category.layoutPattern}
/> />
</div> </div>
); );

View File

@@ -11,7 +11,8 @@ import homeImg from '@images/autumn_mountain.png';
const global = await directus.request(readSingleton('site_global')); const global = await directus.request(readSingleton('site_global'));
const description = 'Writing on technology, selfhosting, and me.'; const description =
'Engineering the cloud by day, homelab by night, and exploring Minnesota in between.';
--- ---
<BaseLayout <BaseLayout

View File

@@ -23,6 +23,7 @@ export async function GET(context: APIContext) {
// Load the content collection entries to add to our RSS feed. // Load the content collection entries to add to our RSS feed.
const posts = await directus.request( const posts = await directus.request(
readItems('posts', { readItems('posts', {
filter: { published: { _eq: true } },
fields: ['*'], fields: ['*'],
sort: ['-published_date'], sort: ['-published_date'],
}) })

View File

@@ -1,58 +0,0 @@
/** @type {import('tailwindcss').Config} */
module.exports = {
content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}', '*.{js,ts,jsx,tsx,mdx}'],
darkMode: 'class',
theme: {
extend: {
typography: (theme) => ({
DEFAULT: {
css: {
a: {
color: theme('colors.zinc.900'),
'&:hover': {
color: theme('colors.zinc.700'),
},
textDecoration: 'underline',
textDecorationColor: theme('colors.zinc.400'),
textUnderlineOffset: '2px',
},
'h1, h2, h3, h4, h5, h6': {
color: theme('colors.zinc.900'),
},
code: {
color: theme('colors.zinc.900'),
backgroundColor: theme('colors.zinc.100'),
borderRadius: theme('borderRadius.md'),
padding: `${theme('padding.1')} ${theme('padding.1.5')}`,
},
'code::before': {
content: '""',
},
'code::after': {
content: '""',
},
},
},
invert: {
css: {
a: {
color: theme('colors.zinc.100'),
'&:hover': {
color: theme('colors.zinc.300'),
},
textDecorationColor: theme('colors.zinc.700'),
},
'h1, h2, h3, h4, h5, h6': {
color: theme('colors.zinc.100'),
},
code: {
color: theme('colors.zinc.100'),
backgroundColor: theme('colors.zinc.800'),
},
},
},
}),
},
},
plugins: [require('@tailwindcss/typography')],
};