-This is a lot like the docker-osx solution discussed in 4 Bluebubbles and Beeper, except it’s proxmox focused.

Github repo with official instructions is here: https://github.com/luchina-gabriel/OSX-PROXMOX

First you run the installer. Be aware this will require a restart after it runs:

/bin/bash -c "$(curl -fsSL https://install.osx-proxmox.com)"

That should ask some questions, all of which should have pretty obvious answers. I chose macos ventura, and put it on my optiplex zfs pool, and gave it an arbitrary vm id.

It will spin up a vm after it reboots, and that vm will be running the macos installer

First you need to open up the disk utility and wipe the virtio block disk. You should choose apfs for the filesystem type with the guid partition table.

Then you hit reinstall macos, accept terms, select the partition you just created, etc.

Once you begin installation, it may restart, many times. Just keep choosing macos-installer from the boot list. Eventually you boot into the real macos setup page. It might do like 8 or 9 restarts though. I didn’t count but it did a lot.

Once I got into macos, first thing I did was enable the ssh server. apple logo in top left system settings general sharing enable remote login click the i next to remote login allow full disk access for all users and allow access for all users

you will see none of your old imessages in the vm. You’ll be able to see the new ones, but none of the old ones.

This is, infact, a travesty. Completely unacceptable.

My solution to this is to copy over the messages from my old mac.

Here is the guide I followed to do that: https://www.reddit.com/r/mac/comments/3kq6dr/whats_the_best_way_to_transfer_imessages_to_a_new/

So, first we have to make sure messages is closed, which requires closing bluebubbles too.

Ip of new mac is 192.168.2.164

We also must rename the old messages folder, to something new. In order to do this, ssh in, and use sudo to mv /Users/thomasmcelroy/Library/Messages /Users/thomasmcelroy/Library/Messages2

So now I can

scp -r /Users/thomasmcelroy/Library/Messages [email protected]:/Users/thomasmcelroy/Library/Messages

Then I must restart the new computer, once that copy operation finishes. I now see all my messages, and can send messages and they work. You should test this before continuing.

Next up we need to install bluebubbles. I could just grab the dmg from their github releases, but I am going to do homebrew so I can have updates via brew ( currently the developer’s apple developer account is unable to push updates, so auto update is broken )

In order to do this, I went to brew.sh, where homebrew is distributed, but it didn’t load right.

Installing and using chrome fixed that.

Brew can be installed via this command:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Once the brew installation finishes, you can install bluebubbles server with this command:

brew install --cask bluebubbles

Now bluebubbles will be in your applications menu. Open it up.

It will tell you that it can’t be verified, so you should hit cancel then go fix that via settings privacy and security “bluebubbles was blocked … open anyway” enter password open

It’s gonna ask you for full disk access. Settings privacy and security full disk access enable bluebubbles

You’re also going to want to go to settings privacy and security accessiblity and enable bluebubbles.

Now it wants me to setup firebase. Issue is that I have already setup firebase multiple times previously. I am just going to rename the old projects, so that I can start a new one. I also could totally skip setting up firebase if I wanted, because firebase handles notifications and I am using the beeper bridge, but It is still worthwhile just in case beeper stops working for whatever reason.

go to https://console.firebase.google.com/ and rename or delete any projects you have already titled bluebubbles Renaming can be done by clicking the project, and hitting the settings cog next to “project overview” in the top left, then hitting project settings.

then you should be able to continue with google in the bluebubbles app.

If you get an error saying status code 429 or failed to provision or anything like that, just hit the continue with google button again and try again. Took me 3 tries.

On next page, youll need to set server password and proxy. I chose cloudflare for proxy. Remember to hit the save button on your password, or else you cant continue with the thing. Odd that it requires individual saving though, and that it isnt saved just by you hitting the next button

Now it is time for the private api setup

We need to edit config.plist to disable SIP, and for that we need a plist editor. I have absolutely no wish to deal with installing dependencies, and ProperTree, the plist editor im aware of, is not on brew, so im going to install it from the aur on my laptop https://aur.archlinux.org/packages/propertree-git.

yay -S propertree-git

Then we need to send the config.plist file to ourself.

open finder EFI-PX-HACK EFI OC

Copy config.plist

send to yourself however you want ( i emailed it cause i was already signed into that )

then run ProperTree on it

ProperTree config.plist

then you need to hit ctrl+f

type in csr

hit enter

You should find the key csr-active-config

Set csr-active-config’s data value to 67000000

send it back to yourself, and replace the old config.plist file with it’s new edited form.

now reboot, and hit 4 to reset nvram

I also then went to recovery ( 3 i believe ) and ran

csrutil disable

in the recovery terminal

i know they advise against this for virtualized macs, but i did it anyway and have had no issues yet.

then reboot again.

Next I setup startup disk and autologin

settings users and groups automatically login as your user

and I edited config.plist once more . open it up in propertree hit ctrl+f and find ShowPicker. Set that to false.

send it to yourself again and have it replace current config.plist

this will make you not have to hit enter in order to boot the thing.

All we have left now is installing the beeper bridge!

For that, I will be using https://github.com/ngencokamin/sh-imessage-setup

first, we need to install tmux

brew install tmux 

then we need to

git clone https://github.com/ngencokamin/sh-imessage-setup
cd sh-imessage-setup
chmod +x setup.sh
./setup.sh

say Y to reinstall bbctl and Y to just about everything else other than entering passwords.

then run zsh to get a new shell and run bbctl login to do the beeper login process

run start-bb-server then tmux a

give it a little bit to get setup. While you wait, send a message to yourself and see if it comes in on your phone.

Your chats WILL most likely separate from eachother, which sucks, but you will still get backfill so it won’t matter too much. You will just get duplicate old messages which kinda sucks

The duplicate thing you can avoid if you run

bbctl delete sh-imessage

then re run

./setup.sh

though this does mean you lose any messages that don’t get backfilled for whatever reason

This script also does handling of automatic startup on boot via cron jobs. I have never experienced it work, because it looks at .bashrc, which is not relevant on macos, and because it tries to use an alias sourced from bashrc, which I do not think is how shell scripts work

It does the adding to the contab right, but not the actual script

so first you need to run ssh-keygen and ssh-copy-id localhost

then open ~/check_and_run.sh

replace current contents with this

#!/bin/bash  
  
    if ! pgrep -f "bbctl" > /dev/null  
    then  
        rm ~/bbctllog.txt  
        rm ~/balls.txt  
        sleep 100  
        touch ~/balls.txt  
        ssh -tt localhost "/usr/local/bin/bbctl run --param 'bluebubbles_url=[http://localhost:1234](http://localhost:1234)' --param 'bluebubbles_password=yourbbpassword' --param 'imessage_platform=bluebubbles' sh-imessage >> ~/bbctllog.txt"  
    fi

edit yourbbpassword to be your bluebubbles server password

Reboot to make sure that works. It will take 100 seconds for it to start up, because of sleep 100. I do this so that bluebubbles can start before it, because if it starts before bluebubbles the script will fail to connect and then exit. I could do this better with like checking whether or not curl localhost:1234 returns anything in a while loop etc etc but I did not bother.

balls.txt’s existance is a flag for whether or not the script has been started. it is not necessary if things are working properly.

bbcttllog is the log of output from the script, you can cat bbctllog.txt at any time to see what it’s up to

can’t use tmux doing like this because getting cronjob to start a tmux session was a nuisance