Voron Timelapse Guide — Moonraker Camera and Video Setup
Klipper Guide Mod
There's nothing quite like watching a timelapse of your Voron building a complex part layer by layer. This guide covers everything you need: camera hardware selection, mounting options for each Voron model, Moonraker webcam configuration, the timelapse plugin setup, G-code integration for automatic photo capture, and storage management. Last updated: May 2025.
Camera Hardware
Raspberry Pi Camera Module (v2 / v3)
- Interface: CSI ribbon cable directly to Pi's camera port
- Resolution: v2 = 8MP (3280x2464), v3 = 12MP (4608x2592)
- Field of view: v2 = 62.2 degrees, v3 = 66 degrees
- Pros: Low latency (<50ms), zero CPU overhead for capture, excellent Linux integration, no USB port used
- Cons: Ribbon cable limits placement to near the Pi, shorter cable length (v3 has 150mm ribbon, extenders available)
- Best for: Clean builds where the Pi is mounted near the top panel or electronics compartment
USB Webcam (Logitech C270 / C920)
- Interface: USB-A to Pi USB port
- Resolution: C270 = 720p (1280x720), C920 = 1080p (1920x1080)
- Field of view: C270 = 60 degrees, C920 = 78 degrees
- Pros: Easy to mount anywhere (long USB cable), widely available, autofocus on C920 works well
- Cons: Higher latency than CSI cameras, uses a USB port, can cause USB bandwidth issues if multiple cameras
- Best for: Quick setup, flexible mounting, users who want 1080p resolution
Arducam (Adjustable Focus)
- Interface: CSI (most models) or USB
- Resolution: 2MP to 16MP depending on model
- Pros: Adjustable focus ring (critical for close-up bed shots), metal housing, various lens options (wide angle, telephoto)
- Cons: Slightly more expensive than Pi Camera Module, some models need extra configuration
- Best for: Voron builds where the camera is close to the bed (most Voron mounts), users who want precise focus control
Camera Mounting by Voron Model
V2.4 — Top Panel Mount
The V2.4's enclosed design makes top-down mounting the standard. Print a camera mount that attaches to the top panel extrusions or the top acrylic panel. The camera looks down at the bed from above. This gives a clear view of the entire build plate and is ideal for timelapses. Use a wide-angle lens (90-120 degrees FOV) to capture the full 250/300/350mm bed. The Pi Camera Module v2's 62-degree FOV is too narrow for a 350mm V2.4 — use Arducam's wide-angle version or a USB webcam with wider FOV.
V0.2 — Mini Tripod Mount
The V0.2's compact size makes it easy to position a camera externally. A small desk tripod or 3D-printed arm mounts a camera outside the enclosure, looking through a front or side panel. Alternatively, print a mount that clips onto the top extrusion. The smaller 120mm bed is easy to capture with even a 60-degree FOV camera.
Trident — Z-Chain Mount
The Trident's fixed bed and moving gantry allow for creative camera mounting. A popular approach is attaching the camera to the Z-chain mount on the rear, angled slightly downward toward the bed. This gives a perspective view that shows both the bed and the moving toolhead. Another option is a corner bracket mount on the front left or right extrusion.
Moonraker Webcam Configuration
Moonraker handles webcam streaming through its [webcam] section in moonraker.conf. Here's a complete configuration:
[webcam my_camera]
# Video device
device: /dev/video0
# Camera name shown in frontend
name: Voron Print Cam
# Stream settings
stream_type: h264
resolution: 1920x1080
max_fps: 30
# Image rotation/flip
# rotation: 0, 90, 180, 270
rotation: 0
# horizontal_flip: false
# vertical_flip: false
# Snapshot endpoint
snapshot_url: http://127.0.0.1:8080/?action=snapshot
stream_url: http://127.0.0.1:8080/?action=stream
# Target fps for timelapse captures
target_fps: 15
Key settings:
device: Usels /dev/video*to find your camera's device pathresolution: 1280x720 is a good balance of quality and performance on a Pi 4. Use 1920x1080 on Pi 5 with hardware encodingmax_fps: 15-30 is fine for monitoring. Higher FPS uses more Pi CPUrotation: Useful if your camera is mounted upside-down or sideways
Moonraker Timelapse Plugin
Moonraker includes a built-in timelapse plugin. It captures a still image at specific G-code events (typically after each layer) and compiles them into a video after the print finishes.
Method 1: Moonraker Built-in Timelapse
Enable the timelapse plugin in moonraker.conf:
[timelapse]
# Enable the plugin
enabled: True
# Camera to use for snapshots
camera: my_camera
# Image format (png or jpg)
image_format: jpg
# Image quality (0-100, only for jpg)
image_quality: 90
# Output video format
output: mp4
# Frame rate of the final timelapse video
framerate: 30
# Whether to delete source images after video is created
clean_images: True
# Add timestamp overlay
# Example: {year}-{month}-{day} {hour}:{minute}:{second}
# timestamp: "%Y-%m-%d %H:%M:%S"
Then add G-code hooks in your print_start and print_end macros, or use OrcaSlicer's built-in timelapse G-code:
; In start G-code:
TIMELAPSE_TAKE_FRAME
; In end G-code:
TIMELAPSE_RENDER
The plugin hooks into LAYER_CHANGE events. On each layer change, it takes a photo. After the print finishes, it renders all photos into an MP4 video.
Method 2: External Timelapse with ffmpeg
For greater control (and better performance), use a gcode_shell_command that calls ffmpeg directly:
[gcode_shell_command timelapse_capture]
command: ffmpeg -y -i /dev/video0 -vframes 1 /home/pi/timelapse/$(date +%Y%m%d_%H%M%S).jpg
timeout: 5.
verbose: False
[gcode_shell_command timelapse_render]
command: ffmpeg -r 30 -pattern_type glob -i '/home/pi/timelapse/*.jpg' -c:v libx264 -pix_fmt yuv420p /home/pi/timelapse/$(date +%Y%m%d_%H%M%S).mp4
timeout: 120.
verbose: True
Call these from your printer.cfg macros:
[gcode_macro TIMELAPSE_CAPTURE]
gcode:
RUN_SHELL_COMMAND CMD=timelapse_capture
[gcode_macro TIMELAPSE_RENDER]
gcode:
RUN_SHELL_COMMAND CMD=timelapse_render
G-Code for Timelapse: HYPERLAPSE vs TIMELAPSE
Hyperlapse and Timelapse differ in how the camera captures images:
| Mode | Capture Method | Best For |
|---|---|---|
| Timelapse | Takes photo at each layer change. Toolhead parks at a defined position. Layer-by-layer capture shows smooth print growth. | Detailed prints where you want to see each layer being added |
| Hyperlapse | Takes photos at time intervals (e.g., every 30 seconds) regardless of layer changes. Toolhead may be in motion during capture. | Long prints where you want to compress hours into minutes, less detail per layer |
For Voron builds, timelapse mode is preferred. The toolhead parks at a defined position (e.g., the front-left corner) before each photo, ensuring the bed is visible without obstruction. Add this to your PRINT_START macro:
; Park position for timelapse photos
[gcode_macro _TOOLHEAD_PARK]
gcode:
SAVE_GCODE_STATE NAME=PARK_STATE
G90
G1 X10 Y10 F9000 ; Park at front-left corner
G1 Z20 F600 ; Raise Z slightly
RESTORE_GCODE_STATE NAME=PARK_STATE
Settings: Frame Rate and Resolution
- Frame rate: 15-30 fps for the final timelapse video. 30 fps gives smooth motion, 15 fps uses less storage. The frame rate determines how fast the timelapse plays back — not how often photos are taken.
- Resolution: 1920x1080 (1080p) is standard. 4K is overkill for timelapse and increases render time and file size significantly. 1280x720 is fine for web sharing.
- G-code for park position: The toolhead should move to a position where it doesn't obstruct the bed view. For top-down cameras, park at X10 Y10 Z20 (front-left, slightly raised). For angled cameras, park at the back right.
Storing Timelapses: Local vs Remote
Local Storage
By default, timelapse videos are stored on the Pi's SD card or external storage. Path: ~/timelapse/ or ~/printer_data/timelapse/. On a 32GB card, you can store roughly 50-100 timelapse videos (30-second clips at 1080p). Older videos should be regularly cleaned up.
Remote Storage (FTP/SFTP)
For longer-term storage, configure automatic upload to a NAS or FTP server:
[gcode_shell_command upload_timelapse]
command: curl -T /home/pi/timelapse/latest.mp4 ftp://user:pass@nas.local/timelapse/
timeout: 30.
verbose: False
Or use rsync for sync rather than upload:
rsync -avz /home/pi/timelapse/ user@nas.local:/volume1/timelapse/
Mobileraker Timelapse Viewer
Mobileraker (a mobile companion app for Klipper/Moonraker) has a built-in timelapse viewer on iOS and Android. After a timelapse is rendered, it appears in Mobileraker's media gallery alongside your print history. You can view, share, or delete timelapses directly from your phone without touching the Pi.
Troubleshooting
| Issue | Solution |
|---|---|
| No camera found | Run ls /dev/video* to check if the camera is detected. For CSI cameras, verify camera_auto_detect=1 in /boot/firmware/config.txt. For USB cameras, check lsusb output. Reboot after connecting the camera. |
| Timelapse not starting | Check that [timelapse] is configured in moonraker.conf and Moonraker was restarted. Verify the G-code hooks (TIMELAPSE_TAKE_FRAME) are being called. Check moonraker.log for errors: grep -i timelapse ~/printer_data/logs/moonraker.log. |
| Jerky movement during photo | The toolhead is moving during capture. Ensure your park position G-code runs before each frame. Add a G4 P500 (pause 500ms) before the capture to let vibrations settle. Reduce acceleration in the park position move. |
| Timelapse video is choppy | Too few frames. Increase capture frequency (every layer instead of every N layers). Or increase the output framerate to 30fps. If using external ffmpeg, lower the -r output framerate to compensate for fewer frames. |
| Blurry or out-of-focus timelapse | Adjust camera focus. USB webcams with autofocus (like C920) can struggle with the close range. Disable autofocus: v4l2-ctl -d /dev/video0 -c focus_automatic_continuous=0 -c focus_absolute=250. For Arducam, manually twist the focus ring while watching the live stream. |
| Pi overheating from encoding | Timelapse rendering (especially at 1080p) is CPU-intensive on a Pi 4. Use hardware encoding: -c:v h264_v4l2m2m on Pi 4 or -c:v h264_v4l2m2m on Pi 5 for much lower CPU usage. Or install a heatsink/fan on the Pi. |
A well-tuned timelapse setup is one of the most satisfying parts of owning a Voron. It turns every print into a shareable showcase of your build's precision and speed. Start with a simple setup (USB camera + built-in plugin) and upgrade as your needs grow.