Skip to content

Instantly share code, notes, and snippets.

@usrbinkat
Created July 18, 2026 23:39
Show Gist options
  • Select an option

  • Save usrbinkat/1addf656f7a25986abb273fc153091f3 to your computer and use it in GitHub Desktop.

Select an option

Save usrbinkat/1addf656f7a25986abb273fc153091f3 to your computer and use it in GitHub Desktop.
Ultimaker on PopOS

3D Printing / CAD Flatpak Stack — Mithril (Dell Precision 7750)

Date: 2026-07-18 GPU: NVIDIA Quadro RTX 5000 Mobile (hybrid PRIME offload, driver 580.173.02) OS: Pop!_OS 24.04 LTS, Wayland (COSMIC compositor) Kernel: 7.0.11-76070011-generic Printer: Creality Ender 3 (CH340 USB-serial, idVendor=1a86, idProduct=7523) Device: /dev/ttyUSB0 (USB-A port via adapter, bus 1 port 3)

Status

Printer connected and executing a print via USB from Cura 5.13 flatpak. STL: Pokemon Go Revive crystal (revive.stl, 3.6K) Sliced and sent to printer via /dev/ttyUSB0.

Installed Applications

Application Flatpak ID Version Purpose
UltiMaker Cura com.ultimaker.cura 5.13.0 Slicer, print preparation
PrusaSlicer com.prusa3d.PrusaSlicer latest Slicer, broad printer support
Blender org.blender.Blender latest Mesh modeling, STL repair, sculpting
FreeCAD org.freecad.FreeCAD latest Parametric CAD
OpenSCAD org.openscad.OpenSCAD latest Programmatic/code-based CAD

Installation Commands

flatpak install --user --assumeyes --noninteractive flathub com.ultimaker.cura
flatpak install --user --assumeyes --noninteractive flathub com.prusa3d.PrusaSlicer org.freecad.FreeCAD org.blender.Blender org.openscad.OpenSCAD

NVIDIA Flatpak GL Runtime

The flatpak nvidia GL runtime must match the host kernel driver version exactly.

Host driver: 580.173.02 Installed runtime: org.freedesktop.Platform.GL.nvidia-580-173-02

flatpak install --user --assumeyes --noninteractive flathub org.freedesktop.Platform.GL.nvidia-580-173-02

Stale runtimes to clean up:

flatpak uninstall --user org.freedesktop.Platform.GL.nvidia-580-159-03 org.freedesktop.Platform.GL.nvidia-580-82-07 org.freedesktop.Platform.GL.nvidia-580-82-09

Flatpak Overrides — NVIDIA PRIME Offload

All 3D applications are configured to render on the discrete NVIDIA GPU via PRIME offload environment variables, with --device=all for USB printer access.

# Apply to all 3D apps
for app in com.ultimaker.cura com.prusa3d.PrusaSlicer org.blender.Blender org.freecad.FreeCAD org.openscad.OpenSCAD; do
  flatpak override --user \
    --device=all \
    --env=__NV_PRIME_RENDER_OFFLOAD=1 \
    --env=__VK_LAYER_NV_optimus=NVIDIA_only \
    --env=__GLX_VENDOR_LIBRARY_NAME=nvidia \
    "$app"
done

App-Specific Overrides

Cura — Force X11 backend (OpenGL viewport fails on Wayland with nvidia):

flatpak override --user --env=QT_QPA_PLATFORM=xcb com.ultimaker.cura

PrusaSlicer — Disable Wayland socket (hangs at startup with nvidia PRIME on Wayland):

flatpak override --user --nosocket=wayland com.prusa3d.PrusaSlicer

Verify Overrides

flatpak override --user --show com.ultimaker.cura
flatpak override --user --show com.prusa3d.PrusaSlicer
flatpak override --user --show org.blender.Blender
flatpak override --user --show org.freecad.FreeCAD
flatpak override --user --show org.openscad.OpenSCAD

Current Override State

# com.ultimaker.cura
[Context]
devices=all;

[Environment]
__VK_LAYER_NV_optimus=NVIDIA_only
__GLX_VENDOR_LIBRARY_NAME=nvidia
__NV_PRIME_RENDER_OFFLOAD=1
QT_QPA_PLATFORM=xcb

# com.prusa3d.PrusaSlicer
[Context]
devices=all;
sockets=!wayland;

[Environment]
__VK_LAYER_NV_optimus=NVIDIA_only
__GLX_VENDOR_LIBRARY_NAME=nvidia
__NV_PRIME_RENDER_OFFLOAD=1

# org.blender.Blender, org.freecad.FreeCAD, org.openscad.OpenSCAD
[Context]
devices=all;

[Environment]
__VK_LAYER_NV_optimus=NVIDIA_only
__GLX_VENDOR_LIBRARY_NAME=nvidia
__NV_PRIME_RENDER_OFFLOAD=1

USB 3D Printer Access

Verified Hardware

usb 1-3: New USB device found, idVendor=1a86, idProduct=7523, bcdDevice= 2.64
usb 1-3: Product: USB Serial
ch341 1-3:1.0: ch341-uart converter detected
usb 1-3: ch341-uart converter now attached to ttyUSB0

Permissions after udev rules applied:

crw-rw-rw- 1 root dialout 188, 0 Jul 18 16:24 /dev/ttyUSB0

User Group

sudo usermod -aG dialout usrbinkat
# Requires logout/login or reboot to take effect
# Verified active: groups output includes 'dialout'

udev Rules

File: /etc/udev/rules.d/99-3dprinter.rules

# 3D Printer USB serial device access rules
# Grants read/write to dialout group for common printer USB-serial chips

# Prusa printers (Prusa Research)
SUBSYSTEM=="tty", ATTRS{idVendor}=="2c99", MODE="0666", GROUP="dialout"

# CH340/CH341 USB-serial (Creality, Ender, many Chinese boards)
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", MODE="0666", GROUP="dialout"

# FTDI USB-serial (many printers, CNC controllers)
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", MODE="0666", GROUP="dialout"

# Arduino/Genuino (Marlin firmware boards)
SUBSYSTEM=="tty", ATTRS{idVendor}=="2341", MODE="0666", GROUP="dialout"
SUBSYSTEM=="tty", ATTRS{idVendor}=="2a03", MODE="0666", GROUP="dialout"

# STMicroelectronics (SKR, BTT boards with STM32)
SUBSYSTEM=="tty", ATTRS{idVendor}=="0483", MODE="0666", GROUP="dialout"

# Silicon Labs CP210x (some printer boards, Smoothieboard)
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", MODE="0666", GROUP="dialout"

# Digi International (XBee, some wireless print servers)
SUBSYSTEM=="tty", ATTRS{idVendor}=="1d6b", MODE="0666", GROUP="dialout"

# WCH CH9102 (newer Creality boards)
SUBSYSTEM=="tty", ATTRS{idVendor}=="4348", MODE="0666", GROUP="dialout"

# Prolific PL2303 (some older printer cables)
SUBSYSTEM=="tty", ATTRS{idVendor}=="067b", MODE="0666", GROUP="dialout"

# MicroPython/CircuitPython boards (Klipper MCUs)
SUBSYSTEM=="tty", ATTRS{idVendor}=="239a", MODE="0666", GROUP="dialout"
SUBSYSTEM=="tty", ATTRS{idVendor}=="303a", MODE="0666", GROUP="dialout"

# Raspberry Pi Pico (Klipper MCU)
SUBSYSTEM=="tty", ATTRS{idVendor}=="2e8a", MODE="0666", GROUP="dialout"

# OpenMoko (some CAN bus adapters for Klipper)
SUBSYSTEM=="tty", ATTRS{idVendor}=="1d50", MODE="0666", GROUP="dialout"

# BigTreeTech USB devices
SUBSYSTEM=="tty", ATTRS{idVendor}=="1eaf", MODE="0666", GROUP="dialout"

Reload after install:

sudo udevadm control --reload-rules
sudo udevadm trigger

Ender 3 USB Connection

Board Chip Device Path
Creality 4.2.2 (8-bit) CH340 /dev/ttyUSB0
Creality 4.2.7 (32-bit) CH340 /dev/ttyUSB0
BTT SKR / STM32 boards CDC ACM /dev/ttyACM0

Note: USB-A port via USB-C adapter on bus 1 port 3 is the working connection. USB-C ports directly did not enumerate the device.

Cura Printer Profile

Printer added: CrealityEnder-3 Build volume: 220 × 220 × 250 mm Connection: USB /dev/ttyUSB0 at 115200 baud

Blender GPU Configuration

After first launch:

  1. Edit → Preferences → System
  2. Cycles Render Devices → select OptiX
  3. Check "Quadro RTX 5000"
  4. OptiX uses hardware RT cores on RTX — significantly faster than CUDA for ray tracing

Launch Commands

# Cura with STL file
flatpak run com.ultimaker.cura /path/to/model.stl

# Cura standalone
flatpak run com.ultimaker.cura

# PrusaSlicer
flatpak run com.prusa3d.PrusaSlicer

# Blender
flatpak run org.blender.Blender

# FreeCAD
flatpak run org.freecad.FreeCAD

# OpenSCAD
flatpak run org.openscad.OpenSCAD

Known Issues & Workarounds

Cura — OpenGL viewport blank on Wayland

Cause: NVIDIA proprietary driver EGL implementation incompatible with Qt's Wayland backend. Fix: QT_QPA_PLATFORM=xcb forces XWayland (already set via flatpak override). Reference: Ultimaker/Cura#18891

Cura — Slow/delayed file loading when printer connected

Cause: USB Printing plugin scans all /dev/tty* devices on startup, blocking UI thread. Fix: Disconnect printer USB before loading files, or disable USB Printing plugin in Cura → Marketplace → Installed → USB Printing (toggle off) when not actively printing. Reference: Ultimaker/Cura#15292

PrusaSlicer — Hangs at startup with nvidia PRIME

Cause: GTK3/OpenGL initialization deadlocks when __NV_PRIME_RENDER_OFFLOAD=1 is set under native Wayland. Fix: --nosocket=wayland forces XWayland rendering (already set via flatpak override). Reference: prusa3d/PrusaSlicer#13945

Blender — CUDA/OptiX not detected in flatpak

Cause: Missing nvidia GL runtime inside flatpak sandbox (version mismatch). Fix: Ensure org.freedesktop.Platform.GL.nvidia-580-173-02 is installed (matches host driver). Reference: https://community.osarch.org/discussion/1446/blender-how-to-use-nvidia-gpu-in-blender-flatpak-version-linux-gnu

FreeCAD — OpenSCAD integration path

Cause: Flatpak sandboxed paths differ from system installs. Fix: In FreeCAD preferences, set OpenSCAD executable to /app/bin/openscad (both must be flatpak). Reference: FreeCAD/FreeCAD#17889

USB printer not detected

Cause: User not in dialout group, or missing udev rules, or charge-only cable. Fix: sudo usermod -aG dialout usrbinkat + install udev rules + re-login. Note: USB-C ports on this laptop do not enumerate the CH340. Use USB-A (via adapter if needed). Reference: https://github.com/hroncok/3dprinter-udev-rules

ALSOFT PipeWire error (errno: 112)

Cause: Flatpak sandbox PipeWire socket timing race. Fix: Cosmetic — audio still initializes via fallback. No action needed.

First Print

Model: Pokemon Go Revive crystal (revive.stl) Source: Thingiverse #1688494 Size: 3.6K STL file Sliced in Cura 5.13, sent to Ender 3 via USB direct print. Status: Printing successfully.

Rollback

Remove all overrides for an app

flatpak override --user --reset com.ultimaker.cura

Uninstall apps

flatpak uninstall --user com.ultimaker.cura com.prusa3d.PrusaSlicer org.blender.Blender org.freecad.FreeCAD org.openscad.OpenSCAD

Remove udev rules

sudo rm /etc/udev/rules.d/99-3dprinter.rules
sudo udevadm control --reload-rules

Remove dialout group

sudo gpasswd -d usrbinkat dialout

Files Created

CREATED  /etc/udev/rules.d/99-3dprinter.rules
CREATED  ~/ultimaker.md

Flatpak override state stored in:

~/.local/share/flatpak/overrides/com.ultimaker.cura
~/.local/share/flatpak/overrides/com.prusa3d.PrusaSlicer
~/.local/share/flatpak/overrides/org.blender.Blender
~/.local/share/flatpak/overrides/org.freecad.FreeCAD
~/.local/share/flatpak/overrides/org.openscad.OpenSCAD

Packages Installed

gamemode (apt, for Minecraft FeralGamemode support)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment