diff --git a/public/images/friends/dominic_petrarca.png b/public/images/friends/dominic_petrarca.png
new file mode 100644
index 0000000..f12fe75
Binary files /dev/null and b/public/images/friends/dominic_petrarca.png differ
diff --git a/public/images/friends/jenn_johnsey.png b/public/images/friends/jenn_johnsey.png
new file mode 100644
index 0000000..d60f9c2
Binary files /dev/null and b/public/images/friends/jenn_johnsey.png differ
diff --git a/public/images/friends/kieran_klukas.png b/public/images/friends/kieran_klukas.png
new file mode 100644
index 0000000..ac93641
Binary files /dev/null and b/public/images/friends/kieran_klukas.png differ
diff --git a/public/images/friends/logan_lambert.png b/public/images/friends/logan_lambert.png
new file mode 100644
index 0000000..dabeb52
Binary files /dev/null and b/public/images/friends/logan_lambert.png differ
diff --git a/public/images/friends/maclean_dunkin.png b/public/images/friends/maclean_dunkin.png
new file mode 100644
index 0000000..afd92b7
Binary files /dev/null and b/public/images/friends/maclean_dunkin.png differ
diff --git a/public/images/friends/ryan_di_lorenzo.png b/public/images/friends/ryan_di_lorenzo.png
new file mode 100644
index 0000000..a30dd86
Binary files /dev/null and b/public/images/friends/ryan_di_lorenzo.png differ
diff --git a/public/images/friends/samantha_miel.png b/public/images/friends/samantha_miel.png
new file mode 100644
index 0000000..94f02d2
Binary files /dev/null and b/public/images/friends/samantha_miel.png differ
diff --git a/public/images/friends/theo_reid.png b/public/images/friends/theo_reid.png
new file mode 100644
index 0000000..a10c034
Binary files /dev/null and b/public/images/friends/theo_reid.png differ
diff --git a/public/sitemap.xml b/public/sitemap.xml
index 4045286..d6f6257 100644
--- a/public/sitemap.xml
+++ b/public/sitemap.xml
@@ -1,23 +1,27 @@
-https://jaspermayone.com2026-03-24T03:47:29.255Zweekly1
-https://jaspermayone.com/colophon2026-03-24T03:47:29.256Zweekly0.7
-https://jaspermayone.com/concerts2026-03-24T03:47:29.256Zmonthly0.5
-https://jaspermayone.com/contact2026-03-24T03:47:29.256Zweekly1
-https://jaspermayone.com/elsewhere2026-03-24T03:47:29.256Zweekly0.7
-https://jaspermayone.com/green2026-03-24T03:47:29.256Zmonthly0.5
-https://jaspermayone.com/hardware2026-03-24T03:47:29.256Zmonthly0.5
-https://jaspermayone.com/keys/gpg2026-03-24T03:47:29.256Zmonthly0.5
-https://jaspermayone.com/keys/ssh2026-03-24T03:47:29.256Zmonthly0.5
-https://jaspermayone.com/now2026-03-24T03:47:29.256Zweekly0.7
-https://jaspermayone.com/open-source2026-03-24T03:47:29.256Zmonthly0.5
-https://jaspermayone.com/panera2026-03-24T03:47:29.256Zmonthly0.5
-https://jaspermayone.com/pfp2026-03-24T03:47:29.256Zmonthly0.5
-https://jaspermayone.com/podroll2026-03-24T03:47:29.256Zmonthly0.5
-https://jaspermayone.com/portfolio2026-03-24T03:47:29.256Zweekly1
-https://jaspermayone.com/slashes2026-03-24T03:47:29.256Zmonthly0.5
-https://jaspermayone.com/support-me2026-03-24T03:47:29.256Zmonthly0.5
-https://jaspermayone.com/to2026-03-24T03:47:29.256Zmonthly0.5
-https://jaspermayone.com/uses2026-03-24T03:47:29.256Zweekly0.7
-https://jaspermayone.com/verify2026-03-24T03:47:29.256Zmonthly0.5
+https://jaspermayone.com2026-08-13T00:50:32.196Zweekly1
+https://jaspermayone.com/colophon2026-08-13T00:50:32.196Zweekly0.7
+https://jaspermayone.com/concerts2026-08-13T00:50:32.196Zmonthly0.5
+https://jaspermayone.com/conferences2026-08-13T00:50:32.196Zmonthly0.5
+https://jaspermayone.com/contact2026-08-13T00:50:32.196Zweekly1
+https://jaspermayone.com/elsewhere2026-08-13T00:50:32.196Zweekly0.7
+https://jaspermayone.com/friends2026-08-13T00:50:32.196Zmonthly0.5
+https://jaspermayone.com/green2026-08-13T00:50:32.196Zmonthly0.5
+https://jaspermayone.com/hackathons2026-08-13T00:50:32.196Zmonthly0.5
+https://jaspermayone.com/hardware2026-08-13T00:50:32.196Zmonthly0.5
+https://jaspermayone.com/keys/gpg2026-08-13T00:50:32.196Zmonthly0.5
+https://jaspermayone.com/keys/ssh2026-08-13T00:50:32.196Zmonthly0.5
+https://jaspermayone.com/now2026-08-13T00:50:32.196Zweekly0.7
+https://jaspermayone.com/open-source2026-08-13T00:50:32.196Zmonthly0.5
+https://jaspermayone.com/opengraph-image2026-08-13T00:50:32.196Zmonthly0.5
+https://jaspermayone.com/panera2026-08-13T00:50:32.196Zmonthly0.5
+https://jaspermayone.com/pfp2026-08-13T00:50:32.196Zmonthly0.5
+https://jaspermayone.com/podroll2026-08-13T00:50:32.196Zmonthly0.5
+https://jaspermayone.com/portfolio2026-08-13T00:50:32.196Zweekly1
+https://jaspermayone.com/slashes2026-08-13T00:50:32.196Zmonthly0.5
+https://jaspermayone.com/support-me2026-08-13T00:50:32.196Zmonthly0.5
+https://jaspermayone.com/to2026-08-13T00:50:32.196Zmonthly0.5
+https://jaspermayone.com/uses2026-08-13T00:50:32.196Zweekly0.7
+https://jaspermayone.com/verify2026-08-13T00:50:32.196Zmonthly0.5
\ No newline at end of file
diff --git a/src/app/friends/page.tsx b/src/app/friends/page.tsx
new file mode 100644
index 0000000..05f339a
--- /dev/null
+++ b/src/app/friends/page.tsx
@@ -0,0 +1,156 @@
+import ExternalLink from "@/components/ExternalLink";
+import FOOTER from "@/components/FOOTER";
+import MENU from "@/components/MENU";
+import { friends, siteUrl } from "@/lib/defs";
+import { safeJsonLd } from "@/lib/jsonld";
+import { Metadata } from "next";
+import Image from "next/image";
+import Script from "next/script";
+
+export const metadata: Metadata = {
+ title: "Friends",
+ description:
+ "Some of the super cool people I have the privilege to call friends.",
+ alternates: {
+ canonical: "https://jaspermayone.com/friends",
+ },
+};
+
+const friendsPageSchema = {
+ "@context": "https://schema.org",
+ "@graph": [
+ {
+ "@type": "WebPage",
+ "@id": "https://jaspermayone.com/friends#webpage",
+ url: "https://jaspermayone.com/friends",
+ name: "Friends - Jasper Mayone",
+ description:
+ "Some of the super cool people I have the privilege to call friends.",
+ isPartOf: {
+ "@id": "https://jaspermayone.com/#website",
+ },
+ about: {
+ "@id": "https://jaspermayone.com/#person",
+ },
+ mainEntity: {
+ "@id": "https://jaspermayone.com/friends#friend-list",
+ },
+ breadcrumb: {
+ "@type": "BreadcrumbList",
+ "@id": "https://jaspermayone.com/friends#breadcrumb",
+ itemListElement: [
+ {
+ "@type": "ListItem",
+ position: 1,
+ name: "Home",
+ item: "https://jaspermayone.com",
+ },
+ {
+ "@type": "ListItem",
+ position: 2,
+ name: "Friends",
+ item: "https://jaspermayone.com/friends",
+ },
+ ],
+ },
+ },
+ {
+ "@type": "ItemList",
+ "@id": "https://jaspermayone.com/friends#friend-list",
+ name: "Friends",
+ description: "Friends of Jasper Mayone",
+ numberOfItems: friends.length,
+ itemListElement: friends.map((friend, index) => ({
+ "@type": "ListItem",
+ position: index + 1,
+ item: {
+ "@type": "Person",
+ name: friend.name,
+ ...(friend.image ? { image: `${siteUrl}${friend.image}` } : {}),
+ ...(friend.link ? { url: friend.link } : {}),
+ },
+ })),
+ },
+ ],
+};
+
+function initials(name: string): string {
+ const words = name.split(" ");
+ const first = words[0]?.[0] ?? "";
+ const last = words.length > 1 ? (words[words.length - 1][0] ?? "") : "";
+ return `${first}${last}`.toUpperCase();
+}
+
+export default function Friends() {
+ return (
+ <>
+
+
+
+
+
+
+ Friends
+
+
+ I have some super cool friends, check them all out! 🌟 (btw, shoot
+ me a message if you want to be added here, I definitely missed
+ some people lol.)
+
+
+
+ {friends.map((friend) => {
+ const card = (
+ <>
+ {friend.image ? (
+
+ ) : (
+
+ {initials(friend.name)}
+
+ )}
+
+ {friend.name}
+
+ >
+ );
+
+ return friend.link ? (
+
+ {card}
+
+ ) : (
+
{card}
+ );
+ })}
+
+
+
+
+
+ >
+ );
+}
diff --git a/src/lib/defs.ts b/src/lib/defs.ts
index 1d3c285..759c1dd 100644
--- a/src/lib/defs.ts
+++ b/src/lib/defs.ts
@@ -10,6 +10,7 @@ import {
Appearance,
Conference,
Domain,
+ Friend,
Hackathon,
HardwareItem,
HostedService,
@@ -79,6 +80,7 @@ export const pages: PageItem[] = [
{ text: "Conferences", slug: "conferences", showInNav: false, order: 99 },
{ text: "Hackathons", slug: "hackathons", showInNav: false, order: 99 },
{ text: "Elsewhere", slug: "elsewhere", showInNav: false, order: 99 },
+ { text: "Friends", slug: "friends", showInNav: false, order: 99 },
{ text: "Colophon", slug: "colophon", showInNav: false, order: 8 },
{ text: "Open Source", slug: "open-source", showInNav: false, order: 99 },
{ text: "Blank", slug: "blank", showInNav: false, order: 99 },
@@ -802,6 +804,69 @@ export const appearances: Appearance[] = [
},
];
+export const friends: Friend[] = [
+ {
+ name: "Kieran Klukas",
+ image: "/images/friends/kieran_klukas.png",
+ link: "https://dunkirk.sh/",
+ },
+ {
+ name: "Ryan Di Lorenzo",
+ image: "/images/friends/ryan_di_lorenzo.png",
+ link: "https://github.com/LimesKey",
+ },
+ {
+ name: "Samantha Miel",
+ image: "/images/friends/samantha_miel.png",
+ link: "https://www.instagram.com/cirque_du_samantha/",
+ },
+ {
+ name: "Théo Reid",
+ image: "/images/friends/theo_reid.png",
+ link: "https://www.instagram.com/theointheair/",
+ },
+ {
+ name: "Maclean Dunkin",
+ image: "/images/friends/maclean_dunkin.png",
+ link: "https://www.morizuru.co/",
+ },
+ {
+ name: "Dominic Petrarca",
+ image: "/images/friends/dominic_petrarca.png",
+ link: "https://dominicpetrarca.com/",
+ },
+ {
+ name: "Logan Lambert",
+ image: "/images/friends/logan_lambert.png",
+ link: "https://cattn.dev/",
+ },
+ {
+ name: "Karl Wünsche",
+ },
+ {
+ name: "Clarissa Lambert",
+ },
+ {
+ name: "Tristan Gottshall",
+ },
+ {
+ name: "Jenn Johnsey",
+ image: "/images/friends/jenn_johnsey.png",
+ link: "https://www.linkedin.com/in/jennjohnsey/",
+ },
+ {
+ name: "Zoya Hussain",
+ link: "https://zoya.sh/",
+ },
+ {
+ name: "Heidi Liou",
+ link: "https://www.linkedin.com/in/heidiliou/",
+ },
+ {
+ name: "CJ Kanne",
+ },
+];
+
export const podcasts: Podcast[] = [
{
name: "Mac Power Users",
@@ -1087,6 +1152,12 @@ export const slashPages: SlashPage[] = [
name: "Elsewhere",
description: "Find me on other platforms",
},
+ {
+ slug: "friends",
+ name: "Friends",
+ description:
+ "Some of the super cool people I have the privilege to call friends",
+ },
{
slug: "podroll",
name: "Podroll",
diff --git a/src/lib/types.ts b/src/lib/types.ts
index d4d6b47..92397ec 100644
--- a/src/lib/types.ts
+++ b/src/lib/types.ts
@@ -105,6 +105,12 @@ export interface Podcast {
url: string;
}
+export interface Friend {
+ name: string;
+ image?: string;
+ link?: string;
+}
+
export interface Tool {
emoji: string;
name: string;