WPCTL(1)

πŸ’… WPCTL(1) β€” WirePlumber Control CLI, bestie edition ✨

okay so this is wpctl, the command-line control tool from the WirePlumber fam (that's the PipeWire session manager, iykyk) πŸŽ€


🌸 SYNOPSIS 🌸

wpctl [COMMAND] [COMMAND_OPTIONS]

✨ DESCRIPTION ✨

wpctl is literally a command-line control tool for WirePlumber, the PipeWire session manager. It gives you a whole interface to inspect, control, and configure audio and video devices, nodes, and their properties inside a PipeWire media server πŸ¦‹

So like, WirePlumber handles the audio and video routing, the device configuration, and the session policies β€” all that backstage main-character work. And wpctl is your little front-row pass to talk to all of it: change volume levels, set default devices, peek at object properties, tweak settings. No cap, it's giving backstage access πŸ’…


πŸ‘‘ COMMANDS πŸ‘‘

🫢 status

wpctl status [-k|--nick] [-n|--name]

Shows you the current state of everything in PipeWire β€” devices, sinks, sources, filters, and streams. You get a whole hierarchical view of the audio/video system. It's the vibe check for your entire setup οΏ½

Options:

  • -k, --nick β€” display device and node nicknames instead of descriptions 🏷️
  • -n, --name β€” display device and node names instead of descriptions 🏷️

🫢 list

wpctl list [audio|video] [devices|sinks|sources]

Shows a machine-readable list of PipeWire objects, and you can filter by media type and object type if you want. Every line of output has tab-separated fields: the object ID, the name, the media type/object type, and a * marker if that node is the current default ⭐

Arguments:

  • audio|video (optional) β€” filter by media type πŸŽ§πŸ“Ή
  • devices|sinks|sources (optional) β€” filter by object type (heads up: this one requires you to specify the media type first) 🚨

🫢 get-volume

wpctl get-volume ID

Shows volume info about the node you point at β€” the current volume level and the mute state πŸ”‰

Arguments:

  • ID β€” node ID or a special identifier (go look at SPECIAL IDENTIFIERS below, bestie) 🧚

🫢 inspect

wpctl inspect ID [-r|--referenced] [-a|--associated]

Shows you the detailed tea on the specified object β€” all the properties and metadata β˜•βœ¨

Arguments:

  • ID β€” object ID or special identifier πŸ”

Options:

  • -r, --referenced β€” show objects that are referenced in properties πŸ”—
  • -a, --associated β€” show associated objects 🧩

🫢 set-default

wpctl set-default ID

Sets the specified device node to be the default target of its kind (capture or playback) for new streams that need auto-connection πŸ‘‘

The selection is remembered across restarts, in the default-nodes state file <#state-locations>, and it takes precedence over the automatic, priority-based selection that WirePlumber would otherwise make. Use clear-default to undo it πŸ’€

Arguments:

  • ID β€” sink or source node ID 🎯

🫢 set-volume

wpctl set-volume ID VOL[%][-|+] [-p|--pid] [-l LIMIT|--limit LIMIT]

Sets the volume of the specified node πŸ”Š

Arguments:

  • ID β€” node ID, special identifier, or PID (with --pid) πŸͺͺ
  • VOL[%][-|+] β€” the volume specification:
    • VOL β€” set volume to a specific value (1.0 = 100%) πŸ’―
    • VOL% β€” set volume to a percentage (50% = 0.5) 🍰
    • VOL+ β€” increase volume by value ⬆️
    • VOL- β€” decrease volume by value ⬇️
    • VOL%+ β€” increase volume by percentage πŸ“ˆ
    • VOL%- β€” decrease volume by percentage πŸ“‰

Options:

  • -p, --pid β€” treat ID as a process ID and affect all nodes associated with it 🧬
  • -l LIMIT, --limit LIMIT β€” limit the final volume to below this value (floating point, 1.0 = 100%) 🚧

Examples:

Set volume to 50%: wpctl set-volume @DEFAULT_SINK@ 0.5

Increase volume by 10%: wpctl set-volume 42 10%+

Set volume for all nodes of PID 1234: wpctl set-volume --pid 1234 0.8

🫢 set-mute

wpctl set-mute ID 1|0|toggle [-p|--pid]

Changes the mute state of the specified node 🀫

Arguments:

  • ID β€” node ID, special identifier, or PID (with --pid) πŸͺͺ
  • 1|0|toggle β€” mute state: 1 (mute), 0 (unmute), or toggle the current state πŸ”

Options:

  • -p, --pid β€” treat ID as a process ID and affect all nodes associated with it 🧬

🫢 set-profile

wpctl set-profile ID INDEX

Sets the profile of the specified device to the index you give it πŸŽ›οΈ

Arguments:

  • ID β€” device ID or special identifier πŸͺͺ
  • INDEX β€” profile index (integer, 0 typically means 'off') 🚫

🫢 set-route

wpctl set-route ID INDEX

Sets the route of the specified device to the index you give it πŸ›€οΈ

Arguments:

  • ID β€” device node ID or special identifier πŸͺͺ
  • INDEX β€” route index (integer, 0 typically means 'off') 🚫

🫢 clear-default

wpctl clear-default [ID]

Clears the default configured node. If you don't give it an ID, it clears all the default nodes 🧹

This forgets the current and all previous set-default selections of that kind, so WirePlumber goes back to choosing the default node automatically, based on the priority.session property of each node. It's needed whenever a configured priority appears to have no effect β€” because a saved selection outranks any priority. The saved selections are listed in the "Default Configured Devices" section of status πŸ“‹

Arguments:

  • ID (optional) β€” settings ID to clear (0-2 for Audio/Sink, Audio/Source, Video/Source). If omitted, clears all defaults 🌈

🫢 settings

wpctl settings [KEY] [VAL] [-d|--delete] [-s|--save] [-r|--reset]

Shows, changes, or removes WirePlumber settings βš™οΈ

Arguments:

  • KEY (optional) β€” setting key name πŸ”‘
  • VAL (optional) β€” setting value (JSON format) πŸ“¦

Options:

  • -d, --delete β€” delete the saved setting value (no KEY means delete all) πŸ—‘οΈ
  • -s, --save β€” save the setting value (no KEY means save all, no VAL means current value) πŸ’Ύ
  • -r, --reset β€” reset the setting to its default value πŸ”„

Behavior:

  • No arguments: show all settings πŸ‘€
  • KEY only: show specific setting value πŸ”
  • KEY and VAL: set specific setting value ✍️

🫢 set-log-level

wpctl set-log-level [ID] LEVEL

Sets the log level of a client πŸ“

Arguments:

  • ID (optional) β€” client ID. If omitted, applies to WirePlumber. Use 0 for the PipeWire server. πŸ–₯️
  • LEVEL β€” log level (e.g., 0, 1, 2, 3, 4, 5, E, W, N, I, D, T). Use - to unset the log level. 🎚️

🫢 reset

wpctl reset [-c|--wireplumber-config] [-p|--pipewire-config] [-a|--all]
[-n|--no-restart] [-d|--dry-run] [-y|--yes]

Resets WirePlumber (and optionally PipeWire) to defaults by removing state and configuration files 🧼 By default, only the WirePlumber state directory (~/.local/state/wireplumber) is removed. WirePlumber is automatically stopped before removal and restarted afterwards β€” unless you give --no-restart. A confirmation prompt is shown before any files are deleted, unless you give --yes ⚠️

This command does not require a running PipeWire session 🚫🎧

Options:

  • -c, --wireplumber-config β€” also remove WirePlumber user configuration files (~/.config/wireplumber) πŸ—‚οΈ
  • -p, --pipewire-config β€” also remove PipeWire user configuration files (~/.config/pipewire) and restart the PipeWire service πŸ”„
  • -a, --all β€” remove all state and configuration files (equivalent to combining -c and -p) πŸ’₯
  • -n, --no-restart β€” do not stop or restart services after removing files πŸ›‘
  • -d, --dry-run β€” show which files would be deleted without actually deleting anything or restarting services πŸ‘»
  • -y, --yes β€” proceed without prompting for confirmation βœ…

🧚 SPECIAL IDENTIFIERS 🧚

Instead of numeric IDs, wpctl accepts these special identifiers for commonly used defaults:

  • @DEFAULT_SINK@, @DEFAULT_AUDIO_SINK@ β€” the current default audio sink (playback device) πŸ”Š
  • @DEFAULT_SOURCE@, @DEFAULT_AUDIO_SOURCE@ β€” the current default audio source (capture device) πŸŽ™οΈ
  • @DEFAULT_VIDEO_SOURCE@ β€” the current default video source (camera) πŸ“Ή

These identifiers get resolved at runtime to the appropriate node IDs ✨


πŸ’€ EXIT STATUS πŸ’€

wpctl returns these exit codes, so you know what's up:

  • 0 β€” success πŸŽ‰
  • 1 β€” general error (e.g., invalid arguments, connection failure) 😬
  • 2 β€” could not connect to PipeWire 😭
  • 3 β€” command-specific error (e.g., object not found) πŸ•΅οΈ

🌈 EXAMPLES 🌈

Display system status:

wpctl status

Set default audio sink:

wpctl set-default 42

Set volume to 75% on default sink:

wpctl set-volume @DEFAULT_SINK@ 75%

Increase volume by 5% on a specific node:

wpctl set-volume 42 5%+

Mute the default source:

wpctl set-mute @DEFAULT_SOURCE@ 1

Toggle mute on default sink:

wpctl set-mute @DEFAULT_SINK@ toggle

Inspect a device with associated objects:

wpctl inspect --associated 30

Show all WirePlumber settings:

wpctl settings

Set a specific setting:

wpctl settings bluetooth.autoswitch true

Save all current settings:

wpctl settings --save

Set log level for WirePlumber to debug:

wpctl set-log-level D

Set log level for a specific client:

wpctl set-log-level 42 W

List all audio sinks:

wpctl list audio sinks

Reset WirePlumber state (dry run):

wpctl reset --dry-run

Reset WirePlumber state and config without prompting:

wpctl reset --wireplumber-config --yes

Reset everything (WirePlumber and PipeWire state and config):

wpctl reset --all

πŸ“ NOTES πŸ“

Object IDs can be found using the status command β€” the hierarchical display shows IDs for devices, nodes, and other objects πŸ‘€

Volume values are floating-point numbers where 1.0 represents 100% volume. Values can exceed 1.0 to introduce volume amplification πŸ”₯ (yes bestie, that's how you go past 100%)

When using the --pid option, wpctl will find all audio nodes associated with the specified process ID and apply the operation to all of them πŸ§¬πŸ’…


πŸ¦‹ SEE ALSO πŸ¦‹

wireplumber(1), wpexec(1), pipewire(1), pw-cli(1), pw-dump(1)

WirePlumber Documentation: <https://pipewire.pages.freedesktop.org/wireplumber/>

Author

The WirePlumber Developers πŸ‘‘

2020-2025, Collabora & contributors ©️


and that's the whole page, bestie β€” version 0.5.18, dated Sep 30, 2026, brought to you by the WirePlumber girlies. go forth and slay your audio routing πŸ’œβœ¨πŸŽ€

πŸ“¦ where this page comes from