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.
···2233> **Note**: This project is built on top of [**bird**](https://github.com/steipete/bird) by [@steipete](https://github.com/steipete), which provides the core Twitter interaction capabilities.
4455-A powerful tool to crosspost your Tweets to Bluesky automatically. Now supports **multiple accounts**, **custom PDS (hosting) locations**, and a **user-friendly CLI** for easy management.
55+A powerful tool to crosspost your Tweets to Bluesky automatically. Now features a **Web Dashboard** for easy management, **Multi-account support** for different owners, and **Custom PDS** hosting support.
6677## ✨ Features
8899-- **Multi-Account Support**: Sync Twitter A -> Bluesky A, Twitter B -> Bluesky B, or multiple Twitters to one Bluesky.
1010-- **Interactive CLI**: Manage all your account mappings and credentials without touching code.
1111-- **Custom PDS Support**: Works with `bsky.social` or any independent Bluesky hosting provider.
1212-- **Thread Support**: Maintains your Twitter threads perfectly on Bluesky.
1313-- **Media Support**: Automatically migrates high-quality images and videos.
1414-- **Smart Logic**: Automatically detects languages and expands short links.
1515-- **Safety First**: Includes a `--dry-run` mode to test before you post.
99+- **Web Dashboard**: Modern interface to manage all your sync tasks.
1010+- **Multi-User Mapping**: Let others add their accounts (e.g., Dan, Josh) with their own owners.
1111+- **Multi-Account Support**: Sync Twitter A -> Bluesky A, Twitter B -> Bluesky B, etc.
1212+- **Tailscale Ready**: Accessible over your local network or VPN.
1313+- **Interactive CLI**: Manage everything from the terminal with `./crosspost`.
1414+- **High Quality**: Supports threads, high-quality images, and videos.
16151716---
18171919-## 🚀 Quick Start (For Everyone)
1818+## 🚀 Quick Start
20192120### 1. Prerequisites
2222-- **Node.js** installed on your computer.
2323-- A Twitter account (preferably an alt/burner for the web cookies).
2424-- A Bluesky account and an **App Password** (Settings -> Privacy & Security -> App Passwords).
2121+- **Node.js** installed.
2222+- A Twitter account (burner recommended) for global cookies.
2323+- Bluesky account(s) with **App Passwords**.
25242625### 2. Installation
2727-Open your terminal and run:
2826```bash
2927git clone https://github.com/j4ckxyz/tweets-2-bsky.git
3028cd tweets-2-bsky
3129npm install
3030+npm run build
3231```
33323434-### 3. Setup (Using the CLI)
3535-Instead of editing files, use our simple setup command:
3333+### 3. Start Syncing & Web UI
3634```bash
3737-# 1. Set your Twitter cookies (one set of cookies works for all mappings)
3838-./crosspost setup-twitter
3939-4040-# 2. Add your first account mapping
4141-./crosspost add-mapping
3535+# This starts both the sync daemon AND the web dashboard
3636+npm start
4237```
4343-*Note: You can find your Twitter `auth_token` and `ct0` in your browser's developer tools under Application -> Cookies.*
3838+By default, the web interface runs at **http://localhost:3000**. If you are using Tailscale, it's accessible at `http://your-tailscale-ip:3000`.
44394545-### 4. Run the Sync
4646-```bash
4747-# Build the project
4848-npm run build
4949-5050-# Start the automatic syncing daemon
5151-npm start
5252-```
4040+### 4. Setup (Web Dashboard)
4141+1. Open the dashboard in your browser.
4242+2. **Register** a new account (email/password).
4343+3. Log in and go to **Global Twitter Config** to enter your cookies.
4444+4. Use **Add New Mapping** to connect a Twitter handle to a Bluesky account.
53455446---
55475648## 🛠 Advanced Usage
57495858-### Backfilling Old Tweets
5959-If you want to import your historical tweets for a specific account:
5050+### Disable Web Interface
5151+If you only want to run the sync daemon without the web UI:
6052```bash
6161-# Get the command from the CLI help
6262-./crosspost import-history
6363-6464-# Example: Import the last 10 tweets for a specific user
6565-npm run import -- --username YOUR_TWITTER_HANDLE --limit 10
5353+npm start -- --no-web
6654```
67556868-### Testing with Dry Run
6969-See what would be posted without actually posting anything:
5656+### Command Line Interface (CLI)
5757+You can still manage everything via the terminal:
7058```bash
7171-npm start -- --dry-run
5959+# Set Twitter cookies
6060+./crosspost setup-twitter
6161+6262+# Add a mapping
6363+./crosspost add-mapping
6464+6565+# List/Remove
6666+./crosspost list
6767+./crosspost remove
7268```
73697474-### Management Commands
7070+### Backfilling Old Tweets
7571```bash
7676-./crosspost list # Show all active mappings
7777-./crosspost remove # Remove an account mapping
7878-./crosspost set-interval # Change how often to check for new tweets
7272+# Example: Import the last 20 tweets for a user
7373+npm run import -- --username YOUR_TWITTER_HANDLE --limit 20
7974```
80758176---
82778383-## 📝 Configuration Details
8484-8585-- **Check Interval**: Default is 5 minutes.
8686-- **Database**: Processed tweets are tracked per-account in the `processed/` folder so you never get duplicates.
8787-- **Service URL**: If you use a custom Bluesky host (like `bsky.network`), you can set it during the `add-mapping` process.
7878+## ⚙️ How to get Twitter Cookies
7979+1. Log in to Twitter in your browser.
8080+2. Open **Developer Tools** (F12) -> **Application** tab -> **Cookies**.
8181+3. Copy `auth_token` and `ct0` values.
88828983## ⚖️ License
9084MIT
9191-9292----
9393-*Created with ❤️ for the decentralized web.*