# slack-sieve Sieve your [Slack workspace export](https://slack.com/help/articles/201658943-Export-your-workspace-data) before [Mattermost](https://mattermost.com) import — triage channels, cherry-pick messages, preview attachments. ```text Slack export → hydrate → review UI → manifest.json → prepare-export → mmetl → mmctl ``` ## Quick start ```bash git clone git@git.levkin.ca:ilia/slack-sieve.git cd slack-sieve # Optional: download files into __uploads/ from export token URLs export SLACK_EXPORT_DIR="$HOME/Downloads/your-slack-export" export SLACK_HYDRATED_DIR="$HOME/Downloads/your-slack-export-enriched" make hydrate # Optional: pre-skip noise channels (edit presets/levkin-skips.json or add your own) make preset-skips # Review at http://127.0.0.1:8765 export SLACK_EXPORT_PATH="$HOME/Downloads/your-slack-export-enriched" make review ``` Selections are saved to `manifest.json` (gitignored). ## Make targets | Target | Description | |--------|-------------| | `make review` | Start the web UI on port 8765 | | `make hydrate` | Copy export + download attachments via embedded `xoxe` URLs | | `make preset-skips` | Mark preset channels as skip in `manifest.json` | | `make prepare-export` | Write `prepared-export/` (filtered Slack shape for mmetl) | ## Environment | Variable | Default | |----------|---------| | `SLACK_EXPORT_PATH` | `~/Downloads/Levkin Slack export enriched` | | `SLACK_EXPORT_DIR` | Raw export for hydrate | | `SLACK_HYDRATED_DIR` | Output folder for hydrate | | `SLACK_IMPORT_PORT` | `8765` | ## UI shortcuts - **J/K** — previous/next message - **Space** — toggle cherry-pick - **I / S** — import/skip message - **Shift+I / Shift+S** — import/skip whole channel - **N** — next undecided channel ## Presets Edit `presets/levkin-skips.json` (or copy it) for workspace-specific channels to auto-skip. ## Mattermost import (after review) 1. Set optional `mattermost_channel` renames and `user_emails` in `manifest.json`. 2. `make prepare-export` — writes `prepared-export/` (pytest-covered). 3. Zip that folder; [mmetl](https://github.com/mattermost/mmetl) `transform slack --team …` 4. [mmctl](https://docs.mattermost.com/administration-guide/manage/mmctl-command-line-tool.html) `import process --bypass-upload` on the Mattermost host **Levkin:** import completed 2026-07-10 — see [docs/HANDOFF.md](docs/HANDOFF.md) for channel map and caveats. Docs: [Migrate from Slack](https://docs.mattermost.com/administration-guide/onboard/migrate-from-slack.html) ## Requirements - Python 3.10+ (stdlib only for server) - Official Slack export folder or enriched copy with `channels.json`, `users.json`, channel dirs ## Handoff Levkin migration status and channel map: **[docs/HANDOFF.md](docs/HANDOFF.md)** ## Remote ```text git@git.levkin.ca:ilia/slack-sieve.git ``` SSH uses LAN `10.255.255.1` via `Host git.levkin.ca` in `~/.ssh/config` (see homelab ansible docs).