Contributing¶
Every resource in the directory comes from a single file: docs/data/resources.json.
Without technical skills¶
Use the GitHub forms (in French, answers in English are welcome):
Add a resource (Pull Request)¶
Add an entry to the resources array:
{
"id": "my-tool",
"name": "My tool",
"url": "https://example.org/",
"category": "communication",
"tags": ["messagerie", "open-source"],
"description": {
"fr": "Description courte en français.",
"en": "Short description in English (optional)."
},
"check": { "date": "2026-10-28", "result": "confirmed", "by": "volunteer" }
}
Rules:
idandtagsin lowercase, without accents, separated by hyphens (hors-ligne).categorymust exist in thecategoriesobject of the same file.urlmust usehttps://.description.fris required;description.enis optional (falls back to French).check: the last check of the link and the information (see "Check an entry" below).date(YYYY-MM-DD): when you checked. After 12 months, the weekly maintenance flags the resource.result:confirmed(link reachable, information accurate) orunconfirmed(could not be confirmed: "Unconfirmed" badge on the card, no phone number allowed).note: required whenunconfirmed, to explain what could not be confirmed.by: who checked (ai,volunteer,lawyer,medicalorhistorian).
urlis also the primary source of the description. If the description states something coming from elsewhere, addsources:[{ "title": "…", "url": "https://…" }].- In guides and tips, every factual or legal statement carries a footnote (
[^id]). Sources are centralised indocs/data/sources.json(FR/EN title, URL, check date): add a source once, then cite it by id from any page. - To mention a directory resource in a guide, use
{{ res("id") }}(or{{ res("id", "link text") }}) instead of pasting its URL. phone(optional): only an official public number (emergency line, helpline).
Check an entry¶
Content was first researched and sourced with the help of an AI. Every registry entry (resources.json, sources.json, history.json, victimes.json) carries a check indicator saying who checked it, from least to most reliable:
by |
Shown as | Who |
|---|---|---|
ai |
AI-sourced, awaiting human check | Starting value: link and content found by an AI, no human review |
volunteer |
Checked by a volunteer | Someone opened the source and confirmed the information |
lawyer |
Checked by a lawyer | Legal information confirmed by a lawyer |
medical |
Checked by a health professional | Medical information confirmed by a health professional |
historian |
Checked by a historian | Historical fact (date, toll, context) confirmed by a historian |
To check: open the source, compare it with what is written, fix it if needed, then update check (today's date, result, by). No technical skills? Report your check in an issue.
Translate and get reviewed¶
- Each English page (
page.en.md) records insource_committhe commit of the French page it translates. If the French page changes afterwards, the translation is flagged as outdated (CI, weekly report and a notice on the page). After updating a translation, setsource_committo the French page's latest commit (git log -1 --format=%H -- docs/…/page.md). - Legal or medical pages carry
review: juridiqueorreview: medicalandreview_status: pending. Once reviewed by a professional, switch toreview_status: reviewedand addreviewed_on: YYYY-MM-DD: the "not yet reviewed" badge disappears.
Improve search¶
Two blocks of the same file drive the directory search:
situations: the shortcuts shown above the search ("I am in custody"…). A resource appears if it has at least one of the listedtagsorcategories.synonyms: words people type, mapped to tags or words to also search ("gav": ["garde-a-vue"]). Keys in lowercase without accents.
The essentiel tag feeds the "It's my first protest" shortcut: keep it for a handful of must-have tools and guides.
If a common search returns nothing, add a synonym rather than another tag.
Add an "I am… and I want to…" path¶
Paths live in docs/data/parcours.json: each profile ("I am…") has keywords for typing and needs ("… and I want to…"). Each need lists results:
{ "resource": "id" }: a directory resource;{ "guide": "slug", "anchor": { "fr": "…", "en": "…" }, "label": { … } }: a guide section;{ "page": "sos" | "carte" | "comprendre" | "histoire" | "repressions", … }or{ "directory": { "situation": "…" }, … }.
Add "urgent": true to show the SOS link. npm run validate:data checks that every resource, situation and anchor exists, in French and English.
Open Data¶
All site data is public and available in JSON format in docs/data/ (validation schemas in schemas/):
resources.json— directory of tools, associations, outlets and emergency numbers;parcours.json— "I am… and I want to…" decision tree;history.json— historical milestones, social gains and documented repression and debunked statements;victimes.json— censuses and timeline of people injured or killed at protests;sources.json— centralised registry of sources cited across the site.
Check¶
npm run validate:data # validate the registry
npm run readme # regenerate the README list
npm run check # format, lint, spelling, registry
npm test # strict MkDocs build
Then open a Pull Request on the GitHub repository.