Thanks to Anirudh for getting me started on the right path!

Running Signal Desktop in a Debian VM on OpenBSD

I wanted to get Signal Desktop running in a way that integrates smoothly with my OpenBSD host. Since Signal doesn’t have a native OpenBSD port, I spun up a Debian VM using vmm(4) and vmctl. Below are my notes for setting this up, including a few gotchas.


Step 1: Download Debian ISO

Start with the Bookworm Debian netinst ISO (I had issues with Trixie):

Debian 12.12.0 netinst ISO


Step 2: Configure vmd Permissions

Allow your user account to control VMs by editing /etc/vm.conf:

socket owner :vmdusers

Step 3: Create Disk Image

vmctl create -s 40G debian.qcow2

Step 4: Configure Networking

Edit /etc/pf.conf and add:

match out on egress from 100.64.0.0/10 to any nat-to (egress)
pass in proto { udp tcp } from 100.64.0.0/10 to any port domain     rdr-to 8.8.8.8 port domain

Reload pf:

doas pfctl -f /etc/pf.conf

Step 5: Boot and Install Debian

Start the VM:

vmctl start -c -m 2G -L -r debian.iso debian.qcow2

At boot, edit the installer line and replace quiet with:

console=ttyS0,115220n8

Install Debian with the usual defaults:

  • Use the whole disk, single partition.
  • Remove Gnome and only select SSH Server.

Reboot and update:

apt update && apt upgrade

Step 6: Install Basic Packages

apt install tmux sndiod sudo gpg libgl1-mesa-glx libcanberra-gtk-module

Enable sound:

systemctl enable sndiod

On the OpenBSD host:

doas rcctl set sndiod flags -L 0.0.0.0

Step 7: Install Signal

Follow the Signal Beta instructions (I use Beta because it supports the app tray in Gnome):

Signal Beta Desktop Install Guide


Step 8: SSH Config

Add an entry to ~/.ssh/config:

host debian
    Hostname 100.64.1.3
    User bob
    Compression no
    ForwardX11 yes
    ServerAliveInterval 30
    ServerAliveCountMax 10

Copy your SSH key to enable autologin.


Step 9: Signal Launch Script

Create ~/.bin/signal.sh:

#!/bin/sh
# signal: launch signal-desktop via a vm (vmm(4))

status="$(vmctl status debian | grep running)"
[[ "$status" == "" ]] && {
    vmctl start debian
    sleep 10
}

ssh -Y debian "export AUDIODEVICE=snd@100.64.2.2/0 && signal-desktop-beta &"> /dev/null

Make it executable:

chmod +x ~/.bin/signal.sh

Step 10: Autostart VM

Edit /etc/vm.conf:

socket owner :vmdusers

vm "debian" {
    memory 4G
    disk "/home/bob/vm/debian.qcow2"
    local interface
    owner bob
    enable
}

Restart vmd:

doas rcctl restart vmd

Step 11: Desktop Integration

Get an icon:

mkdir ~/.icons && cd ~/.icons
wget https://upload.wikimedia.org/wikipedia/commons/4/41/Signal_ultramarine_icon.svg -O signal.svg
convert signal.svg signal.png

Create a desktop entry at ~/.local/share/applications/userapp-signal.desktop:

[Desktop Entry]
Version=1.0
Type=Application
Icon=/home/bob/.icons/signal.png
Exec=/home/bob/.bin/signal.sh
Name=Signal VM App
GenericName=Signal
Comment=Run the signal application from debian VM
X-Desktop-File-Install-Version=0.28

Install it:

desktop-file-install --dir=$HOME/.local/share/applications ~/.local/share/applications/userapp-signal.desktop
update-desktop-database ~/.local/share/applications

Gotchas

  • I assume only one VM is running. If you run multiple VMs, the IP may change.
  • Sound forwarding (AUDIODEVICE) is not yet working for me, but the script is structured for consistency with other X11 applications.
  • I use Signal Desktop Beta as the app icon shows up in the tray. I have been unable to get the standard install to work and expose that.
  • You could pick a weaker cipher for faster SSH connections with X11 Forwarding.

That’s it! You now have Signal Desktop running inside a Debian VM on OpenBSD, launched seamlessly from your desktop menu.