diff --git a/src/components/docs/DocsArticlePage.astro b/src/components/docs/DocsArticlePage.astro
index 894ed169..4280a091 100644
--- a/src/components/docs/DocsArticlePage.astro
+++ b/src/components/docs/DocsArticlePage.astro
@@ -9,6 +9,7 @@ import { DocsTableOfContents } from '@/components/DocsTableOfContents';
import { DocsPageDropdown } from '@/components/DocsPageDropdown';
import { Prose } from '@/components/Prose';
import { DocsLanding } from '@/components/docs/DocsLanding';
+import IntegrationResourceBar from '@/components/docs/IntegrationResourceBar.astro';
import { docsLandings } from '@/components/docs/docsLandings';
import { Icon, faPencil } from '@rivet-gg/icons';
import { sitemap } from '@/sitemap/mod';
@@ -17,6 +18,7 @@ import { findActiveTab, findPageForHref } from '@/lib/sitemap';
import { getContentSlugPath } from '@/lib/content-path';
import { productAccent } from '@/lib/product-accent';
import { getProductMetadata } from '@/sitemap/product-metadata';
+import { integrationFor } from '@/data/integrations';
import * as mdxComponents from '@/components/mdx';
import { jsonLdString } from '@/lib/jsonLd';
import {
@@ -97,6 +99,9 @@ const slugPath = routeSlugOverride ?? getContentSlugPath(routeEntryId);
const landing = docsLandings[entrySlugPath ?? ''];
const isLanding = Boolean(landing);
const fullPath = slugPath ? `${routePrefix}/${slugPath}/` : `${routePrefix}/`;
+const integration = productId && tabId === 'integrations' && slugPath
+ ? integrationFor(productId, slugPath)
+ : undefined;
const discovered = findActiveTab(fullPath, sitemap);
const routeOwnedTab = productId && tabId
? sitemap.find((tab) => tab.href.replace(/\/$/, '') === `/${productId}/${tabId}`)
@@ -222,6 +227,7 @@ const breadcrumbSchema = {
)}
diff --git a/src/components/docs/IntegrationResourceBar.astro b/src/components/docs/IntegrationResourceBar.astro
new file mode 100644
index 00000000..87949500
--- /dev/null
+++ b/src/components/docs/IntegrationResourceBar.astro
@@ -0,0 +1,40 @@
+---
+import { Icon, faGithub } from '@rivet-gg/icons';
+import type { Integration } from '@/data/integrations';
+
+interface Props {
+ integration: Integration;
+}
+
+interface ResourceLink {
+ label: string;
+ href: string;
+}
+
+const { integration } = Astro.props;
+const links: ResourceLink[] = [];
+if (integration.exampleUrl) {
+ links.push({ label: 'Complete example', href: integration.exampleUrl });
+}
+links.push({ label: 'Integration source', href: integration.sourceUrl });
+---
+
+
diff --git a/src/data/integrations.ts b/src/data/integrations.ts
index a5a35bb4..98f5c4fe 100644
--- a/src/data/integrations.ts
+++ b/src/data/integrations.ts
@@ -20,6 +20,8 @@ export interface Integration extends SeoOverrides {
category: string;
icon: { src: string };
badge?: string;
+ exampleUrl?: string;
+ sourceUrl: string;
}
const ACTORS: Integration[] = [
@@ -30,6 +32,8 @@ const ACTORS: Integration[] = [
category: "Agents",
icon: { src: "/images/vendors/flue.svg" },
badge: "Beta",
+ exampleUrl: "https://github.com/rivet-dev/agentos/tree/main/examples/flue",
+ sourceUrl: "https://github.com/rivet-dev/agentos/tree/main/packages/flue",
},
{
title: "Vercel Eve",
@@ -38,6 +42,9 @@ const ACTORS: Integration[] = [
category: "Agents",
icon: { src: "/images/vendors/eve.svg" },
badge: "Beta",
+ exampleUrl:
+ "https://github.com/rivet-dev/agentos/tree/main/examples/vercel-eve",
+ sourceUrl: "https://github.com/rivet-dev/agentos/tree/main/packages/eve",
},
{
title: "Workflow SDK",
@@ -46,13 +53,19 @@ const ACTORS: Integration[] = [
category: "Workflows",
icon: { src: "/images/vendors/workflow.svg" },
badge: "Beta",
+ exampleUrl:
+ "https://github.com/rivet-dev/rivet/tree/main/examples/workflow-sdk",
+ sourceUrl:
+ "https://github.com/rivet-dev/rivet/tree/main/integrations/workflow-world",
},
{
title: "Durable Streams",
- description: "Real-time streams with durable, replayable history, backed by Rivet Actors.",
+ description:
+ "Real-time streams with durable, replayable history, backed by Rivet Actors.",
slug: "durable-streams",
category: "Streams",
icon: { src: "/images/vendors/durable-streams.svg" },
+ sourceUrl: "https://github.com/rivet-dev/rivet-durable-streams",
},
];
@@ -64,6 +77,8 @@ const AGENTOS: Integration[] = [
category: "Frameworks",
icon: { src: "/images/vendors/flue.svg" },
badge: "Beta",
+ exampleUrl: "https://github.com/rivet-dev/agentos/tree/main/examples/flue",
+ sourceUrl: "https://github.com/rivet-dev/agentos/tree/main/packages/flue",
},
{
title: "Vercel Eve",
@@ -72,6 +87,9 @@ const AGENTOS: Integration[] = [
category: "Frameworks",
icon: { src: "/images/vendors/eve.svg" },
badge: "Beta",
+ exampleUrl:
+ "https://github.com/rivet-dev/agentos/tree/main/examples/vercel-eve",
+ sourceUrl: "https://github.com/rivet-dev/agentos/tree/main/packages/eve",
},
{
title: "Rivet Actors",
@@ -79,6 +97,10 @@ const AGENTOS: Integration[] = [
slug: "rivet-actors",
category: "Platform",
icon: { src: "/images/vendors/rivet.svg" },
+ exampleUrl:
+ "https://github.com/rivet-dev/agentos/tree/main/examples/quickstart-app",
+ sourceUrl:
+ "https://github.com/rivet-dev/agentos/tree/main/packages/agentos",
},
];
@@ -92,6 +114,15 @@ export function integrationsFor(productId: string): Integration[] {
return INTEGRATIONS[productId] ?? [];
}
+export function integrationFor(
+ productId: string,
+ slug: string,
+): Integration | undefined {
+ return integrationsFor(productId).find(
+ (integration) => integration.slug === slug,
+ );
+}
+
/**
* Integrations sidebar for a product: an Overview entry, then one section per
* category in first-seen order.
diff --git a/src/styles/main.css b/src/styles/main.css
index e830ece8..351258e0 100644
--- a/src/styles/main.css
+++ b/src/styles/main.css
@@ -504,7 +504,7 @@
flex-shrink: 0;
width: 1.05rem;
height: 1.05rem;
- margin-top: 0.2rem;
+ margin-top: 0.375rem;
}
.mdx-callout__body {
min-width: 0;