Select the types of activity you want to include in your feed.
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.
···991010Prerequisite: Docker Desktop (Windows/macOS) or Docker Engine (Linux). On Windows, use Docker Desktop in Linux container mode.
11111212+Prefer using the included compose file so the named volume is always attached:
1313+1414+```bash
1515+docker compose up -d
1616+```
1717+1218### 1) Run the latest image
13191420macOS/Linux (bash):
···30363137Open `http://localhost:3000`.
32383939+Important: keep `-v tweets2bsky_data:/app/data` (or an equivalent bind mount). Without a persistent volume, mappings and history are lost when the container is recreated.
4040+3341If port `3000` is already in use, change only the first port (example: `-p 3001:3000`).
34423543### 2) Complete first-time setup
···121129122130The container aims for feature parity with normal installs while giving one-command startup.
123131132132+Tip: the repository includes `docker-compose.yml` with a named `tweets2bsky_data` volume, so `docker compose up -d` is the safest default.
133133+124134### 1) Pull and run (recommended)
125135126136After publishing an image (see [Publishing](#publishing-multi-platform-images-linuxamd64--linuxarm64)), run:
···178188- `CORS_ALLOWED_ORIGINS`
179189- `BSKY_APPVIEW_URL` (optional override)
180190- `SCHEDULED_ACCOUNT_TIMEOUT_MS` (default `480000` / 8 minutes, forces a skip when one source account hangs during scheduled checks)
191191+- `TWEETS2BSKY_DATA_DIR` (default `/app/data` in Docker; keep aligned with your mounted data volume path)
181192182193### 4) Persistent data inside Docker
183194···187198- `/app/data/database.sqlite`
188199- `/app/data/.jwt-secret`
189200190190-Note: inside the container, `/app/config.json` is linked to `/app/data/config.json` so one volume preserves everything important.
201201+The app reads persistent files from `TWEETS2BSKY_DATA_DIR` (defaults to `/app/data` in Docker), so a single mounted volume preserves everything important.
191202192203### 5) CLI usage in container
193204
+6
TROUBLESHOOTING.md
···120120docker run -d --name tweets-2-bsky -p 3000:3000 -v tweets2bsky_data:/app/data ghcr.io/j4ckxyz/tweets-2-bsky:latest
121121```
122122123123+The container stores persistent state under `TWEETS2BSKY_DATA_DIR` (default `/app/data`). If you mount a different path, set that env var to match:
124124+125125+```bash
126126+docker 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
127127+```
128128+123129### Docker: updating image
124130In Docker mode, update by pulling a newer image and recreating the container with the same volume.
125131`/api/update` / `update.sh` are source-install workflows.