+ );
+}
diff --git a/app/_components/sample-app-card.tsx b/app/_components/sample-app-card.tsx
index b94fe7f47..92d409778 100644
--- a/app/_components/sample-app-card.tsx
+++ b/app/_components/sample-app-card.tsx
@@ -12,8 +12,38 @@ type SampleAppCardProps = {
blank?: boolean;
tags?: string[];
date?: string;
+ // When there's no `image`, render a generated gradient header with a monogram
+ // so cards still have a visual anchor. Opt-in so other usages stay unchanged.
+ fallbackVisual?: boolean;
};
+// Tinted gradients that read well on both light and dark surfaces.
+const FALLBACK_GRADIENTS = [
+ "from-emerald-500/30 to-teal-600/10",
+ "from-violet-500/30 to-fuchsia-600/10",
+ "from-amber-500/30 to-orange-600/10",
+ "from-sky-500/30 to-blue-600/10",
+ "from-rose-500/30 to-pink-600/10",
+ "from-lime-500/30 to-green-600/10",
+];
+const MONOGRAM_WORDS = 2;
+const WHITESPACE = /\s+/;
+
+function monogram(title: string): string {
+ return title
+ .trim()
+ .split(WHITESPACE)
+ .slice(0, MONOGRAM_WORDS)
+ .map((word) => word.charAt(0))
+ .join("")
+ .toUpperCase();
+}
+
+function gradientFor(title: string): string {
+ const sum = [...title].reduce((acc, ch) => acc + ch.charCodeAt(0), 0);
+ return FALLBACK_GRADIENTS[sum % FALLBACK_GRADIENTS.length];
+}
+
export function SampleAppCard({
title,
description,
@@ -22,6 +52,7 @@ export function SampleAppCard({
blank = false,
tags = [],
date,
+ fallbackVisual = false,
}: SampleAppCardProps) {
const handleClick = () => {
posthog.capture("Sample app clicked", {
@@ -57,6 +88,15 @@ export function SampleAppCard({
/>
)}
+ {!image && fallbackVisual && (
+
+
+ {monogram(title)}
+
+
+ )}
diff --git a/app/en/resources/examples/_meta.tsx b/app/en/resources/examples/_meta.tsx
new file mode 100644
index 000000000..a98f4b9ae
--- /dev/null
+++ b/app/en/resources/examples/_meta.tsx
@@ -0,0 +1,24 @@
+import type { MetaRecord } from "nextra";
+
+// Nest the outcome buckets under "Examples" in the sidebar. Each is a link to
+// the matching section anchor on the gallery page (ids set by `levelId` in
+// examples-gallery.tsx). The parent "Examples" still opens the full gallery.
+const meta: MetaRecord = {
+ index: {
+ title: "Overview",
+ },
+ connect: {
+ title: "Connect",
+ href: "/en/resources/examples#level-connect",
+ },
+ automate: {
+ title: "Automate",
+ href: "/en/resources/examples#level-automate",
+ },
+ orchestrate: {
+ title: "Orchestrate",
+ href: "/en/resources/examples#level-orchestrate",
+ },
+};
+
+export default meta;
diff --git a/app/en/resources/examples/examples-data.ts b/app/en/resources/examples/examples-data.ts
new file mode 100644
index 000000000..9d0280e76
--- /dev/null
+++ b/app/en/resources/examples/examples-data.ts
@@ -0,0 +1,193 @@
+export type ExampleType = "Sample app" | "MCP server";
+
+// Outcome-driven skill levels (beginner -> advanced). The gallery groups
+// examples into these buckets so a developer can find the right starting point
+// for what they're trying to achieve, not just filter by tech.
+export type ExampleLevel = "Connect" | "Automate" | "Orchestrate";
+
+export type LevelMeta = {
+ level: ExampleLevel;
+ // Short difficulty label shown as a badge.
+ tier: string;
+ // Plain-English outcome: what you can do after working through this level.
+ outcome: string;
+};
+
+// Order here defines the order the buckets render in (beginner first).
+export const LEVELS: LevelMeta[] = [
+ {
+ level: "Connect",
+ tier: "Beginner",
+ outcome:
+ "Authorize an agent and make its first real tool call in a live app.",
+ },
+ {
+ level: "Automate",
+ tier: "Intermediate",
+ outcome:
+ "Ship an agent that finishes a real task across your apps, end to end.",
+ },
+ {
+ level: "Orchestrate",
+ tier: "Advanced",
+ outcome:
+ "Go further with multi-agent systems, frameworks, and per-user auth in production.",
+ },
+];
+
+export type ExampleItem = {
+ title: string;
+ description: string;
+ href: string;
+ tags: string[];
+ date: string;
+ type: ExampleType;
+ // Outcome-driven skill level used to group the gallery.
+ level: ExampleLevel;
+ // Optional cover art (served from /public). Cards fall back to a generated
+ // gradient + monogram when this is omitted.
+ image?: string;
+ // Set on one entry to spotlight it in a large hero above the grid. If more
+ // than one is flagged, the newest wins.
+ featured?: boolean;
+};
+
+// To feature your project, add an entry below following the existing pattern.
+// `date` uses "Mon YYYY"; the gallery sorts newest-first within each level.
+// `level` places it in a bucket: "Connect" (beginner), "Automate"
+// (intermediate), or "Orchestrate" (advanced).
+export const EXAMPLES: ExampleItem[] = [
+ {
+ title: "Baseball dugout",
+ description:
+ "Ask about any player and the agent researches them, then emails you a full scouting report, all from one conversation.",
+ href: "https://github.com/ArcadeAI/baseball-dugout",
+ tags: ["JavaScript", "GitHub", "Email"],
+ date: "Dec 2025",
+ type: "Sample app",
+ level: "Automate",
+ image: "/images/examples/example-baseball-dugout.jpg",
+ featured: true,
+ },
+ {
+ title: "Agent Templates",
+ description:
+ "Copy-paste starting points for common agent use cases, so you can stand up your first working agent in minutes.",
+ href: "https://github.com/ArcadeAI/agent-templates",
+ tags: ["Python"],
+ date: "Dec 2025",
+ type: "Sample app",
+ level: "Connect",
+ image: "/images/examples/example-agent-templates.jpg",
+ },
+ {
+ title: "OpenAI Agents SDK + Arcade MCP Gateway",
+ description:
+ "Give an OpenAI Agents SDK app instant, authorized access to hundreds of tools through a single Arcade gateway.",
+ href: "https://github.com/ArcadeAI/openaisdk-mcpgateway",
+ tags: ["TypeScript", "OpenAI"],
+ date: "Nov 2025",
+ type: "Sample app",
+ level: "Orchestrate",
+ image: "/images/examples/example-openai-mcp-gateway.jpg",
+ },
+ {
+ title: "Agent Kitchen Sink",
+ description:
+ "One TypeScript app that wires up many tools, auth flows, and integrations to show everything an agent can do with Arcade.",
+ href: "https://github.com/ArcadeAI/agent-kitchen-sink-typescript",
+ tags: ["TypeScript"],
+ date: "Nov 2025",
+ type: "Sample app",
+ level: "Orchestrate",
+ image: "/images/examples/example-agent-kitchen-sink.jpg",
+ },
+ {
+ title: "Arcade Custom Verifier for Next.js apps",
+ description:
+ "Drop-in user verification for Next.js apps, so your own users can securely connect their accounts.",
+ href: "https://github.com/ArcadeAI/arcade-custom-verifier-next",
+ tags: ["TypeScript", "Next.js"],
+ date: "Aug 2025",
+ type: "Sample app",
+ level: "Connect",
+ image: "/images/examples/example-custom-verifier-next.jpg",
+ },
+ {
+ title: "Agency Tutorial with Stytch",
+ description:
+ "Build an app where agents act for each signed-in user, with Stytch handling login and Arcade handling tool access.",
+ href: "https://github.com/ArcadeAI/agency-tutorial-stytch",
+ tags: ["TypeScript", "Stytch"],
+ date: "Aug 2025",
+ type: "Sample app",
+ level: "Connect",
+ image: "/images/examples/example-agency-stytch.jpg",
+ },
+ {
+ title: "Arcade CLI Agent Template",
+ description:
+ "A minimal terminal agent you can talk to, so you can start building command-line tools fast.",
+ href: "https://github.com/ArcadeAI/cli-agent-template",
+ tags: ["TypeScript"],
+ date: "Jul 2025",
+ type: "Sample app",
+ level: "Connect",
+ image: "/images/examples/example-cli-agent-template.jpg",
+ },
+ {
+ title: "Megaforce",
+ description:
+ "Turn one piece of content into platform-ready posts for every social channel, automatically.",
+ href: "https://github.com/ArcadeAI/megaforce",
+ tags: ["TypeScript"],
+ date: "Jul 2025",
+ type: "Sample app",
+ level: "Automate",
+ image: "/images/examples/example-megaforce.jpg",
+ },
+ {
+ title: "Human-in-the-loop (HITL) Agent Frameworks Showdown",
+ description:
+ "Put a human in the loop before agents act, with the same approval workflow built three ways (LangGraph, OpenAI Agents SDK, Google ADK) so you can compare.",
+ href: "https://github.com/ArcadeAI/framework-showdown",
+ tags: ["TypeScript"],
+ date: "May 2025",
+ type: "Sample app",
+ level: "Orchestrate",
+ image: "/images/examples/example-hitl-showdown.jpg",
+ },
+ {
+ title: "YouTube Transcript Bot",
+ description:
+ "Drop a YouTube link in Slack and get an instant, searchable summary, with transcripts fetched, summarized, and stored in Weaviate.",
+ href: "https://github.com/dforwardfeed/slack-AIpodcast-summaries",
+ tags: ["Python", "Langchain", "Slack", "Weaviate"],
+ date: "Mar 2025",
+ type: "Sample app",
+ level: "Automate",
+ image: "/images/examples/example-youtube-transcript.jpg",
+ },
+ {
+ title: "Archer: Agentic Slack Assistant",
+ description:
+ "Run your day from Slack with one assistant that handles Google Calendar, Gmail, GitHub, and web research on your behalf.",
+ href: "https://github.com/ArcadeAI/ArcadeSlackAgent",
+ tags: ["JavaScript", "Slack"],
+ date: "Oct 2024",
+ type: "Sample app",
+ level: "Automate",
+ image: "/images/examples/example-archer-slack.jpg",
+ },
+ {
+ title: "Granola MCP Server",
+ description:
+ "Give any AI client access to your Granola meeting notes and transcripts through a clean MCP server you can build on.",
+ href: "https://github.com/ArcadeAI/granola-mcp-server",
+ tags: ["Python"],
+ date: "Mar 2026",
+ type: "MCP server",
+ level: "Connect",
+ image: "/images/examples/example-granola-mcp.jpg",
+ },
+];
diff --git a/app/en/resources/examples/page.mdx b/app/en/resources/examples/page.mdx
index 1aefa332e..0c3a56299 100644
--- a/app/en/resources/examples/page.mdx
+++ b/app/en/resources/examples/page.mdx
@@ -5,168 +5,30 @@ description: "Example apps and MCP servers using Arcade's tools and MCP servers
## Examples
-Get up and running faster with ready-to-use example repositories.
+import { ExamplesGallery } from "../../../_components/examples-gallery";
-Browse sample apps and MCP servers to see how Arcade works in practice, then fork them as a starting point or use them as a reference while building your own projects and integrations.
+
-import { SampleAppCard } from "../../../_components/sample-app-card";
-import { Tabs } from "nextra/components";
+### Submit your example
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-### Submit your app
-
-Built something with Arcade? The team would love to feature it! Submit your app by creating a pull request to the documentation site.
+Built something with Arcade? The team would love to feature it! Submit your sample app or MCP server by creating a pull request to the documentation site.
#### Guidelines
-- **Open source**: Your app should be publicly available on GitHub
-- **Uses Arcade**: Your app should integrate with Arcade's tools, MCP servers, or SDK
-- **Working demo**: Include clear setup instructions and ensure your app runs
+- **Open source**: Your project should be publicly available on GitHub
+- **Uses Arcade**: Your project should integrate with Arcade's tools, MCP servers, auth, or SDK
+- **Working demo**: Include clear setup instructions and ensure your project runs
- **Good documentation**: Provide a clear README with installation and usage instructions
-- **Appropriate content**: Family friendly and professional applications only
+- **Appropriate content**: Family friendly and professional projects only
#### How to submit
1. Fork the [Arcade docs repository](https://github.com/ArcadeAI/docs)
-2. Add your app to `/app/en/resources/examples/page.mdx` following the existing pattern
-3. Include a descriptive title, clear description, and appropriate tags
-4. Create a pull request with details about your app and its Arcade integration
-5. The team will review and potentially feature your app
+2. Add an entry to `/app/en/resources/examples/examples-data.ts` following the existing pattern, setting `type` to either `"Sample app"` or `"MCP server"` and `level` to `"Connect"` (beginner), `"Automate"` (intermediate), or `"Orchestrate"` (advanced)
+3. Write a benefit-first description (lead with what the user can _do_, not how it's built), plus a descriptive title, appropriate tags, and the release date
+4. Create a pull request with details about your project and its Arcade integration
+5. The team will review and potentially feature your project
#### Need help?
-If you have questions about submitting your app, feel free to [contact the team](/resources/contact-us) or open an issue in the docs repository.
-
-
-
-
-
-
-
-
-### Submit your MCP server
-
-Built an MCP server with Arcade? The team would love to feature it! Submit your server by creating a pull request to the documentation site.
-
-#### Guidelines
-
-- **Open source**: Your MCP server should be publicly available on GitHub
-- **Uses Arcade**: Your server should integrate with Arcade's tools, auth, or SDK
-- **Working demo**: Include clear setup instructions and ensure your server runs
-- **Good documentation**: Provide a clear README with installation and usage instructions
-- **Appropriate content**: Family friendly and professional servers only
-
-#### How to submit
-
-1. Fork the [Arcade docs repository](https://github.com/ArcadeAI/docs)
-2. Add your server to `/app/en/resources/examples/page.mdx` following the existing pattern
-3. Include a descriptive title, clear description, and appropriate tags
-4. Create a pull request with details about your server, its Arcade integration, and a link to the public repository.
-5. The team will review and potentially feature your server
-
-#### Need help?
-
-If you have questions about submitting your MCP server, feel free to [contact the team](/resources/contact-us) or open an issue in the docs repository.
-
-
-
+If you have questions about submitting your project, feel free to [contact the team](/resources/contact-us) or open an issue in the docs repository.
diff --git a/app/globals.css b/app/globals.css
index e0a653de7..35abda5e3 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -216,6 +216,24 @@ nav > div:has(.algolia-search-button) {
}
}
+/* Subtle "alive" glow on the Examples overview goal cards. Staggered per card
+ * via inline animation-delay; disabled for reduced-motion users. */
+@media (prefers-reduced-motion: no-preference) {
+ @keyframes goal-pulse {
+ 0%,
+ 100% {
+ box-shadow: 0 0 0 0 transparent;
+ }
+ 50% {
+ box-shadow: 0 0 24px 2px color-mix(in oklch, var(--brand-accent) 32%, transparent);
+ }
+ }
+
+ .goal-pulse-card {
+ animation: goal-pulse 2.8s ease-in-out infinite;
+ }
+}
+
/* Only number h3 (###) in Steps component, not smaller nested headings */
.nextra-steps h4,
.nextra-steps h5,
diff --git a/public/images/examples/example-agency-stytch.jpg b/public/images/examples/example-agency-stytch.jpg
new file mode 100644
index 000000000..226d1ad02
Binary files /dev/null and b/public/images/examples/example-agency-stytch.jpg differ
diff --git a/public/images/examples/example-agent-kitchen-sink.jpg b/public/images/examples/example-agent-kitchen-sink.jpg
new file mode 100644
index 000000000..ad9758afb
Binary files /dev/null and b/public/images/examples/example-agent-kitchen-sink.jpg differ
diff --git a/public/images/examples/example-agent-templates.jpg b/public/images/examples/example-agent-templates.jpg
new file mode 100644
index 000000000..7b62896c7
Binary files /dev/null and b/public/images/examples/example-agent-templates.jpg differ
diff --git a/public/images/examples/example-archer-slack.jpg b/public/images/examples/example-archer-slack.jpg
new file mode 100644
index 000000000..df4ffb8c6
Binary files /dev/null and b/public/images/examples/example-archer-slack.jpg differ
diff --git a/public/images/examples/example-baseball-dugout.jpg b/public/images/examples/example-baseball-dugout.jpg
new file mode 100644
index 000000000..f7f9f2401
Binary files /dev/null and b/public/images/examples/example-baseball-dugout.jpg differ
diff --git a/public/images/examples/example-cli-agent-template.jpg b/public/images/examples/example-cli-agent-template.jpg
new file mode 100644
index 000000000..694e1f4b6
Binary files /dev/null and b/public/images/examples/example-cli-agent-template.jpg differ
diff --git a/public/images/examples/example-custom-verifier-next.jpg b/public/images/examples/example-custom-verifier-next.jpg
new file mode 100644
index 000000000..6eb93e146
Binary files /dev/null and b/public/images/examples/example-custom-verifier-next.jpg differ
diff --git a/public/images/examples/example-granola-mcp.jpg b/public/images/examples/example-granola-mcp.jpg
new file mode 100644
index 000000000..ab1615ae7
Binary files /dev/null and b/public/images/examples/example-granola-mcp.jpg differ
diff --git a/public/images/examples/example-hitl-showdown.jpg b/public/images/examples/example-hitl-showdown.jpg
new file mode 100644
index 000000000..884df958c
Binary files /dev/null and b/public/images/examples/example-hitl-showdown.jpg differ
diff --git a/public/images/examples/example-megaforce.jpg b/public/images/examples/example-megaforce.jpg
new file mode 100644
index 000000000..2b847e474
Binary files /dev/null and b/public/images/examples/example-megaforce.jpg differ
diff --git a/public/images/examples/example-openai-mcp-gateway.jpg b/public/images/examples/example-openai-mcp-gateway.jpg
new file mode 100644
index 000000000..b245b1e5b
Binary files /dev/null and b/public/images/examples/example-openai-mcp-gateway.jpg differ
diff --git a/public/images/examples/example-youtube-transcript.jpg b/public/images/examples/example-youtube-transcript.jpg
new file mode 100644
index 000000000..669038d10
Binary files /dev/null and b/public/images/examples/example-youtube-transcript.jpg differ