screenie

x 1.00 · purpose 0.20 · t 1 s · scope 0.85

from 2026-09

Rust · Hyprland · Wayland · OCR · CLI

Working in the terminal made me increasingly reluctant to reach for the mouse for small repetitive tasks. Screenie is a keyboard-driven screenshot tool for Hyprland: it freezes a frame, then lets me select, inspect, edit and extract from it using a consistent set of commands.

the selection

A scripted screenie session, 41 keyframes: the box starts on the active window, jumps between windows, widens and narrows its scope, is halved and refined corner by corner, then a loupe picks a pixel, a rectangle, a numbered callout and an arrow lock into one layer and a censor into a second, and Enter copies the 440 × 280 box to the clipboard.

data
stepstagekeyswhat happensbox (x, y, w × h)
1invokeprintthe frame freezes; the box starts on the active window960, 10, 950 × 620
2selectctrl+hthe window to the left10, 10, 940 × 1060
3selectctrl+lback to the browser960, 10, 950 × 620
4select+widen the scope to the monitor0, 0, 1920 × 1080
5select-back to the window960, 10, 950 × 620
6refinealt+kkeep the top half960, 10, 950 × 310
7refinealt+hkeep the left half960, 10, 475 × 310
8refineh ×3the cursor corner in 15px960, 10, 460 × 310
9refinek ×2and up 10px960, 10, 460 × 300
10refineothe opposite corner becomes the cursor960, 10, 460 × 300
11refinel ×4the left edge in 20px980, 10, 440 × 300
12refinej ×4the top edge down 20px; the box is the card980, 30, 440 × 280
13inspectzthe loupe, at the box's center980, 30, 440 × 280
14inspectshift+ja loupe width down980, 30, 440 × 280
15inspectshift+jagain980, 30, 440 × 280
16inspectshift+lright, onto the peak980, 30, 440 × 280
17inspectzclose the loupe; it remembers the pixel980, 30, 440 × 280
18annotateaannotate opens layer 1, clipped to the box980, 30, 440 × 280
19annotatera rectangle, starting at the loupe's pixel980, 30, 440 × 280
20annotatel ×1050px wide980, 30, 440 × 280
21annotatej ×630px tall980, 30, 440 × 280
22annotatealock it, back to the pen980, 30, 440 × 280
23annotatencallout 1 at the pen point980, 30, 440 × 280
24annotateuundo removes the callout, nothing else980, 30, 440 × 280
25annotatej ×8the pen point down 40px980, 30, 440 × 280
26annotateh ×4left 20px980, 30, 440 × 280
27annotatencallout 1 again980, 30, 440 × 280
28annotatevan arrow from the loupe's pixel980, 30, 440 × 280
29annotateh ×8the tip out 40px980, 30, 440 × 280
30annotatej ×8and down 40px980, 30, 440 × 280
31annotateoswap ends; the head points at the peak980, 30, 440 × 280
32annotateenterlock the arrow, commit layer 1980, 30, 440 × 280
33censorxa censor opens layer 2, a 20px square at the center980, 30, 440 × 280
34censoralt+shift+ldouble it rightward980, 30, 440 × 280
35censoralt+shift+lagain, over the label980, 30, 440 × 280
36censorentercommit layer 2 (pixelate, 10px blocks)980, 30, 440 × 280
37layers1layer 1 on its own980, 30, 440 × 280
38layersspacehide it980, 30, 440 × 280
39layersuundo the hide980, 30, 440 × 280
40layersescback to select980, 30, 440 × 280
41exportenterthe box with both layers, to the clipboard980, 30, 440 × 280
the selection moves with the keyboard.

It begins as a frozen display plane with a thin selection rectangle. Each keystroke changes a corner or snaps the boundary to something meaningful, and a crosshair, pixel loupe and faint guides make the operation legible. Mouse interaction remains possible, but the keyboard can perform the whole workflow.

nothing is burned in

24 keyframes of edits as layers over an untouched 440 × 280 capture. 2 layers end up committed (rectangle 50×30, callout 1, arrow; pixelate 80×20, 10px); one undo removes a single callout, and hiding a layer in the Layers view is undone the same way.

data
stepkeysopen layercommitted layers
1a(empty)
2r(empty)
3l l l l l l l l l l(empty)
4j j j j j j(empty)
5arectangle 50×30
6nrectangle 50×30, callout 1
7urectangle 50×30
8j j j j j j j jrectangle 50×30
9h h h hrectangle 50×30
10nrectangle 50×30, callout 1
11vrectangle 50×30, callout 1
12h h h h h h h hrectangle 50×30, callout 1
13j j j j j j j jrectangle 50×30, callout 1
14orectangle 50×30, callout 1
15Return1: rectangle 50×30, callout 1, arrow
16x(empty)1: rectangle 50×30, callout 1, arrow
17<A-S-l>(empty)1: rectangle 50×30, callout 1, arrow
18<A-S-l>(empty)1: rectangle 50×30, callout 1, arrow
19Return1: rectangle 50×30, callout 1, arrow; 2: pixelate 80×20, 10px
2011: rectangle 50×30, callout 1, arrow; 2: pixelate 80×20, 10px
21space1: rectangle 50×30, callout 1, arrow (hidden); 2: pixelate 80×20, 10px
22u1: rectangle 50×30, callout 1, arrow; 2: pixelate 80×20, 10px
23Escape1: rectangle 50×30, callout 1, arrow; 2: pixelate 80×20, 10px
24Return1: rectangle 50×30, callout 1, arrow; 2: pixelate 80×20, 10px
edits accumulate as reversible layers over the untouched capture.

After selection, annotations and censoring become operations on a layer stack rather than permanent modifications to the source frame. The stack expands to reveal text, arrows, shapes and filters, and an undo is the removal of an operation, not a visual reset.

inspect and extract

Four results from the same box: pixel (1221,212), region (image 440×280, 2 layers), text (ocr text of 440×280), distance (440 × 280 px). Each goes to the clipboard.

data
yieldkeysresult
pixelz shift+j shift+j shift+l zpixel (1221,212)
regionenterimage 440×280, 2 layers
textprint . yocr text of 440×280
distanceprint . m r enter y440 × 280 px
a screenshot can yield a region, text or a measured distance.

The picker also lets me inspect colors and pixels, extract text and make geometric measurements. It can be driven from scripts as well as through its interactive overlay.