How it works

A full migration, start to finish — with the real app in front of you.

Every screen below is Mailwynx's actual interface. Follow it top to bottom: from launching the app to watching mail land in the destination and handing your client the report. Most engineers get their first pilot batch running the same afternoon.

The screens are Mailwynx's own UI, shown with sample data. Your live runs look identical.

Before you start

What you'll need

A machine to run it on

Your own Windows PC, Mac, or a small Linux VM with Python 3.10+. Mailwynx runs locally — no public ports, nothing exposed to the internet.

Access to each side

For Microsoft 365, a one-time Azure app registration (10 min). For Google Workspace, a service account with domain-wide delegation. For plain IMAP, host plus an app password. All covered in the docs.

Your licence key

One Mailwynx key you top up with mailbox packs — buy 100 or 300 at a time and the balance grows on the same key. Migrate 3 mailboxes free before you buy.

The walkthrough

Eight steps, from launch to report

Launch Mailwynx and unlock your vault

Start the app and open it in your browser at localhost. The first time, you set a master password that encrypts every saved credential on disk. After that, one password unlocks all your migration projects — nothing leaves your machine.

localhost:8770
Vault gate. AES-encrypted, local-only. There's no recovery — the password is yours alone.
# start the local web app
$ mailwynx web
✓ Mailwynx running at http://127.0.0.1:8770

Create a new project

A project is one migration: a source, a destination and a list of mailboxes. Your saved projects live on the home screen with their last-run status, so you can pause and pick any of them back up later.

localhost:8770/#/
Projects home. Each card shows the route and how many messages moved on the last run.

Choose your source

Name the project, then pick where mail is read from: Microsoft 365, Google Workspace or generic IMAP. Click a platform tile to continue to its connection details.

localhost:8770/#/new
Step 1 — Source. Here the source is a Hostinger IMAP server (selected tile).

Connect the destination

Pick the destination platform and enter its credentials. For Microsoft 365 that's the three values from your Azure app registration — tenant ID, client ID and the client-secret value. Mailwynx talks to Microsoft Graph directly, so it moves mail, calendar and contacts at full fidelity.

localhost:8770/#/new
Step 2 — Destination. Microsoft 365 over Graph. Secrets are encrypted in your vault, never transmitted anywhere but the provider's own API.
First time with Microsoft 365? The Azure app-registration walkthrough in the docs gets you the three values in about ten minutes.

Map the mailboxes

Add each source address and where it should land. Type them in, import a CSV, or — for a whole M365 tenant — hit Autodiscover to pull the mailbox list automatically. Leave secrets blank when the side uses API auth (Graph or Gmail); fill them in for IMAP app passwords. Download a sample CSV to start from.

localhost:8770/#/new
Step 3 — Mailboxes. Pick Safe (one at a time) for large or unattended runs; Fast to move several in parallel.

Review and verify connections

Before anything moves, Mailwynx tests every credential and lists the folders it can see on each side. Green means it connected and can read/write; a red row tells you exactly what's wrong. Nothing is copied at this stage.

localhost:8770/#/new
Step 4 — Review & verify. A connection test that moves nothing — the safe way to catch a wrong secret or a missing permission.

Pre-stage with a dry run, then migrate

Save the project and open its dashboard. Pre-stage (dry run) counts exactly what would move without touching the destination — a great pilot check. Then hit Migrate. Every mailbox gets a live progress card with migrated / skipped / failed counts and a streaming activity log. It throttles itself under the provider's rate limits, and it's safe to stop and resume — it picks up on a delta pass.

localhost:8770/#/run/acme
Step 5 — Live dashboard. Real-time per-mailbox progress, self-throttling, and stop/resume without losing your place.

Open the report and cut over

When a run finishes, Open full report gives you a self-contained HTML summary (and a CSV) — per-mailbox counts, skips and any failures — ready to hand a client or keep for your records. Run a final delta pass at cutover to sweep up mail that arrived during pre-staging, then switch MX to the destination. Done.

Re-running is safe. Mailwynx is idempotent: it skips anything already copied, so a second run only moves what's new. That's how the final delta before cutover works.

Prefer the terminal?

The same migration, on the command line

The web UI is a front-end over the same engine. Scripters and CI pipelines can drive it entirely from a YAML config with four commands.

# 1. install (once)
$ python -m venv .venv && source .venv/bin/activate
$ pip install -e .

# 2. write a starter config, then edit it
$ mailwynx init config.yaml

# 3. test credentials + list folders (moves nothing)
$ mailwynx verify config.yaml

# 4. count what WOULD move
$ mailwynx dry-run config.yaml

# 5. migrate — safe to re-run (delta + resume)
$ mailwynx run config.yaml
✓ done — 48,210 migrated, 84 skipped, 0 failed · report in logs/reports/

Full config reference, provider setup and troubleshooting live in the docs.

Ready to run your first migration?

Start with the free IMAP core, or book a demo to see a full M365 tenant move end to end.