Tried my hand at a keyboard too... (Can't type on non-qwerty...)
Found that the horizontal precision is actually nice on this touch sensor, it's the vertical registration where I go wrong the most. So I made a keyboard with only three rows of keys, and I can actually type on it. Trick for me is to briefly but consciously look at a key before hitting it: as soon as I start relying on muscle memory my error rate goes way up. Also find that if correcting mistakes is easy enough and doesn't lead to additional mistakes, it's OK to have some misses. Try the experimental branch on my repo, the Touch / Keyboard example for a taste.
The help screen (which now just says "HELP"), will eventually explain that space is swipe right, backspace is swipe left and to get upper case, just drag a letter upwards. If you move across the typed text you move the caret unless text is wider than window, then you (smoothly..) drag the text. In that case drag down to bottom key row and then sideways to move caret. You can grab the text anywhere above the keys, even in the help/prompt bar.
Note that I used sprites both for the text entry field and also (briefly) for the keyboard change so that I prevent flicker. Also, there's now
M5.Buttons.popState() to save and restore buttons, gestures and eventhandlers so that one can switch context (such as into and out of keyboard mode) without setting up one's entire environment again.
Lots of emerging thoughts on how to structurally build out from here, but also just happily playing around building cool stuff and seeing how I would most like things to work for people to program with ease.