Released: January 31, 2026
Enhanced Signal Deck with full Bluesky rescan capabilities, improved UX for status management, and fixed a critical bug where talk OG images were incorrectly falling back to YouTube thumbnails.
Per-Share Rescan Button
- Added rescan button (🔄) for Bluesky shares that fetches fresh data from the platform
- Rescan harvests: post text (saved as Notes), actual posted date, TarotTALKS URL extraction
- Automatically resolves cardId/talkId from extracted URLs
- Sets status to "verified" after successful rescan
- Available in both ShareRow (Shares list) and MentionRow (Mentions inbox)
Status Workflow Enhancements
- Added descriptive tooltips to all status badges explaining each status
- Made "posted" status clickable to one-click convert to "verified"
- Status tooltips: draft, posted, verified, discovered, acknowledged
Platform Auto-Detection
- NewShareForm now auto-detects platform from post URL
- Supports: bsky.app → Bluesky, x.com/twitter.com → X, threads.net → Threads, linkedin.com → LinkedIn
- Shows warning with "Fix it" button when detected platform doesn't match selected
Visual Improvements
- ShareRow now displays card/talk images based on linked content
- Shows card image for card shares, talk thumbnail for talk shares
- Platform badge overlays the content image
New getFullPostData Function
- Fetches complete post data: text, createdAt, author info, metrics
- Used by rescan feature to harvest all post details
- Added
getFullPostDataFromUrlconvenience wrapper
Problem: Talk share images on social platforms were showing YouTube thumbnails instead of custom thumbnails stored in the database.
Root Cause: The getThumbnailUrl function prioritized YouTube fallback over non-Supabase URLs, even when a valid thumbnailUrl was stored.
Solution:
- Simplified thumbnail selection: if
thumbnailUrlis set in database, use it - Only fall back to YouTube when
thumbnailUrlis null/empty - Now matches Signal Deck behavior (which shows database thumbnailUrl directly)
- Added
revalidate = 0to OG image generation to prevent caching stale data
Files Changed:
lib/utils/thumbnails.ts- Simplified priority logicapp/talks/[slug]/page.tsx- Point to generated OG image instead of raw thumbnailapp/talks/[slug]/opengraph-image.tsx- Added revalidate and logging
Added comprehensive logging throughout thumbnail selection:
[Talk OG Image]- Raw data from database[getThumbnailUrl]- Selection logic path taken[isSupabaseStorageUrl]- Supabase URL detection- Filter Vercel logs by these prefixes to debug thumbnail issues
CLAUDE.md
- Added "Useful External Tools" section with social media debuggers:
- X/Twitter Card Validator: https://www.xcardvalidator.com/
- Facebook Sharing Debugger: https://developers.facebook.com/tools/debug/
- LinkedIn Post Inspector: https://www.linkedin.com/post-inspector/
components/admin/signal-deck/ShareRow.tsx- Rescan button, status tooltips, content imagescomponents/admin/signal-deck/MentionRow.tsx- Rescan button, tooltipscomponents/admin/signal-deck/NewShareForm.tsx- Platform auto-detection
app/api/admin/social-shares/[id]/rescan/route.ts- Full rescan implementationapp/api/admin/mentions/route.ts- Save post text as notes
lib/services/bluesky.ts-getFullPostData,getFullPostDataFromUrllib/utils/thumbnails.ts- Simplified selection logic with logginglib/supabase/server.ts- Added logging toisSupabaseStorageUrl
app/talks/[slug]/page.tsx- Use generated OG image URLapp/talks/[slug]/opengraph-image.tsx- Logging, revalidate=0
CLAUDE.md- External tools section
After deployment, verify:
- Rescan button on Bluesky shares fetches fresh data
- Talk OG images show database thumbnail (not YouTube fallback)
- Use card validators to refresh cached previews
- Check Vercel logs for
[getThumbnailUrl]entries if issues persist