commit 167073c01010d60b6b9e5690c4edc7a0cb311a9f
parent fbcdb246a430ba8df8fb11667fb8c0c26c3e213f
Author: Damian Myrda <damian@prime8.dev>
Date: Tue, 17 Feb 2026 21:59:13 -0600
ci: auto-deploy on push; fix api networking, dates and readme images
Diffstat:
10 files changed, 40 insertions(+), 12 deletions(-)
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
@@ -0,0 +1,13 @@
+stages:
+ - deploy
+
+deploy:
+ stage: deploy
+ script:
+ - |
+ curl -X POST "${DOKPLOY_DEPLOY_URL}" \
+ -H "Content-Type: application/json" \
+ -H "X-Gitlab-Event: Push Hook" \
+ -d '{"ref": "refs/heads/master"}'
+ only:
+ - master
diff --git a/env.example b/env.example
@@ -1 +1,3 @@
+NODE_ENV=dev|prod
+GITLAB_HOST=https://gitlab.com
WAKATIME_API_KEY=your_wakatime_api_key_here
diff --git a/src/blogs/building-my-portfolio.md b/src/blogs/building-my-portfolio.md
@@ -2,7 +2,7 @@
id: building-my-portfolio
title: Building a TUI-Inspired Portfolio
description: How I built this terminal-style portfolio with Astro
-date: 2026-01-16
+date: 2026-01-31
tags:
- Astro
- TypeScript
diff --git a/src/config/experience.ts b/src/config/experience.ts
@@ -15,9 +15,9 @@ export interface Experience {
export const experience = [
{
id: "stealth",
- company: "Stealth",
+ company: "Stealth Startup",
role: "SWE Intern",
- startDate: "2025-02",
+ startDate: "2026-02",
description: [],
tech: [],
},
diff --git a/src/constants/website.ts b/src/constants/website.ts
@@ -1,3 +1,3 @@
-export const SITE_DOMAIN = "prime8.dev";
+export const SITE_DOMAIN = "www.prime8.dev";
export const SITE_URL = `https://${SITE_DOMAIN}`;
diff --git a/src/external/git.ts b/src/external/git.ts
@@ -15,7 +15,7 @@ export async function fetchGitMetadataForProject(
project: Project,
): Promise<GitMetadata | null> {
try {
- const response = await fetch(project.apiUrl, {
+ const response = await fetch(getInternalGitLabUrl(project.apiUrl), {
headers: { "User-Agent": "prime8dev-portfolio" },
});
@@ -43,12 +43,18 @@ export async function fetchGitMetadataForProject(
}
}
+function getInternalGitLabUrl(externalUrl: string): string {
+ const internalHost = process.env.GITLAB_HOST;
+ if (!internalHost) return externalUrl;
+ return externalUrl.replace(/https?:\/\/[^/]+/, internalHost);
+}
+
async function fetchReadme(
urls: RepoUrls,
readmeUrl: string,
): Promise<string | null> {
try {
- const response = await fetch(readmeUrl, {
+ const response = await fetch(getInternalGitLabUrl(readmeUrl), {
headers: { "User-Agent": "prime8dev-portfolio" },
});
if (!response.ok) return null;
diff --git a/src/layouts/tabs/Experience.astro b/src/layouts/tabs/Experience.astro
@@ -74,7 +74,9 @@ while (current <= timelineEnd) {
<span class="exp-dates">
{startStr} → {endStr}
</span>
- <span class="exp-duration">{months} months</span>
+ <span class="exp-duration">
+ {months} {months === 1 ? "month" : "months"}
+ </span>
{exp.url && (
<a
class="external-link"
diff --git a/src/layouts/tabs/Projects.astro b/src/layouts/tabs/Projects.astro
@@ -321,7 +321,7 @@ const metadata = Object.fromEntries(
}
.readme-content :global(img) {
- max-width: 100%;
+ max-width: min(720px, 100%);
height: auto;
margin: 12px 0;
}
diff --git a/src/pages/projects/[id].astro b/src/pages/projects/[id].astro
@@ -7,7 +7,7 @@ import { SITE_URL } from "../../constants/website";
import schemas from "../../schemas/index";
import { getTagClass } from "../../utils/tags";
-import { parseMarkdown } from "../../utils/markdown";
+import { parseMarkdown, removeFirstH1 } from "../../utils/markdown";
const project = projects.find((p) => p.id === Astro.params.id);
if (!project) {
return new Response(null, {
@@ -59,7 +59,9 @@ const { getSchemaForProject, getBreadcrumbSchema } = schemas.project;
<div class="readme-content">
{
metadata?.readme ? (
- <Fragment set:html={parseMarkdown(metadata.readme)} />
+ <Fragment
+ set:html={parseMarkdown(removeFirstH1(metadata.readme))}
+ />
) : (
<p class="color-dim">README not available</p>
)
@@ -250,7 +252,7 @@ const { getSchemaForProject, getBreadcrumbSchema } = schemas.project;
}
.readme-content :global(img) {
- max-width: 100%;
+ max-width: min(1024px, 100%);
height: auto;
margin: 16px 0;
}
diff --git a/src/tabs/projects.ts b/src/tabs/projects.ts
@@ -58,7 +58,10 @@ function select(index: number): void {
function setupClicks(): void {
$$("#projects .list-item").forEach((item, i) => {
- item.addEventListener("click", () => select(i));
+ item.addEventListener("click", () => {
+ select(i);
+ setRoute("projects", getId(i));
+ });
});
}