Migrate Discord servers to Stoat (formerly Revolt)
Project description
Discord Ferry
Migrate your Discord server to Stoat (formerly Revolt) — messages, channels, roles, emoji, attachments, and all.
One-click app for Windows and Mac. Command-line interface for Linux. No coding required. Your data stays on your machine.
Download
| Platform | Download | Size |
|---|---|---|
| Windows | Ferry.exe | ~25 MB |
| macOS | Ferry.zip | ~25 MB |
| Linux / pip | pipx install discord-ferry |
~2 MB |
What is Stoat?
Stoat (formerly Revolt) is an open-source chat platform — like Discord, but community-owned. You can use the official hosted service or run it on your own server. Ferry moves your entire Discord server there.
New to Stoat? Create a free account or self-host your own instance.
How It Works
Step 1: Enter your credentials
Launch Ferry. You'll need four things:
- Discord user token + server ID — a token is a secret key that lets Ferry access your account. Ferry shows you how to find both.
- Stoat API URL — the web address Ferry uses to talk to Stoat. Use
https://api.stoat.chatfor the official service, or your own domain if you run your own Stoat instance. - Stoat user token — a secret key your browser saves when you log in to Stoat. No bot or app creation needed — you just copy it from your browser. The step-by-step guide shows exactly where to find it.
Step 2: Ferry exports your server automatically
Ferry downloads and runs DiscordChatExporter behind the scenes — no manual steps.
Step 3: Click Migrate
Messages, channels, roles, emoji, and attachments migrate to Stoat. Each message shows the original author's name and avatar. Pins are preserved.
Already have DiscordChatExporter (DCE) exports? Ferry also supports offline mode — just point it at your export folder.
How long does it take?
Ferry processes multiple channels in parallel (configurable, default 3 concurrent). Typical throughput: ~3-5x faster than sequential. Stoat limits how fast data can be sent to protect the service, which sets the overall pace. That means:
| Messages | Estimated time |
|---|---|
| 1,000 | ~6 minutes |
| 10,000 | ~1 hour |
| 100,000 | ~8-10 hours |
Ferry can pause and resume — close it anytime, pick up where you left off.
What gets migrated?
| Discord feature | What happens |
|---|---|
| Text channels | Recreated on Stoat with the same names and topics |
| Categories | Recreated — channels grouped the same way |
| Roles | Recreated with colours and Discord permissions translated to Stoat equivalents |
| Channel permissions | Per-role and @everyone overrides migrated |
| NSFW channels | NSFW flag preserved |
| Messages + authors | Each message shows the original author's name and avatar |
| File attachments | Uploaded to Stoat's file storage |
| Custom emoji | Uploaded (up to 100) |
| Pinned messages | Re-pinned in the correct channels |
| Replies | Reply links preserved between messages |
| Reactions | Shown as text summary by default, or applied via API |
| Embeds | Flattened to Stoat format with thumbnails and images uploaded |
| Polls | Rendered as formatted text |
| Threads | Converted to text channels, merged into parent, or archived as markdown — your choice |
| Forum posts | Grouped into dedicated categories with an index channel |
| Voice channels | Created, but may not work yet (known Stoat bug) |
| Stickers | Image uploaded, or text fallback for animated/missing |
| Server banner | Uploaded from Discord API when a Discord token is provided |
| Original timestamps | Shown at the start of each message (e.g. *[2024-01-15 12:00 UTC]*) |
Reliability features
Ferry is built to handle large migrations safely:
- Pause and resume — close Ferry anytime, pick up where you left off
- Parallel channel sends — processes multiple channels concurrently (3x–5x faster)
- Incremental migration — only migrate new messages since the last completed run
- Pre-creation review — summary and confirmation before anything is created on Stoat
- Migration report — human-readable
migration_report.mdwith a fidelity score - Dead-letter queue — failed messages tracked and retryable without re-running
- Message splitting — messages over 2000 characters are split, not truncated
- Migration lock — prevents two Ferry instances from targeting the same server
- Circuit breaker — automatic backoff on API failures, no indefinite blocking
Detailed Guides
- Exporting from Discord manually (offline mode)
- Setting up your Stoat instance
- Your first migration (full walkthrough)
- GUI guide (every screen explained)
- CLI reference
- Migrating large servers (100k+ messages)
- Self-hosted tips
- Troubleshooting
- Pre-Flight Checklist
- Known Limitations
- Timestamp Preservation
Contributing
We welcome contributions! See CONTRIBUTING.md.
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file discord_ferry-2.0.2.tar.gz.
File metadata
- Download URL: discord_ferry-2.0.2.tar.gz
- Upload date:
- Size: 91.9 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c7858892658ce638bfe470b6c6d584fc1c0053c0be77fede5074bf58d1987e4f
|
|
| MD5 |
987e2d648b4245e3d983a223486bf012
|
|
| BLAKE2b-256 |
3be837f0e1c3f9337711fd6e81ee378ed1e8a5129c2c1635dab8175afdf7335a
|
Provenance
The following attestation bundles were made for discord_ferry-2.0.2.tar.gz:
Publisher:
release.yml on nordscope-fi/Discord-stoat-ferry
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
discord_ferry-2.0.2.tar.gz -
Subject digest:
c7858892658ce638bfe470b6c6d584fc1c0053c0be77fede5074bf58d1987e4f - Sigstore transparency entry: 1352118869
- Sigstore integration time:
-
Permalink:
nordscope-fi/Discord-stoat-ferry@3846ccc19431be1f433ef3704d9eef5333baecb8 -
Branch / Tag:
refs/tags/v2.0.2 - Owner: https://github.com/nordscope-fi
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@3846ccc19431be1f433ef3704d9eef5333baecb8 -
Trigger Event:
push
-
Statement type:
File details
Details for the file discord_ferry-2.0.2-py3-none-any.whl.
File metadata
- Download URL: discord_ferry-2.0.2-py3-none-any.whl
- Upload date:
- Size: 108.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b1a39f851ba6da22e73a36cad796b15ca7be2c9bcfb387eb23c37104b48c7fcc
|
|
| MD5 |
c3e1373629f1aa546e37f91946a13863
|
|
| BLAKE2b-256 |
2bdff243e079853ef6a53616afcfa8942f572d0bf8462540f4fca89f12fc45d9
|
Provenance
The following attestation bundles were made for discord_ferry-2.0.2-py3-none-any.whl:
Publisher:
release.yml on nordscope-fi/Discord-stoat-ferry
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
discord_ferry-2.0.2-py3-none-any.whl -
Subject digest:
b1a39f851ba6da22e73a36cad796b15ca7be2c9bcfb387eb23c37104b48c7fcc - Sigstore transparency entry: 1352118941
- Sigstore integration time:
-
Permalink:
nordscope-fi/Discord-stoat-ferry@3846ccc19431be1f433ef3704d9eef5333baecb8 -
Branch / Tag:
refs/tags/v2.0.2 - Owner: https://github.com/nordscope-fi
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@3846ccc19431be1f433ef3704d9eef5333baecb8 -
Trigger Event:
push
-
Statement type: