+			
+				{#each languages as language}
+					
+						
+						{language.name}
+					
+				{/each}
 				
-					
-					{language.name}
+					
+					{license}
+				
+				
+					
+					{year}
 				
-			{/each}
-			
-				
-				{license}
-			
-			
-				
-				{year}
 			
+			{#if gitHubUrl || projectUrl}
+				
+					{#if gitHubUrl}
+						
+					{/if}
+					{#if projectUrl}
+						
+					{/if}
+				
+			{/if}
 		
 	
 
diff --git a/src/lib/components/site/projects/projects.svelte b/src/lib/components/site/projects/projects.svelte
index ab8fad3..6f02555 100644
--- a/src/lib/components/site/projects/projects.svelte
+++ b/src/lib/components/site/projects/projects.svelte
@@ -5,12 +5,6 @@
 
 
 	{#each projects as project}
-		{#if project.url}
-			
-				
-			
-		{:else}
-			
-		{/if}
+		
 	{/each}
 
diff --git a/src/lib/content/projects.ts b/src/lib/content/projects.ts
index 71e0111..4e8569d 100644
--- a/src/lib/content/projects.ts
+++ b/src/lib/content/projects.ts
@@ -7,16 +7,20 @@ import omnidashLogo from '$lib/assets/projects/omnidash-logo.png?enhanced';
 import azureGeocodeMappingLogo from '$lib/assets/projects/azure-geocode-mapping-logo.png?enhanced';
 import slayerWeightCalcLogo from '$lib/assets/projects/slayerweightcalc-logo.png?enhanced';
 
+// TODO: Use vite glob import to import all images from a folder and select them based on their name
+// const gallery = Object.values(import.meta.glob('@assets/asso/*.{png,jpg,jpeg,PNG,JPEG}', { eager: true, as: 'url' }))
+
 export type ProgrammingLanguage = {
 	name: string;
 	color: string;
 };
 
 export type Project = {
-	url?: string;
 	logo: string;
 	title: string;
 	description: string;
+	gitHubUrl?: string;
+	projectUrl?: string;
 	languages: ProgrammingLanguage[];
 	license: string;
 	year: string;
@@ -24,11 +28,12 @@ export type Project = {
 
 const projects: Project[] = [
 	{
-		url: 'https://hellob.art',
 		logo: helloBartLogo,
 		title: 'hellob.art',
 		description:
 			'The website you are currently visiting. A personal portfolio website that regularly gets rebuilt. Currently it has been built in Svelte and SvelteKit and uses shadcn-svelte and Tailwind CSS for component styling.',
+		projectUrl: 'https://hellob.art',
+		gitHubUrl: 'https://github.com/bartvdbraak/hellob.art',
 		year: '2020',
 		license: 'GPLv3',
 		languages: [
@@ -39,11 +44,12 @@ const projects: Project[] = [
 		]
 	},
 	{
-		url: 'https://omnidash.io',
 		logo: omnidashLogo,
 		title: 'Omnidash',
 		description:
 			'Omnidash is an open-source dashboard for retrieving ticketing information from various sources and displaying them in a single view.',
+		projectUrl: 'https://omnidash.io',
+		gitHubUrl: 'https://github.com/bartvdbraak/omnidash',
 		year: '2023',
 		license: 'GPLv3',
 		languages: [
@@ -54,26 +60,12 @@ const projects: Project[] = [
 		]
 	},
 	{
-		url: 'https://github.com/bartvdbraak/azure-geocode-mapping',
-		logo: azureGeocodeMappingLogo,
-		title: 'azure-geocode-mapping',
-		description:
-			'azure-geocode-mapping is a Python package that generates a mapping of Azure regions to their display names and geocodes.',
-		year: '2023',
-		license: 'MIT',
-		languages: [
-			{
-				name: 'Python',
-				color: 'text-blue-400'
-			}
-		]
-	},
-	{
-		url: 'https://www.github.com/bartvdbraak/keyweave',
 		logo: keyweaveLogo,
 		title: 'Keyweave',
 		description:
 			'Keyweave is an open-source tool crafted in Rust to seamlessly fetch secrets from Azure Key Vault and weave them into a convenient .env file.',
+		gitHubUrl: 'https://www.github.com/bartvdbraak/keyweave',
+		projectUrl: 'https://docs.rs/crate/keyweave/latest',
 		year: '2023',
 		license: 'GPLv3',
 		languages: [
@@ -87,6 +79,22 @@ const projects: Project[] = [
 			}
 		]
 	},
+	{
+		logo: azureGeocodeMappingLogo,
+		title: 'azure-geocode-mapping',
+		description:
+			'azure-geocode-mapping is a Python package that generates a mapping of Azure regions to their display names and geocodes.',
+		projectUrl: 'https://bartvdbraak.github.io/azure-geocode-mapping/geo.mapping.json',
+		gitHubUrl: 'https://github.com/bartvdbraak/azure-geocode-mapping',
+		year: '2023',
+		license: 'MIT',
+		languages: [
+			{
+				name: 'Python',
+				color: 'text-blue-400'
+			}
+		]
+	},
 	{
 		logo: videoWallLogo,
 		title: 'Videowall',
@@ -124,11 +132,11 @@ const projects: Project[] = [
 		]
 	},
 	{
-		url: 'https://zaantje.com/',
 		logo: zaantjeLogo,
 		title: 'Zaantje',
 		description:
 			'A SPA crafted with Nuxt.js and Vue.js, backed by Sanity CMS, taking you on a virtual tour of Zaandam, showcasing locations of famous music videos.',
+		projectUrl: 'https://zaantje.com/',
 		year: '2020',
 		license: 'Private',
 		languages: [
@@ -139,11 +147,12 @@ const projects: Project[] = [
 		]
 	},
 	{
-		url: 'https://bartvdbraak.github.io/SlayerWeightCalculator/',
 		logo: slayerWeightCalcLogo,
 		title: 'SlayerWeightCalculator',
 		description:
 			'I created this Slayer calculator for OldSchool RuneScape in 2019, but I am no longer maintaining it. As of 23th April 2023, I have decided to publicly archive the repository for it.',
+		projectUrl: 'https://bartvdbraak.github.io/SlayerWeightCalculator/',
+		gitHubUrl: 'https://github.com/bartvdbraak/SlayerWeightCalculator',
 		year: '2019',
 		license: 'BSD-2',
 		languages: [