RuneBoard is an experimental dual-screen Android keyboard designed primarily for the AYN Thor.
The project is currently in Prototype 1. Prototype 0 closed all Thor hardware gates; the current phase focuses on product-level visual hierarchy, setup/settings UX and regression-safe polish on top of that validated architecture.
- D-pad: move keyboard selection
- A: press selected key
- B: backspace
- X: space
- Y: Shift -> Caps Lock -> off
- L1 / R1: move text cursor left / right
- L2 / R2: previous / next word
- Start: enter / active editor action
- Select: minimize
- L3: next language
- R3: accept primary suggestion
- Touch: direct key input
The DS-style controls are validated on AYN Thor hardware. Twelve editing actions can be remapped; D-pad navigation remains fixed. Left-stick keyboard navigation is also validated on the Thor while the IME view is active: each deliberate stick gesture advances one key, while D-pad hold uses delayed autorepeat.
Prototype 1 starts from the validated Prototype 0 foundation:
- a real Android
InputMethodService; - a touch QWERTY keyboard with a compact command row, an always-visible number row directly above the letters and a thumb-oriented bottom action row;\n- Prototype 1 keyboard chrome with a dedicated header surface, quieter command controls, stronger typing-key hierarchy and a more explicit selected-key halo;
- a narrowly scoped accessibility service for physical controller buttons;
- a separate keyboard model, state engine and controller mapper;
- geometry-aware D-pad navigation across rows with different key widths;
- L1/R1 cursor movement and L2/R2 word navigation through the active
InputConnection; - hold-to-repeat for D-pad navigation, Backspace, cursor movement and word movement, with touch autorepeat on repeatable editing keys;
- controller-first EDIT mode with Select All, Cut, Copy, Paste, Undo, Redo, Home, End, cursor/word navigation and character/word selection extension;
- a dedicated on-screen ↵ key that always inserts a newline, while the remappable physical Enter action (Start by default) keeps Android's contextual Go/Search/Send/Next/Done/Previous behavior;
- field-aware capitalization: sentence starts for prose, word starts for names/addresses, explicit Android cap flags when present, and no automatic caps for email/URL/password/non-text editors;
- persistent typing profiles for English QWERTY, Spanish QWERTY, French AZERTY and Russian JCUKEN;
- quick language cycling from L3 or the keyboard header;
- ABC/SYM mode switching without closing the IME;
- direct comma/period keys plus language-specific accent and punctuation pages;
- lower-display geometry that fills Android's available IME bounds without double-applying the navigation-bar inset;
- automatic IME presentation when an external text field gains focus, including a Thor-specific delayed show pass for the secondary display;
- system spell-check suggestions with up to three header candidates;
- touch or remappable R3 acceptance of the primary suggestion;
- conservative autocorrect on Space for strong typo recommendations;
- Suggestions and Autocorrect toggles, both enabled by default;
- persistent physical-button remapping with automatic conflict swapping;
- context-aware auto-capitalization plus manual one-shot Shift and persistent Caps Lock;
- action keys show the currently mapped physical button;
- four keyboard opacity levels;
- persistent background opacity across IME recreation;
- theme profiles: Default, OLED Black, Transparent and persistent Custom;
- custom settings UI with live theme/background controls, palette presets and key geometry;
- compact/minimized mode;
- standard Android clipboard actions without maintaining a private clipboard history;
- a setup/settings activity with live Android integration status and a built-in keyboard test field;
- unit tests for state, controller mappings and minimized capture policy;
- GitHub Actions running unit tests, lint and APK assembly;
- a dedicated Android emulator for non-Thor regression testing.
There are no third-party runtime dependencies.
The product code is split into independent layers:
keyboard/: layout, key model, ABC/SYM/EDIT state and keyboard engine;controller/: controller actions and Android key-code mapping;theme/: visual profiles, persistent custom-theme data and supported background-opacity levels;language/: typing-language profiles and layout metadata;editor/: editor-action resolution and input-field policy;suggestion/: word extraction, Android spell-check adapter and correction policy;settings/: persistent user preferences;RuneKeyboardView: rendering, touch hit testing and motion-event adapter;RuneBoardImeService: Android IME andInputConnectionadapter;RuneBoardControlService: physical-button filtering while RuneBoard is active.
See docs/ARCHITECTURE.md.
Current development version: 0.20.0-prototype
Current minimum Android version: Android 13 / API 33.
GitHub Actions runs:
- unit tests;
- Android lint;
- debug APK assembly.
The successful workflow exposes RuneBoard-prototype-debug as an artifact.
Prototype 0 was tested on an AYN Thor running Android 13 / firmware .377.
Validated on the physical device:
- AYN pins RuneBoard to the lower display while the editor remains on the upper display;
- touch input on the lower display writes into the upper-display editor;
- D-pad and A/B/X/Y controller typing, including delayed D-pad autorepeat while held;
- one-step analog-stick navigation with Android's synthetic D-pad compatibility events deduplicated;
- L1/R1 text-cursor movement and L2/R2 word navigation;
- EN/ES/FR/RU layout switching, persisted across IME recreation;
- L3 quick-cycle language switching;
- R3 primary-suggestion acceptance and touch-selectable candidate chips;
- conservative Space autocorrection for recommended typos;
- live physical-button remapping, including conflict swapping and reset;
- Shift/Caps state cycling and compact-mode Start pass-through;
- compact minimize/restore with controller pass-through;
- tuned background-opacity switching at 100%, 67%, 33% and 0%;
- controller/touch EDIT panel with clipboard and document-navigation actions.
On the test Thor, Android reports lower-display app bounds of approximately 1240x1025 px in landscape. The 0.17.1 full keyboard now fills the IME-provided height instead of using the earlier approximately 1240x595 px cap. Compact mode remains approximately 1240x134 px.
The lower panel is 1080x1240 native and 1240x1080 in landscape.
See:
docs/PROTOTYPE_0_TEST_PLAN.mddocs/PROTOTYPE_0_RESULTS.mddocs/PROTOTYPE_1_RESULTS.mddocs/EMULATOR_TESTING.mddocs/CONTROLLER_MAPPING.mddocs/LANGUAGES.mddocs/LOCALIZATION.mddocs/SUGGESTIONS.mddocs/SYMBOLS.mddocs/CUSTOMIZATION.mddocs/EDITING.md
A dedicated Android 15 emulator can simulate a second 1240x1080 display and RuneBoard activities can run on it.
Stock Android still places the IME on display 0 even when the focused editor is on display 2. The emulator therefore cannot reproduce AYN's special cross-display IME policy.
Thor-specific display placement remains a real-hardware test.
Prototype 1 is the product-polish phase: keyboard visual hierarchy, setup/settings UX, theme consistency and regression-safe daily-use testing. It intentionally does not reopen the validated IME/controller architecture unless a regression requires it.
Swipe typing, cloud prediction, accounts, telemetry, Japanese composition and broad general-Android support remain out of scope for this phase.
See docs/PROTOTYPE_1_PLAN.md for the current product baseline and acceptance rules.
RuneBoard remains Thor-first. General Android support can be evaluated later.
Build, unit tests and lint: passing.
Core Thor architecture: validated.
Prototype 0 hardware gates: complete.
Physical controller remapping, Shift/Caps, transparency and compact capture policy: validated on the real Thor.
Prototype 1 product/visual polish: in progress.
Experimental - not ready for daily use.
Bug reports, feature ideas and focused pull requests are welcome. See CONTRIBUTING.md before opening one.
For security or privacy-sensitive reports, follow SECURITY.md instead of posting details publicly.