Initial commit: Astro blog scaffold with CI/CD
Deploy / build (push) Waiting to run

This commit is contained in:
hoelee committed 2026-09-06 04:18:16 +08:00
commit 8372d5e659
15 files changed
+5976

No files matched your search

+23
View File
@@ -0,0 +1,23 @@
---
import BaseLayout from '../layouts/BaseLayout.astro';
---
<BaseLayout title="About — hoelee.dev">
<h1>About</h1>
<p>
I'm Hoelee, a full-stack developer and DevOps engineer based in Malaysia.
I build web applications (PHP/CodeIgniter, Java/Spring, JavaScript/TypeScript/React),
self-host a ~140-container homelab, and run a small email-hosting business
for Malaysian SMEs.
</p>
<p>
This blog is where I document what I build — from self-hosted CI/CD and
Docker orchestration to Web3 experiments and AI automation. If you're a
recruiter or a fellow builder, the posts here are my living portfolio.
</p>
<p>
<a href="https://www.hoelee.com" target="_blank" rel="noopener">www.hoelee.com</a>
&middot;
<a href="https://git.hoelee.com/hoelee" target="_blank" rel="noopener">git.hoelee.com</a>
</p>
</BaseLayout>
+35
View File
@@ -0,0 +1,35 @@
---
import BaseLayout from '../layouts/BaseLayout.astro';
import { getCollection } from 'astro:content';
const posts = (await getCollection('posts', ({ data }) => !data.draft))
.sort((a, b) => b.data.pubDate.valueOf() - a.data.pubDate.valueOf());
---
<BaseLayout title="hoelee.dev — personal blog">
<h1>hoelee.dev</h1>
<p>
I'm Hoelee — a full-stack developer and DevOps engineer. I build web apps,
self-host infrastructure, and automate things. Here I write about what I
learn and ship.
</p>
<h2>Latest posts</h2>
{posts.length === 0 ? (
<p><em>No posts yet — check back soon.</em></p>
) : (
<ul class="post-list">
{posts.slice(0, 10).map((post) => (
<li>
<a href={`/posts/${post.slug}/`}>
<h2>{post.data.title}</h2>
</a>
<time datetime={post.data.pubDate.toISOString()}>
{post.data.pubDate.toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' })}
</time>
<p>{post.data.description}</p>
</li>
))}
</ul>
)}
</BaseLayout>
+27
View File
@@ -0,0 +1,27 @@
---
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getCollection, render } from 'astro:content';
export async function getStaticPaths() {
const posts = await getCollection('posts', ({ data }) => !data.draft);
return posts.map((post) => ({
params: { slug: post.slug },
props: { post },
}));
}
const { post } = Astro.props;
const { Content } = await render(post);
---
<BaseLayout title={`${post.data.title} — hoelee.dev`} description={post.data.description} lang={post.data.lang}>
<article>
<h1>{post.data.title}</h1>
<time datetime={post.data.pubDate.toISOString()}>
{post.data.pubDate.toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' })}
</time>
<span class="tag">{post.data.category}</span>
{post.data.tags.map((tag) => <span class="tag">{tag}</span>)}
<Content />
</article>
</BaseLayout>
+30
View File
@@ -0,0 +1,30 @@
---
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getCollection } from 'astro:content';
const posts = (await getCollection('posts', ({ data }) => !data.draft))
.sort((a, b) => b.data.pubDate.valueOf() - a.data.pubDate.valueOf());
---
<BaseLayout title="Posts — hoelee.dev">
<h1>Posts</h1>
{posts.length === 0 ? (
<p><em>No posts yet.</em></p>
) : (
<ul class="post-list">
{posts.map((post) => (
<li>
<a href={`/posts/${post.slug}/`}>
<h2>{post.data.title}</h2>
</a>
<time datetime={post.data.pubDate.toISOString()}>
{post.data.pubDate.toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' })}
</time>
<span class="tag">{post.data.category}</span>
{post.data.tags.map((tag) => <span class="tag">{tag}</span>)}
<p>{post.data.description}</p>
</li>
))}
</ul>
)}
</BaseLayout>