Skip to content
Draft
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
20 changes: 20 additions & 0 deletions web/app/download/download.module.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
.page { min-height: 100dvh; background: var(--bg); color: var(--fg); }
.main { max-width: 980px; margin: 0 auto; padding: 150px 32px 100px; }
.eyebrow { margin: 0 0 24px; font-size: 12px; font-weight: 600; letter-spacing: .12em; color: var(--fg-muted); }
.main h1 { font-size: clamp(40px, 6vw, 68px); font-weight: 500; line-height: 1.08; letter-spacing: -.04em; margin: 0; }
.main h1 em { color: var(--primary); font-weight: 400; }
.description { font-size: 18px; line-height: 1.6; color: var(--fg-muted); margin: 24px 0 36px; }
.downloads { display: flex; flex-wrap: wrap; gap: 20px; }
.option { display: flex; flex-direction: column; gap: 10px; }
.option > span { color: var(--fg-muted); font-size: 12px; }
.download { min-height: 48px; gap: 8px; cursor: pointer; }
.download:focus-visible, .releaseNotes:focus-visible { outline: 2px solid var(--primary); outline-offset: 5px; }
.requirements { margin: 32px 0 8px; font-size: 13px; color: var(--fg-muted); }
.install { margin: 0; font-size: 14px; line-height: 1.6; color: var(--fg-muted); }
.releaseNotes { display: inline-flex; align-items: center; gap: 6px; margin-top: 28px; padding: 8px 0; font-size: 14px; color: var(--fg); text-decoration: underline; text-underline-offset: 4px; }
.releaseNotes:hover { color: var(--primary); }
@media (max-width: 600px) {
.main { padding: 120px 24px 64px; }
.downloads { flex-direction: column; }
.download { justify-content: center; width: 100%; }
}
41 changes: 41 additions & 0 deletions web/app/download/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import type { Metadata } from 'next';
import { ArrowDownToLine } from 'lucide-react';
import { SiteNav } from '../../components/SiteNav';
import { SiteFooter } from '../../components/SiteFooter';
import { desktopDownloads, DESKTOP_RELEASES_URL } from '../../lib/desktop-downloads';
import { absoluteUrl } from '../../lib/site';
import s from './download.module.css';

export const metadata: Metadata = {
title: 'Download Agent Relay for Mac',
description: 'Connect your coding agents to your team with Agent Relay for Mac.',
alternates: { canonical: absoluteUrl('/download') },
};

export default function DownloadPage() {
return (
<div className={s.page}>
<a className="skip-link" href="#main">Skip to content</a>
<SiteNav />
<main id="main" className={s.main}>
<p className={s.eyebrow}>AGENT RELAY FOR MAC</p>
<h1>Get your agents<br /><em>on the relay.</em></h1>
<p className={s.description}>Connect your coding sessions to your team.<br />Choose what you share, right from your menu bar.</p>
<div className={s.downloads}>
{desktopDownloads.map(({ arch, label, detail, href }) => (
<div className={s.option} key={arch}>
<a href={href} className={`btn ${arch === 'arm64' ? 'btn-primary' : 'btn-secondary'} ${s.download}`}>
<ArrowDownToLine size={18} aria-hidden="true" /> Download for {label}
</a>
<span>{detail}</span>
</div>
))}
</div>
<p className={s.requirements}>Requires macOS 13 or later.</p>
<p className={s.install}>Open the download, drag Agent Relay to Applications, then sign in.</p>
<a className={s.releaseNotes} href={DESKTOP_RELEASES_URL}>Release notes &amp; earlier versions <span aria-hidden="true">↗</span></a>
</main>
<SiteFooter />
</div>
);
}
1 change: 1 addition & 0 deletions web/app/sitemap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export default function sitemap(): MetadataRoute.Sitemap {
const now = new Date();

const staticRoutes: MetadataRoute.Sitemap = [
{ url: absoluteUrl('/download'), lastModified: now, changeFrequency: 'monthly', priority: 0.8 },
{ url: absoluteUrl('/teams'), lastModified: now, changeFrequency: 'weekly', priority: 0.9 },
{
url: absoluteUrl('/'),
Expand Down
1 change: 1 addition & 0 deletions web/components/SiteFooter.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ const footerColumns: FooterColumn[] = [
{
title: 'Products',
links: [
{ label: 'Download for Mac', href: '/download' },
{ label: 'Relay Cloud', href: 'https://agentrelay.com/cloud' },
{ label: 'Flows', href: '/flows' },
{ label: 'Skip', href: 'https://heyskip.dev' },
Expand Down
4 changes: 4 additions & 0 deletions web/components/SiteNav.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ export function SiteNav({
<div className={s.navRight}>
{!hideLinks && (
<ul className={s.links}>
<li><Link href="/download" className={s.link}>Download</Link></li>
<li>
<Link href="/docs" className={s.link}>
Docs
Expand Down Expand Up @@ -165,6 +166,9 @@ export function SiteNav({
)}
{!hideLinks && (
<>
<Link href="/download" className={s.mobileLink} onClick={() => setMenuOpen(false)}>
Download
</Link>
<Link href="/blog" className={s.mobileLink} onClick={() => setMenuOpen(false)}>
Blog
</Link>
Expand Down
9 changes: 9 additions & 0 deletions web/lib/desktop-downloads.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
export const DESKTOP_RELEASES_URL = 'https://github.com/AgentWorkforce/relay-desktop-releases/releases';

export const desktopDownloads = [
{ arch: 'arm64', label: 'Apple silicon', detail: 'M1 and later' },
{ arch: 'x64', label: 'Intel', detail: 'Intel-based Macs' },
].map((download) => ({
...download,
href: `${DESKTOP_RELEASES_URL}/latest/download/AgentRelay-macOS-${download.arch}.dmg`,
}));
12 changes: 12 additions & 0 deletions web/lib/test/desktop-downloads.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { describe, expect, it } from 'vitest';
import { desktopDownloads, DESKTOP_RELEASES_URL } from '../desktop-downloads';

describe('desktop distribution links', () => {
it('downloads both Mac builds from the public distribution repo', () => {
expect(desktopDownloads.map(({ href }) => href)).toEqual([
'https://github.com/AgentWorkforce/relay-desktop-releases/releases/latest/download/AgentRelay-macOS-arm64.dmg',
'https://github.com/AgentWorkforce/relay-desktop-releases/releases/latest/download/AgentRelay-macOS-x64.dmg',
]);
expect(DESKTOP_RELEASES_URL).toBe('https://github.com/AgentWorkforce/relay-desktop-releases/releases');
});
});
Loading