Dry Hopped or mold
Hi everyone, doing a citra IPA and it had a dry hopping step after one week. We're at two weeks now and seeing in addition to the green on the rim some black. Is that a bad sign?
Hi everyone, doing a citra IPA and it had a dry hopping step after one week. We're at two weeks now and seeing in addition to the green on the rim some black. Is that a bad sign?
Boy howdy these are not thinking big and pretty underwhelming, imo. Capping the highways feels the closest to large ambition that would stand out to the world.
Okay I've been trying for months both with physical dummy HDMI connectors and virtual ones and for the life of me I can't get streaming to my handhelds to work properly. It works when I install decky sunshine BUT my display on my handhelds is 1/4 of the screen. Or a blank screen when trying with the dummy outputs. After a TON of trial and error with Claude's help I got it working. It's not perfect, you have to disconnect and reconnect when you first initiate Moonlight. But it's the closes to good enough I've gotten. Here's the steps:
My setup:
Don't use the Samsung Q800T EDID that some guides suggest — it advertises 4K as preferred and gamescope will pick that up and render at 4K, causing a quarter-screen issue on 1080p clients.
Use this 1080p-only EDID instead:
bash
sudo mkdir -p /usr/lib/firmware/edid
sudo curl -L -o /usr/lib/firmware/edid/virtual-1080p.bin \
"https://raw.githubusercontent.com/akatrevorjay/edid-generator/master/1920x1080.bin"
file /usr/lib/firmware/edid/virtual-1080p.bin
# Should say: EDID data, version 1.3
Edit /etc/mkinitcpio.conf and add the file to the FILES array:
FILES=(/usr/lib/firmware/edid/virtual-1080p.bin)
Important: CachyOS deckify uses Limine, not systemd-boot. Do not edit /boot/limine.conf directly — it gets overwritten. The correct override file is /etc/default/limine.
First identify your free connector (one that's disconnected and not your main display):
bash
for p in /sys/class/drm/*/status; do con=${p%/status}; echo -n "${con#*/card?-}: "; cat $p; done
My TV was on DP-2 and I used HDMI-A-1 as the virtual display. Add to /etc/default/limine — keep your existing KERNEL_CMDLINE line and append a second one:
bash
# Your existing line stays as-is, add this below it:
KERNEL_CMDLINE[default]+=" drm.edid_firmware=HDMI-A-1:edid/virtual-1080p.bin video=HDMI-A-1:1920x1080@60e"
The e at the end of the video= parameter is critical — it forces the connector enabled even with nothing plugged in.
Then regenerate:
bash
sudo limine-mkinitcpio
After reboot, verify:
bash
for p in /sys/class/drm/*/status; do con=${p%/status}; echo -n "${con#*/card?-}: "; cat $p; done
# HDMI-A-1 should show: connected
The deckify gamescope session script builds its -O (output) flag from the OUTPUT_CONNECTOR environment variable. By default it uses * which picks your physical display first. We need to control this so HDMI-A-1 becomes primary when streaming.
Create a systemd drop-in (TV-first is the default/resting state):
bash
sudo mkdir -p /etc/systemd/user/gamescope-session.service.d/
sudo tee /etc/systemd/user/gamescope-session.service.d/output-connector.conf << 'EOF'
[Service]
Environment="OUTPUT_CONNECTOR=DP-2,HDMI-A-1"
EOF
Reload:
bash
sudo -u deck DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus XDG_RUNTIME_DIR=/run/user/1000 systemctl --user daemon-reload
Install Decky Loader first if you haven't, then install the Decky Sunshine plugin from the Decky store. It handles Sunshine as a system Flatpak running as root.
If you previously installed Sunshine via AUR: remove it first (pacman -Rns sunshine) and clean up the leftover config (rm -rf /home/deck/.config/sunshine/). The Decky plugin will reinstall it as a Flatpak.
Display ID: leave the Display ID field blank in Sunshine's Audio/Video config — letting it auto-detect works better than setting it explicitly.
The Sunshine Flatpak sandbox is heavily restricted — it can't exec host binaries directly, can't write to /tmp (isolated), and flatpak-spawn --host requires D-Bus which isn't always available. The working solution is a systemd path unit that watches a trigger file inside the Flatpak's own config directory.
Create the trigger scripts (these run inside the Flatpak sandbox and can write to their own config dir):
bash
sudo mkdir -p /root/.var/app/dev.lizardbyte.app.Sunshine/config/sunshine/scripts
sudo tee /root/.var/app/dev.lizardbyte.app.Sunshine/config/sunshine/scripts/connect.sh << 'EOF'
#!/bin/bash
rm -f /root/.var/app/dev.lizardbyte.app.Sunshine/config/sunshine/trigger-disconnect
touch /root/.var/app/dev.lizardbyte.app.Sunshine/config/sunshine/trigger-connect
EOF
sudo tee /root/.var/app/dev.lizardbyte.app.Sunshine/config/sunshine/scripts/disconnect.sh << 'EOF'
#!/bin/bash
rm -f /root/.var/app/dev.lizardbyte.app.Sunshine/config/sunshine/trigger-connect
touch /root/.var/app/dev.lizardbyte.app.Sunshine/config/sunshine/trigger-disconnect
EOF
sudo chmod +x /root/.var/app/dev.lizardbyte.app.Sunshine/config/sunshine/scripts/connect.sh
sudo chmod +x /root/.var/app/dev.lizardbyte.app.Sunshine/config/sunshine/scripts/disconnect.sh
Create the systemd path units and services (these run on the host as root and can do anything):
bash
sudo tee /etc/systemd/system/sunshine-connect.path << 'EOF'
[Unit]
Description=Watch for Sunshine connect trigger
[Path]
PathExists=/root/.var/app/dev.lizardbyte.app.Sunshine/config/sunshine/trigger-connect
Unit=sunshine-connect.service
[Install]
WantedBy=multi-user.target
EOF
sudo tee /etc/systemd/system/sunshine-disconnect.path << 'EOF'
[Unit]
Description=Watch for Sunshine disconnect trigger
[Path]
PathExists=/root/.var/app/dev.lizardbyte.app.Sunshine/config/sunshine/trigger-disconnect
Unit=sunshine-disconnect.service
[Install]
WantedBy=multi-user.target
EOF
sudo tee /etc/systemd/system/sunshine-connect.service << 'EOF'
[Unit]
Description=Sunshine Connect Handler
StartLimitBurst=2
StartLimitIntervalSec=60
[Service]
Type=oneshot
ExecStart=/bin/bash -c "rm -f /root/.var/app/dev.lizardbyte.app.Sunshine/config/sunshine/trigger-connect && printf '[Service]\nEnvironment=\"OUTPUT_CONNECTOR=HDMI-A-1,DP-2\"\n' > /etc/systemd/user/gamescope-session.service.d/output-connector.conf"
ExecStart=machinectl shell deck@ /bin/bash -c 'systemctl --user daemon-reload && systemctl --user restart gamescope-session.target'
EOF
sudo tee /etc/systemd/system/sunshine-disconnect.service << 'EOF'
[Unit]
Description=Sunshine Disconnect Handler
StartLimitBurst=2
StartLimitIntervalSec=60
[Service]
Type=oneshot
ExecStart=/bin/bash -c "rm -f /root/.var/app/dev.lizardbyte.app.Sunshine/config/sunshine/trigger-disconnect && printf '[Service]\nEnvironment=\"OUTPUT_CONNECTOR=DP-2,HDMI-A-1\"\n' > /etc/systemd/user/gamescope-session.service.d/output-connector.conf"
ExecStart=machinectl shell deck@ /bin/bash -c 'systemctl --user daemon-reload && systemctl --user restart gamescope-session.target'
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now sunshine-connect.path
sudo systemctl enable --now sunshine-disconnect.path
Set the Sunshine app commands in the web UI under Applications → Desktop → Command Preparations:
/root/.var/app/dev.lizardbyte.app.Sunshine/config/sunshine/scripts/connect.sh/root/.var/app/dev.lizardbyte.app.Sunshine/config/sunshine/scripts/disconnect.shKnown quirk: because gamescope has to fully restart when you connect, Moonlight will show a blank screen initially. Disconnect and reconnect once and it will display correctly. This is because Sunshine locks onto the display state at connection time, before gamescope finishes restarting.
If the TV doesn't restore after disconnecting, the path unit may have hit its rate limit:
bash
sudo systemctl reset-failed sunshine-connect.service sunshine-disconnect.service sunshine-connect.path sunshine-disconnect.path
sudo systemctl restart sunshine-connect.path sunshine-disconnect.path
# Then manually trigger disconnect:
sudo systemctl start sunshine-disconnect.service