- @{profile.user.username}
+
+
+
+ Wrapped
+
+
+ {profile.dateSelection.label}
+
- Shareable output, usage, and model stats from Open Agents.
+ {displayName}
+
+
+
+ @{profile.user.username}
@@ -115,35 +165,38 @@ export async function GET(request: Request, context: OgRouteContext) {
flexDirection: "column",
alignItems: "flex-end",
gap: 16,
+ minWidth: 360,
}}
>
+
- {label}
- {value}
+ {label}
+
+ {value}
+
);
}
@@ -262,28 +311,29 @@ function FeatureCard({
flex: 1,
display: "flex",
flexDirection: "column",
- gap: 12,
- borderRadius: 28,
- padding: 24,
- background: "rgba(15, 23, 42, 0.82)",
- border: "1px solid rgba(148, 163, 184, 0.18)",
+ gap: 10,
+ borderRadius: 16,
+ padding: 20,
+ background: "rgba(255, 255, 255, 0.03)",
+ border: "1px solid rgba(255, 255, 255, 0.08)",
}}
>
{title}
@@ -291,9 +341,9 @@ function FeatureCard({
{detail}
diff --git a/apps/web/app/shared/[shareId]/opengraph-image.tsx b/apps/web/app/shared/[shareId]/opengraph-image.tsx
new file mode 100644
index 000000000..398f48f46
--- /dev/null
+++ b/apps/web/app/shared/[shareId]/opengraph-image.tsx
@@ -0,0 +1,238 @@
+import { ImageResponse } from "next/og";
+import { eq } from "drizzle-orm";
+import { db } from "@/lib/db/client";
+import { users } from "@/lib/db/schema";
+import { getChatById } from "@/lib/db/sessions";
+import {
+ getSessionByIdCached,
+ getShareByIdCached,
+} from "@/lib/db/sessions-cache";
+
+export const alt = "Shared Open Agents session";
+export const size = { width: 1200, height: 630 };
+export const contentType = "image/png";
+
+export default async function Image({
+ params,
+}: {
+ params: Promise<{ shareId: string }>;
+}) {
+ const { shareId } = await params;
+
+ const share = await getShareByIdCached(shareId);
+ if (!share) {
+ return fallbackImage();
+ }
+
+ const chat = await getChatById(share.chatId);
+ if (!chat) {
+ return fallbackImage();
+ }
+
+ const session = await getSessionByIdCached(chat.sessionId);
+ if (!session) {
+ return fallbackImage();
+ }
+
+ const [owner] = await db
+ .select({
+ username: users.username,
+ name: users.name,
+ avatarUrl: users.avatarUrl,
+ })
+ .from(users)
+ .where(eq(users.id, session.userId))
+ .limit(1);
+
+ if (!owner) {
+ return fallbackImage();
+ }
+
+ const displayName = owner.name?.trim() || owner.username;
+ const repoLabel =
+ session.repoOwner && session.repoName
+ ? `${session.repoOwner}/${session.repoName}`
+ : null;
+
+ return new ImageResponse(
+
+
+
+
+
+
+
+
+
+
+ Open Agents
+
+
+
+
+ {chat.title || "Shared Chat"}
+
+
+ {repoLabel ? (
+
+ {repoLabel}
+
+ ) : null}
+
+ {session.branch ? (
+
+ Branch: {session.branch}
+
+ ) : null}
+
+
+
+
+ Shared by {displayName}
+
+
+ open-agents.dev
+
+
+
+
,
+ { ...size },
+ );
+}
+
+function fallbackImage() {
+ return new ImageResponse(
+
+ Shared Open Agents session
+
,
+ { ...size },
+ );
+}
diff --git a/apps/web/public/.well-known/workflow/v1/manifest.json b/apps/web/public/.well-known/workflow/v1/manifest.json
index 7a81c28cb..0c0715132 100644
--- a/apps/web/public/.well-known/workflow/v1/manifest.json
+++ b/apps/web/public/.well-known/workflow/v1/manifest.json
@@ -176,4 +176,4 @@
}
},
"classes": {}
-}
\ No newline at end of file
+}
From 1330bb8608355907d85ffa78ae565c15be254435 Mon Sep 17 00:00:00 2001
From: nicoalbanese <49612682+nicoalbanese@users.noreply.github.com>
Date: Mon, 13 Apr 2026 15:32:47 +0000
Subject: [PATCH 4/4] refactor: set twitter image runtime to edge
---
apps/web/app/twitter-image.tsx | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/apps/web/app/twitter-image.tsx b/apps/web/app/twitter-image.tsx
index 1b687684a..ecffdd060 100644
--- a/apps/web/app/twitter-image.tsx
+++ b/apps/web/app/twitter-image.tsx
@@ -1 +1,3 @@
-export { default, alt, size, contentType, runtime } from "./opengraph-image";
+export { default, alt, size, contentType } from "./opengraph-image";
+
+export const runtime = "edge";