The parts worth keeping, kept
QWERTY, symbols and numeric layouts, the shift and caps state machine, key previews, moreKeys long-press popups, auto-capitalisation and double-space-to-period. A decade of tuning does not need redoing.
Being built
A keyboard that types, and does not watch.
Hieroglyph is a minimal soft keyboard forked from the Android 10 Keyboard: a line-by-line port where the behaviour is hard-won, a clean rewrite where it is not. It keeps the layouts, the shift state machine, the long-press popups and the key previews, and drops the suggestion engine, the dictionary pack, gesture typing, contacts and the spell-checker — along with every permission that came with them.
INTERNET is the final permission set, used solely by the emoji refresh worker to check two well-known static URLs. No analytics, no crash reporting, no keystroke telemetry.
There is no build to download yet, and no repository to read either.
Hieroglyph is being built phase by phase, and the typing surface it has today is a placeholder that every one of those phases replaces. Shipping it now would mean asking people to type on something already scheduled for deletion. The source is not public yet for the same reason: the port/rewrite split is still being settled file by file, and a half-annotated fork of LatinIME would tell you less than the plan below already does.
MIT for Hieroglyph. Portions derived from AOSP LatinIME remain Apache 2.0. The repository goes up, and a release with it, when there is a keyboard worth putting your thumbs on.
Where it is
A fork is only honest if it says which parts are ported, which are rewritten, and which have not been written at all. This is the plan, and where it has got to.
Phase 0 done
Repository and licensing — the port/rewrite split written down file by file, SPDX headers, and the CI lint that enforces them.
Phase 1 done
Skeleton — the Gradle project, the IME registered and selectable, the keyboard ⇄ Compose swap with its window-hosting plumbing, a launcher and setup screen, and CI running assemble, tests and lint.
Phase 2 next
The keyboard core, ported from upstream: the XML layout parser, the KeyboardView draw path, KeyboardState, PointerTracker and InputLogic. The upstream test suites go in before the code they cover.
Phase 3 planned
The emoji subsystem — the self-updating picker, the refresh worker, and the subset Noto Color Emoji font it draws with.
Phase 4 planned
Themes, key sizing, TalkBack for a canvas-drawn keyboard, RTL, hardware keyboard passthrough, and a latency gate in CI.
Screens
There is nothing worth photographing yet. The typing surface today is a deliberate placeholder — a hard-coded QWERTY grid, enough to type with and no more — and every piece of it is replaced by the ports in Phase 2. Screens will go up when there is a real keyboard under them.
Features
QWERTY, symbols and numeric layouts, the shift and caps state machine, key previews, moreKeys long-press popups, auto-capitalisation and double-space-to-period. A decade of tuning does not need redoing.
No suggestion engine, no downloadable dictionary pack, no gesture typing, no personalisation, no contacts lookup, no spell-checker — and so none of the permissions any of that required.
INTERNET, used solely by the emoji refresh worker to check two well-known static URLs: Unicode's emoji-test.txt and the Noto Color Emoji release asset. No analytics, no crash reporting, no keystroke telemetry.
Backed by the latest Noto Color Emoji and the latest Unicode list, refreshed on a schedule and swapped in atomically. Emoji the shipped font cannot actually draw are filtered out rather than shown as boxes.
The typing surface is a View with onDraw, ported from upstream — dirty-rect invalidation, a bitmap-cached keyboard layer, a hand-rolled touch pipeline. Compose is used only for the picker, settings and about, where latency is not on the critical path.
A fixed constraint, not an accident: ./gradlew assemble works with a JDK and the Android SDK. No Python, no network, no generated sources you cannot rebuild yourself.