If you upgraded Hyprland recently and found that an old wf-recorder command suddenly started printing Failed to copy frame, retrying... until it gave up, you did not hallucinate it. A small but important chunk of the Wayland capture stack has moved on.
The short version is this:
wf-recorderwas built aroundwlr-screencopy-unstable-v1- that protocol is now explicitly marked deprecated and “not intended for production use”
- the replacement is a pair of newer protocols:
- Hyprland implemented those newer protocols
wf-recorderhas not made that transition cleanly, and people started hitting failures as soon as compositors moved in that direction
This is one of those annoying Linux desktop moments where a protocol that was “temporary but useful” accidentally became infrastructure. Then the future arrived, and it arrived without asking your shell scripts for permission.
The immediate symptom
The most concrete public report is in wf-recorder issue #273, a thread that started as a question about support for the new protocols and later turned into a bug report in disguise.
A Hyprland user reported that after Hyprland implemented the new image capture protocols, a standard command like this:
wf-recorder -g "$(slurp)" -f screencast-$(date +%Y-%m-%d_%H-%M-%S).mp4
started doing this:
Detected output based on geometry: DP-1
selected region 1490,97 426x528
Failed to copy frame, retrying...
Failed to copy frame, retrying...
...
Failed to copy frame too many times, exiting!
That thread matters because it has three unusually candid data points:
wf-recordersupport for the new protocol family was not something the maintainer was rushing toward.- There was an implementation attempt, but it was incomplete.
- The person attempting the port eventually pointed users at a different project.
The maintainer, @ammen99, wrote:
“If someone sends a PR, I don’t see why not. However I am not in a hurry…”
Later, collaborator @soreau pointed at an experimental branch for the newer protocol family, and then in the related porting work effectively threw in the towel with this line:
“I have learned there is wl-screenrec now which apparently supersedes this project. Giving up on this attempt.”
That’s not a polished migration guide, but it is about as direct a recommendation as you’ll get from inside the wreckage.
What wlr-screencopy actually was
The protocol being retired here is wlr-screencopy-unstable-v1, one of the old wlroots-family Wayland extensions.
It did one job: let a privileged client ask the compositor to copy pixels from the screen into a client-provided buffer.
At a high level, the flow looked like this:
- bind a
zwlr_screencopy_manager_v1 - request a frame from an output or a region of an output
- compositor advertises supported buffer types and dimensions
- client allocates a matching
wl_buffer - client sends
copyorcopy_with_damage - compositor replies with
readyorfailed
The important thing is that the model was fundamentally output-centric:
- capture a whole output
- or capture a region on an output
That was enough for a lot of useful tools:
- screenshots
- simple recorders
- some remote desktop / mirroring tools
- assorted shell scripts built around
slurp,grim, andwf-recorder
And to its credit, wlr-screencopy did improve over time. Version 3 added damage reporting and a wait-for-damage mode. That made it less stupid than the first generation of “copy the whole frame every time and pray” tooling.
But it still had the limitations of its origin: it was a wlr unstable protocol, not the long-term standard answer for the wider Wayland ecosystem.
Wayland Explorer now puts the warning directly at the top of the page:
“This protocol is deprecated and not intended for production use. The
ext-image-copy-capture-v1protocol should be used instead.”
That is not subtle.
Why it was replaced instead of extended
The best explanation I found is Andri Yngvason’s write-up, Making a Wayland Screen Capturing Protocol. It is worth reading in full because it explains both the technical motivation and the politics of how Wayland protocols actually get made.
The original draft for the replacement started life as a better screencopy protocol, but over time the design evolved into a more general architecture. The key change was introducing a second protocol layer: image sources.
That is what gave us the split between:
Old model: source and capture are fused
In wlr-screencopy, the protocol more or less bakes in both of these questions at once:
- what am I capturing?
- how do I get the pixels?
The answer is basically “an output or output region, copied into a buffer.”
That works until you want richer capture targets.
New model: source and capture are separated
The newer architecture says:
- image capture source = the thing from which an image can be derived
- image copy capture = the mechanism for copying frames from that source into client buffers
That sounds abstract, but it buys three concrete things immediately.
1. Outputs and windows fit the same model
ext-image-capture-source-v1 can represent:
- an output, via
ext_output_image_capture_source_manager_v1 - a foreign toplevel/window, via
ext_foreign_toplevel_image_capture_source_manager_v1
This is a big deal.
With wlr-screencopy, whole-screen capture was natural and window capture was bolted on elsewhere, if at all. With the new model, capturing an output and capturing a toplevel are structurally similar operations.
That matters to compositors because they can stop carrying separate piles of awkward rendering logic for:
- screenshots
- screen recording
- portal screen sharing
- window sharing
- remote desktop protocols
Hyprland’s implementation PR literally describes part of the goal as:
“unify all screen/window/region sharing rendering code”
That is the right instinct.
2. Damage tracking got meaningfully better
This is the subtle one, and the one most people never see because the UX of screen recording is “did it work, yes/no”.
wlr-screencopy version 3 can tell the client which parts of the image changed since the previous frame. That helps downstream encoders and lets clients wait for damage.
But the replacement protocol goes further.
With ext-image-copy-capture-v1, the client can tell the compositor:
- which buffer it is attaching
- what damage exists in that buffer
- therefore which parts need to be refreshed
This matters when clients do double-buffered capture.
Suppose a recorder alternates between buffer A and buffer B.
- The compositor wrote the latest frame into A.
- B is now stale in some regions.
- On the next capture, the client submits B again.
- With the new protocol, the client can describe which parts of B are out of date.
That means the compositor does not need to recopy the whole frame. It can update only:
- the regions that actually changed on screen
- plus the regions missing from the older client buffer
This is exactly the kind of boring systems-engineering improvement that pays off in CPU use, memory bandwidth, and latency. It is not sexy, but it is real.
Andri Yngvason calls this out explicitly in his article as one of the motivations for the new protocol.
3. Cursor capture is first-class instead of awkward
The new protocol family also adds proper cursor capture:
- cursor image
- hotspot
- position
That matters for VNC, remote desktop, and mirroring software because it allows the remote side to render the cursor locally. The result is lower perceived latency when you move the mouse.
Again, that is not just a nice extra. For remote desktop it is the difference between “feels sluggish” and “feels plausible”.
4. It is trying to be a Wayland-wide answer, not a wlroots-only one
This is the larger ecosystem point.
wlr-screencopy lives in the wlr unstable namespace. It was useful, but it was never a great long-term center of gravity for everybody.
The replacement lives in wayland-protocols, under the ext / staging path. That is the route toward broader standardization.
This is not just protocol bikeshedding. It changes the incentives:
- compositor authors have a protocol family worth implementing outside wlroots history
- client authors have a protocol family worth targeting if they want to survive across compositors
- tools built only on
wlr-screencopybecome legacy tools, whether they like it or not
What Hyprland changed
Hyprland implemented the new protocol pair in PR #11709: implement image-capture-source-v1 and image-copy-capture-v1, merged in February 2026.
That PR is more informative than most because the author documented actual test procedures and real tools used to exercise the new stack.
The test matrix included:
- OBS via portal / PipeWire
wl-screenrecgrim
The PR description also noted this command for testing the new backend directly with wl-screenrec:
./target/debug/wl-screenrec -o HDMI-A-1 -capture-backend=ext-image-copy-capture
And, notably, the author wrote that the Arch package at the time had broken transforms and recommended building from source for that test.
That detail matters because it shows what Hyprland’s capture work was being validated against in practice:
wl-screenrecwas already part of the expected futureOBSthrough PipeWire remained the mainstream sanity checkwf-recorderwas not at the center of that future
Hyprland’s own wiki is also pretty clear about where the preferred capture path lives now. The page on Screen sharing says:
- “Screensharing is done through PipeWire on Wayland”
- install and use
pipewire,wireplumber, andxdg-desktop-portal-hyprland
And in a Hyprland forum thread about portal startup, Vaxry suggested using OBS via PipeWire as the way to verify that the stack works.
That does not mean “everything must be OBS now.” It does mean the center of gravity has shifted:
- CLI direct capture tools now need to follow the new protocol family
- GUI / mainstream capture flows are expected to work through PipeWire and portals
Why wf-recorder in particular got stranded
wf-recorder was not abandoned in a general sense. The repository is still active, and there have been unrelated fixes as recently as 2026.
But the capture backend it relies on is the wrong one for the direction the ecosystem is moving.
The key issue is still wf-recorder #273, which reads almost like a compressed postmortem:
- support for the new protocol family was considered eventual, not urgent
- someone noted that wlroots planned to remove
wlr-screencopy - Hyprland then implemented the new protocols
- users started reporting breakage
- the most visible porting effort never reached “drop-in replacement” quality
There was also a porting PR, wf-recorder #322, titled Switch to ext-copy-capture protocols instead of wlr-screencopy protocol. The title says exactly what needed to happen.
The comments in that PR are revealing because they show there is real protocol complexity here, not just a boring rename:
- buffer damage semantics changed
- the client needs to manage damage correctly across its own swapchain
- naïve ports produce broken or inefficient behavior
That is why “just add support for the new protocol” turns out not to be a one-line patch.
It also explains why wf-recorder is not automatically the right horse to bet on for the future, even if it technically could be made to work.
The protocol details that actually matter
If you maintain a capture tool, or just like understanding where the pain comes from, these are the useful differences.
wlr-screencopy
The old protocol is centered around a single frame object:
- request
capture_outputorcapture_output_region - receive one or more buffer capability events
- send
copyorcopy_with_damage - get
ready,damage, orfailed
Conceptually, the compositor owns the capture state and tells the client about damage.
ext-image-copy-capture
The new protocol is organized around a session and explicit frame objects:
- create a capture session from an image source
- compositor advertises current buffer constraints
- client attaches a buffer to a frame
- client marks buffer damage with
damage_buffer - client requests capture
- compositor returns
presentation_time,ready, orfailed(reason)
This buys several improvements:
- the session can be invalidated cleanly with
stopped - buffer constraints can be re-advertised if they change
- failures have more specific reasons, like constraint mismatch
- cursor sessions exist as a separate structured concept
So when a legacy client built around wlr-screencopy talks to a compositor that has moved its implementation strategy toward the newer protocols, you are not dealing with a cosmetic mismatch. You are dealing with a different capture model.
What to use now on Hyprland
There are really two answers, depending on what kind of user you are.
If you want the mainstream, least-surprising path
Use OBS Studio via PipeWire.
That is the boring answer, which is usually the right one.
It is what Hyprland documentation and forum guidance orbit around. It is also the answer that is least entangled with wlroots-era assumptions.
On Arch, obs-studio is in the official repositories:
If you want the thing closest in spirit to wf-recorder
Use wl-screenrec.
This is the project that keeps coming up when people working through the transition ask: “fine, but what is the new CLI-ish recorder?”
It matters that:
wf-recordercontributors pointed at it- Hyprland protocol work was tested against it
- it already knows about the newer capture backend choices
On Arch, wl-screenrec is not in the official repos at the time of writing, but it is on the AUR:
If you are on Hyprland and liked wf-recorder because it was small, scriptable, and not a giant streaming suite, this is the most natural successor.
If you care about low overhead and hardware encode paths
There is also GPU Screen Recorder, which is in the official Arch repos:
This is less “the canonical protocol transition answer” and more “a very practical recorder that performs well.” It is still a good option, just not the one that emerged directly from the wf-recorder breakage discussion.
If you just want a GUI button
Kooha remains a perfectly decent simple GUI recorder:
It is not a replacement for the old wf-recorder shell-script niche, but not everybody needs every tool to be a shrine to Unix composability.
Official Arch repo vs AUR
For Arch users, the split is simple.
Official repos
obs-studiogpu-screen-recorderkoohawf-recorder, though that no longer buys you much on modern Hyprland
AUR
If you want the most future-aligned CLI replacement for wf-recorder, the annoying answer is still the real one: the good option is in the AUR.
What this says about Wayland in 2026
A lot of “Wayland is immature” commentary is stale. Most of it has been stale for years. But this kind of breakage is the sort of thing that still makes the desktop feel more provisional than people want to admit.
The irony is that the new protocol direction is technically better.
It gives us:
- a more composable capture architecture
- cleaner window capture semantics
- better damage handling
- proper cursor sessions
- a path away from wlroots-only historical accidents
That is all good.
What still feels rough is the migration layer:
- a widely-used capture tool depended on the old protocol
- the replacement path was real but incomplete
- users discovered the transition by having existing commands stop working
This is very Wayland. The architecture gets better. The user gets punched in the face by a missing compatibility story.
What to do if your old workflow was wf-recorder -g "$(slurp)"
If your old habit looked like this:
wf-recorder -g "$(slurp)" -f clip.mp4
the practical advice is:
- stop expecting
wf-recorderto be the long-term answer on Hyprland - install
wl-screenrecif you want the closest conceptual successor - keep
obs-studioaround as the reliable fallback and for any workflow involving PipeWire, scenes, multiple sources, or just wanting the thing to work - if performance and long-running recordings matter more than protocol purity, evaluate
gpu-screen-recorder
In other words:
- closest replacement:
wl-screenrec - most reliable mainstream option:
obs-studio - best performance-oriented option:
gpu-screen-recorder
The actual timeline, in links
If you want the shortest possible path through the evidence, read these in order:
wlr-screencopy-unstable-v1protocol page — note the deprecation warning- Andri Yngvason: Making a Wayland Screen Capturing Protocol — explains the design and rationale for the replacement
ext-image-capture-source-v1protocol pageext-image-copy-capture-v1protocol page- Hyprland PR #11709 — implementation of the new protocols
wf-recorderissue #273 — where the user-facing failure becomes visiblewf-recorderPR #322 — attempted migration offwlr-screencopy- Hyprland wiki: Screen sharing
- Hyprland forum thread about portal startup / OBS via PipeWire
wl-screenrecrepository
Bottom line
Nothing “mystical” happened here.
A deprecated wlroots-era protocol reached the end of its useful life. A better protocol family replaced it. Hyprland moved. wf-recorder did not keep up cleanly enough. Users noticed because the easiest old commands stopped working.
That does not mean Hyprland broke screen recording out of spite. It means the capture stack is being rebuilt on a better foundation and one of the old clients got stranded between eras.
Which, to be fair, is still a breakage. It is just a breakage with a decent technical case behind it.