The scenario
You plug in a USB webcam for a video call. Every application shows it as USB2.0 HD UVC WebCam or a string of hex characters like alsa_card.usb-046d_0825-0234. You want it to say Office Camera in Zoom and OBS. Or maybe you have two webcams and need to disable the built-in one when the external dongle is plugged in. The desktop settings menu will not help you here. The naming and routing logic lives in WirePlumber, the session manager that sits between your hardware and PipeWire.
What is actually happening
Fedora uses PipeWire for audio and video routing. PipeWire handles the low-level streaming and kernel driver communication. WirePlumber handles the policy. It decides which device is default, how devices are named, and which applications get access to which hardware. WirePlumber reads a series of configuration files and applies them in order. The base rules ship with the wireplumber package in /usr/lib/wireplumber/. You never edit those files. Package updates will overwrite them. You write your overrides in ~/.config/wireplumber/wireplumber.conf.d/. WirePlumber merges your directory into the base configuration at startup.
The configuration uses a rule-based syntax. Each rule has a matches block and an actions block. The matches block checks properties against your hardware. The actions block tells WirePlumber what to do when a match succeeds. You can change the description, set a device as default, or completely disable it from showing up in applications. The matching uses glob patterns, not exact strings. A single asterisk matches any sequence of characters. A question mark matches a single character. Understanding the pattern is the difference between a rule that works and a rule that silently does nothing.
WirePlumber organizes rules by monitor type. The monitor.alsa.rules key targets sound and video cards exposed by the Advanced Linux Sound Architecture. The monitor.bluez.rules key targets Bluetooth audio devices. The monitor.libcamera.rules key targets native camera pipelines. You must place your rule under the correct monitor key, or WirePlumber will ignore it entirely.
Write your rules in the user directory. System updates respect ~/.config and leave it untouched. Trust the package manager. Manual file edits drift, snapshots stay.
Finding your device identifier
Before writing a rule, you need the exact internal name WirePlumber assigns to the camera. Run the PipeWire control tool to list all audio and video sources.
wpctl status | grep -A 5 "Sources"
# WHY: wpctl queries the active PipeWire session manager.
# WHY: grep filters the output to show only the source devices.
# WHY: The -A 5 flag prints five lines after each match for context.
Look for the line that starts with alsa_card.usb-. That is the hardware identifier. The string after the hyphen contains the USB vendor and product IDs. Those IDs change if you plug the camera into a different USB port or a different machine. Use a glob pattern to ignore the trailing serial number. If your output shows alsa_card.usb-046d_0825-0234, your match pattern should be ~alsa_card.usb-046d_0825-*. The tilde at the start tells WirePlumber to use a glob match instead of an exact string comparison.
If you need more detail about a specific device, query it directly by its index number. The index appears to the left of the device name in the wpctl status output.
wpctl info 3
# WHY: wpctl info prints the full property tree for a given device index.
# WHY: This reveals hidden properties like device.bus-path and device.vendor.id.
# WHY: Use these properties if the name alone is too volatile for matching.
Check the full property list before guessing. A mismatched pattern breaks the rule.
Writing the configuration rule
Create the user configuration directory if it does not exist yet. WirePlumber expects a specific directory structure for drop-in configuration files.
mkdir -p ~/.config/wireplumber/wireplumber.conf.d
# WHY: -p creates parent directories automatically and fails silently if they exist.
# WHY: This path is the standard user override location for WirePlumber.
# WHY: Files here are preserved across system updates and package reinstalls.
Open your editor and create custom-props.conf inside that directory. The file uses a YAML-like syntax that WirePlumber parses natively. Indentation matters. Use two spaces per level. Do not use tabs.
monitor.alsa.rules = [
{
matches = [ { device.name = "~alsa_card.usb-046d_0825-*." } ],
# WHY: The tilde enables glob matching against the full device name.
# WHY: The trailing dot and asterisk ignore the unique serial number suffix.
actions = { update-props = { device.description = "Office Camera" } }
# WHY: update-props modifies runtime properties without touching the kernel.
# WHY: device.description is what desktop applications display in dropdown menus.
}
]
If you want to disable a device entirely, change the action to remove-props or set device.disabled = true. Disabling hides the device from wpctl and application menus. The kernel driver still loads. The USB device still draws power. The change only affects the user-space routing layer. You can stack multiple rules in the same file. WirePlumber evaluates them top to bottom. The first matching rule wins.
Keep your rules in the home directory. Files in /usr/lib/ ship with the package. Edit /etc/ or ~/.config/. Never edit /usr/lib/.
Applying the changes
WirePlumber does not watch the configuration directory for changes. You must restart the user service to load the new rules. The --replace flag tells the running instance to terminate and immediately spawn a new one with the updated configuration.
wireplumber --replace
# WHY: --replace gracefully shuts down the current session manager.
# WHY: A fresh instance reads the updated drop-in directory on startup.
# WHY: This avoids killing active audio or video streams abruptly.
If you are running a headless server or a minimal desktop without a graphical session manager, you may need to use systemctl --user restart wireplumber instead. The --replace flag works best when a desktop environment is actively managing the user session. Most sysadmins type systemctl --user status wireplumber muscle-memory style to verify the unit is active before restarting.
Run journalctl first. Read the actual error before guessing.
Verify it worked
Run the status command again and check the source list. The description should match your custom string exactly.
wpctl status | grep -A 5 "Sources"
# WHY: Confirms the new rule is active in the current session.
# WHY: A missing description means the glob pattern failed to match.
# WHY: WirePlumber logs match failures to the journal if debugging is enabled.
Open your video conferencing application or OBS. The dropdown menu should now show Office Camera. If the old name persists, the application cached the device list. Close and reopen the application. Some apps require a full logout and login to refresh their PipeWire client connections.
Reboot before you debug. Half the time the symptom is gone.
Common pitfalls and what the error looks like
The most frequent mistake is an incorrect glob pattern. WirePlumber requires the pattern to match the entire device.name string. If you omit the trailing .*, the rule will fail silently. WirePlumber does not print errors to the terminal for unmatched rules. It simply skips them. Check the journal to see why a rule was ignored.
journalctl --user -u wireplumber -n 20 --no-pager
# WHY: Filters logs to the user-level WirePlumber service.
# WHY: -n 20 shows the most recent twenty lines after the restart.
# WHY: --no-pager prevents the output from locking your terminal.
Look for lines containing rule and match. If you see no match, your pattern is too strict. If you see duplicate key, you have a syntax error in the YAML structure. Another common issue is editing the wrong file. Files in /usr/lib/wireplumber/ belong to the package. Editing them breaks on the next dnf upgrade --refresh. Always write to ~/.config/. The user directory takes precedence and survives package manager transactions.
Some users try to use udev rules to rename the device. udev runs at the kernel level and modifies the device node in /dev/. PipeWire and WirePlumber read properties from the kernel, but they also apply their own naming layer. A udev rename often gets overwritten by the ALSA card naming logic. Stick to WirePlumber for desktop application names. Use udev only when you need to change permissions or bind a specific kernel module.
If you see [FAILED] Failed to start wireplumber.service during login, your configuration file has invalid syntax. WirePlumber refuses to start with malformed YAML. Check indentation and bracket placement. Run journalctl -xeu wireplumber to read the exact parser error.
Trust the package manager. Manual file edits drift, snapshots stay.
When to use this vs alternatives
Use WirePlumber rules when you want to change how desktop applications see and name audio or video devices. Use v4l2-ctl when you need to adjust hardware parameters like brightness, contrast, or frame rate at the driver level. Use udev rules when you need to change device permissions, set static symlinks in /dev/, or trigger scripts on plug events. Use desktop environment settings when you only need to change the default input or output device for the entire session. Stay on the upstream Workstation if you only deviate from the defaults occasionally.