Releases: ashinno/wechat-multi
v2.0.0
v2.0.0 — Rebuilt on a tested foundation
A major-version milestone that's about trust and maintainability, not new buttons. The app shipped eight feature releases with zero automated tests, because every piece of logic was welded to live UserDefaults, FileManager, and /bin/cp — no seam to test against, and real bugs hiding underneath. This release fixes that at the root.
New architecture
Split into a pure, Foundation-only WeChatMultiCore library and a thin AppKit/SwiftUI app shell. Three SwiftPM targets: Core (library) · WeChatMulti (app) · CoreTests.
61 tests, 8 suites — gated in CI
swift test now runs on every push, PR, and release. A failing test blocks the release. The historically bug-prone logic is now verified deterministically: the ps parser, slot ordering, version comparison, naming round-trips, thread-safe settings, and backup/restore.
Real bugs fixed
- Atomic cloning — a clone is now copied + configured in a temp location and atomically renamed into place. A failure mid-prepare no longer leaves a half-configured bundle that the app wrongly treats as ready. Also handles the two-launches-same-slot race and purges stale temp dirs.
- Settings race fixed — slot names and display order were read-modify-written from both the main thread and background queues; access is now serialized behind a lock.
- Locale-robust process detection — the
psparser no longer assumes a fixedlstarttoken count; it anchors on the executable path, so it survives non-English locales. - Validated backup import — schema-version and numeric-key checks, plus stale-custom-path sanitization on restore.
- Centralized settings keys — five scattered string literals are now one catalog.
No behavior change
Everything you do in the app works exactly as in v1.8 — this release is what's underneath.
Install
Download WeChat-Multi-v2.0.0.zip below. Universal binary (arm64 + x86_64), CI-built.
SHA256: 01bf16aec77295ff09e44948b59682679f27f7352cfda4cebf87cd33f5b6359c
Upgrading from v1.x: drop in the new bundle. All clones, names, colors, order, launch-at-login, and onboarding state carry over.
v1.8.0
v1.8.0 — Friendlier & more discoverable
Five user-friendliness wins in one release.
⌨️ Keyboard navigation in the popover
Open the popover and press:
- ↑ / ↓ — move selection between rows (the focused row gets a stronger jade outline than hover)
- Return — bring the focused row to the front if it's running, or launch it if it's stopped
- Delete / Backspace — open the delete confirmation for the focused row (only when it's a stopped clone)
Modifier-laden shortcuts (⌘N, ⌘Q, etc.) pass through unmodified so nothing else breaks.
🔔 System notifications when a clone is ready
The 5–10 second clone-prep step used to finish silently — easy to miss if you alt-tabbed away. Now you get a system banner ("Slot 3 is ready") when prep takes longer than 1.5 seconds. Fast re-launches stay silent. macOS asks for notification permission on the first send.
🟢 Menubar icon badge
A tiny jade dot now appears on the top-right of the menubar Stack glyph whenever at least one WeChat instance is running. The dot has a soft halo so it reads at 18pt. Hover the icon for an updated tooltip ("WeChat Multi — 2 instances running").
💬 Tooltips on everything
Every button now has a .help() tooltip explaining what it does — popover footer items, account rows (state-specific copy), stale/health prompts, every Preferences button, the launch-at-login toggle, and the About link rows. Free first-time discoverability for non-keyboard users.
✨ What's new panel
The first time you launch a new version, this very panel auto-appears with a bulleted list of what changed. Versioned Changelog.swift ships in the bundle; the panel shows the latest entry prominently plus up to two older entries dimmed below for users who skipped releases. Linked to the full GitHub release notes from the footer. Skipped on the first-ever launch (onboarding handles that) and on downgrades.
Install
Download WeChat-Multi-v1.8.0.zip below. Universal binary (arm64 + x86_64), CI-built.
SHA256: fd47609993cd7ef9f46365e3c95c1ffa58731c45260c355398a40b7303e73032
Upgrading from v1.7.x: drop in the new bundle. All existing clones, names, colors, order, the launch-at-login toggle, and onboarding state carry over. The What's New panel will fire once on first launch.
v1.7.0
v1.7.0 — Drag-to-reorder, health check, backup & restore
Three power-user features in one release.
🤚 Drag-to-reorder accounts
Click and hold any row in the popover, drag it to a new position. A 2pt jade hairline appears above the target row showing where it'll land. Drag below the last row to move to the bottom; the source row dims to 45% during the drag.
- Display order persists across launches in
SlotDisplayOrderUserDefaults - Slot numbers never change — they stay tied to their sandbox container, so reordering is purely visual. Your signed-in WeChat sessions are unaffected
- New slots auto-append at the end; deleted slots filter out of the order
🛠️ Health check & repair
WeChat Multi now verifies every clone bundle is intact — no signature drift, Info.plist tampering, missing executables. Runs 2 seconds after launch and again every 5 minutes (off the main thread, so the menu stays snappy).
Checks performed per clone:
- Main executable exists and is
+x CFBundleIdentifiermatches the expectedcom.wechatmulti.cloneNcodesign --verifyexits 0
When something's off, a red /Applications/WeChat.app, preserving signed-in sessions.
💾 Backup & restore preferences
New Backup section in Preferences with Export Settings… and Import Settings… buttons. Exports a WeChat Multi Settings.json file (~1 KB) containing:
- Slot names (
"1": "Work","2": "Personal") - Display order
- Custom WeChat.app path (if you've overridden the default)
- Onboarding state (so a restored install skips the first-run window)
JSON is pretty-printed with sorted keys, schema-versioned (v1). Import shows a confirmation alert before overwriting current settings. Signed-in WeChat sessions live in macOS sandbox containers and aren't portable — you'll log in fresh on the new Mac.
Install
Download WeChat-Multi-v1.7.0.zip below. Universal binary (arm64 + x86_64), CI-built.
SHA256: 7d2289ca5b6f3cefb55481f918e42863deded60429abd7cfd7a048035ac23f5b
Upgrading from v1.6.x: drop in the new bundle. All clones, names, colors, the launch-at-login toggle, and the onboarding-shown flag carry over. The first health check fires 2 seconds after launch.
v1.6.2
v1.6.2 — Dedicated About window
Adds a polished standalone About WeChat Multi window — opened from a new footer item in the popover (between Preferences and Quit).
What's inside
- Hero icon — 104pt app icon under a soft jade halo. Hover it for a subtle spring scale up
- Version pill —
Version X.Y.Z · build Nin monospace jade caps - Two-line tagline
- Four link rows — GitHub Repository, What's New (Changelog), License (MIT), Report an Issue. Jade SF Symbol leading icons +
arrow.up.rightchevrons that brighten and slide right on hover; whole row hover-tints in jade - Footer credits — "Built with Swift & SwiftUI · Crafted for macOS", copyright, and the trademark disclaimer
- Entrance animation — spring-physics fade + slide on appear
Window
- 360×560, transparent titlebar with
fullSizeContentViewso the jade gradient runs edge to edge - Drag from anywhere; only the close button is visible
- Custom NSWindow subclass so it can become key without a title (otherwise keyboard input is dropped and the close-shake looks dead)
- Activation policy is only dropped back to
.accessorywhen ALL windows are closed — opening Preferences then About then closing About won't kick Preferences out of focus
Install
Download WeChat-Multi-v1.6.2.zip below. Universal binary (arm64 + x86_64), CI-built.
SHA256: d1d38561e6f261d23b29c490df6f20fec506b84c2729dc3c9f82e44a5fc61904
v1.6.1
v1.6.1 — Per-slot delete
You can now remove an individual clone from the popover instead of needing to nuke everything via Preferences → Reset All Clones.
How
Right-click any account row in the popover. If the row is a stopped clone (slot > 0, not currently running), a new Delete Slot… option appears at the bottom of the context menu, marked destructive.
The confirmation alert:
- Explains exactly what's being removed (the cloned
.appbundle under~/Applications/WeChat Multi/) - Includes an Also delete signed-in session and chat history checkbox — but only when there's actually something to reset (a sandbox container exists at
~/Library/Containers/com.wechatmulti.cloneN/) - Defaults the checkbox to off — your login data is preserved unless you opt in, so an accidental delete is recoverable by re-creating the same slot
Refusal paths
The launcher refuses to delete:
- A running clone — quit it first (the existing Quit This Instance option in the same context menu)
- Slot 0 — the original
/Applications/WeChat.appisn't managed by us, so we don't offer to delete it
Install
Download WeChat-Multi-v1.6.1.zip below. Universal binary (arm64 + x86_64), CI-built.
SHA256: 2ff92521cb4f4fac09583ab436fa9a2bff758ace162b069b85dab44cff680b7c
v1.6.0
v1.6.0 — First-run onboarding
A proper three-panel onboarding window replaces the bare NSAlert that v1.0 shipped with. New users land in something that actually explains the app instead of a system dialog with one button.
The three panels
- Concept — what WeChat Multi is, with the app icon at hero scale under a soft jade glow halo
- Location — a stylized menu bar slice with the Stack icon highlighted and pulsing inside an expanding ring, an upward arrow, and a tracked HERE label
- Ready — a stylized mini-popover preview with Add account… highlighted in the same jade hover gradient used in the real popover, plus a pointing-hand glyph
Interaction
- Page transitions slide horizontally with spring physics (forward from trailing edge, back from leading)
- Page indicators morph from dots to a wider jade capsule on the active page
- Skip reachable on panels 1–2 (panel 3 has Get Started instead)
- Keyboard shortcuts:
Return/→advances,←goes back,Escskips
Window
- 600×480, transparent titlebar with
fullSizeContentView - Jade-tinted background gradient (linear + radial wash anchored top-left)
- Movable from anywhere in the window (no need to grab the title bar)
- Custom
NSWindowsubclass so keyboard shortcuts still work despite the hidden title
Persistence
DidShowFirstLaunchHint is set immediately on display (not on completion), so closing the window mid-flow still counts as "shown" — the onboarding doesn't re-appear on the next launch. The flow fires exactly once per user.
Install
Download WeChat-Multi-v1.6.0.zip below. Universal binary (arm64 + x86_64), CI-built.
SHA256: 9a4f949959f8a9b3724a68c534d39db8446117181532bab4b5449a6bc9edb17f
Upgrading from v1.5.x: drop in the new bundle. Existing clones, custom slot names, per-slot colors, and the launch-at-login setting all carry over. Existing users won't see the onboarding (the flag was already flipped during their first launch on v1.0).
To force-show the onboarding for a demo:
defaults delete com.wechatmulti.app DidShowFirstLaunchHint
open "/Applications/WeChat Multi.app"v1.5.2
v1.5.2 — One surface, one design
The right-click NSMenu fallback is gone. It was a stopgap from the v1.4 popover migration — system-rendered, no way to match the popover's polish (jade tints, per-row gradients, monospace pills, glossy status dots). Its biggest cost was the visible design split between left-click (polished popover) and right-click (plain system menu).
Now
- Right-click and left-click both toggle the same polished popover
- Quit All Instances — the one feature that lived only in the old menu — moved to:
- Per-row right-click in the popover — right-click any account row → "Quit All Running Instances" (marked destructive)
- Preferences → Clones — a "Quit All Running" button appears when there are running instances
- First-launch hint copy updated (no longer mentions right-click "advanced options" since right-click is now identical to left-click)
Under the hood
Net −354 lines across AppDelegate: the entire NSMenu plumbing came out (fallbackMenu, rebuildMenu, refreshUI, NSMenuDelegate, menuNeedsUpdate, and a half-dozen @objc action handlers that only served menu items whose features already exist in the popover/Preferences).
Install
Download WeChat-Multi-v1.5.2.zip below. Universal binary (arm64 + x86_64), CI-built.
SHA256: 38ee604d43e48d85e29c54f786d65d21c701a6a46d7da09ee298f9c39dd7199d
v1.5.1
v1.5.1 — Design polish
A pass over both surfaces (popover + Preferences) to make the app feel like a crafted Mac utility instead of a generic flat UI. New shared design system (Brand color tokens, Motion timings, SectionLabel, SettingsCard) used by both surfaces so they read as one app.
Popover
- Account count rendered in a jade-tinted monospace pill at the top right
- Status dots redrawn with a glow ring + vertical gradient fill + tiny white speckle highlight for depth; animate on running-state change
- Subtitle ("running" / "not running") in monospace —
jadeDeepwhen running, secondary when stopped - Row hover state uses a left-to-right jade gradient with a 0.5pt jade border instead of flat opacity
- Stale-clone prompt redesigned: bicolor warning glyph in a circular tint, two-line label, trailing
arrow.clockwiseicon - Footer items gain SF Symbol leading icons (
plus.circle.filljade for Add account…,slider.horizontal.3for Preferences…,powerfor Quit) and monospace ⌘N / ⌘Q shortcuts that brighten on hover - All hover transitions animated with a 140ms ease-out
Preferences window
- Hero card at the top: app icon (with jadeDeep shadow) + name + version pill + tagline on a layered jade gradient (linear + radial wash anchored to the icon)
- Three settings cards (Startup, WeChat Source, Clones) with tracked uppercase headers and subtle elevated containers
- WeChat path rendered in a subtle monospace panel with a
shippingbox.fillicon - Source version and clone count both appear as jade monospace pills — consistent visual rhythm across cards
- Sections stagger-fade-in with spring-based entry timing on window open
- Footer: jade-colored repo link + "Crafted for macOS" microcopy
Install
Download WeChat-Multi-v1.5.1.zip below. Universal binary (arm64 + x86_64), CI-built.
SHA256: 0804fd28616626b843640d451bf2ea489c90c387843637123c2a593fea691f6e
Upgrading from v1.5.0: drop in the new bundle. Existing clones, custom slot names, per-slot colors, and the launch-at-login setting all carry over.
v1.5.0
v1.5.0 — Launch at login
🚀 Launch at login toggle
A new Startup section in Preferences… with a single toggle: Launch at login. Flip it on and the app starts every time you sign in.
Built on SMAppService.mainApp — the modern macOS 13+ API — so:
- No separate helper-app bundle inside our
.app(the legacySMLoginItemSetEnabledapproach) - The registration persists across reboots without us doing anything
- If the OS needs your approval the first time, the toggle shows an inline "Needs approval in System Settings" hint with an Open Login Items… button that deep-links into the right pane
⚠️ Platform bump: macOS 13 Ventura minimum
This release requires macOS 13 or later. The legacy login-item API (which supported back to macOS 10.x) is deprecated and would require shipping a helper bundle to coexist with SMAppService. Monterey users (macOS 12) have been EOL for security updates since late 2024 — the cut feels right.
If you're on macOS 12: stay on v1.4.2. It has every feature except launch-at-login.
Install
Download WeChat-Multi-v1.5.0.zip below, unzip, drag into /Applications, right-click → Open the first time. Or from source:
git clone https://github.com/ashinno/wechat-multi.git
cd wechat-multi
./install.shUniversal binary (arm64 + x86_64), CI-built.
SHA256: bb1e2f7abb3b0c2c75b788c18d36a8f1340ed029f6ed95fd589169a496e27237
v1.4.2
v1.4.2 — Detect running clones in the popover
Patch on top of v1.4.1. Running clones (slots 1+) were showing as not running in the popover even when they were active. The popover only saw the original /Applications/WeChat.app.
Root cause
runningInstances() matched the binary path against three exact suffixes:
/WeChat.app/Contents/MacOS/WeChat/微信.app/Contents/MacOS/WeChat/微信.app/Contents/MacOS/微信
But clones live at ~/Applications/WeChat Multi/WeChat <N>.app/Contents/MacOS/WeChat — the bundle name has a space and a slot number (WeChat 1.app, not WeChat.app), so none of those suffixes matched.
Fix
Rewrote the parser to:
- Gate on
/Contents/MacOS/WeChat(or/Contents/MacOS/微信) — covers both naming and excludes helpers likeWeChatAppEx,crashpad_handler, etc. - Extract the parent
.appcomponent - Categorize by location: under
cloneRoot→ parse slot from "WeChat .app" naming; otherwise → original (slot 0)
Verified live against 2 running instances — both Main account and the running clone now appear with green dots.
Install
Download WeChat-Multi-v1.4.2.zip below. Universal binary (arm64 + x86_64).
SHA256: 4f4b5e52cbe8a956eb1a92ed1500f630abd245af85139690415dcf9162c201a9
Upgrading from v1.4.x: just drop in the new bundle; everything carries over.