Notifications
Clear all

Intruducing: PrusaLink Discord Notify  

  RSS
Fynnovation
(@fynnovation)
Member
Intruducing: PrusaLink Discord Notify

Since the introduction of Buddy firmware, tools like OctoPrint are no longer fully reliable as a monitoring layer for Prusa printers in my experience.
With that in mind, I was looking for a solution to send print progress notifications to a Discord server, similar to what the OctoPrint plugin Octorant provides.

Because OctoPrint relies on serial communication with the printer, it has several limitations when used purely as a monitoring solution:

  • Unreliable detection of prints that were not started through OctoPrint
  • Inconsistent job and progress tracking for locally started prints

Prusa Connect, the cloud-based counterpart to PrusaLink, does offer a Discord integration, but it is limited to basic status notifications.

It does not provide (as of now):

  • detailed printer metrics
  • live snapshots or images (even if a camera is available)

Since PrusaLink provides a direct local API with live printer data, I decided to develop my own solution:

PrusaLink Discord Notify (BETA)

PrusaLink Discord Notify is a lightweight C# background service that monitors a Prusa printer via the local PrusaLink API and posts structured status and progress updates to a Discord channel — including live camera snapshots.

It's still in a beta-like state and will be further refined.
Feature requests are also welcome XD

Features

  • Polls the printer at a configurable interval
  • Detects relevant state changes only
  • Sends updates only when meaningful events occur
  • Rate-limited progress notifications using:
    • time-based thresholds
    • percentage-based thresholds
  • Persistent local state for restart safety
  • Prevents:
    • duplicate notifications
    • outdated job detection
    • false progress updates after restarts
  • Designed for:
    • unattended operation
    • graceful shutdown
    • long-running stability

Recommended Platform

Raspberry Pi 5 (recommended)
Raspberry Pi 4 (should also work fine, not tested)

Screenshot1.png

Screenshot2.png

Installation

Requirements

  • .NET 9
  • FFmpeg 

⚠️ Disclaimer: All apt commands use the -y flag, which skips user confirmation prompts.

1. Update the system

sudo apt update && sudo apt upgrade -y

2. Install .NET 9

curl -sSL  https://dot.net/v1/dotnet-install.sh  | bash /dev/stdin --version 9.0.310 && \
echo 'export DOTNET_ROOT=$HOME/.dotnet' >> ~/.bashrc && \
echo 'export PATH=$PATH:$HOME/.dotnet' >> ~/.bashrc && \
source ~/.bashrc

3. Install FFmpeg

sudo apt install ffmpeg -y

Download

Raspberry Pi OS (ARM64)
https://fynnovation.com/cdn/PrusaDiscordNotify/Pi/PrusaDiscordNotify_armx64.zip

Raspberry Pi OS (ARM32 / x86)
https://fynnovation.com/cdn/PrusaDiscordNotify/Pi/PrusaDiscordNotify_arm.zip

Download & extract via SSH

mkdir -p PrusaNotify && \
cd PrusaNotify && \
wget  https://fynnovation.com/cdn/PrusaDiscordNotify/Pi/PrusaDiscordNotify_armx64.zip  && \
unzip PrusaDiscordNotify_armx64.zip && \
sudo chmod +x PrusaDiscordNotify

If the command fails, ensure wget and unzip are installed:

sudo apt update && sudo apt install wget unzip -y

Systemd Service Setup

Create the service file:

sudo nano /etc/systemd/system/prusanotify.service
[Unit]
Description=Prusa Discord Notify
After=network.target

[Service]
ExecStart=/PATH/TO/PrusaNotify/PrusaDiscordNotify
WorkingDirectory=/PATH/TO/PrusaNotify/
Restart=always
RestartSec=10
KillSignal=SIGINT

StandardOutput=append:/var/log/PrusaNotify.log
StandardError=append:/var/log/PrusaNotify.log
SyslogIdentifier=prusanotify

[Install]
WantedBy=multi-user.target

Note: Replace /PATH/TO/PrusaNotify/ with the actual installation path.

Enable and start the service:

sudo systemctl enable prusanotify
sudo systemctl start prusanotify

Logs & Monitoring

To inspect the service output:

cat /var/log/PrusaNotify.log

Or follow it live:

tail -f /var/log/PrusaNotify.log

Configuration (config.json)

PrusaLink Discord Notify is configured using a simple config.json file. All settings can be adjusted without recompiling the application.

{
  "language": "en",
  "printer_name": "Prusa Printer",
  "api_base_url": "http://YOUR_PRINTER_IP/api/v1/",
  "api_key": "PrusaLinkPassword",
  "DC_Webhook": "DiscordWebhookURL",
  "rtspUrl": "rtsp://YOUR_BUDDYCAM_IP/live",
  "output": "snapshot.jpg",
  "delete": true,
  "MinPostInterval": 5,
  "TimeTrigger": 5,
  "ProgressStep": 10
}

Configuration options explained:

  • language
    Specifies the language used for Discord messages.
    This must match a JSON file in the lang/ directory (without the .json extension).
    Example: "en", "de", "cs", "tlh"
  • printer_name
    Display name of the printer shown in Discord messages and embeds.
  • api_base_url
    Base URL of the local PrusaLink API.
    Example: http://192.168.1.50/api/v1/
  • api_key
    PrusaLink API key (the PrusaLink password).
  • DC_Webhook
    Discord webhook URL where status updates and snapshots will be posted.
  • rtspUrl
    RTSP stream URL of the printer camera (e.g. BuddyCam).
  • output
    Temporary filename used for the generated snapshot image.
  • delete
    If set to true, the snapshot image is deleted after it has been sent to Discord.
  • MinPostInterval
    Minimum time (in minutes) between Discord updates, even if progress changes frequently.
  • TimeTrigger
    Time-based fallback trigger (in minutes).
    Ensures periodic updates even if progress does not advance significantly.
  • ProgressStep
    Percentage-based progress step required to trigger a new notification.
    Example: 10 = notify every 10% progress.

Languages

The service ships with multiple predefined language files located in the lang/ directory. These files are simple JSON dictionaries based on a common template.

Important:
The following languages are fantasy languages and are included purely for fun:

  • sindarin – Elvish (Lord of the Rings)
  • goauld – Goa’uld (Stargate SG-1 / Atlantis)
  • tlh – Klingon (Star Trek)

These languages follow a somewhat lore-consistent convention but are not real-world languages.

All language files are derived from the same base template (see en.json). Using this template, anyone can:

  • add their own language
  • modify existing translations
  • create custom or themed language variants

To add a new language, simply copy en.json, translate the values, and name the file accordingly (e.g. fr.json, es.json, pirate.json).

Applying configuration changes

The config.json and .json file can be modified while the service is installed. To apply changes, restart the service:

sudo systemctl restart prusanotify

The new configuration and language settings will be applied immediately after restart.

This topic was modified 8 hours ago by Fynnovation
Posted : 28/01/2026 6:05 pm
Share: