A simple tool which lets you scrape twitter accounts and crosspost them to bluesky accounts! Comes with a CLI and a webapp for managing profiles! Works with images/videos/link embeds/threads.

fix: only add fallback links when necessary

jack 500e78bc 2e27c7b8

+2
+2
src/index.ts
··· 591 console.log(`[${twitterUsername}] ๐Ÿ”„ Found quoted tweet in local history.`); 592 quoteEmbed = { $type: 'app.bsky.embed.record', record: { uri: quoteRef.uri, cid: quoteRef.cid } }; 593 } else { 594 const quoteUrlEntity = urls.find((u) => u.expanded_url?.includes(quoteId)); 595 externalQuoteUrl = quoteUrlEntity?.expanded_url || `https://twitter.com/i/status/${quoteId}`; 596 console.log(`[${twitterUsername}] ๐Ÿ”— Quoted tweet is external: ${externalQuoteUrl}`); 597 } 598 } 599 600 if (externalQuoteUrl && !text.includes(externalQuoteUrl)) { 601 text += `\n\nQT: ${externalQuoteUrl}`; 602 }
··· 591 console.log(`[${twitterUsername}] ๐Ÿ”„ Found quoted tweet in local history.`); 592 quoteEmbed = { $type: 'app.bsky.embed.record', record: { uri: quoteRef.uri, cid: quoteRef.cid } }; 593 } else { 594 + // If it's NOT in our managed account history, it's external 595 const quoteUrlEntity = urls.find((u) => u.expanded_url?.includes(quoteId)); 596 externalQuoteUrl = quoteUrlEntity?.expanded_url || `https://twitter.com/i/status/${quoteId}`; 597 console.log(`[${twitterUsername}] ๐Ÿ”— Quoted tweet is external: ${externalQuoteUrl}`); 598 } 599 } 600 601 + // Only append link for external quotes 602 if (externalQuoteUrl && !text.includes(externalQuoteUrl)) { 603 text += `\n\nQT: ${externalQuoteUrl}`; 604 }