This site belongs to the community, and almost everything on it was put there by someone who is not a maintainer. You do not need to be a web developer, and for most things you do not need a GitHub account either.
→ The same list as a web page, if
you would rather not read a long document: every way in, what each one costs, and
what happens after you submit. That page is built from
_data/contribute.yml, and each of its entries links
back to the section here that explains it in full. If you add or remove a way
in, change both: the list lives in that file, the detail lives here.
Find what you want to do, and skip the rest.
| I want to… | Go to |
|---|---|
| Be listed as a member | Add yourself |
| Add my lab or project | Register a team |
| Share something that happened | Share news |
| Announce a talk, workshop or seminar | Add an event |
| Add a photograph | Add to the gallery |
| Offer to supervise students | Become a mentor |
| Post a thesis topic | Post a topic |
| Add a paper, model or dataset the site missed | Add a resource |
| Fix a mistake in the text | Fix something |
| Change how the site works | Work on the code |
Through a form. Every common contribution has a form. You fill it in, a robot turns it into a proposed change, and a maintainer merges it. You never see any code. Most forms are GitHub issue forms, which need a free GitHub account, except news, which can be sent without an account at all.
Through a pull request. If you are comfortable with Git, edit the files directly. This is faster for anything the forms do not cover, and it is the only way to change the code. See Work on the code.
Either way, nothing you submit goes live until a maintainer has read it. That is not distrust; it is so that nobody has to worry about breaking the site.
→ Open the "Join EthioNLP" form
Give your name and any public profile links you have: a personal site, GitHub, Hugging Face, Google Scholar, ORCID. One link is enough to start.
The point of asking for those is that you never have to update your profile again. The site reads your publications from OpenAlex, Semantic Scholar, DBLP and the ACL Anthology, your models and datasets from Hugging Face, and your repositories from GitHub. Publish something anywhere, and it appears here within a day.
A Google Scholar or ORCID identifier is the single most useful thing you can give, because it is what makes the publication list work.
Your page at /community/your-name/ is built from one file,
_members/your-name.md, and the page itself has an Edit this profile button
that opens it. There is no login on this site: it is served as static files, so
any password it could check would be readable by everyone. GitHub does that job
instead, and a maintainer merges the change.
What you can set:
| Field | What it does |
|---|---|
name, role, affiliation, location |
the heading of your page |
photo |
a path under resources/img/; leave it out for initials |
website, github, huggingface, twitter, linkedin |
the icon row |
scholar, orcid, openalex, semantic_scholar, dblp |
what the publication sync follows |
focus |
your research areas. Leave it empty and the site works them out from your own papers and releases; fill it in and yours wins |
mentoring, mentoring_levels, mentoring_capacity, mentoring_note |
puts you on /mentorship/ |
published |
set false to take your page off the site |
Your publications, models, datasets and repositories are not in the file. They are synced from the identifiers above, so the way to correct them is to fix the identifier.
If someone sent you a link asking you to confirm, use the Confirm my listing form instead. You are in the EthioNLP organisation on Hugging Face, so we know of your work, but being in an organisation is not the same as agreeing to appear on a public website, so nothing has been published.
If you would rather not be listed, ignore it. Nothing happens and you will not be asked again.
→ Open the "Register a team or lab" form
For a research lab, a project, a student group or a company team.
A team registers its Hugging Face and GitHub organisations, not individual models. From then on, everything the team publishes that covers an Ethiopian language appears on the site by itself. Nothing outside those languages is touched.
Nobody from your team needs to be listed here first. This is the form for a group that has just started.
Registering is also what makes your group's work count as EthioNLP's own rather than as related work; it is a human decision, reviewed in a pull request, rather than something guessed from who belongs to which organisation.
A defence, a paper accepted, a workshop run, an award, a dataset released, a mention on the radio. Two sentences and a link is enough; somebody will tidy the wording.
Four ways, and only the third needs an account:
- Telegram. Post in the channel starting with
/news. The first line becomes the headline, the rest the description, and any link is kept. - The web form. No login, works on a phone, under a minute.
- Email. ethionlp@googlegroups.com. A sentence in the body is fine.
- The GitHub form. Structured fields, and the best one if you want to attach a photograph.
A LinkedIn post is a perfectly good link. Paste the URL and the item will link to it.
You do not need to submit conference participation: a weekly scan already checks the major venues for papers by people listed here and drafts an item for each event. It only catches things that leave a public trace, which is why this section exists.
→ Open the "Propose a talk or event" form
Seminars, workshops, tutorials, hackathons, reading groups. Give a title, a date, and a couple of sentences.
Speakers especially welcome. A thesis chapter; a dataset you are annotating, or a model that is not working yet are all good seminar topics; the audience is people working on the same problems, not a conference committee.
Photographs from workshops, conferences and gatherings.
→ Open the "Add a photograph" form
Drag the file into the form. GitHub takes the upload, and a workflow copies the
image into resources/img/gallery/, appends the entry to
_data/gallery.yml and opens a pull request. The image is
copied into the repository rather than linked, so the gallery does not break if
the original is deleted.
By hand instead: put the image in resources/img/gallery/ and add the entry
yourself. Only src and caption are required; the file documents the rest.
Use plain ASCII filenames.
No GitHub account? Mail the photographs to ethionlp@googlegroups.com with a sentence about each.
Two things we ask. Write a caption that says what is happening rather than just
where it was. And only name people who are happy to be named; leave the
people field out if you are not sure.
Mentors are not required to be senior. If you have finished a thesis in this area, you know more than the person starting one, and a second-year PhD student is often a better first mentor than a professor.
Add four keys to your own file in _members/:
mentoring: [data, models] # keys from _data/focus_areas.yml
mentoring_levels: [msc, phd] # bsc | msc | phd | intern | career
mentoring_capacity: 2 # students you can take this cycle
mentoring_note: >-
What you are happy to be asked about.Capacity is shown publicly, so nobody is asked for more than they offered.
Add a file to _topics/. Copy an existing one; the front matter is
title, level, area, languages, mentor, status, effort,
prerequisites and posted.
A good topic says three things: what the gap is, what a student would actually do, and what a finished result looks like. Look at the existing ones; they are written to be read by someone deciding whether to spend a year on it.
Set status: taken to retire a topic rather than deleting it; the description
usually stays useful as a statement of the gap.
A project is the unit between a research area and a single artifact: a named effort with people on it that produced some combination of a paper, a model, a dataset and code. A single paper is not a project; the line of work that produced it is.
Copy _projects/EXAMPLE-project.md, which
documents every field, and delete its published: false line:
cp _projects/EXAMPLE-project.md _projects/my-project.mdThe filename becomes the URL, so _projects/walia-llm.md is published at
/projects/walia-llm/ and appears on /projects/.
Front matter is title, summary, status (active, shipped or paused),
people, languages, and any of paper, model, dataset, code. Two
fields are worth getting right:
peopletakes member slugs — the filename in_members/without the.md. They render in the community's canonical order, not the order you list them in, so you do not need to rank anyone.languagestakes language names as the catalogue spells them, which is thenamefield in_data/generated/catalog.yml. The catalogue says Oromo, Geez and Sidamo where you may be used to writing Afaan Oromo, Ge'ez and Sidama.
Set status: paused rather than deleting a project that has stopped; a
dormant project with a clear write-up is still the best answer to "has anyone
tried this?".
→ Open the "Add a dataset, model or paper" form
Most models, datasets, repositories and papers arrive automatically. Use this form when something has been missed, usually because it has no Ethiopian language tag, or because the author is not listed here.
If it is your work and it is missing; the better fix is usually to add yourself or register your team, which catches everything else you publish too.
Wrong affiliation, dead link, typo, clumsy sentence, a figure that looks wrong.
The fastest way: every page has an "Edit this page" link above the footer that opens the right file in GitHub's editor. Change it, describe what you changed, and submit. GitHub handles the fork and the branch for you.
If the error is in generated data, anything under _data/generated/, do
not edit the file, because the next sync overwrites it. Instead:
- a wrong publication → add a correction to
_data/publications_manual.yml; - a wrong language fact → fix it in Glottolog or Wikidata, which improves every project using those sources, not just this site;
- anything else → open an issue and say what is wrong.
For changes to layouts, styles, scripts or structure.
You need Ruby 3.x. macOS ships Ruby 2.6, which is too old:
brew install ruby@3.4 # macOS
sudo apt install ruby-full # Debian/UbuntuThen:
git clone https://github.com/EthioNLP/ethionlp.github.io.git
cd ethionlp.github.io
make serveThat installs the gems into vendor/bundle on first run and serves the site at
http://localhost:4000 with live reload. make serve PORT=4123 uses a
different port if that one is busy.
If make serve cannot find Ruby, it tells you where it looked. Everything else
is in the Makefile, which is short and commented.
git checkout -b short-description-of-change
# edit, and check it in the browser
make build # must pass with no Liquid errors
git commit -am "what changed and why"
git push -u origin short-description-of-changeThen open a pull request. If it changes anything visual, a screenshot in the description saves a great deal of back and forth.
| Path | What it is |
|---|---|
_members/, _events/, _news/, _topics/ |
One file per person, event, news item, thesis topic |
_data/*.yml |
Curated data: navigation, focus areas, teams, gallery |
_data/generated/*.yml |
Machine-owned. Overwritten by make sync, never edit |
_layouts/, _includes/ |
Templates. _includes/icon.html holds the whole icon set |
_sass/, assets/ |
The design system, and two small dependency-free scripts |
scripts/ |
The sync and scaffolding tools. Standard library plus PyYAML |
.github/ |
Issue forms, and the workflows that turn them into pull requests |
make sync # everything, in dependency order
make sync-hf # or just one sourceOnly Python 3 and PyYAML are needed (make deps installs them). Review the
result with git diff _data/generated. This also runs nightly in CI, which
opens a pull request when anything changed.
Not rules so much as what the existing code does, so that the next person can read it:
- Comments say why, not what. The code already says what. Several comments
in
scripts/exist because someone got it wrong the first time and wrote down the reason, those are the valuable ones. - No new dependencies without a reason. The sync scripts use the standard library plus PyYAML, which is why the CI job needs no lockfile and runs in seconds. The site itself ships no JavaScript framework.
- Templates must survive missing data. Every generated file can be absent or empty; a page that renders a blank section is fine, a page that crashes is not.
- Liquid cannot do floating-point arithmetic, and a name-based join in a template silently drops anything spelled differently by the two sources. Compute both in Python and let the template do lookups.
- Do not overstate what this community built. Work by EthioNLP is kept apart
from Ethiopian-language work by others, and work built for a language apart
from multilingual work that merely lists one. Both distinctions are enforced
in
scripts/sync_huggingface.py; please keep them. - Nobody is published without consent. People are listed only after confirming. Please do not add a way around that.
The site is meant to be usable on a slow connection and a cheap phone, which is what much of its audience has.
- It works with JavaScript disabled. Charts are server-rendered SVG; filters and the theme toggle are progressive enhancements.
- Images need
loading="lazy"and realalttext. - Light and dark themes both need checking,
data-theme="dark"on<html>. - Keyboard navigation must work. The header menus open on hover and on click for exactly this reason.
- Open an issue, anything at all, including "how do I…".
- ethionlp@googlegroups.com, if you would rather not use GitHub.
- Telegram, the fastest way to reach someone.
A half-finished pull request with a question in the description is welcome. So is an issue that only says something looks wrong without knowing why.
Content is CC BY 4.0; the code is under the repository's licence. By contributing you agree your contribution is published on those terms.