{% assign keyb_repos = site.github.public_repositories|jsonify %}
Beware that the documentation pages for most Experimental repos have little or no content, and that documentation for other keyboards probably is out-of-date. Writing documentation is an ongoing effort, and part of the development process. Automatically generated SVG layouts is presently not working.
The languages are grouped in three different ways, according to maturity, geography and language family. Private repositories are not listed.
Being in the Production group does not necessarily mean it is in production for both mobile and desktop, it can be only one of them. We don't differentiate between the two categories, as soon as a keyboard is released for the general audience for at least one platform, it is in the Production category. See the documentation for each keyboard for further details.
The columns in the tables below are as follows:
- Documentation: Link to the main documentation for the language resources.
- Repository: Link to the GitHub repository.
- License: A badge informing about the chosen license for the language resources. Clicking on the badge will take you to the full text of the license.
- Issues: Link to a list of open issues for the specific language
- Doc CI: Continous Integration status badge for building the online documentation, including documentation generated from source code. This is the documentation linked to in the first column. When clicking the badge you get to the GitHub list of workflow runs, so that one can click further to see the actual build log files and other details.
- Tool CI: Continuous Integration status badge for building the desktop keyboards for each language. Clicking the badge takes you to the details page for the last build, with links to log files and other details. Mobile keyboards are built as part of the mobile keyboard apps, and not covered by this overview.
Initial experiments and student exercises.
<script src="/assets/js/langtable.js"></script> <script> const domProdLangs = document.querySelector('#prod_keyboards'); domProdLangs.appendChild(addRepoTable({{keyb_repos}}, 'keyboard-', ['maturity-prod'])) </script> <script> const domBetaLangs = document.querySelector('#beta_keyboards'); domBetaLangs.appendChild(addRepoTable({{keyb_repos}}, 'keyboard-', ['maturity-beta'])) </script> <script> const domAlphaLangs = document.querySelector('#alpha_keyboards'); domAlphaLangs.appendChild(addRepoTable({{keyb_repos}}, 'keyboard-', ['maturity-alpha'])) </script> <script> const domExperLangs = document.querySelector('#exper_keyboards'); domExperLangs.appendChild(addRepoTable({{keyb_repos}}, 'keyboard-', ['maturity-exper'])) </script> <script> const domUndefLangs = document.querySelector('#undef_keyboards'); domUndefLangs.appendChild(addNegUnorderedList({{keyb_repos}}, 'keyboard-', ['maturity-exper', 'maturity-beta', 'maturity-alpha', 'maturity-prod'])) </script> <script> const domNordLangs = document.querySelector('#geo_nordic'); domNordLangs.appendChild(addUnorderedList({{keyb_repos}}, 'keyboard-', ['geo-nordic'])) </script> <script> const domEuroLangs = document.querySelector('#geo_europe'); domEuroLangs.appendChild(addUnorderedList({{keyb_repos}}, 'keyboard-', ['geo-europe'])) </script> <script> const domRussLangs = document.querySelector('#geo_russia'); domRussLangs.appendChild(addUnorderedList({{keyb_repos}}, 'keyboard-', ['geo-russia'])) </script> <script> const domNorALangs = document.querySelector('#geo_northamerica'); domNorALangs.appendChild(addUnorderedList({{keyb_repos}}, 'keyboard-', ['geo-northamerica'])) </script> <script> const domAfricaLangs = document.querySelector('#geo_africa'); domAfricaLangs.appendChild(addUnorderedList({{keyb_repos}}, 'keyboard-', ['geo-africa'])) </script> <script> const domOthrLangs = document.querySelector('#geo_other'); domOthrLangs.appendChild(addNegUnorderedList({{keyb_repos}}, 'keyboard-', ['geo-nordic', 'geo-europe', 'geo-russia', 'geo-northamerica', 'geo-africa'])) </script> <script> const domUndefGeoLangs = document.querySelector('#geo_undef'); domUndefGeoLangs.appendChild(addNegUnorderedList({{keyb_repos}}, 'keyboard-', ['geo-'])) </script> <script> const domUralicLangs = document.querySelector('#fam_uralic'); domUralicLangs.appendChild(addUnorderedList({{keyb_repos}}, 'keyboard-', ['langfam-uralic'])) </script> <script> const domIndEurLangs = document.querySelector('#fam_indoeuropean'); domIndEurLangs.appendChild(addUnorderedList({{keyb_repos}}, 'keyboard-', ['langfam-indoeuropean'])) </script> <script> const domAlgicLangs = document.querySelector('#fam_algic'); domAlgicLangs.appendChild(addUnorderedList({{keyb_repos}}, 'keyboard-', ['langfam-algic'])) </script> <script> const domEskAleutLangs = document.querySelector('#fam_eskimo_aleut'); domEskAleutLangs.appendChild(addUnorderedList({{keyb_repos}}, 'keyboard-', ['langfam-eskimo-aleut'])) </script> <script> const domNigerCongoLangs = document.querySelector('#fam_niger_congo'); domNigerCongoLangs.appendChild(addUnorderedList({{keyb_repos}}, 'keyboard-', ['langfam-niger-congo'])) </script> <script> const domOthrFamLangs = document.querySelector('#fam_other'); domOthrFamLangs.appendChild(addNegUnorderedList({{keyb_repos}}, 'keyboard-', ['langfam-uralic', 'langfam-indoeuropean', 'langfam-algic', 'langfam-eskimo-aleut', 'langfam-turkic', 'langfam-niger-congo'])) </script> <script> const domUndefFamLangs = document.querySelector('#fam_undef'); domUndefFamLangs.appendChild(addNegUnorderedList({{keyb_repos}}, 'keyboard-', ['langfam-'])) </script>