| Output | Command / source |
|---|---|
assets/en.trie |
word list -> node tools/build-trie.js (see script header for gen_wordlist.py pipe) |
assets/bigrams.json |
python3 scripts/extract_bigrams.py --input count_2w.txt --output android/app/src/main/assets/bigrams.json |
assets/emoji.json |
python3 scripts/gen_emoji.py |
Measured sizes on this tree:
| File | Bytes |
|---|---|
| en.trie | 2316326 |
| bigrams.json | 633187 |
| emoji.json | 171457 |
Runtime-only:
| File | Role |
|---|---|
filesDir/user.trie |
TRIE3 learned words |
filesDir/user_bigrams.json |
v2 user bigrams |
cd android && ./gradlew testDebugUnitTest assembleRelease --console=plain
# APK: app/build/outputs/apk/release/app-release.apk
Version in android/app/build.gradle (verify when you release; do not trust stale docs):
versionCode 9versionName "1.8"CLAUDE.md semver: tag vMajor.Minor.Patch, versionName matches tag, versionCode +1 per release.
Kotlin (android/app/src/test/java/com/codekeyboard/):
JS (__tests__/):
trie.test.js, build-trie.test.js - TRIF layout (magic, 12-byte nodes, u24 index)modifier-state.test.jsCI runs Gradle unit tests. TRIF/TRIE2 mismatch in tests was a real failure mode; readers must match the shipped magic.
File: CodeKeyboard/.github/workflows/build.yml
| On push/PR to main | master: |
cd android && ./gradlew testDebugUnitTestassembleReleaseapp-release.apkworkflow_dispatch release job downloads the artifact and creates a GitHub Release with softprops/action-gh-release.
Example recipe: docs/fdroid-recipe.yml.
Stale numbers warning: recipe lists versionName 1.6 / versionCode 7. App build.gradle is currently 1.8 / 9. When submitting, sync recipe to the git tag you want built.
Shape of the recipe:
subdir: android/app (relative to how F-Droid lays out the clone - confirm against their docs for monorepo paths)UpdateCheckMode: TagsRoot also has LICENSE and fastlane metadata for store listing. F-Droid builds from source and resigns.
Do not invent undocumented F-Droid breakage in this blog. If you hit RN gradle-plugin / includeBuild issues on their builders, log them as ops notes with the error text.
docs/adr-002-gif-picker.md - Planned. BYOK for GIPHY/Tenor (public keys dead). Local MediaStore tab. Send with commitContent. Not in the Kotlin tree as a feature yet.
Keep two-layer BigramModel. Improve the prior:
.combined + dicttool_aosp -> .dictbigrams.json + maybe richer unigram table, or JNI binary dict like HeliBoard"w2 w1" with backoff to bigramUser formula_d/formula_p layer stays for personal and mixed-script pairs AOSP will never ship.
User bigrams already store any string pair. en.trie and Norvig seed are English. Pack download / second trie is future.
TextInputConnection through live IMEInputMethodService + canvas keys + correct InputConnection useEverything else is polish, packaging, and a denser seed.
| Path | Role |
|---|---|
| CodeKeyboardIME.kt | IME |
| NativeKeyboardView.kt | Keys + touch |
| SofleKeyData.kt | Layers |
| KeyboardState.kt / TapMachine.kt | State |
| ComposingBuffer.kt | Composing |
| Trie.kt / UserTrie.kt / TrieWriter.kt | Dictionaries |
| BigramModel.kt | Bigrams |
| SuggestionStrategy.kt / BevaTrieSearch.kt | Ranking |
| SuggestionBarView.kt / EmojiPanelView.kt | Chrome |
| SnippetStore.kt | Snippets |
| TrieDecayWorker.kt / MainApplication.kt | Decay |
| tools/build-trie.js | TRIF |
| scripts/extract_bigrams.py | Seed |
| scripts/gen_emoji.py | Emoji |
| GESTURE_ARCHITECTURE.md | Gestures |
| docs/blog/* | This series |
| Claim | Evidence |
|---|---|
| Asset byte sizes | measured under assets/ |
| versionCode 9 / versionName 1.8 | android/app/build.gradle |
| fdroid recipe 1.6/7 | docs/fdroid-recipe.yml (stale vs app) |
| CI steps | .github/workflows/build.yml |
| Test class list | android/app/src/test/… directory listing |
| GIF planned not shipped | adr-002-gif-picker Status Planned; no Gif* feature module in main kotlin list |
| NDK 27.1 in CI and fdroid | build.yml; fdroid-recipe.yml |