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.
1# tweets-2-bsky
2
3A powerful tool to crosspost Tweets to Bluesky, supporting threads, videos, and high-quality images.
4
5## Troubleshooting
6
7### Update Failures / Git Conflicts
8If `./update.sh` fails with "Pulling is not possible because you have unmerged files" or similar git errors:
9
101. Reset your local repository to match the remote (Warning: this discards local changes to tracked files):
11 ```bash
12 git reset --hard origin/master
13 ```
142. Run the update script again:
15 ```bash
16 ./update.sh
17 ```
18
19### PM2 interpreter mismatch
20If PM2 logs show command/runtime errors after an update (for example stale interpreter paths):
21
22Common error signature:
23
24```text
25TypeError: require() async module ".../dist/index.js" is unsupported. use "await import()" instead.
26```
27
281. Run the repair script:
29 ```bash
30 chmod +x repair_pm2.sh
31 ./repair_pm2.sh
32 ```
332. If needed, manually recreate PM2 with Bun as the process command:
34 ```bash
35 pm2 delete tweets-2-bsky || true
36 pm2 delete twitter-mirror || true
37 pm2 start "$HOME/.bun/bin/bun" --name tweets-2-bsky --cwd "$PWD" -- dist/index.js
38 pm2 save
39 ```
403. Old crash lines remain in PM2 logs until log rotation/flush. Clear them if needed:
41 ```bash
42 pm2 flush
43 ```
44
45### `bun: command not found`
46If Bun is missing on a source install host:
47
481. Run either installer/updater once (they auto-install and auto-upgrade Bun to latest stable):
49 ```bash
50 ./install.sh --no-start
51 # or
52 ./update.sh --no-restart
53 ```
54
55### Native module load failure (`ERR_DLOPEN_FAILED`)
56If startup fails while loading native dependencies:
57
581. Reinstall/rebuild native dependencies with Bun:
59 ```bash
60 bun run rebuild:native
61 ```
622. Rebuild and start:
63 ```bash
64 bun run build
65 bun run start
66 ```
67
68### Dashboard appears unstyled / plain text UI
69If the app loads but looks mostly unstyled:
70
711. Rebuild web assets:
72 ```bash
73 bun run build
74 ```
752. Restart server:
76 ```bash
77 bun run start
78 ```
793. Hard refresh browser cache (`Cmd+Shift+R` on macOS).
80
81### CLI command not recognized
82When using Bun scripts, pass CLI args after `--`:
83
84```bash
85bun run cli -- status
86```
87
88### Scheduler appears stuck on one account
89If a single source account hangs for a long time (media fetch/processing), scheduled checks now skip that account after a timeout and continue with the next one.
90
91- Default timeout: `480000` ms (8 minutes)
92- Override with env var: `SCHEDULED_ACCOUNT_TIMEOUT_MS`
93
94Examples:
95
96```bash
97# Docker
98docker run -d --name tweets-2-bsky -e SCHEDULED_ACCOUNT_TIMEOUT_MS=300000 -p 3000:3000 -v tweets2bsky_data:/app/data j4ckxyz/tweets-2-bsky:latest
99
100# Source install (.env)
101echo 'SCHEDULED_ACCOUNT_TIMEOUT_MS=300000' >> .env
102./update.sh
103```
104
105To watch logs while debugging on Raspberry Pi:
106
107```bash
108docker logs -f tweets-2-bsky
109# or for source/PM2
110pm2 logs tweets-2-bsky
111```
112
113### Docker: permissions writing `/app/data`
114If the container fails to write `config.json` or `database.sqlite`, ensure `/app/data` is writable by the container process.
115
116For easiest portability, use a named Docker volume:
117
118```bash
119docker volume create tweets2bsky_data
120docker run -d --name tweets-2-bsky -p 3000:3000 -v tweets2bsky_data:/app/data ghcr.io/j4ckxyz/tweets-2-bsky:latest
121```
122
123The container stores persistent state under `TWEETS2BSKY_DATA_DIR` (default `/app/data`). If you mount a different path, set that env var to match:
124
125```bash
126docker run -d --name tweets-2-bsky -p 3000:3000 -v /host/path:/persist -e TWEETS2BSKY_DATA_DIR=/persist ghcr.io/j4ckxyz/tweets-2-bsky:latest
127```
128
129### Docker: updating image
130In Docker mode, update by pulling a newer image and recreating the container with the same volume.
131`/api/update` / `update.sh` are source-install workflows.