social media crossposting tool. 3rd time's the charm
mastodon misskey crossposting bluesky
at next 91 lines 3.3 kB view raw view rendered
1# XPost documentation 2 3## Installation 4 5The recommended approach is to use the official container image from `ghcr.io/zenfyrdev/xpost:latest` 6 7### Podman Quadlets 8 9Example Rootful Quadlet. Make sure the data dir exists on the host and is owned by `1000:1000`! 10 11``` 12[Unit] 13Description=XPost 14 15[Container] 16Image=ghcr.io/zenfyrdev/xpost:latest 17EnvironmentFile=/etc/containers/systemd/xpost/.env 18Volume=/var/containers/xpost/data:/app/data:Z 19 20[Service] 21Restart=always 22RestartSec=10s 23 24[Install] 25WantedBy=default.target 26``` 27 28### Docker Compose 29 30Make sure the data dir exists on the host and is owned by `1000:1000`! 31 32``` 33services: 34 xpost: 35 image: ghcr.io/zenfyrdev/xpost:latest 36 restart: unless-stopped 37 env_file: ./.env 38 volumes: 39 - ./data:/app/data 40``` 41 42### Native Install 43 44The project uses uv, so a native install using a `.venv` is pretty simple. 45 461. Make sure that `ffmpeg` and `libmagic` are installed. 472. Download and install [uv](https://github.com/astral-sh/uv) 483. Clone the project `https://tangled.org/zenfyr.dev/xpost` 494. Run `uv sync --locked` 50 51 52## Quickstart 53 54Upon first launch, XPost will create a folder `./data` with an example `settings.json` 55 56Edit the file, and then start XPost again. 57 58## Features 59 60- Based on streaming APIs to instantly crosspost new posts. 61- Splitting large posts into multiple smaller ones to fit into character limits. 62- Supports quotes and reposts. 63 64 65## Configuration 66 67XPost config accepts an array of input -> outputs pairs. find all services and example configs in [services.md](./services.md). 68 69All `"key": "value"` options can be set to `env:VARIABLE` to read envvars instead of storing things directly in the settings file. 70 71Additionally XPost accepts some envvars. 72 73| Key | Description | 74|-----------------|---------------------------------------------------------------------------------------------------------------| 75| `DATA_DIR` | Base data directory. | 76| `SETTINGS_DIR` | `settings.json` file location. | 77| `DATABASE_DIR` | `data.db` file location. | 78| `SLINGSHOT_URL` | URL of the [microcosm](https://www.microcosm.blue/) slingshot service for resolving identities. | 79| `JETSTREAM_URL` | URL of the [Jetstream](https://github.com/bluesky-social/jetstream) service for listening for incoming posts. | 80 81## Advanced Features 82 83### bi-directional crossposting 84 85**This is experimental and unstable.** 86 87XPost supports pointing to services directly at each other, posts crossposted from other services are marked as so, and are skipped to avoid creating infinite loops. 88 89While this works for most things, cross-service replies can end up being duplicated multiple times over or cause an infinite loop, this usually happens when a post from one service is split into multiple other on the other. 90 91e.g. Post A from Mastodon ends up as Post A1 and Post A2 on bsky, replying from bsky to either may result in Reply B being posted twice, or getting stuck in a loop.