import type { Metadata } from "next" import type { ReactNode } from "react" import Image from "next/image" import { getTranslations, setRequestLocale } from "next-intl/server" import { BookOpen, Code2, ExternalLink, FlaskRound, GitPullRequest, Heart, Languages, Youtube } from "lucide-react" import { DocHeader } from "@/components/ui/doc-header" import { Callout } from "@/components/ui/callout" const REPOSITORY = "https://github.com/MacRimi/ProxMenux" const activeContributors = ["Vaso73", "f3rs3n", "jcastro"] as const // Human authors of merged PRs and code contributions, checked on 2026-10-25. // Alphabetical, without commit rankings. Ongoing contributors are credited above. const codeContributors = [ "byGarcia", "cod378", "detlefs", "fklnc94", "MrCaringi", "pbr85", "pespinel", "phyrexia", "riri-314", "yeager", ] const earlyContributors = [ { name: "MALOW", avatar: "malow.png" }, { name: "Segarra", avatar: "segarra.png" }, { name: "Aprilia", avatar: "aprilia.png" }, { name: "Jonatan Castro", avatar: "jonatancastro.png", github: "jcastro", youtube: "https://www.youtube.com/@JonatanCastro" }, { name: "Kamunhas", avatar: "Kamunhas.png" }, { name: "heriberto", avatar: "heriberto.png" }, { name: "JF_Car", avatar: "JF_Car.png" }, { name: "rafapuerta", avatar: "rafapuerta.png" }, { name: "JcMinarro", avatar: "JcMinarro.png" }, ] function contributionsUrl(login: string) { return REPOSITORY + "/pulls?q=" + encodeURIComponent("is:pr is:merged author:" + login) } function External({ href, children, className = "" }: { href: string; children: ReactNode; className?: string }) { return {children} } export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise { const { locale } = await params const t = await getTranslations({ locale, namespace: "docs.about.contributors.meta" }) return { title: t("title"), description: t("description"), openGraph: { title: t("ogTitle"), description: t("ogDescription"), type: "article", url: "https://proxmenux.com/" + locale + "/docs/about/contributors/", }, } } export default async function ContributorsPage({ params }: { params: Promise<{ locale: string }> }) { const { locale } = await params setRequestLocale(locale) const t = await getTranslations({ locale, namespace: "docs.about.contributors" }) const ways = [ { key: "code", Icon: Code2 }, { key: "testing", Icon: FlaskRound }, { key: "translations", Icon: Languages }, { key: "docs", Icon: BookOpen }, ] as const const heading = "mb-3 text-2xl font-semibold text-gray-900" const paragraph = "mb-6 leading-relaxed text-gray-700" return (

{t("active.heading")}

{t("active.intro")}

{activeContributors.map((login) => (

{login}

{t("active.people." + login)}

))}

{t("code.heading")}

{t("code.intro")}

    {codeContributors.map((login) => (
  • {login} {t("code.viewWork")}: {login}
  • ))}
{t("code.history")} {t("code.merged")}

{t("community.heading")}

{t("community.body")}

{t("community.languages")}

{t("testers.heading")}

{t("testers.intro")}

    {earlyContributors.map((person) => (
  • {person.github ? {person.name} : person.name}

    {person.youtube && }
  • ))}

{t("contribute.heading")}

{t("contribute.intro")}

    {ways.map(({ key, Icon }) => (
  • ))}
{t("contribute.guide")} {t("contribute.discuss")}

) }