Looks like evremap will do what I want, plus a nifty bonus! The following config lets me use CapsLock + N/P/etc to navigate. And if I just tap CapsLock without pressing anything else, it will act as escape.
device_name = "Telink Wireless Receiver"
[[dual_role]]
input = "KEY_CAPSLOCK"
hold = ["KEY_F19"]
tap = ["KEY_ESC"]
[[remap]]
input = ["KEY_F19", "KEY_N"]
output = ["KEY_DOWN"]
[[remap]]
input = ["KEY_F19", "KEY_P"]
output = ["KEY_UP"]
[[remap]]
input = ["KEY_F19", "KEY_B"]
output = ["KEY_LEFT"]
[[remap]]
input = ["KEY_F19", "KEY_F"]
output = ["KEY_RIGHT"]
[[remap]]
input = ["KEY_F19", "KEY_A"]
output = ["KEY_HOME"]
[[remap]]
input = ["KEY_F19", "KEY_E"]
output = ["KEY_END"]
Note: I used F19 because it doesn’t seem to be bound to anything by default. Apparently, a bunch of the other function keys already did things, as described in /usr/share/X11/xkb/symbols/inet
$ cat /usr/share/X11/xkb/symbols/inet | grep FK13
key { [ XF86Tools ] };
key { [ XF86MailForward ] };
key { [ XF86Word ] }; // F2
key { [ XF86MailForward ] }; // F3
$ cat /usr/share/X11/xkb/symbols/inet | grep FK20
key { [ XF86AudioMicMute ] };
Fun fact - we will intentionally inject (small) bubbles of air into your veins to look for connections between chambers of your heart that shouldn’t be there. It’s called a Bubble Study. https://www.health.harvard.edu/heart-health/what-is-a-bubble-study