SPB Git forge

spb/polyllm

Public
15commits 1branches 0releases
2.2 MBsize
maindefault branch
13 days agolast push
TypeScript 97.4% SQL 1% JavaScript 0.9% CSS 0.6%
4.3 KB · 94 lines tsx
Raw Blame History
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