social media crossposting tool. 3rd time's the charm
mastodon
misskey
crossposting
bluesky
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.