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.
11
fork

Configure Feed

Select the types of activity you want to include in your feed.

at be3d05b90928d6059133ad6c260251bca6ac25c8 84 lines 2.5 kB view raw
1{ 2 "name": "tweets-2-bsky", 3 "version": "2.0.0", 4 "description": "A powerful tool to crosspost Tweets to Bluesky, supporting threads, videos, and high-quality images.", 5 "packageManager": "bun@1.3.9", 6 "type": "module", 7 "main": "dist/index.js", 8 "scripts": { 9 "setup": "bun install && bun run build", 10 "prebuild": "bash scripts/ensure-bun.sh", 11 "build": "tsc && vite build", 12 "build:server": "tsc", 13 "build:web": "vite build", 14 "rebuild:native": "bash scripts/rebuild-native.sh", 15 "run:once": "bun dist/index.js --run-once --no-web", 16 "test:twitter-metadata": "bun scripts/test-twitter-profile-metadata.ts", 17 "start": "bun dist/index.js", 18 "cli": "bun src/cli.ts", 19 "dev": "bun src/index.ts", 20 "dev:web": "vite", 21 "import": "bun src/index.ts --import-history", 22 "lint": "biome check --write .", 23 "preview:web": "vite preview", 24 "format": "biome format --write .", 25 "typecheck": "tsc --noEmit" 26 }, 27 "keywords": [ 28 "bluesky", 29 "twitter", 30 "crosspost", 31 "migration", 32 "thread", 33 "video" 34 ], 35 "author": "", 36 "license": "MIT", 37 "dependencies": { 38 "@atproto/api": "^0.18.9", 39 "@google/generative-ai": "^0.24.1", 40 "@the-convocation/twitter-scraper": "^0.21.1", 41 "axios": "^1.13.2", 42 "bcryptjs": "^3.0.3", 43 "better-sqlite3": "^12.5.0", 44 "cheerio": "^1.1.2", 45 "class-variance-authority": "^0.7.1", 46 "clsx": "^2.1.1", 47 "commander": "^14.0.2", 48 "cors": "^2.8.5", 49 "dotenv": "^17.2.3", 50 "express": "^5.2.1", 51 "franc-min": "^6.2.0", 52 "inquirer": "^13.1.0", 53 "iso-639-1": "^3.1.2", 54 "jsonwebtoken": "^9.0.3", 55 "lucide-react": "^0.553.0", 56 "node-cron": "^4.2.1", 57 "puppeteer-core": "^24.34.0", 58 "react": "^19.2.0", 59 "react-dom": "^19.2.0", 60 "sharp": "^0.34.5", 61 "tailwind-merge": "^3.3.1" 62 }, 63 "devDependencies": { 64 "@types/react": "^19.2.6", 65 "@types/react-dom": "^19.2.3", 66 "@vitejs/plugin-react": "^5.1.0", 67 "@biomejs/biome": "^1.9.4", 68 "@types/bcryptjs": "^2.4.6", 69 "@types/better-sqlite3": "^7.6.13", 70 "@types/cheerio": "^0.22.35", 71 "@types/cors": "^2.8.19", 72 "@types/express": "^5.0.6", 73 "@types/inquirer": "^9.0.9", 74 "@types/jsonwebtoken": "^9.0.10", 75 "@types/node": "^22.10.2", 76 "@types/sharp": "^0.31.1", 77 "autoprefixer": "^10.4.21", 78 "postcss": "^8.5.6", 79 "tailwindcss": "^3.4.18", 80 "tsx": "^4.19.2", 81 "typescript": "^5.7.2", 82 "vite": "^7.1.12" 83 } 84}