v0.1.0 709e2cd

README.md RawHistoryFolder

[!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).

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 2

Tags 9

↑↓ moveenter openesc close