The _Ext(CursesView) subclass in pipeline_app.py:941 owns the getch() loop and inserts preprocess_key(vm, ch) before the base dispatch_key. This single seam unblocks everything else — custom chords without touching glyfi's base, bracketed paste without losing newlines, multi-line input.
The seam (pipeline_app.py:1197–1199):
viewmodel.bus.emit(KeyPressed(key=pch, mode_ui=viewmodel.mode_ui))
if not preprocess_key_fn(viewmodel, pch): # True = consumed; skip base