[!WARNING]
Early alpha. Built for NeferWL. Other compositors can take screenshots but cannot record. Expect bugs and breaking config changes.
Usage
Bind nefercap to a key in your compositor. For NeferWL:
bind.cmd+p = spawn nefercap
Press the key: a selector covers every monitor. Pick what to capture, press Tab to switch between screenshot and recording, then confirm. A badge at the top left shows the mode: SHOT or REC.
While recording, a red border marks the target and a small REC / Stop HUD shows the time. Neither appears in the video. Press the key again, or click Stop, to finish the file.
| Input |
Action |
| Drag |
Capture a rectangle |
| Click |
Capture the monitor |
W, then Enter |
Capture the current workspace |
M, then Enter |
Capture the monitor |
1–9 |
Pick that monitor |
R |
Back to rectangle selection |
G |
Show or hide the thirds guides |
Tab |
Switch shot ⇄ rec |
Esc |
Cancel |
A workspace recording follows that workspace, even when you switch to another one. A monitor recording follows whatever the monitor shows.
Features
- One shortcut. Screenshot and recording share one selector; the same key stops a recording.
- Clean video. The compositor keeps the border and HUD out of the recording.
- Clipboard. Screenshots can be saved, copied, or both.
- Small footprint. One capture in flight, reused buffers, no redraw while idle. Allocation tests guard the hot paths.
- Scriptable.
nefercap screenshot and nefercap record run without the selector.
Configuration
~/.config/nefercap/config (or $XDG_CONFIG_HOME/nefercap/config):
selector.grid = on
screenshot.dir = ~/Pictures/Screenshots
screenshot.output = file+clipboard
video.dir = ~/Videos
| Key |
Values |
Default |
selector.grid |
on, off |
on |
screenshot.dir |
absolute or ~/ path |
$XDG_PICTURES_DIR/Screenshots |
screenshot.output |
file, file+clipboard, clipboard |
file |
video.dir |
absolute or ~/ path |
$XDG_VIDEOS_DIR |
Unknown keys, duplicates and invalid values are reported before the selector opens. Files are private, named with a timestamp, never overwritten, and their path is printed on stdout.
Commands
nefercap # all-in-one: stop the recording, else open the selector
nefercap shot # selector, screenshot only
nefercap rec # selector, recording only
nefercap stop # stop the active recording
nefercap status # print the recording state
Scripted commands never open the selector:
nefercap outputs
nefercap screenshot -output DP-1 -file shot.png
nefercap screenshot -output DP-1 -region 0,0,1920x1080 -clipboard
nefercap record -output DP-1 -fps 30 -duration 10s -file clip.mp4
nefercap -h lists every flag. Regions use output-local logical coordinates. -size WxH sets an even output resolution for odd-sized sources.
Requirements
- Go 1.27 to build.
- A Wayland compositor with
zwlr_layer_shell_v1 v4 and zwlr_screencopy_manager_v1.
- Vulkan, libxkbcommon, linux-dmabuf and linux-drm-syncobj for the selector.
- NeferWL's capture-session protocol to record.
- FFmpeg with
libx264 to record.
wl-copy (wl-clipboard) for clipboard screenshots.
Output is SDR, and video is silent H.264 in fragmented MP4. Audio, pause and cursor capture are not supported.
Install
make bin # builds bin/nefercap
Copy bin/nefercap to a directory on your PATH.
Development
internal/core owns capture and selection state and imports only the standard library and internal/ports. internal/adapters holds Wayland, selector, HUD, PNG and FFmpeg code; internal/app wires them.
make check
make race
make mocks-check
staticcheck ./...
Test doubles are generated by Mockery v3.
License
GPL-3.0. See LICENSE.
source
1<h1 align="center">nefercap</h1>
2
3<p align="center">
4 <a href="LICENSE"><img src="https://img.shields.io/badge/license-GPLv3-blue?style=flat-square" alt="License: GPLv3"></a>
5 <a href="https://github.com/bnema/nefercap"><img src="https://img.shields.io/badge/platform-Linux-blue?style=flat-square" alt="Platform: Linux"></a>
6 <a href="https://github.com/bnema/nefercap/commits/main"><img src="https://badgen.net/github/last-commit/bnema/nefercap/main?icon=github" alt="Last commit"></a>
7 <a href="https://github.com/bnema/nefercap/stargazers"><img src="https://badgen.net/github/stars/bnema/nefercap?icon=github" alt="GitHub stars"></a>
8</p>
9
10<p align="center">Screenshots and silent screen recording for Wayland, from one shortcut.</p>
11
12> [!WARNING]
13> **Early alpha.** Built for [NeferWL](https://github.com/bnema/neferwl). Other compositors can take screenshots but cannot record. Expect bugs and breaking config changes.
14
15---
16
17## Usage
18
19Bind `nefercap` to a key in your compositor. For NeferWL:
20
21```text
22bind.cmd+p = spawn nefercap
23```
24
25Press the key: a selector covers every monitor. Pick what to capture, press **Tab** to switch between screenshot and recording, then confirm. A badge at the top left shows the mode: `SHOT` or `REC`.
26
27While recording, a red border marks the target and a small **REC / Stop** HUD shows the time. Neither appears in the video. Press the key again, or click Stop, to finish the file.
28
29| Input | Action |
30| --- | --- |
31| Drag | Capture a rectangle |
32| Click | Capture the monitor |
33| `W`, then Enter | Capture the current workspace |
34| `M`, then Enter | Capture the monitor |
35| `1`–`9` | Pick that monitor |
36| `R` | Back to rectangle selection |
37| `G` | Show or hide the thirds guides |
38| `Tab` | Switch shot ⇄ rec |
39| `Esc` | Cancel |
40
41A workspace recording follows that workspace, even when you switch to another one. A monitor recording follows whatever the monitor shows.
42
43## Features
44
45- **One shortcut.** Screenshot and recording share one selector; the same key stops a recording.
46- **Clean video.** The compositor keeps the border and HUD out of the recording.
47- **Clipboard.** Screenshots can be saved, copied, or both.
48- **Small footprint.** One capture in flight, reused buffers, no redraw while idle. Allocation tests guard the hot paths.
49- **Scriptable.** `nefercap screenshot` and `nefercap record` run without the selector.
50
51## Configuration
52
53`~/.config/nefercap/config` (or `$XDG_CONFIG_HOME/nefercap/config`):
54
55```ini
56selector.grid = on
57screenshot.dir = ~/Pictures/Screenshots
58screenshot.output = file+clipboard
59video.dir = ~/Videos
60```
61
62| Key | Values | Default |
63| --- | --- | --- |
64| `selector.grid` | `on`, `off` | `on` |
65| `screenshot.dir` | absolute or `~/` path | `$XDG_PICTURES_DIR/Screenshots` |
66| `screenshot.output` | `file`, `file+clipboard`, `clipboard` | `file` |
67| `video.dir` | absolute or `~/` path | `$XDG_VIDEOS_DIR` |
68
69Unknown keys, duplicates and invalid values are reported before the selector opens. Files are private, named with a timestamp, never overwritten, and their path is printed on stdout.
70
71## Commands
72
73```sh
74nefercap # all-in-one: stop the recording, else open the selector
75nefercap shot # selector, screenshot only
76nefercap rec # selector, recording only
77nefercap stop # stop the active recording
78nefercap status # print the recording state
79```
80
81Scripted commands never open the selector:
82
83```sh
84nefercap outputs
85nefercap screenshot -output DP-1 -file shot.png
86nefercap screenshot -output DP-1 -region 0,0,1920x1080 -clipboard
87nefercap record -output DP-1 -fps 30 -duration 10s -file clip.mp4
88```
89
90`nefercap -h` lists every flag. Regions use output-local logical coordinates. `-size WxH` sets an even output resolution for odd-sized sources.
91
92## Requirements
93
94- Go 1.27 to build.
95- A Wayland compositor with `zwlr_layer_shell_v1` v4 and `zwlr_screencopy_manager_v1`.
96- Vulkan, libxkbcommon, linux-dmabuf and linux-drm-syncobj for the selector.
97- NeferWL's capture-session protocol to record.
98- FFmpeg with `libx264` to record.
99- `wl-copy` (wl-clipboard) for clipboard screenshots.
100
101Output is SDR, and video is silent H.264 in fragmented MP4. Audio, pause and cursor capture are not supported.
102
103## Install
104
105```sh
106make bin # builds bin/nefercap
107```
108
109Copy `bin/nefercap` to a directory on your `PATH`.
110
111## Development
112
113`internal/core` owns capture and selection state and imports only the standard library and `internal/ports`. `internal/adapters` holds Wayland, selector, HUD, PNG and FFmpeg code; `internal/app` wires them.
114
115```sh
116make check
117make race
118make mocks-check
119staticcheck ./...
120```
121
122Test doubles are generated by Mockery v3.
123
124## License
125
126GPL-3.0. See [LICENSE](LICENSE).