From b591267b81ded2df7017a14a172f7d07ce20540f Mon Sep 17 00:00:00 2001 From: Jeff Emmett Date: Thu, 5 Mar 2026 21:04:58 -0800 Subject: [PATCH] feat: remove title/header image, add Twitter-style link previews Remove the title input and header image upload/generate section from the thread builder editor. Title is now auto-derived from first tweet. Add link preview cards that render inline in tweet content, similar to Twitter's URL card unfurling. Server-side /api/link-preview endpoint fetches OG metadata (title, description, image) with caching. URLs in tweet text are rendered as clickable links. Co-Authored-By: Claude Opus 4.6 --- .../components/folk-thread-builder.ts | 268 ++++++++---------- server/index.ts | 66 +++++ 2 files changed, 178 insertions(+), 156 deletions(-) diff --git a/modules/rsocials/components/folk-thread-builder.ts b/modules/rsocials/components/folk-thread-builder.ts index dabf3b4..41426a1 100644 --- a/modules/rsocials/components/folk-thread-builder.ts +++ b/modules/rsocials/components/folk-thread-builder.ts @@ -32,6 +32,7 @@ export class FolkThreadBuilder extends HTMLElement { private _offlineUnsub: (() => void) | null = null; private _offlineReady: Promise | null = null; private _tweetImageUploadIdx: string | null = null; + private _linkPreviewCache: Map = new Map(); // SVG icons private svgReply = ''; @@ -217,6 +218,7 @@ export class FolkThreadBuilder extends HTMLElement { const tweetImgHtml = tweetImgUrl ? `
Tweet image
` : ''; + const linkCards = this.extractLinkCards(text); return `
${connector}
@@ -226,8 +228,9 @@ export class FolkThreadBuilder extends HTMLElement { · ${this.esc(dateStr)}
-

${this.esc(text)}

+

${this.renderTweetContent(text)}

${tweetImgHtml} + ${linkCards} - ${t.title ? `

${this.esc(t.title)}

` : ''} - ${imageHTML}
${tweetCards}
Edit Thread @@ -324,17 +321,6 @@ export class FolkThreadBuilder extends HTMLElement {
-
- -
- Preview -
-
- - -
-
-
@@ -397,6 +383,7 @@ export class FolkThreadBuilder extends HTMLElement {
` : ''; + const linkCards = this.extractLinkCards(text); return `
${connector} ${photoBtn} @@ -407,8 +394,9 @@ export class FolkThreadBuilder extends HTMLElement { · now
-

${this.esc(text)}

+

${this.renderTweetContent(text)}

${imgHtml} + ${linkCards}