feat: add projects page
This commit is contained in:
parent
a331872c79
commit
a155a9b355
12 changed files with 254 additions and 20 deletions
|
|
@ -19,7 +19,10 @@ const { title, description, image = "/blog-placeholder-1.jpg" } = Astro.props;
|
|||
<!-- Global Metadata -->
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
|
||||
<link rel="manifest" href="/site.webmanifest" />
|
||||
<meta name="generator" content={Astro.generator} />
|
||||
|
||||
<!-- Font preloads, keep them even if it throws a warning for not using them due to the system providing them -->
|
||||
|
|
|
|||
|
|
@ -3,12 +3,13 @@ import HeaderLink from "./HeaderLink.astro";
|
|||
---
|
||||
|
||||
<header class="mb-8 w-full lg:w-[768px] max-w-[calc(100%-2em)] lg:mx-auto">
|
||||
<nav>
|
||||
<div class="flex gap-4">
|
||||
<HeaderLink href="/">Home</HeaderLink>
|
||||
<HeaderLink href="/blog">Blog</HeaderLink>
|
||||
<HeaderLink href="/publications">Publications</HeaderLink>
|
||||
<HeaderLink href="/contact">Contact</HeaderLink>
|
||||
</div>
|
||||
</nav>
|
||||
<nav>
|
||||
<div class="flex gap-4">
|
||||
<HeaderLink href="/">Home</HeaderLink>
|
||||
<HeaderLink href="/blog">Blog</HeaderLink>
|
||||
<HeaderLink href="/projects">Projects</HeaderLink>
|
||||
<HeaderLink href="/publications">Publications</HeaderLink>
|
||||
<HeaderLink href="/contact">Contact</HeaderLink>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
|
|
|||
|
|
@ -15,8 +15,8 @@ import BaseLayout from "../layouts/BaseLayout.astro";
|
|||
have been maintaining a small homelab, which ignited a passion for
|
||||
automating infrastructure. I am a privacy enthusiast and advocate for
|
||||
non-invasive software. Occasionally, I channel my creativity into building
|
||||
sleek web applications that prioritize efficiency and adhere to web
|
||||
standards and best practices.
|
||||
sleek web applications that prioritize efficiency and usability over visual
|
||||
clutter, and adhere to web standards and best practices.
|
||||
</p>
|
||||
<p>
|
||||
I currently work as a software engineer at <Link href="https://tv1.eu"
|
||||
|
|
|
|||
|
|
@ -0,0 +1,238 @@
|
|||
---
|
||||
import BaseLayout from "../../layouts/BaseLayout.astro";
|
||||
import { Icon } from "astro-icon/components";
|
||||
|
||||
const projects = [
|
||||
{
|
||||
title: "daichendt.one (this site)",
|
||||
live_url: "https://www.youtube.com/watch?v=XfELJU1mRMg",
|
||||
repo_url: "https://github.com/AlexDaichendt/site",
|
||||
description: "Personal website and blog.",
|
||||
tech_stack: ["Astro", "Tailwind CSS"],
|
||||
duration: "2022 - Present",
|
||||
complexity: 4,
|
||||
},
|
||||
// {
|
||||
// title: "Radio Player",
|
||||
// live_url: "https://video.taxi/en/functions/simultaneous-interpreting/",
|
||||
// description: "A radio player for the VIDEO.TAXI website. Allows users to listen to radio stations with dubbed audio with the voice of the original speaker.",
|
||||
// tech_stack: ["React", "TypeScript", "Vite", "Go", "Docker"],
|
||||
// duration: "2024 - Present",
|
||||
// complexity: 4,
|
||||
// company: "TV1 GmbH",
|
||||
// },
|
||||
{
|
||||
title: "VIDEO.TAXI Meetings",
|
||||
live_url: "https://meetings.video.taxi/",
|
||||
description:
|
||||
"Records, transcribes, and translates meetings (Webex, Teams, Zoom). Interfaces with the GraphQL API of VIDEO.TAXI. Architecure, development, and deployment all done by me. Greenfield project.",
|
||||
tech_stack: [
|
||||
"Svelte",
|
||||
"TypeScript",
|
||||
"Tailwind CSS",
|
||||
"Express",
|
||||
"GraphQL",
|
||||
"PostgreSQL",
|
||||
"Docker",
|
||||
"OpenAPI",
|
||||
],
|
||||
complexity: 5,
|
||||
duration: "2024 - Present",
|
||||
company: "TV1 GmbH",
|
||||
},
|
||||
{
|
||||
title: "Netbox PDU Plugin",
|
||||
repo_url: "https://github.com/AlexDaichendt/axians-netbox-plugin-pdu",
|
||||
description:
|
||||
"Netbox plugin to read out power usage of PDUs. Forked and maintained from the original plugin by Axians. Used in production by multiple companies.",
|
||||
tech_stack: ["Python", "Django", "Netbox"],
|
||||
duration: "2023 - Present",
|
||||
complexity: 4,
|
||||
company: "TV1 GmbH",
|
||||
},
|
||||
{
|
||||
title: "Latency IRQ Analyzer",
|
||||
repo_url: "https://github.com/AlexDaichendt/latency-irq-analyzer",
|
||||
description:
|
||||
"Quick uni project for overlaying latency files with IRQ data.",
|
||||
tech_stack: ["NodeJS", "Highcharts"],
|
||||
duration: "2024",
|
||||
complexity: 2,
|
||||
},
|
||||
{
|
||||
title: "Netbox Agent",
|
||||
description:
|
||||
"Reads out lshw, dmidecode and other data of a server and creates Netbox devices. Forked from the original project.",
|
||||
tech_stack: ["Python"],
|
||||
duration: "2023 - Present",
|
||||
complexity: 2,
|
||||
company: "TV1 GmbH",
|
||||
},
|
||||
{
|
||||
title: "magewell-exporter",
|
||||
repo_url: "https://github.com/TV1-EU/magewell-exporter",
|
||||
description:
|
||||
"Prometheus exporter for Magewell AiO encoders. Allows monitoring of the capture card status and video signal. Used in production by TV1.",
|
||||
tech_stack: ["NodeJs", "Typescript"],
|
||||
duration: "2023",
|
||||
complexity: 4,
|
||||
company: "TV1 GmbH",
|
||||
},
|
||||
{
|
||||
title: "Discretize -- Gear Optimizer",
|
||||
live_url: "https://optimizer.discretize.eu/",
|
||||
repo_url: "https://github.com/discretize/discretize-gear-optimizer",
|
||||
description:
|
||||
"A gear optimizer for the popular MMORPG Guild Wars 2. The optimizer is used by thousands of players daily to find the best gear combinations for their characters.",
|
||||
tech_stack: ["React", "Redux", "Rust", "Vite", "MaterialUI"],
|
||||
duration: "2021 - Present",
|
||||
complexity: 5,
|
||||
},
|
||||
{
|
||||
title: "Discretize -- UI Library",
|
||||
repo_url: "https://github.com/discretize/discretize-ui",
|
||||
description:
|
||||
"A beautiful component library with tooltips for the popular MMORPG Guild Wars 2. Allows websites to look and feel like the game. Integral part of the Discretize ecosystem.",
|
||||
live_url:
|
||||
"https://discretize.github.io/discretize-ui/gw2-ui/?path=/story/components-attribute--boon-duration",
|
||||
tech_stack: ["React", "TypeScript", "Storybook"],
|
||||
duration: "2021 - Present",
|
||||
complexity: 5,
|
||||
},
|
||||
{
|
||||
title: "Discretize -- Rewritten Website",
|
||||
description:
|
||||
"Rewritten website for the Discretize community. Contains guides, builds, and other useful information for the popular MMORPG Guild Wars 2. Awaiting last few changes and content updates by players before deployment.",
|
||||
live_url: "https://next.discretize.eu/",
|
||||
repo_url: "https://github.com/discretize/discretize.eu-rewrite",
|
||||
tech_stack: ["Astro", "React", "TypeScript", "Tailwind CSS"],
|
||||
duration: "2022 - Present",
|
||||
complexity: 5,
|
||||
},
|
||||
{
|
||||
title: "Discretize -- CC Tool",
|
||||
description:
|
||||
"Allows players to create skill schedules with drag and drop. Used by high-end players to optimize and coordinate their gameplay.",
|
||||
live_url: "https://cc-tool.pages.dev/",
|
||||
repo_url: "https://github.com/discretize/cc-tool",
|
||||
tech_stack: ["Vite", "React", "TypeScript", "Tailwind CSS"],
|
||||
duration: "2024 - Present",
|
||||
complexity: 3,
|
||||
},
|
||||
{
|
||||
title: "Discretize -- Random Builds",
|
||||
description:
|
||||
"Generates random builds for the popular MMORPG Guild Wars 2. Meant as a way to force players out of their comfort zone and try new things.",
|
||||
live_url: "https://random-builds.discretize.eu/",
|
||||
tech_stack: ["Vite", "React", "TypeScript", "Tailwind CSS"],
|
||||
duration: "2022",
|
||||
complexity: 3,
|
||||
},
|
||||
{
|
||||
title: "Discretize -- Old Website",
|
||||
description:
|
||||
"Currently deployed website for the Discretize community. Contains guides, builds, and other useful information for the popular MMORPG Guild Wars 2. Inherited project from previous maintainer. Several hundred thousand monthly users.",
|
||||
live_url: "https://discretize.eu/",
|
||||
tech_stack: ["React", "Gatsby", "Material UI"],
|
||||
duration: "2019 - Present",
|
||||
complexity: 3,
|
||||
},
|
||||
{
|
||||
title: "Minecraft LandLord Spigot Plugin",
|
||||
live_url: "https://www.spigotmc.org/resources/landlord-2.44398/",
|
||||
repo_url: "https://github.com/LandlordPlugin/LandLord",
|
||||
description:
|
||||
"Landlord aims to keep the Minecraft experience simple and fluid for players while also protecting their land. The idea for this plugin is to protect player builds with minimal game-play interference, while also allowing them to tweak the protection details in a simple and user-friendly way. Handed over the project to a new group of maintainers in 2019.",
|
||||
tech_stack: ["Java"],
|
||||
duration: "2017 - 2019",
|
||||
complexity: 2,
|
||||
},
|
||||
];
|
||||
|
||||
const getCardStyle = (company?: string) => {
|
||||
const baseStyles =
|
||||
"rounded-lg shadow-lg p-6 transition-colors duration-300 mb-8";
|
||||
|
||||
if (!company) {
|
||||
return `${baseStyles} bg-white dark:bg-gray-800`;
|
||||
}
|
||||
|
||||
const companyColors: Record<string, string> = {
|
||||
Discretize: "bg-blue-50 dark:bg-blue-900/30",
|
||||
"TV1 GmbH": "border-2 border-orange-500 dark:border-orange-500",
|
||||
};
|
||||
|
||||
return `${baseStyles} ${companyColors[company] || "bg-white dark:bg-gray-800"}`;
|
||||
};
|
||||
---
|
||||
|
||||
<BaseLayout title="Projects">
|
||||
<p>
|
||||
Here are some of the projects I have worked on in the past. They are sorted
|
||||
by my personal rating of relevancy. Projects done for a company are marked
|
||||
with the company name and have a special border color.
|
||||
</p>
|
||||
{
|
||||
projects
|
||||
.sort((a, b) => b.complexity - a.complexity)
|
||||
.map((project) => (
|
||||
<article class={getCardStyle(project.company)}>
|
||||
<div class="flex justify-between items-start mb-4">
|
||||
<div>
|
||||
<h2 class="text-2xl font-semibold text-gray-900 dark:text-white">
|
||||
{project.title}
|
||||
</h2>
|
||||
{project?.company && (
|
||||
<div class="flex items-center mt-1">
|
||||
<Icon name="mdi:office-building" class="w-5 h-5 mr-1" />
|
||||
<span class="text-sm text-gray-600 dark:text-gray-300 font-medium">
|
||||
{project?.company}
|
||||
</span>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
<span class="text-sm text-gray-500 dark:text-gray-400">
|
||||
{project.duration}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<p class="text-gray-600 dark:text-gray-300 mb-4">
|
||||
{project.description}
|
||||
</p>
|
||||
|
||||
<div class="flex flex-wrap gap-2 mb-4">
|
||||
{project.tech_stack.map((tech) => (
|
||||
<span class="px-3 py-1 text-sm bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-200 rounded-full">
|
||||
{tech}
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
|
||||
<div class="flex gap-4">
|
||||
{project.live_url && (
|
||||
<a
|
||||
href={project.live_url}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="text-blue-600 dark:text-blue-400 hover:underline flex items-center"
|
||||
>
|
||||
<Icon name="mdi:web" class="w-5 h-5 mr-1" />
|
||||
Live Demo
|
||||
</a>
|
||||
)}
|
||||
{project.repo_url && (
|
||||
<a
|
||||
href={project.repo_url}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="text-gray-600 dark:text-gray-400 hover:underline flex items-center"
|
||||
>
|
||||
<Icon name="mdi:github" class="w-5 h-5 mr-1" />
|
||||
Repository
|
||||
</a>
|
||||
)}
|
||||
</div>
|
||||
</article>
|
||||
))
|
||||
}
|
||||
</BaseLayout>
|
||||
Loading…
Add table
Add a link
Reference in a new issue