From dfefc26aeae1e24840970426ad08adbc5f675330 Mon Sep 17 00:00:00 2001
From: lemma <>
Date: Wed, 10 Jun 2026 00:46:18 -0500
Subject: [PATCH] Show author handle on publication cards.
Store resolvedHandle on publication DynamoDB records (indexer, backfill, API createPublication) and return it from listPublications and listSuggestions
---
app/components/PublicationCard.tsx | 6 ++++--
app/lib/api-client.ts | 4 +++-
app/routes/suggestions.tsx | 4 ++--
infra/api/src/index.ts | 8 ++++++--
infra/backfill/src/index.ts | 7 +++++--
infra/indexer/src/index.ts | 2 ++
6 files changed, 22 insertions(+), 9 deletions(-)
diff --git a/app/components/PublicationCard.tsx b/app/components/PublicationCard.tsx
index 66c7951..47c2338 100644
--- a/app/components/PublicationCard.tsx
+++ b/app/components/PublicationCard.tsx
@@ -3,7 +3,7 @@ import { Link } from 'react-router'
import { RssIcon } from '@heroicons/react/24/outline'
interface Props {
- pub: { atUri: string; name: string; url: string; description?: string }
+ pub: { atUri: string; name: string; url: string; description?: string; authorHandle?: string }
action?: React.ReactNode
}
@@ -28,7 +28,9 @@ export default function PublicationCard({ pub, action }: Props) {
) : (
{pub.name}
)}
-
{new URL(pub.url).host}
+
+ {new URL(pub.url).host}{pub.authorHandle && ` ยท @${pub.authorHandle}`}
+
{pub.description && (
{pub.description}
)}
diff --git a/app/lib/api-client.ts b/app/lib/api-client.ts
index 8572326..22c544e 100644
--- a/app/lib/api-client.ts
+++ b/app/lib/api-client.ts
@@ -28,6 +28,7 @@ export type Publication = {
url: string
name: string
description?: string
+ authorHandle?: string
preferences: { showInDiscover: boolean }
}
@@ -102,6 +103,7 @@ export type SuggestionItem = {
pubName: string
pubUrl: string
pubDescription?: string
+ authorHandle?: string
}
export type TimelineItem = {
@@ -1386,7 +1388,7 @@ export async function listSuggestions(session: OAuthSession): Promise,
+ pubs: Array<{ pubAtUri: string; rkey: string; authorDid: string; pubName: string; pubUrl: string; pubDescription?: string; authorHandle?: string }>,
): Promise<{ added: number }> {
const pdsUrl = await resolvePdsUrl(session.sub)
const token = await getServiceToken(session, pdsUrl)
diff --git a/app/routes/suggestions.tsx b/app/routes/suggestions.tsx
index 0ae71a0..d6859a1 100644
--- a/app/routes/suggestions.tsx
+++ b/app/routes/suggestions.tsx
@@ -104,7 +104,7 @@ export default function Suggestions() {
const authorDid = pub.atUri.slice('at://'.length).split('/')[0]
if (!rkey || authorDid === session.sub) continue
if (subscriptions?.some((s) => s.publicationAtUri === pub.atUri)) continue
- candidates.push({ pubAtUri: pub.atUri, rkey, authorDid, pubName: pub.name, pubUrl: pub.url, pubDescription: pub.description })
+ candidates.push({ pubAtUri: pub.atUri, rkey, authorDid, pubName: pub.name, pubUrl: pub.url, pubDescription: pub.description, authorHandle: pub.authorHandle })
}
}
}
@@ -233,7 +233,7 @@ export default function Suggestions() {
return (