Both CONFIG_ZMK_JAVELIN_STENO_DICT_PLOVER and DICT_LAPWING can be y.
All enabled dicts downloaded + compiled into one binary. Javelin stacks
them in StenoDictionaryList — user toggles at runtime.
Dict priority at runtime (highest first):
1. User dict (add_translation, on-keyboard)
2. All built-in dicts (Plover, Lapwing, etc. from embedded binary)
Upload dict (USB) not yet implemented — future enhancement.
CONFIG_ZMK_JAVELIN_STENO_DICT choices:
- PLOVER (default) — downloads openstenoproject/plover main.json
- LAPWING — downloads lapwing-base + lapwing-commands + lapwing-numbers
- NONE — no auto-download, upload via USB or provide custom binary
Set in corne.conf: CONFIG_ZMK_JAVELIN_STENO_DICT_LAPWING=y
CMake configure:
1. Check for pre-compiled dicts/steno_dict.bin (or JAVELIN_DICT_BIN)
2. If missing, download Plover main.json from openstenoproject/plover
3. Run compile_dict.py to produce JSC4 binary
4. Embed via dict_embed.S
Downloaded JSON cached in dicts_src/ — persists across builds via
GH Actions west module cache. Only re-downloads if cache evicted.
- engine_init.cc: loads StenoDictionaryCollection from embedded binary,
validates JSC4 magic + timestamp, constructs dict list + full processor
pipeline (Repeat → AllUp → JeffModifiers → Engine)
- dict_embed.S: embeds compiled dict binary via .incbin directive.
Falls back to null placeholder if no dict available
- CMakeLists.txt: dict binary discovery (dicts/steno_dict.bin or
JAVELIN_DICT_BIN cmake var), assembly embedding
- tools/dict_compiler/compile_dict.py: stroke parser + skeleton compiler.
Full JSC4 binary format not yet implemented — for now, use Javelin
web tool (lim.au) to generate dict binary
- dicts/: directory for compiled dictionary binaries
Dict compiler is the remaining gap — JSC4 format requires exact XIP
pointer layout matching Javelin's C++ struct casting.