All AOSP
Hieroglyph app icon

Being built

Hieroglyph

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.

Version
0.1.0
Platform
Android 10 and up
Licence
MIT
Network
One request

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

Two phases done, three to go

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.

  1. Phase 0 done

    Repository and licensing — the port/rewrite split written down file by file, SPDX headers, and the CI lint that enforces them.

  2. 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.

  3. 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.

  4. Phase 3 planned

    The emoji subsystem — the self-updating picker, the refresh worker, and the subset Noto Color Emoji font it draws with.

  5. 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

What it does

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.

The parts worth dropping, dropped

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.

One permission, and it is not for you

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.

An emoji picker that keeps up

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.

A raw View where latency lives

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.

Builds with a JDK and nothing else

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.