Skip to content

Conversation

@Julow
Copy link
Owner

@Julow Julow commented Dec 13, 2025

This adds dictionary-based spell checking to the keyboard. The keyboard looks at the word being typed and matches it against a dictionary to either complete the rest of the word or find alternative spellings.

The core of this feature is implemented in cdict, a project that I developed for this purpose.
The dictionaries are hosted in this repository and can be downloaded from within the app. The wordlists used to build the dictionaries are the same ones used by HeliBoard (from this repository).

This is still a work in progress. I plan to improve the interface and add more features:

  • Phonetic-based spell checking
  • Custom dictionary
  • Emoji lookup
  • More customisation

This work was fully funded by the NLnet foundation. I would like to thanks them for giving me the time required to work on this feature.

Closes #343 #716 #745 #596 #571

This is the most requested feature and I hope it will be enjoyed.
I'm eager to receive feedback from anyone willing to test this new feature.

This was referenced Dec 13, 2025
@starlingnia
Copy link

Cool, this is what I am looking forward for unexpected keyboard

@Julow Julow mentioned this pull request Dec 28, 2025
@Julow Julow force-pushed the vendor_libcdict branch 2 times, most recently from a01c4e3 to b49a283 Compare December 28, 2025 18:03
@alotbsol555
Copy link
Contributor

wow, I just found this and installed the debug build from here, correct?

https://github.com/Julow/Unexpected-Keyboard/actions/runs/20557555689

however, I'm still struggling to test this properly:

  • the launcher app is light themed and not dark like my system theme and the official launcher app.
  • the installation dialog to download dictionaries is almost white on white, see screen shot below
  • after downloading a dictionary, there is still the install button above the keyboard and no suggestions

Screenshot_20251228-212051_1.png

what am I doing wrong?

@Julow
Copy link
Owner Author

Julow commented Dec 29, 2025

You are not doing anything wrong. This is how the interface is at this stage and that's what I'm working on next.
Make sure to install only one dictionary. Which one doesn't work for you ?

@alotbsol555
Copy link
Contributor

ok, with only one dictionary installed, it works. there are max 3 suggestions, which can be chosen. this looks good for the basic functionality!

@PickleHik3
Copy link

I've tried the recent builds, Downloaded the dictionary when prompted, but it kept prompting to download it (even though i had it downloaded) and could not get it working.

I'll keep an eye out for future builds!
cheers!

@Julow
Copy link
Owner Author

Julow commented Jan 17, 2026

Thanks you all for trying :)
With the last few fixes, this should be much more usable.
Can you try again and tell me what you think ? The APK is available at the end of this page: https://github.com/Julow/Unexpected-Keyboard/actions/runs/21093976426?pr=1137

@PickleHik3
Copy link

No, thank you for working on it!! you have no idea how much i've wanted this feature.
i am no developer but i'll keep using the build and report back if i find anything, here are the initial impressions;

  • Dictionary list empty on first launch: On the very first launch, the dictionary list was a blank white screen. I fixed this by clearing the app data (this could be just a me problem since there was a pip install running in the background)

  • Once loaded, it correctly detected my system language and showed only that one dictionary .

  • Suggestions are inconsistent based on cursor position. Example: 'dictionarirs' shows suggestions if the cursor is in the middle (dictionari | rs), but not if the cursor is at the end.

  • No auto correction: Typing 'keyblard' shows 'keyboard' in the suggestion strip, but doesn't actually replace the word automatically when i press space.

  • word combos: Compared to other keyboards (like Heliboard), it does not yet handle accidental key presses between words. Example: "thebtent" gets corrected to "the tent".

  • my wishlist;

  • Auto-insert on Space: Automatically insert the top suggestion when the spacebar is pressed.
  • Undo on Backspace: Revert an autocorrected word to the original if backspace is pressed immediately after the correction was made.
  • Visual Spellcheck: Red underlining for misspelled words.

Looking forward to future updates!

@Julow
Copy link
Owner Author

Julow commented Jan 18, 2026

Thanks for your help :)

Dictionary list empty on first launch: On the very first launch, the dictionary list was a blank white screen.

I could reproduce this bug. It happens when the keyboard was not yet enabled in the settings. Was that the case for you as well ?

Suggestions are inconsistent based on cursor position

This is very annoying! I should fix that.

No auto correction

This is intended, at least for the initial version. I'm trying to come up with a UX that lets the user choose when to correct or not.

word combos

Good idea !

Auto-insert on Space
Undo on Backspace

This is planned :)

Visual Spellcheck

I didn't plan to do that initially but this can be added easily. I'll take a note for future versions.

Julow added 16 commits January 18, 2026 17:36
Build cdict's C library and Java bindings and link them into the app.
Uses libcdict to query a dictionary each time the word before the cursor
changes. The candidates view is updated.

The dictionary is embedded into the app for now.
The main package is getting big.
Add an activity accessible from the launcher app that lists available
dictionaries with a download button.

The Dictionaries class manages installed dictionaries. Dictionaries are
installed as individual files into the app's private directory.

The DictionaryListView view shows the list of available dictionaries and
handles downloading and installing them.
The message is updated when the config is refreshed.
This is an important information that users might want to know before
clicking download.
Disables automatic compression, which doesn't always work, and instead
compress statically the dictionaries on the server. Compression is
disabled in the request and then forced on the client side.
Update the CI to work with the new vendor/cdict submodule.
The checkout action is upgraded to v6.
`dictionaries.xml` replaces the generated `SupportedDictionaries.java`
and `dict_names.xml`. It is generated from the
Unexpected-Keyboard-dictionaries project and contains the list of
available dictionaries.

This file is easier to update when the dictionaries are re-built and can
be parsed by gen_method_xml.py later to assign dictionaries to locales.
`gen_method_xml.py` reads `res/values/dictionaries.xml` and assign a
dictionary to each subtypes.

The script is rewritten to avoid using large format strings.
Instead of the full list of the supported dictionaries.
Use the information in DeviceLocales to select the right dictionary. A
cache is added into Dictionaries to avoid unecessary loads when
switching locale.
Julow added 5 commits January 18, 2026 17:45
The bug was caused by having two instances of Dictionaries.
This was an attempt at making the icons adapt to the app theme but
wasn't working as intended.
@PickleHik3
Copy link

I could reproduce this bug. It happens when the keyboard was not yet enabled in the settings. Was that the case for you as well ?

yes, i just confirmed this.

@Julow
Copy link
Owner Author

Julow commented Jan 18, 2026

Thanks :) For this bug, I think it's not useful to add code and handle this case. Perhaps the "enable" button should be redesigned and be the only thing on the screen in this case.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Word predicion and correcting

5 participants