Voron Webcam Streaming Guide — Camera Setup, Moonraker, and Mobile Viewing
Klipper Guide Mod
Watching your Voron print from across the room — or across the world — is one of the great pleasures of owning a 3D printer. A well-configured webcam lets you monitor first layers, check for failures, and share timelapses. This guide covers camera selection, mounting, streaming software (Crowsnest vs MJPG-Streamer), Moonraker integration, remote access via VPN/OctoEverywhere, and multi-camera setups. Last updated: May 2025.
Camera Options for Voron
The best camera for your Voron depends on your budget, enclosure, and what you want to see.
Budget: USB Webcams ($20-$60)
- Logitech C270/C920: The classics. C920 does 1080p at 30fps, autofocus, and decent low-light performance. C270 is 720p but cheap and reliable. Both are USB-A, plug directly into Raspberry Pi or CB1.
- Raspberry Pi Camera Module 3: Excellent image quality, autofocus, 1080p60. Uses the CSI ribbon cable instead of USB, freeing up USB ports. Requires
dtoverlay=vc4-kms-v3din config.txt on Pi 4/5. - ELECTOP Wide Angle USB Camera: 120-170 degree FOV, ideal for seeing the full build plate on a 350mm Voron. 1080p, manual focus. Around $25 on AliExpress.
Mid-Range: IP Cameras ($50-$150)
- Wyze Cam v3: 1080p, excellent low-light (starlight sensor), RTSP firmware available for local streaming. Very popular in the Voron community.
- Reolink E1: Pan/tilt, 4MP, PoE capable. The pan/tilt is nice for inspecting different parts of the print remotely, but adds complexity to mounting.
High-End: Machine Vision Cameras ($150-$500)
- Intel RealSense D415/D435: Depth-sensing cameras that enable 3D print inspection and first-layer height mapping. Overkill for most users but useful for experimental setups.
- Raspberry Pi HQ Camera with 6mm telephoto lens: Gives you a zoomed-in view of the nozzle area for first-layer inspection. Requires precise mounting and calibration.
Mounting Your Camera
Camera placement matters more than camera quality. A poorly positioned 4K camera is worse than a well-positioned 720p camera. Here are the three standard mounting positions for Voron printers:
Position 1: Corner Mount (Full Bed View)
Mount the camera in the top-front corner of the enclosure, looking diagonally across the build plate. This gives you a view of the entire print area. Best for monitoring multi-part prints and detecting overall failures.
- Pros: Sees the whole bed, easy to mount (z-bracket or adhesive mount to the aluminum extrusion)
- Cons: Perspective distortion, hard to see first-layer details, nozzle can be obscured by tall parts
- Recommended for: General monitoring, timelapse, multi-part prints
Position 2: Toolhead Mount (Nozzle View)
The camera is attached to the toolhead (via a printed mount) and moves with it. This gives you an extreme close-up of the nozzle.
- Pros: Perfect for first-layer inspection, detects clogging and underextrusion immediately
- Cons: Only sees the immediate nozzle area, adds weight to the toolhead, cable management is tricky
- Recommended for: First-layer tuning, quality control, spaghetti detection
Position 3: Side/Front Mount (Print Progress View)
Camera mounted on the front or side extrusion, looking at the print from a low angle. Popular in Voron builds with acrylic doors.
- Pros: Shows print progress well, easy to see layer lines and surface finish
- Cons: Front door opening/closing can shake the camera, limited view of the bed
- Recommended for: Timelapse videos, sharing print progress online
Streaming Software: Crowsnest vs MJPG-Streamer
There are two main streaming solutions for Klipper-based printers:
Crowsnest (Recommended)
Crowsnest is a modern streaming service developed specifically for Klipper/Moonraker setups. It's included in most KIAUH installations and is the recommended choice for new builds.
# Install/Update via KIAUH
cd ~/kiauh
./kiauh.sh
# Option 5 (Webcam) → Install Crowsnest
Configure in ~/printer_data/config/crowsnest.conf:
[crowsnest]
log_path: ~/printer_data/logs/crowsnest.log
log_level: verbose
[cam 1]
mode: usb
port: 8080
device: /dev/video0
resolution: 1920x1080
max_fps: 30
custom_flags:
v4l2_decoder: hw
rotate: 0
# For a second camera
[cam 2]
mode: usb
port: 8081
device: /dev/video1
resolution: 1280x720
max_fps: 15
Key features:
- Auto-detects USB and CSI cameras
- Hardware-accelerated JPEG encoding on Raspberry Pi
- Snapshot endpoint for timelapse:
http://localhost:8080/?action=snapshot - Dynamic resolution switching (useful for slow connections)
- Memory-efficient — uses ~15MB RAM per camera stream
MJPG-Streamer (Legacy)
MJPG-Streamer is the older, simpler option. It's stable and well-documented but lacks modern features like hardware acceleration and dynamic quality adjustment.
# Install MJPG-Streamer
sudo apt install cmake libjpeg8-dev
cd ~
git clone https://github.com/jacksonliam/mjpg-streamer.git
cd mjpg-streamer/mjpg-streamer-experimental
make
sudo make install
# Run (single camera)
mjpg_streamer -i "input_uvc.so -d /dev/video0 -r 1920x1080 -f 30" -o "output_http.so -p 8080 -w /usr/local/www"
# Run with two cameras
mjpg_streamer -i "input_uvc.so -d /dev/video0 -r 1280x720 -f 15" -o "output_http.so -p 8080 -w /usr/local/www" &
mjpg_streamer -i "input_uvc.so -d /dev/video1 -r 640x480 -f 10" -o "output_http.so -p 8081 -w /usr/local/www" &
Both services provide the same snapshot URL format: http://localhost:{port}/?action=snapshot. Moonraker doesn't care which backend you use — it just needs a valid JPEG URL.
Moonraker Webcam Configuration
Once your streaming service is running, tell Moonraker about the camera. Add to moonraker.conf:
[webcam 1]
# Camera name shown in Mainsail/Fluidd
name: Main View
# Stream URL (MJPG stream)
stream_url: http://localhost:8080/?action=stream
# Snapshot URL (single JPEG frame)
snapshot_url: http://localhost:8080/?action=snapshot
# Icon shown in the UI
icon: camera
# Service type (mjpgstreamer or crowsnest)
service: crowsnest
# Target FPS for the stream
target_fps: 15
# Audio support (rarely used on 3D printer webcams)
audio: False
# Second camera (e.g., nozzle cam)
[webcam 2]
name: Nozzle Cam
stream_url: http://localhost:8081/?action=stream
snapshot_url: http://localhost:8081/?action=snapshot
icon: camera
service: crowsnest
target_fps: 10
Restart Moonraker after making changes:
sudo systemctl restart moonraker
The cameras should appear automatically in Mainsail and Fluidd. If not, check ~/printer_data/logs/moonraker.log for webcam-related errors.
Mainsail / Fluidd Camera Configuration
Mainsail and Fluidd read your webcam configuration from Moonraker. No additional setup is needed. However, you can customize the camera layout in each UI:
Mainsail
- Go to Settings → Webcams
- Enable/disable cameras, set default view, adjust URL if needed
- Choose between "Camera only" view or split view with printer status
- The camera feed appears on the main dashboard and can be made full-screen
Fluidd
- Go to Settings → Cameras
- Edit camera name, URL, flip/rotate settings
- Choose camera layout: single, dual side-by-side, or grid
- Enable "Auto" to switch between cameras based on print stage
Mobile Viewing
Watching your Voron from your phone is essential for remote monitoring. Here are the best options:
Method 1: Direct Moonraker Access (Local Network)
On your home WiFi, simply open Mainsail or Fluidd in your phone's browser:
http://voron-printer-ip:7125
or
http://voron-printer-ip:7125/webcam?stream=1 (direct stream)
Bookmark it on your home screen for one-tap access. Mainsail and Fluidd are fully responsive and work well on mobile.
Method 2: VPN (Tailscale / WireGuard)
For secure remote access without exposing your printer to the internet, use a VPN:
# Tailscale (easiest — free for personal use)
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
# Follow the auth URL — your printer now has a private Tailscale IP
# Access: http://100.x.x.x:7125 from any device on your Tailscale network
WireGuard is a more technical alternative but uses less overhead. Install via:
sudo apt install wireguard
# Follow standard WireGuard peer setup for your printer
Method 3: OctoEverywhere (Cloud Tunneling)
OctoEverywhere provides free cloud-based remote access to your Klipper printer. It creates a secure tunnel from your printer to their cloud, then proxies it to your browser or phone app.
# Install OctoEverywhere
cd ~
git clone https://github.com/QuinnDK/OctoEverywhere.git
cd OctoEverywhere
./install.sh
# Follow the prompts:
# - Enter your printer's local URL (http://localhost:7125)
# - Create an account at https://octoeverywhere.com
# - Link the setup code to your account
Once set up, access your printer at https://app.octoeverywhere.com from any browser — no VPN needed. The free tier supports one printer with 1080p streaming.
Method 4: Native Mobile Apps
- Mainsail Mobile: Native Android app for Mainsail. Supports multiple printers, push notifications, and camera streaming.
- Gcode Mobile: iOS app that works with Mainsail, Fluidd, and OctoPrint. Full printer control, camera viewing, and print monitoring.
- Obico (formerly The Spaghetti Detective): AI-powered failure detection with camera streaming. Free tier includes remote access and 24 hours of time-lapse storage.
Optimizing Stream Quality and Performance
Streaming video on a Raspberry Pi 4 or CB1 can be CPU-intensive. Here's how to optimize:
- Use hardware JPEG encoding: Crowsnest and MJPG-Streamer both support hardware acceleration on Raspberry Pi. Add
v4l2_decoder: hwin crowsnest.conf or use the input plugin's hardware flag. - Reduce framerate: 15fps is more than enough for print monitoring. 30fps doubles CPU usage with minimal benefit.
- Lower resolution: 720p is adequate for most monitoring. 1080p is nice but uses 2x the bandwidth and CPU. Keep the snapshot URL high-res (for timelapse) and the stream URL at lower resolution:
[webcam 1] # Stream at 720p for mobile viewing stream_url: http://localhost:8080/?action=stream&resolution=720p # Snapshot at full resolution for timelapse snapshot_url: http://localhost:8080/?action=snapshot - Limit concurrent viewers: Each viewer consumes CPU and memory. If you share your printer with friends, consider a dedicated streaming service (like OBS + Twitch) instead.
Lighting for Better Camera Quality
Good lighting improves camera quality more than a better camera. Voron enclosures are dark — the orange or black panels absorb light. Add LED lighting inside the enclosure:
- LED strip along the top extrusion: WS2812B (NeoPixel) or plain white LED strip. Provides even illumination across the build plate.
- Klipper-controlled lighting: Wire the LEDs to a MOSFET on your controller board, then control them with macros:
[gcode_macro LIGHTS_ON] gcode: SET_PIN PIN=led_light VALUE=1 [gcode_macro LIGHTS_OFF] gcode: SET_PIN PIN=led_light VALUE=0 - Automatic lighting: Turn on lights when a print starts, off when it finishes:
[gcode_macro PRINT_START] gcode: LIGHTS_ON # ... rest of PRINT_START ... [gcode_macro PRINT_END] gcode: # ... rest of PRINT_END ... LIGHTS_OFF
For timelapse, consistent lighting is critical. Use LEDs (not room lights) and disable any auto-exposure features on your camera. The illumination should not change during the print.
Multi-Camera Setup
Running multiple cameras on a single Raspberry Pi is straightforward with Crowsnest. Each camera gets its own device (/dev/video0, /dev/video1, etc.) and port.
Identify your cameras:
# List video devices
ls -la /dev/video*
# Output: /dev/video0, /dev/video1, /dev/video2, /dev/video3
# Check which is which
v4l2-ctl --list-devices
# Shows camera names mapped to /dev/video nodes
# Test each camera
ffplay -f v4l2 /dev/video0
ffplay -f v4l2 /dev/video1
Note: On Raspberry Pi, the CSI camera often appears as /dev/video0 and also /dev/video10 (metadata), plus /dev/video11//dev/video12 for different formats. Use the one that provides the correct format — typically /dev/video0 for the main stream.
For USB cameras, you can use an ID_PATH based symlink to ensure the same camera always gets the same device name, even after reboot:
# Get the ID_PATH for each camera
udevadm info --name=/dev/video0 | grep ID_PATH
# udevadm info --name=/dev/video1 | grep ID_PATH
# Create a udev rule
sudo nano /etc/udev/rules.d/99-camera.rules
SUBSYSTEM=="video4linux", ENV{ID_PATH}=="platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1:1.0", SYMLINK+="cam_main"
SUBSYSTEM=="video4linux", ENV{ID_PATH}=="platform-fd500000.pcie-pci-0000:01:00.0-usb-0:2:1.0", SYMLINK+="cam_nozzle"
# Then use /dev/cam_main and /dev/cam_nozzle in crowsnest.conf
Troubleshooting
- Camera not detected: Check
lsusbto see if the camera is connected. For CSI cameras, verifydtoverlay=vc4-kms-v3din/boot/config.txt. Reboot after changing config files. - Stream shows black screen: The camera may be set to the wrong resolution or format. Try:
v4l2-ctl -d /dev/video0 --list-formatsto see supported formats. Use a supported resolution in your config. - High CPU usage: Disable software encoding by adding
v4l2_decoder: hwin Crowsnest. For MJPG-Streamer, use theinput_uvc.soplugin with hardware MJPEG encoding (not YUYV format). - Snapshots work but stream doesn't: Your browser may not support the MJPEG stream format. Try Chrome or Firefox. Safari on iOS has limited MJPEG support — use the Mainsail Mobile app instead.
- Camera feed lags behind actual print: Increase the FPS or reduce resolution. The default 2-second delay is normal for 1080p/15fps. For real-time viewing, use 720p/30fps.
- USB camera disconnects randomly: Power delivery issue. USB cameras on Raspberry Pi can draw more power than the USB port provides. Use a powered USB hub. Alternatively, try a different USB port (Pi 4's blue USB 3.0 ports deliver more power).
Example: Complete Camera Setup
Hardware:
- Raspberry Pi 4B (4GB) — Klipper host
- Logitech C920 — corner mount, full bed view
- Raspberry Pi Camera Module 3 — nozzle view
- WS2812B LED strip — enclosure lighting
Software:
- Crowsnest — webcam streaming
- Tailscale — remote VPN access
- OctoEverywhere — cloud backup access
Config:
# crowsnest.conf
[cam 1]
mode: usb
port: 8080
device: /dev/video0
resolution: 1920x1080
max_fps: 15
v4l2_decoder: hw
[cam 2]
mode: csi
port: 8081
device: /dev/video1
resolution: 1280x720
max_fps: 10
v4l2_decoder: hw
# moonraker.conf
[webcam 1]
name: Full Bed
stream_url: http://localhost:8080/?action=stream
snapshot_url: http://localhost:8080/?action=snapshot
service: crowsnest
[webcam 2]
name: Nozzle
stream_url: http://localhost:8081/?action=stream
snapshot_url: http://localhost:8081/?action=snapshot
service: crowsnest
# Access:
# Local: http://voron.local:7125
# VPN: http://100.64.0.1:7125
# Cloud: https://app.octoeverywhere.com
With this setup, you have full visibility of your Voron from anywhere. The wide-angle camera catches overall print progress and failures, while the nozzle cam lets you inspect first layers and detect clogs early. Combined with LED lighting and remote access, you can keep an eye on your prints from work, bed, or vacation.