You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
echo"hello from mac"| pbcopy
clip2sl
# Now switch to Snow Leopard and paste — should see "hello from mac"
Troubleshooting
"no matching host key type found"
Snow Leopard offers only ssh-rsa / ssh-dss. Verify your ~/.ssh/config has the sl-vm block with both HostKeyAlgorithms +ssh-rsa and PubkeyAcceptedKeyTypes +ssh-rsa.
Asks for password every time
The SSH key isn't being used. Check:
ls -la ~/.ssh/sl_vm_key*
ssh -v sl-vm 2>&1| grep -i identity
Verify the key is on the VM:
ssh sl-vm 'cat ~/.ssh/authorized_keys'
VM IP changed
UTM Shared Network can reassign IPs after restart. Find the new IP in Snow Leopard:
Windows 98 has no SSH and no SPICE guest tools, so QEMU's serial port is the cleanest path for true bidirectional clipboard sync.
Recommended: clip98 (via QEMU serial port)
The clip98 project provides bidirectional clipboard sync between any Windows machine (Windows 95 through Windows 10) and any Node.js host via QEMU's emulated serial port.
How it works
QEMU exposes a virtual serial port (-serial pty) to both sides
A small Windows 9x executable polls the clipboard and reads/writes the serial port
A Node.js script on the host does the same with macOS clipboard via pbcopy/pbpaste
When clipboard changes on either side, the new content is sent over serial
On startup, QEMU prints a line like char device redirected to /dev/ttys019 (label serial0). Note the device path (here /dev/ttys019) — you will need it for the Node.js host script in the next step.
This path changes between QEMU restarts. You will need to update index.js accordingly, or symlink the path to a stable name after each launch.
2. Install a compatible Node.js version
clip98's host code depends on serialport@9.x which uses native bindings incompatible with modern Node (v20+). Use Node 18 via nvm:
# Install nvm if you don't have it
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
# Reload shell — restart your terminal OR run:export NVM_DIR="$HOME/.nvm"
[ -s"$NVM_DIR/nvm.sh" ] &&\."$NVM_DIR/nvm.sh"# Install and use Node 18
nvm install 18
nvm use 18
3. Set up the Node.js host side
The repo layout has two subdirectories: js/ (Node.js host code) and cpp/ (Windows guest code).
git clone https://github.com/giulioz/clip98.git
cd clip98/js
npm install
Update the serial port path in index.js to match what QEMU reported in step 1:
# Example for /dev/ttys019
sed -i '''s|/dev/ttys000|/dev/ttys019|' index.js
Run it:
node index.js
The process sits waiting for serial activity — leave it running.
b) Build with Docker + Wine + VC++ 6.0 (no Windows needed)
The project author maintains a vc6-docker image that bundles Visual C++ 6.0 running under Wine. Build clip98.exe from your cloned repo with one command:
The resulting clip98.exe appears in the repo root.
c) Build inside Win98 with Visual C++ 6.0
Open cpp/clip98.dsw in Visual C++ 6.0 on the Win98 guest and build it there. Useful only if you already have VC++ 6.0 installed in the VM.
5. Run clip98.exe in Win98
Transfer clip98.exe into Win98 (via SMB share, ISO, or floppy image), then run it from a DOS prompt or the Run dialog. It runs in the background — no visible window.
6. Use normally
Copy on either side with Ctrl+C / ⌘C — the clipboard syncs automatically. No commands to run.
Order of operations
Each time you start the VM:
Launch QEMU and note the /dev/ttysXXX path it prints
Edit index.js with that path
node index.js on the Mac
Run clip98.exe in Win98
If you forget to update index.js, node will fail with cannot open /dev/ttys000 or similar.
Alternative: QEMU SMB shared folder (file-based)
Lower-tech approach using a shared folder for text transfer. Also useful for moving files in general (e.g. transferring clip98.exe into Win98 the first time).
Then in Win98, open \\10.0.2.4\qemu\clip.txt in Notepad.
Win98 → Mac: save text from Notepad to \\10.0.2.4\qemu\clip.txt, then on Mac:
cat ~/win98-share/clip.txt | pbcopy
Aliases
cat >>~/.zshrc << 'ALIASEOF'# Windows 98 QEMU shared folder clipboard helpersalias clip2win98='pbpaste > ~/win98-share/clip.txt && echo "Now open \\\\10.0.2.4\\qemu\\clip.txt in Notepad"'alias clipfromwin98='cat ~/win98-share/clip.txt | pbcopy && echo "Mac clipboard updated from Win98"'ALIASEOFsource~/.zshrc
Why not SPICE / qemu-ga?
SPICE: no Windows 98 guest drivers exist; SPICE tools target XP and newer.
qemu-ga (QEMU guest agent): requires modern Windows; no Win9x port.
VirtIO-serial: drivers exist for XP+ but not Win9x.
The legacy serial port is the only standardized peripheral that both Win98 and modern QEMU agree on without any guest-side driver work.
Tips
The serial port is slow (~9600 baud by default) — only suitable for text clipboard, not large data or files.
For large files, combine clip98 (for text) with the SMB share (for files).
clip98.exe is a background process with no window. To stop it, end the task via Task Manager (Ctrl+Alt+Del) in Win98.
serialport@9.x is unmaintained and shows deprecation warnings on install. The bindings still build under Node 18 but not Node 20+.
Troubleshooting
Error: Operation not supported on socket
serialport only supports real serial device files, not Unix sockets or TCP. You must use -serial pty in QEMU and point index.js at the /dev/ttysXXX path it reports.
npm install fails with V8/nan compile errors
You are using a Node version newer than 18. Switch to Node 18 with nvm use 18 and retry rm -rf node_modules && npm install.
Path changes every time QEMU starts
This is normal for -serial pty. Either edit index.js each time, or after QEMU starts run:
ln -sf /dev/ttys019 /tmp/win98-serial # use whatever path QEMU printed