Part 1 · one-time setup
Workstation setup: day zero to first skill call.
You do this once per laptop. The skills install themselves via Claude Code’s plugin / skills mechanism; the tooling they call (slackdump, mmetl, mmctl, etc.) is installed by a bootstrap script that ships with the skill.
§1.0Day zero — order a server and wire up SSH
Phase 2 installs Mattermost on an Ubuntu server that you rent. Order it before you install the skill so the IP address and SSH access are ready when you need them. Takes about 2 hours wall-clock (most of it Hetzner’s ID verification) and ~15 minutes of attention.
1.0.1Order a Hetzner dedicated server
- Go to hetzner.com/dedicated-rootserver and click Server Auction. The auction has the same specs at lower prices.
- Sign up with company email. Hetzner requires government-ID upload for first-time verification; usually clears in 1–2 hours during German business hours.
- Pick an AX42 (up to ~250 users) or AX52 (250–1,000 users) from the auction. Prefer NVMe storage. Datacenter: Falkenstein or Helsinki for EU, Ashburn for US.
- OS: Ubuntu 24.04 LTS (noble). If 24.04 isn’t offered, pick 22.04 LTS and upgrade post-provision.
- Leave Rescue System and KVM on defaults. Do not set a root password. Paste your SSH public key (from §1.0.3 below) into the “SSH keys” field.
- Submit. You’ll receive a “Server installed” email with the IP and confirmation the key was installed.
OVH (US operators preferring a North American provider) and Contabo (small workspaces under 50 users at ~$10/mo) work the same way. OVH uses the Bare Metal Cloud → Advance series; Contabo uses VPS M (under 50 users), L (up to 250), XL (up to 1,000).
1.0.2I don’t have a domain yet
- Cloudflare Registrar — at-cost ~$10/year for .com, auto-adds the zone to Cloudflare. Fastest path.
- Any existing registrar (GoDaddy, Namecheap, Porkbun, Route 53) — update nameservers to Cloudflare later. See §Cloudflare walkthrough.
Buy the domain now. DNS propagation after nameserver update takes 15 minutes to 24 hours; you want that clock running in parallel with ID-verification.
1.0.3Generate an SSH keypair on your laptop
An SSH keypair is two files: a private key that stays on your laptop (treat it like a password) and a public key you paste into the server. They unlock the server together; without the private file on your laptop, nobody can log in as you.
macOS
ssh-keygen -t ed25519 -C "your_email@example.com"
# press Enter to accept default path (~/.ssh/id_ed25519)
# passphrase is optional; empty is acceptable if your disk is encrypted
cat ~/.ssh/id_ed25519.pub
# copy the ssh-ed25519 AAAAC3... line into Hetzner's order form
Windows 10/11 (PowerShell)
ssh-keygen -t ed25519 -C "your_email@example.com"
# files land in C:\Users\<you>\.ssh\
Get-Content $HOME\.ssh\id_ed25519.pub
1.0.4First SSH login after the server is installed
ssh root@95.217.12.34 # replace with your real IP
# SSH prints a host-key fingerprint — type 'yes' to record it in ~/.ssh/known_hosts
# you should land at root@Ubuntu-...#
# type 'exit' to return
If it asks for a password instead of logging in directly, Hetzner didn’t install the SSH key. Go to robot.hetzner.com → your server → add key under Linux rescue system, use Reset root password, SSH in with the temp password, and manually append your public key to /root/.ssh/authorized_keys; then chmod 600 /root/.ssh/authorized_keys.
If you lose your private SSH key (recoverable)
- Boot into Hetzner’s rescue system (robot UI → server → Rescue → activate Linux rescue → reboot). Get a temp root password by email, SSH in, mount the installed filesystem (mount /dev/sda1 /mnt), paste a new public key into /mnt/root/.ssh/authorized_keys, umount, reboot. Works for every provider with a rescue console.
- Re-order the server and start fresh. If you’re at day zero and nothing is installed yet, this is faster than rescue-system diagnosis.
Sidebar: Windows-specific notes
- PowerShell, not Command Prompt — this article’s commands assume a POSIX-ish shell. On Windows, PowerShell 7+ or Git Bash.
- Install Git for Windows (git-scm.com/downloads/win). Provides git plus Git Bash.
- Chocolatey is the Windows equivalent of Homebrew — install from chocolatey.org/install in an Admin PowerShell.
- WSL2 is optional but convenient: wsl --install -d Ubuntu-24.04, then wsl.
- Paths: Mac-style ~/.claude/skills/ = Windows %USERPROFILE%\.claude\skills\.
- Symlinks need Admin PowerShell (New-Item -ItemType SymbolicLink) or Git Bash with Developer Mode.
- SSH built into Windows 10 (1809+) and 11. Run ssh -V; if missing, Settings → Apps → Optional Features → OpenSSH Client.
§1.1Pick an agent harness (GUI app or CLI)
You need one of the following. Either can run the skills end to end. Both Claude Code and Codex ship as GUI desktop apps and as CLIs.
| Option | Requires | Install |
|---|
| 1a · Claude Code desktop | Anthropic Pro, Max, Team, or Enterprise plan | Download from claude.ai/download · sign in · open Code tab · Select folder |
| 1b · Codex desktop | ChatGPT Plus/Pro/Business/Edu/Enterprise, or OpenAI API key with Codex access | Download from developers.openai.com/codex/app · sign in · pick project folder |
| 1c · Claude Code CLI | Anthropic plan | npm install -g @anthropic-ai/claude-code · claude login · claude in your workdir |
| 1d · Codex CLI | ChatGPT plan or API key | Install from github.com/openai/codex · codex login · codex in workdir |
What “running the skill” looks like
In all four options, running a skill means opening a session in your working directory and asking the agent, in plain English, to use it. Examples:
- Desktop app: type / in the prompt box to see slash commands, pick slack-migration-to-mattermost-phase-1-extraction. Or just say “Use the Phase 1 Slack-to-Mattermost skill to run the setup stage.”
- CLI: claude (or codex) in the workdir, then the same plain-English request.
Behind the scenes the agent runs ./migrate.sh setup for you and shows the output. You’ll see commands flash by; you don’t need to memorize them.
§1.2Install the two skills
Skill catalog pages · open in a new tab
Heads up: those three URLs return a 404 unless you are signed in to a jeffreys-skills.md account with an active subscription. If you hit a 404, sign up (or log in) at jeffreys-skills.md/dashboard first, then reload — the same account is what the jsm CLI authenticates against below, so doing this step first means jsm install will already know who you are.
Three ways to install. Pick whichever matches the path you chose above.
Recommended: via jsm (Jeffrey’s Skills.md)
# macOS / Linux
curl -fsSL https://jeffreys-skills.md/install.sh | bash
# Windows (PowerShell as Admin)
irm https://jeffreys-skills.md/install.ps1 | iex
jsm setup # first-time wizard: creates config, picks skill dirs
jsm login # opens browser → sign in with Google
jsm install slack-migration-to-mattermost-phase-1-extraction
jsm install slack-migration-to-mattermost-phase-2-setup-and-import
Restart the Claude Code and/or Codex desktop app (or claude / codex) and the skills show up in the picker. jsm downloaded a verified copy of each skill, unzipped into ~/.claude/skills/ and ~/.codex/skills/, checked the hash matches what the server published, and recorded the version in a local database.
Alternative: via claude plugins
claude plugins install slack-migration-to-mattermost-phase-1-extraction
claude plugins install slack-migration-to-mattermost-phase-2-setup-and-import
Alternative: symlink from a local clone (developers only)
ln -s /path/to/je_private_skills_repo/.claude/skills/slack-migration-to-mattermost-phase-1-extraction ~/.claude/skills/
ln -s /path/to/je_private_skills_repo/.claude/skills/slack-migration-to-mattermost-phase-2-setup-and-import ~/.claude/skills/
# mirror to Codex too:
ln -s /path/to/je_private_skills_repo/.claude/skills/slack-migration-to-mattermost-phase-1-extraction ~/.codex/skills/
ln -s /path/to/je_private_skills_repo/.claude/skills/slack-migration-to-mattermost-phase-2-setup-and-import ~/.codex/skills/
On Windows (Git Bash or PowerShell 7+ as Admin), use mklink /D or New-Item -ItemType SymbolicLink.
Verify
jsm list # lists installed skills + versions
ls -la ~/.claude/skills/ | grep slack-migration
# Windows:
dir %USERPROFILE%\.claude\skills
§1.3Bootstrap the workstation for Phase 1
Installs the underlying CLI tools the skill shells out to: slackdump does extraction, mmetl does transformation, mmctl does import upload, and so on.
cd ~/.claude/skills/slack-migration-to-mattermost-phase-1-extraction
./scripts/doctor.sh # what's missing?
./scripts/bootstrap-tools.sh # install missing system + Go tools
./scripts/doctor.sh # confirm all required checks are green
Platforms covered automatically: macOS uses Homebrew (and installs Homebrew first if missing); Ubuntu/Debian/WSL uses apt; Windows prints a Chocolatey checklist. Installed: python3, jq, zip, unzip, curl, rsync, git, sha256sum, go, then the Go tools (slackdump, slack-advanced-exporter, mmetl, mmctl) into $(go env GOPATH)/bin, plus the Python packages requests and beautifulsoup4.
If something goes wrong
- command not found: ./scripts/doctor.sh → you forgot the cd, or the skills dir is elsewhere. Find it with jsm list.
- permission denied → run chmod +x scripts/*.sh inside the skill dir, then retry.
- One Go install fails (bad network, yanked release) → the script warns and continues. Re-run once network cooperates.
- Windows permission errors → open PowerShell as Administrator.
§1.4Bootstrap the workstation for Phase 2
cd ~/.claude/skills/slack-migration-to-mattermost-phase-2-setup-and-import
./scripts/doctor.sh # what's missing?
./scripts/bootstrap-tools.sh # install workstation-side tools
./scripts/doctor.sh --require-remote # probe SSH to your target once TARGET_HOST is set
Phase 2 needs mmctl, jq, psql, ssh, scp, rsync, openssl, and the Python requests module. On macOS it will nudge you to add $(brew --prefix)/opt/libpq/bin to your PATH so psql is runnable after a fresh libpq install. --require-remote confirms your SSH key is on the target and ssh -o BatchMode=yes works. Run this right before ./operate.sh provision / deploy.
§1.5Wire up MCP servers (optional but recommended)
The skills ship installers that register Slack / Playwright / Mattermost MCP servers into whichever agent CLIs you have.
# Phase 1 (workstation)
./scripts/install-mcp-servers.sh
./scripts/doctor.sh --require-mcp
# Phase 2 (workstation)
./scripts/install-mcp-servers.sh
./scripts/doctor.sh --require-mcp
| MCP | When it helps | Phase |
|---|
| Slack MCP (Anthropic official, xoxb-) | “count channels”, “verify last message in #general”, “check user U0ABC’s email” | Phase 1 |
| Slack MCP stealth (korotovsky, xoxc- + xoxd-) | full visibility including DMs for gap-fill verification | Phase 1 |
| Playwright MCP | drives the Slack admin UI’s export flow, or Mattermost System Console screens that lack API equivalents | Phase 1 + 2 |
| Mattermost MCP (community, admin PAT) | “which users are inactive”, “stamp a test post”, “list team roles” | Phase 2 |
You do not need any of these for the skill itself to run. They are accelerators for verification, gap-hunting, and UI steps. See the §MCP worked examples section later for concrete prompts.