Whisky is dead. Pour yourself a Dram.
A terminal-based Windows-games-on-Mac manager for Apple Silicon, built to replace Whisky after it was discontinued. One Python file, no dependencies, runs on the Python that ships with macOS.
A dram is a small pour β and on an entry-level Mac, small pours are exactly what you want.
Not affiliated with Whisky, CrossOver, GOG, or Valve. Dram is a launcher and a wrapper around Wine; it does not ship or circumvent any game, and it assumes you own what you point it at.
- Apple Silicon Mac (Intel works, minus the Rosetta layer), macOS 13+
- Homebrew β used to install Wine, winetricks, innoextract
- Xcode Command Line Tools, only for the optional controller mapper
- ~15 GB free for a prefix plus a few games
Whisky was a GUI over three things, and Dram manages the same three:
| Layer | What it does | Dram's source for it |
|---|---|---|
| Rosetta 2 | Runs x86_64 code on Apple Silicon | Built into macOS (dram setup installs it) |
| Wine engine | Runs Windows programs on macOS | In order of preference: WineHQ builds (wine 10/11 β best audio & controllers) β Gcenx Wine-Crossover if present β leftover WhiskyWine β anything on PATH |
| Graphics translation | DirectX β Metal | D3DMetal if your engine has it (WhiskyWine/GPTK does), otherwise Wine's WineD3D + MoltenVK β fine for DX9/OpenGL-era 2D games |
Together the first two are what people half-remember as "RosettaWine".
dram engine shows every engine found on your machine and which one is
active; dram engine --set pins a specific one.
If you had Whisky installed before: its engine (WhiskyWine, with
D3DMetal) usually survives in ~/Library/Application Support/com.isaacmarovitz.Whisky/
and Dram adopts it automatically. Old Whisky bottles keep working too β
dram doctor finds them, and dram scan reads the GOG manifests inside
them so previously-installed games can be re-registered in one step.
./install.sh # symlinks `dram` onto your PATH
dram setup # installs anything missing: Rosetta 2, Wine, winetricks, prefix
dram doctor # verify everything (add --fix to auto-repair the safe stuff)dram setup is idempotent β run it any time; it skips what's already done.
dram # interactive menu: pick a number, play
dram add # add a game (interactive, tab-completes paths)
dram add ~/Games/MyGame/game.exe --yes
dram scan ~/Downloads # hunt a folder for game .exes, add in bulk
dram search <name> # fuzzy search (typos fine)
dram play <name> # fuzzy launch; `dram play 1` works too
dram install ~/Downloads/setup_game.exe # unpack a GOG installer and
# auto-register what it containsEverything lives in ~/.dram (library, config, prefixes, logs). Override
with DRAM_HOME.
Full documentation: Command reference β every command and flag, generated from the parser itself Β· Configuration β every setting, per-game fields, and what lives where.
| Command | What |
|---|---|
dram doctor [--fix] |
Full health check: CPU/RAM/disk, Rosetta, Homebrew, engines, quarantine flags, D3DMetal, audio output & controllers, prefix, dead library entries, old Whisky bottles |
dram list / remove / edit |
Library management; playtime + last-played tracked automatically |
dram engine [--set NAME|auto] [--install stable|staging|devel|gptk] |
List/pin/install Wine engines; per-game pin via dram add --engine or dram edit |
dram joy |
Open Wine's joystick panel to test a controller inside Wine |
dram pad [--list] [--game <game>] |
Controllerβkeyboard/mouse mapper for games with no pad support; per-game profiles |
dram prefix list|new|delete|path |
Multiple prefixes ("bottles") |
dram prefix snapshot/rollback [label] |
APFS copy-on-write prefix snapshots β instant, near-free; take one before winetricks or an installer |
dram config |
Toggles: msync, esync, retina, metal_hud, avx, locale, eco, turbo, pad |
dram tricks <verbs> |
winetricks passthrough (DLLs, fonts, runtimes) |
dram cfg / dram open |
winecfg / open the prefix's C: drive in Finder |
dram run foo.exe / dram wine β¦ |
One-off exe / raw wine passthrough |
dram steam [appid] |
Windows Steam inside the prefix, for Windows-only titles |
dram steamcmd <appid> --user <you> |
Pull a Windows build with Valve's CLI β no Steam client |
dram saves backup/restore <game> |
Save-game snapshots β auto-finds saves in prefixes (AppData, Documents, Saved Games) and ~/Library/Application Support, zips them, keeps the last 10 |
dram mod list/backup/install/restore <game> |
Mod manager with a safety net β APFS-clones the game folder first, unpacks .zip/.7z/.rar/.tar.* or folders, runs .exe patchers inside the game dir, rolls back with one command |
dram shortcut <game> |
Generates a tiny .app in ~/Applications β launch from Spotlight/the Dock |
dram warm [game] |
Pre-warm wine + RAM-cache game files for a hot start |
dram play --turbo / --eco |
No display sleep + resident wineserver / efficiency-core clamp |
dram why [game] [--deep] |
Crash triage: scans the last log for known failure signatures and names the fix. On a frozen game it reads the thread table to tell a spin from rendering; --deep names the module the spinning thread is stuck in |
dram kill / dram logs [game] |
Shut down wineserver everywhere / tail the latest log |
dram completion / dram update |
zsh tab-completion; self-update via git pull |
- GOG installers β
dram install <setup.exe or its folder>. Dram does not run GOG's wizard: GOG wraps Inno Setup in a custom skinned UI (botva2.dll) that crashes under Wine on Apple Silicon β it dies silently right after the language dialog, and no combination of/VERYSILENTflags avoids it. Instead Dram unpacks the installer natively withinnoextract(auto-installed via Homebrew): no Wine, no wizard, headless and deterministic. It then reads GOG's owngoggame-<id>.infomanifest for the real title and primary executable β so DOSBox/ScummVM-wrapped classics register correctly instead of you guessing which exe to pick β and drops the game in~/Games/<Title>. Multi-part downloads (-1.bin,-2.bin) are handled.--wineforces the run-the-installer path if you need it. - itch.io / standalone exes β unzip anywhere,
dram add. - Steam, Windows-only titles. The Mac Steam client refuses to install
Windows-only depots. Two options:
dram steamcmd <appid> --user <account>uses Valve's official CLI to download the Windows build directly β no client, no GUI, less RAM. Dram never handles your password; SteamCMD prompts you itself.dram steaminstalls and launches the Windows client in the prefix, thendram steam <appid> --name "Game"registers a one-command launcher. The client costs ~1 GB of RAM, so prefer the CLI. If store pages render black, add-cef-in-process-gpu;--no-browserskips the web helper entirely and fixes the classic hang at "Update complete, launching Steamβ¦".
- Check for a native Mac build first. Many games ship one, and native
always beats Wine on speed, RAM and battery.
dram addany.appbundle or Mac binary and it runs with zero translation layers β Dram is a unified launcher, not a Wine-only one. It nudges you when you add a Windows exe of a title known to have a Mac version.
Written for entry-level Apple Silicon Macs, useful on any of them.
- Close the browser before playing; it's the other thing holding a gig.
msyncis on by default (fastest sync on macOS). Leaveesyncoff unless you know why you want it.- One shared prefix beats a prefix per game β each booted prefix costs RAM and disk. Exception: pinned old engines need their own (below).
- After playing,
dram killfrees whatever wineserver still holds. - 2D and DX9-era games are the sweet spot. DX12 AAA is not happening on an entry-level machine β that's the hardware, not the tool.
Dram keeps Whisky's core β Rosetta 2 + Wine is still the most efficient Windows-runner on macOS; a Windows-ARM VM eats half a low-memory Mac before the game boots β but deviates where it pays:
-
Native Mac builds beat Wine. Always. See above:
.appbundles are first-class library entries with no prefix and no translation. -
Eco mode β
dram play <game> --eco(ordram config eco on) clamps the game to the efficiency cores viataskpolicy. 2D games don't need performance cores; on battery this is a real power and heat win. Turn it off when frames matter. (On "CPU offloading": x86 translation can't be pushed to the GPU. The real levers on Apple Silicon are E/P-core steering, keeping the GPU path modern, and pre-warming.) -
Warm starts β
dram warm <game>boots wine's services, holdswineserverresident, and streams the game's files into the RAM page cache (capped at 1 GB; macOS evicts it freely under pressure), so the nextdram playskips cold-start seconds and first-minute disk stutter.dram play --turboadds: no display sleep while the game runs (essential for controller play, where you never touch the keyboard), other prefixes quiesced, and your prefix's server pre-attached. Engine version probes are disk-cached, so the menu and doctor open instantly instead of re-runningwine --versionthrough Rosetta. -
Engine choice per job β this is a real trade, know it. Modern WineHQ (wine 11) has the good audio stack and the modern controller stack, but no D3DMetal: DirectX goes WineD3DβVulkanβMoltenVKβMetal. Apple's D3DMetal (in WhiskyWine/GPTK) translates DirectXβMetal directly and is markedly faster for GPU-heavy scenes β think heavy particle load β at the cost of an ancient wine 7.7 core with crackly audio and weak pad support. So keep wine 11 as the default and pin GPU-heavy games to D3DMetal:
dram prefix new retro # old engines need their own prefix dram add "<game.exe>" --engine d3dmetal --prefix retro dram edit <game> # or set engine: d3dmetal
--engineaccepts a fuzzy name (whisky,d3dmetal,gptk,stable), a number fromdram engine, or a full path. Give pinned games their own prefix β wine generations rewrite a prefix's registry and system DLLs, so pointing wine 7.7 at a prefix wine 11 has upgraded breaks in confusing ways. Dram warns you if you forget. -
The future, when it lands: ARM64EC Wine (native ARM Wine that emulates only the game's x86 code, how Windows-on-ARM does it) isn't available for macOS yet. The day a build ships it drops into Dram as just another engine. Nothing to rewrite.
dram dxvk install|remove|status is there, and DXVK's persistent shader
cache is genuinely the right cure for "stutters the first time each
effect appears". But on Apple Silicon it currently doesn't work, and
Dram says so before touching anything. Measured on Apple Silicon with
MoltenVK and wine 11:
| DXVK | Result |
|---|---|
3.x (latest) |
No adapters found β needs Vulkan 1.3 features MoltenVK doesn't implement. Game won't start. |
| 1.10.3 (default) | DxvkAdapter: Failed to create device β game runs, audio plays, black screen. |
So dram dxvk install defaults to 1.10.3 rather than latest, warns on
Apple Silicon, and asks before proceeding. Installing preserves wine's
own PE builtins as *.dll.dram-builtin and dram dxvk remove puts
them back β important, because wine 10/11 ship builtins as real .dll
files, so a naive uninstall would delete your DirectX.
For GPU-heavy games on Apple Silicon, pin D3DMetal instead (see engine choice above) β that's the path that actually works today.
Both problems mostly live in Whisky's engine β WhiskyWine is wine 7.7 (a 2022 Game Porting Toolkit fork) with a crackly CoreAudio path and a mostly-broken gamepad stack. The fix is a modern engine:
dram engine --install stableinstalls WineHQ's current build: reworked audio timing and the modern controller stack (Xbox, DualShock, DualSense, Switch Pro). Auto-detect prefers it once installed.dram doctorchecks your default audio output (Bluetooth warning, sample-rate hint) and whether macOS sees a controller at all.dram joyopens Wine's joystick panel to confirm the pad inside Wine.
Still choppy on the new engine?
- Audio MIDI Setup (
/Applications/Utilities) β your output device β 44100.0 Hz. Many 2D engines output 44.1 kHz, and resampling to 48 kHz under Rosetta is a classic crackle source. - Wired beats Bluetooth while gaming β for both audio and pads.
- Close the browser; under memory pressure the audio thread starves.
Mods that bring their own audio engine are a known hazard. Wine
reimplements XAudio2 as xaudio2_9.dll (FAudio), and a mod audio backend
built against real XAudio2 can wedge it outright β the game freezes
rather than crackles, at full CPU. dram why --deep names the DLL. The
documented case is FINAL FANTASY IX + Memoria (see
Worked examples); the fix is to point the mod at a
different backend rather than to touch Wine.
Plenty of PC games simply have no gamepad code β Wine's joy.cpl
sees the pad, the game never asks for it. On Windows people fix this with
Steam Input or JoyToKey; Dram ships its own native equivalent, built on
Apple's GameController framework:
dram pad --list # can macOS see the pad? (wake it with a button press)
dram play <game> --pad # run the mapper alongside the game
dram pad --game <game> # create a per-game profile
dram config pad on # β¦or run it with every gameDefault layout: left stick = mouse cursor, A = click & drag, RT =
click, LT = right-click, dpad = arrow keys, B/X = X/Z keys, right stick =
scroll, Menu = Enter, View = Esc. Edit ~/.dram/padmap.json to remap
("key:<name>", "click", "rclick", "none"; left_stick can be
"mouse" or "arrows"). Per-game profiles live in ~/.dram/padmaps/.
First run: macOS prompts for Accessibility permission for your terminal (System Settings β Privacy & Security β Accessibility) β that's what lets the mapper send keys and clicks.
Controller seen by dram joy but a pad-supporting game still ignores
it? Unplug other HID gadgets; some games only read slot 0.
Mods overwrite game files in place, so Dram snapshots first β an APFS clone of the whole game folder, effectively instant and costing no disk until files diverge. Nothing is ever a one-way door.
dram mod list <game> # installed mods, backups, drift
dram mod backup <game> --name clean # snapshot before you tinker
dram mod install <game> --mod ~/Downloads/SomeMod.zip
dram mod restore <game> --name clean # undo everything
dram mod diff <game> # exactly which files changed
dram mod prune <game> --keep clean # reclaim space from old backupsDrift detection. Every backup also records a fingerprint of the game
folder (relative path β size, mtime), so dram mod list reports anything
that changed since the last one:
β drifted since 20260731-110110-base:
2 added, 1 modified (+2.9 MB on disk)
This matters because in-game mod managers write straight into the game
folder and never touch Dram's snapshot layer β without drift detection
you'd think you were covered when you weren't. Take a fresh backup to
capture a state you like, or dram mod diff <game> to see exactly which
files were added, modified and removed, with sizes.
Pruning. Backups are APFS clones, so they cost almost nothing at
first and slowly turn into real disk as mods overwrite files. dram mod prune keeps the 2 newest by default, plus anything matching --keep,
and reports what was actually reclaimed rather than the misleading
logical size β deleting a 247.7 MB clone of an untouched folder frees
about 144 KB.
--mod accepts an archive (.zip, .7z, .rar, .tar.*), a folder
(contents merged in), or a .exe patcher β patchers are staged into the
game directory and run there, because that's how they find the assemblies
they rewrite. Every install auto-backs-up first unless you pass
--no-backup. Dram detects common frameworks (Memoria, Moguri, BepInEx)
and carries per-game setup notes in a GAME_TIPS table, surfaced by
dram add and dram mod list so the advice arrives when it's useful.
Concrete end-to-end runs. Everything above is game-agnostic; this section is where specific titles are the point.
dram install ~/Downloads/setup_garou_mark_of_the_wolves_*.exe
dram play garouVerified on Garou: Mark of the Wolves (GOG, 2020-era installer):
innoextract unpacked 247.7 MB to ~/Games/GAROU - MARK OF THE WOLVES,
Dram read goggame-1830215906.info for the title and primary exe,
registered it automatically, and it launched and ran under wine 11.
Note this vintage of GOG installer puts the game at the extraction root
rather than under app/; Dram handles both layouts.
dram steamcmd 1856900 --user <your-account> --name "Andro Dunos II"
dram play androVerified on Andro Dunos II: SteamCMD pulled the Windows depot to
~/.dram/steamapps/1856900 with no client running. That title ships
xinput1_3.dll and no steam_api.dll, so it has native controller
support and no DRM check β it runs standalone.
FINAL FANTASY IX is Windows-only, Unity-based, and mods cleanly under Wine. After buying it on GOG:
dram install ~/Downloads/setup_final_fantasy_ix_*.exe
dram mod backup "final fantasy" --name vanilla
dram mod install "final fantasy" --mod ~/Downloads/Memoria.Patcher.exeThe patcher runs on Wine's bundled Mono β don't install dotnet48
first; it's slow, failure-prone, and unnecessary here. dram mod install
stages the patcher inside the game folder and runs it there, which is how
it locates the launcher it rewrites.
Install Memoria first β it's the engine patcher and it ships the
Mod Manager that downloads Moguri, 30 FPS videos, PSX sounds and the
alternate soundtrack. Pull Moguri through that manager rather than
hand-installing it, which is where most Wine/Proton guides report
trouble. Budget ~5 GB. If a mod misbehaves,
dram mod restore "final fantasy" --name vanilla puts you back exactly.
Known issue β set Memoria's audio backend. Memoria defaults to its
own SaXAudio engine (Backend = 1, under [Audio] in Memoria.ini),
which drives XAudio2. There's no Microsoft XAudio2 here β Wine
substitutes its own reimplementation, xaudio2_9.dll, built on FAudio β
and SaXAudio wedges it. The symptom is precise: the title screen draws
normally, then the game freezes about a second later while pegging a
core. It isn't a crash and it leaves nothing useful in the log; the audio
thread has entered a loop it never leaves, and every Unity thread is left
blocked on wineserver waiting for a callback that never comes.
[Audio]
Backend = 0 ; SdLib β was 1 (SaXAudio)The "not recommended" label on 0 in that file is written for Windows
players, where SaXAudio genuinely is better. Under Wine the
recommendation inverts. Backend = 2 (Soloud) is the middle option if
you hit audio quirks. If you specifically want SaXAudio back, the other
route is forcing Wine to use the real XAudio2 the game already ships in
x64/: dram edit β env WINEDLLOVERRIDES=xaudio2_9=n,b.
- "Engine found but won't run" β usually Rosetta missing
(
dram doctor --fix) or Gatekeeper quarantine (also--fix). - Game exits instantly β
dram why <game>reads the log and names the fix. Missing DirectX helpers are the usual culprit:dram tricks d3dx9 corefonts; .NET games wantdram tricks dotnet48. - Freezes seconds in but still burns ~100% CPU β that's not a crash,
it's one thread spinning.
dram whyreads the thread table β a rendering game spreads work across its render and worker threads, a wedged one pegs a single thread and parks the rest β anddram why --deepattaches lldb to name the DLL it's stuck in. A mod's audio backend wedging Wine's XAudio2/FAudio is the classic case (see the FINAL FANTASY IX example above). - Blurry or tiny window β
dram config retina on(crisp, small UI) oroff(default). - First launch is slow β Rosetta translates the engine once, then
caches; later runs are much faster.
dram warmfront-loads it. - Wine got stuck β
dram kill.
rm -rf ~/.dram # library, prefixes (installed games!), logs
rm -f /opt/homebrew/bin/dram ~/.local/bin/dram
brew uninstall --cask wine-stable # only if setup installed itSee CONTRIBUTING.md. Short version: one file, no dependencies, must run on the Python macOS ships with, and anything that writes into a prefix or game folder needs an undo path.
python3 -m unittest discover -s tests -vThe suite is hermetic and mostly regression tests for bugs that actually shipped β each one names the failure it prevents.
Dram Personal Use License β see LICENSE.
Use it, install it, modify it for yourself, all freely and without asking. Redistributing, republishing, forking publicly, bundling it into another product, or selling it requires written permission β open an issue if you'd like it.
Dram is a launcher: it doesn't include Wine, DXVK, innoextract, SteamCMD or any game, and this licence says nothing about those. Releases up to and including v0.8.0 were published under MIT and remain available under those terms; every release after that is under the licence above.