v0.3.8

kevinraymond/fosforav0.3.8Feb 27, 2026by github-actions[bot]

AI Summary

Adds webcam input layers and infrastructure for runtime particle shader management.

Key Highlights

  • Webcam input layers with cross-platform support via nokhwa
  • ParticleSystem::set_compute_shader() infrastructure
  • Combined 'All Media' file filter
  • Image scatter shader physics update

New Features

  • Webcam layers
  • Particle shader management
  • Media file filter changes

Full Release Notes


### Added
- **Webcam input layers** — live camera feed as a compositing layer (`--features webcam`), cross-platform via nokhwa (v4l2/AVFoundation/MediaFoundation)
  - Capture thread with bounded channel, automatic frame drain (latest-only)
  - "+ Webcam" button in layer panel, webcam controls panel (device name, resolution, mirror, disconnect)
  - Preset save/load with webcam device reconnection
- `ParticleSystem::set_compute_shader()` and `clear_customization()` for runtime particle shader management (infrastructure for future particle design system)
- **Combined "All Media" file filter** — media file picker defaults to showing all supported types (images + video) when video feature is enabled

### Changed
- **Image scatter shader** — spring-damper physics with hardcoded constants, random scatter direction on beat, skip transparent particles, remove audio color shift (preserve original image colors)
- CI: add `libclang-dev` dependency, clippy/test/build steps for `webcam` feature, release builds include `webcam` feature

### Fixes
- Fix NDI runtime discovery on macOS — remove non-existent versioned dylib names, skip `exists()` check (works around NDI 6.0.0 installer permissions bug), add `/opt/homebrew/lib` + `NDI_RUNTIME_DIR_V6`/`V5` env vars, show searched paths in UI when not found
- **Webcam robustness** — validate camera access before spawning capture thread (user-friendly EBUSY error), catch libjpeg panics on corrupted MJPEG frames (skip frame instead of dying), detect dead capture threads with status bar notification, clean up capture when deleting webcam layers

## Downloads

| Platform | File | Notes |
|----------|------|-------|
| **macOS** | `.dmg` | Universal binary (Apple Silicon + Intel) |
| **Linux x86_64** | `.tar.gz` | glibc 2.35+ (Ubuntu 22.04+, Debian 12+) |
| **Windows x64** | `.zip` | Windows 10+ |

## Getting started

**macOS**: Open the DMG, drag Phosphor.app to Applications (or run directly). Signed and notarized.

**Linux / Windows**: Extract, run `phosphor` from the extracted directory. The `assets/` folder must be next to the binary.

## Requirements

- **GPU**: Vulkan (Linux/Windows) or Metal (macOS)
- **Audio**: Built-in mic or line-in for audio-reactive visuals
- **NDI®** (optional): [NDI® SDK runtime](https://ndi.video) for network video output
- **Video playback** (optional): `ffmpeg` on PATH for media layers

---
NDI® is a registered trademark of Vizrt NDI AB.