Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions apps/web/src/components/home/home-footer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Link } from "@tanstack/react-router";

import AmendLogo from "@/components/amend-logo";
import { docsUrl } from "@/lib/docs-url";
import { otherOpenCoreSites } from "@/lib/opencore-sites";

import { BrandIcon, type BrandName } from "./brand-icons";

Expand All @@ -12,6 +13,9 @@ const SOCIAL: { name: BrandName; label: string; href: string }[] = [
{ name: "x", label: "X", href: "https://x.com/amend_sh" },
];

// Plain followed links on purpose: they share authority between our sites.
const OPENCORE_LINKS = otherOpenCoreSites("https://amend.sh");

export function Footer() {
return (
<section className="relative z-10 overflow-hidden border-t border-border">
Expand Down Expand Up @@ -115,6 +119,30 @@ export function Footer() {
/>
</div>

<nav
aria-labelledby="footer-opencore-label"
className="grid gap-5 border-t border-border py-10"
>
Comment thread
leoisadev1 marked this conversation as resolved.
Resolved
<span
id="footer-opencore-label"
className="amend-mono text-xs uppercase tracking-[0.16em] text-foreground"
>
More from OpenCore
</span>
<ul className="grid gap-x-8 gap-y-3 sm:grid-cols-2 lg:grid-cols-4">
{OPENCORE_LINKS.map((site) => (
<li key={site.url}>
<a
href={site.url}
className="text-sm text-muted-foreground transition-colors duration-150 ease-linear hover:text-foreground"
>
<span className="text-foreground/90">{site.name}</span> {site.description}
</a>
</li>
))}
</ul>
</nav>

{/* Bottom bar */}
<div className="flex flex-col gap-3 border-t border-border py-7 text-xs text-muted-foreground sm:flex-row sm:items-center sm:justify-between">
<span className="amend-mono">© 2026 amend.sh</span>
Expand Down
61 changes: 61 additions & 0 deletions apps/web/src/lib/opencore-sites.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
// Leo's public sites, linked from the footer of each one. Every repo keeps an
// identical copy of this list, so update all of them together. URLs are the
// exact origin each site serves (some redirect apex to www), and the links stay
// plain followed links on purpose.

export interface OpenCoreSite {
readonly name: string;
readonly description: string;
readonly url: string;
}

export const OPENCORE_SITES = [
{
name: "Social SDK",
description: "TypeScript SDK for social APIs",
url: "https://social-sdk.dev",
},
{ name: "Email SDK", description: "Email for TypeScript apps", url: "https://email-sdk.dev" },
{
name: "Domain SDK",
description: "Custom domains for TypeScript",
url: "https://www.domain-sdk.dev",
},
{ name: "SMS SDK", description: "One SDK for SMS providers", url: "https://www.sms-sdk.com" },
{
name: "Sandbox SDK",
description: "One SDK for cloud sandboxes",
url: "https://sandbox-sdk.app",
},
{
name: "Login with ChatGPT",
description: "ChatGPT sign-in for your app",
url: "https://loginwithchatgpt.dev",
},
{
name: "gradients.sh",
description: "Animated gradients for React",
url: "https://gradients.sh",
},
{ name: "dithercn", description: "Dither effects for your app", url: "https://dithercn.dev" },
{ name: "BG0", description: "Background removal on your device", url: "https://bg0.dev" },
{ name: "convt", description: "File conversion on your computer", url: "https://convt.app" },
{ name: "Amend", description: "Close the loop on user requests", url: "https://amend.sh" },
{
name: "agentdrop",
description: "Instant links for agent output",
url: "https://www.agent-drop.co",
},
{
name: "Akeru Bot",
description: "Open-source desktop app for Grok bots",
url: "https://www.akeru-bot.com",
},
{ name: "Leo", description: "The developer behind OpenCore", url: "https://leodev.cv" },
] as const satisfies readonly OpenCoreSite[];

export type OpenCoreSiteUrl = (typeof OPENCORE_SITES)[number]["url"];

/** Every site except the one rendering the footer. */
export const otherOpenCoreSites = (current: OpenCoreSiteUrl): readonly OpenCoreSite[] =>
OPENCORE_SITES.filter((site) => site.url !== current);
Loading