TypeScript 97.4%
SQL 1%
JavaScript 0.9%
CSS 0.6%
1import type { Metadata } from "next";2import Link from "next/link";3import { ArrowRight, ExternalLink, Mail, Server, ShieldCheck, UserRound } from "lucide-react";4import { Button } from "@/components/ui/button";5import { Container, Eyebrow } from "@/components/marketing/section";6import { Reveal } from "@/components/marketing/reveal";78export const metadata: Metadata = {9 title: "Contact",10 description: "How to reach the person behind PolyLLM, where it is hosted, and how to report a security issue.",11 alternates: { canonical: "/contact" },12};1314const CARDS = [15 {16 icon: <Mail />,17 title: "E-mail",18 body: "For questions, bug reports, feature requests or anything about your account.",19 action: (20 <a href="mailto:contact@spboucher.ai" className="inline-flex items-center gap-1.5 font-medium text-accent underline-offset-4 hover:underline">21 contact@spboucher.ai <ArrowRight className="size-4" aria-hidden />22 </a>23 ),24 },25 {26 icon: <UserRound />,27 title: "Who built it",28 body: "PolyLLM is designed, built and operated by Simon-Pierre Boucher. One person, so replies are personal but not instant — expect a day or two.",29 action: <span className="text-fg">Simon-Pierre Boucher</span>,30 },31 {32 icon: <Server />,33 title: "Where it runs",34 body: "PolyLLM is hosted on MacLustr, a private cluster of Apple silicon Macs in Québec, fronted by a dedicated gateway. Your data stays in PolyLLM's own PostgreSQL database.",35 action: (36 <a href="https://www.maclustr.io" target="_blank" rel="noreferrer noopener" className="inline-flex items-center gap-1.5 font-medium text-accent underline-offset-4 hover:underline">37 www.maclustr.io <ExternalLink className="size-3.5" aria-hidden />38 </a>39 ),40 },41 {42 icon: <ShieldCheck />,43 title: "Security reports",44 body: "Found a vulnerability? Write to the same address with “security” in the subject. Please allow a reasonable window before disclosing publicly.",45 action: (46 <Link href="/security" className="inline-flex items-center gap-1.5 font-medium text-accent underline-offset-4 hover:underline">47 Read the security page <ArrowRight className="size-4" aria-hidden />48 </Link>49 ),50 },51];5253export default function ContactPage() {54 return (55 <Container className="py-12 sm:py-20">56 <Reveal className="max-w-2xl">57 <Eyebrow>Contact</Eyebrow>58 <h1 className="mt-3 text-balance text-4xl font-semibold tracking-[-0.03em]">Talk to a person.</h1>59 <p className="mt-4 text-pretty text-base leading-7 text-fg-muted sm:text-lg sm:leading-8">No ticketing system, no chatbot. One e-mail address, read by the person who wrote the code.</p>60 <Button asChild size="lg" className="mt-7 w-full sm:w-auto">61 <a href="mailto:contact@spboucher.ai">62 <Mail /> contact@spboucher.ai63 </a>64 </Button>65 </Reveal>66 <ul className="mt-12 grid gap-x-10 gap-y-9 sm:grid-cols-2">67 {CARDS.map((c, i) => (68 <Reveal key={c.title} as="li" delay={0.04 * i} className="flex gap-3.5">69 <span className="flex size-10 shrink-0 items-center justify-center rounded-xl bg-accent-soft text-accent [&_svg]:size-5">{c.icon}</span>70 <div className="min-w-0">71 <h2 className="text-[16px] font-semibold tracking-tight">{c.title}</h2>72 <p className="mt-1 text-[14.5px] leading-6 text-fg-muted">{c.body}</p>73 <p className="mt-2.5 text-[14px]">{c.action}</p>74 </div>75 </Reveal>76 ))}77 </ul>78 <Reveal delay={0.15} className="mt-14 rounded-2xl bg-bg-subtle p-5 sm:p-6">79 <p className="text-[13px] leading-6 text-fg-muted">80 Provider issues (billing, quotas, a model that misbehaves) are handled by the provider — OpenAI, Anthropic, Google, xAI, Mistral, DeepSeek, Moonshot AI, OpenRouter or Cerebras — under your own account with them. PolyLLM never resells model access. See the{" "}81 <Link href="/privacy" className="text-accent underline-offset-4 hover:underline">82 privacy policy83 </Link>{" "}84 and{" "}85 <Link href="/terms" className="text-accent underline-offset-4 hover:underline">86 terms87 </Link>88 .89 </p>90 </Reveal>91 </Container>92 );93}94