{"id":51508449,"url":"https://github.com/netromdk/kaomojidict","last_synced_at":"2026-07-08T03:30:22.154Z","repository":{"id":361645879,"uuid":"1255220857","full_name":"netromdk/kaomojidict","owner":"netromdk","description":"Build Kaomoji dictionaries for HeliBoard / AOSP keyboards.","archived":false,"fork":false,"pushed_at":"2026-06-07T12:26:34.000Z","size":1042,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-06-10T03:41:53.818Z","etag":null,"topics":["aosp-android","dictionaries","heliboard","kaomoji","kaomoji-emoticons","keyboard"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/netromdk.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-31T15:02:48.000Z","updated_at":"2026-06-07T12:26:37.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/netromdk/kaomojidict","commit_stats":null,"previous_names":["netromdk/kaomojidict"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/netromdk/kaomojidict","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/netromdk%2Fkaomojidict","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/netromdk%2Fkaomojidict/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/netromdk%2Fkaomojidict/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/netromdk%2Fkaomojidict/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/netromdk","download_url":"https://codeload.github.com/netromdk/kaomojidict/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/netromdk%2Fkaomojidict/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35251015,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-08T02:00:06.796Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aosp-android","dictionaries","heliboard","kaomoji","kaomoji-emoticons","keyboard"],"created_at":"2026-07-08T03:30:21.606Z","updated_at":"2026-07-08T03:30:22.149Z","avatar_url":"https://github.com/netromdk.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Kaomoji dictionaries for HeliBoard and AOSP keyboards\n\nKaomoji (顔文字) are Japanese-style emoticons built from text characters,\ne.g. `¯╲_(ツ)_╱¯` or `(╯°□°)╯︵┻━┻`. [Wikipedia](https://en.wikipedia.org/wiki/Kaomoji)\n\n## Build\n\n```sh\ngit submodule update --init --recursive\n./build_all.sh\n```\n\n`build_all.sh` produces **two** `.dict` files per locale:\n\n| File | Tags used |\n|------|-----------|\n| `kaomoji_en.dict` | locale-specific (`en`) |\n| `kaomoji_en_all_locales.dict` | all locales merged (`en` + `da` + ...) |\n\nThe `_all_locales` variant has more trigger words per Kaomoji at the cost of\nmixing languages, so a Danish tag can trigger an English Kaomoji suggestion.\n\nRequires `java` on PATH.\n\n## Format\n\nA single `kaomoji.json` contains all locales with per-locale tags and descriptions:\n\n```json\n{\n  \"locales\": [\"en\", \"da\"],\n  \"description\": {\n    \"en\": \"English Kaomoji dictionary\",\n    \"da\": \"Dansk Kaomoji-ordbog\"\n  },\n  \"version\": 1,\n  \"kaomoji\": {\n    \"(◕‿◕)\": {\n      \"en\": [\"happy\", \"cute\"],\n      \"da\": [\"glad\", \"sød\"]\n    },\n    \"(╯°□°)╯︵┻━┻\": {\n      \"*\": [\"flip\"],\n      \"en\": [\"tableflip\", \"rage\"],\n      \"da\": [\"bordvæltning\", \"raseri\"]\n    }\n  }\n}\n```\n\nA special `\"*\"` locale adds tags shared by all locales. These are prepended\nbefore each locale's specific tags. Use `--no-star-locale` to exclude them.\n\nBuild one locale at a time:\n\n```sh\n./build_kaomoji_dict.py kaomoji.json --locale en\n./build_kaomoji_dict.py --locale da\n```\n\nNote: It defaults to using `kaomoji.json` if none is given.\n\nOr use `--all-locales` to merge all locales' tags into a single dictionary with\nmore trigger words for each Kaomoji:\n\n```sh\n./build_kaomoji_dict.py --locale en --all-locales\n```\n\nVersion is not written back to `kaomoji.json` by default. Use `--bump` to\nincrement the version in the JSON file after building:\n\n```sh\n./build_kaomoji_dict.py kaomoji.json --locale en --bump\n```\n\nUnicode Word Joiners (U+2060) can be inserted between each character of the\nKaomoji to attempt to prevent line-breaking in the suggestion strip. Use\n`--word-joiner` to enable this (disabled by default).\n\n```sh\n./build_kaomoji_dict.py kaomoji.json --word-joiner\n```\n\nUse `--sanitize-input` to clean up the input JSON: lowercase all tags, remove\nduplicates, and promote tags that appear in every locale to the shared `\"*\"`\nlocale:\n\n```sh\n./build_kaomoji_dict.py kaomoji.json --sanitize-input\n```\n\nThe input file is modified in place. The process lowercases all tags, removes\nduplicates (within each locale and across locales), and promotes tags shared by\nall locales to `\"*\"`.\n\nBefore:\n\n```json\n{\n  \"(◕‿◕)\": {\n    \"*\": [\"SMILE\"],\n    \"en\": [\"Happy!\", \"Cute\", \"cute\"],\n    \"da\": [\"happy\", \"GLAD\"],\n    \"es\": [\"¿Sonrisa?\", \"happy\"]\n  },\n  \"¯╲_(ツ)_╱¯\": [\"SHRUG!\", \"shrug\", \"SHRUG\"]\n}\n```\n\nAfter:\n\n```json\n{\n  \"(◕‿◕)\": {\n    \"*\": [\"happy\", \"smile\"],\n    \"en\": [\"cute\"],\n    \"da\": [\"glad\"],\n    \"es\": [\"sonrisa\"]\n  },\n  \"¯╲_(ツ)_╱¯\": [\"shrug\"]\n}\n```\n\nAll changes visible here:\n\n- **Lowercased**:\n  - `\"Happy!\"` becomes `\"happy\"`\n  - `\"Cute\"`/`\"cute\"` becomes `\"cute\"`\n  - `\"GLAD\"` becomes `\"glad\"`\n  - `\"SMILE\"` becomes `\"smile\"`\n  - `\"SHRUG!\"` becomes `\"shrug\"`\n  - `\"¿Sonrisa?\"` becomes `\"sonrisa\"`\n- **Deduplicated**: `[\"Happy!\", \"Cute\", \"cute\"]` collapsed to `{\"cute\", \"happy\"}`,\n  so only `\"cute\"` remains\n- **Star promotion**: `\"happy\"` appears in `en`, `da`, and `es` so it is moved to `\"*\"`\n- **Star preserved**: existing `\"SMILE\"` in `\"*\"` kept as `\"smile\"`\n- **Star moved first**: the `\"*\"` locale is always placed first in the output\n- **Flat entry handled**: `[\"SHRUG!\", \"shrug\", \"SHRUG\"]` lowercased,\n  punctuation-stripped, and deduped\n- **Punctuation \u0026 whitespace stripped**: `\"Happy!\"` becomes `\"happy\"` (exclamation\n  removed), `\"¿Sonrisa?\"` becomes `\"sonrisa\"` (inverted `¿` and `?` removed),\n  `\"SHRUG!\"` becomes `\"shrug\"` (exclamation removed)\n\n## Merge with upstream emoji dictionaries\n\nTo get Kaomoji suggestions alongside the official upstream emoji entries,\ndownload the `.combined` wordlists for each locale:\n\n```sh\nwget https://codeberg.org/Helium314/aosp-dictionaries/raw/branch/main/emoji_cldr_signal_wordlists/emoji_en.combined\nwget https://codeberg.org/Helium314/aosp-dictionaries/raw/branch/main/emoji_cldr_signal_wordlists/emoji_da.combined\n```\n\nThen run the merge step manually using `--merge-combined` / `-m`:\n\n```sh\n./build_kaomoji_dict.py --locale en --merge-combined emoji_en.combined \\\n                        --output kaomoji_en.dict\n./build_kaomoji_dict.py --locale en --all-locales --merge-combined emoji_en.combined \\\n                        --output kaomoji_en_combined.dict\n```\n\nKaomoji entries are appended to the upstream wordlist, producing a single\n`.dict` per locale with both emoji and Kaomoji. Both standalone and merged\ndictionaries use `kaomoji:\u003clocale\u003e` as the dictionary type prefix.\nNote that Kaomoji appear as text suggestions, not rendered emoji.\nThey consist of multiple Unicode code points (e.g., `(╯°□°)╯︵┻━┻`), so\nHeliBoard displays them inline as text.\n\nThe merged description follows the format:\n`\u003ckaomoji_desc\u003e [\u003call locales\u003e] (\u003corig_desc\u003e v\u003corig_version\u003e)`.\n\nNote: `build_all.sh` produces standalone dicts only (`kaomoji_en.dict` and\n`kaomoji_en_all_locales.dict`). It does not merge with upstream combined\nfiles. Use the commands above for that.\n\n## Tests\n\nRun all unit tests:\n\n```sh\npython -m pytest tests/\n```\n\nRun `./check.sh` to run all linters (`flake8`, `bandit`, `vulture`, `pylint`,\n`mypy`, `vermin`, `shellcheck`) and unit tests (`pytest`).\n\n## Acknowledgments\n\nThanks to [HeliBoard](https://github.com/Helium314/HeliBoard) for making an\nawesome keyboard app, and to [remi0s](https://github.com/remi0s) for\n[`aosp-dictionary-tools`](https://github.com/remi0s/aosp-dictionary-tools/),\nwhich this project uses to build `.dict` files.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnetromdk%2Fkaomojidict","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnetromdk%2Fkaomojidict","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnetromdk%2Fkaomojidict/lists"}