← Projets

OpenDerja_TN

2026 — en cours

Back-end central complet · s'ouvre aux contributeurs open source

Douze millions de personnes écrivent cette langue chaque jour et il n'en existe presque aucune trace correcte. Des contributeurs écrivent, corrigent et confirment de la derja de leur propre région, et il en sort un jeu de données citable, un lexique, et un traducteur construit sur le corpus. Non lucratif par conception. Le back-end est fait — un cœur de domaine sans framework, onze modules NestJS, un schéma de 42 modèles, de l'OAuth par fournisseur, une file de jobs pg-boss — et le projet s'ouvre maintenant aux contributeurs au lieu de rester en solo.

Rôle — Fondateur & mainteneur — non lucratif dès la première ligne, on amène maintenant des contributeurs

Modèles de données
42
Suites de tests
59 · 302 tests
Modules back-end
11
Régions modélisées
4
Plans de langage
3
Next.jsNestJSCœur sans frameworkPostgreSQLPrismapgBouncerpg-bosspg_trgmRedis (sessions uniquement)OAuth par fournisseurCloudflare Tunnel

La contrainte qui l'a façonné

Un dialecte est un continuum, et un schéma qui force une réponse unique jette une information qu'on ne peut plus récupérer. Presque chaque décision intéressante du modèle de données vient de là.

L'architecture

Plan de contrôleTypeScriptbackendworkerscrapersconstruitPlan de donnéesRustdeduptextexportauditmediadélibérément videIntelligencePythonnlpdélibérément videRègle de promotion : mesurée, pas devinée.Rien dans un chemin de requête ne doit jamais attendre une inférence.
Une étape passe à Rust quand elle est mesurée comme un goulet d'étranglement à l'échelle réelle du corpus — pas quand il semble que ça irait plus vite. Les modules vides sont des jointures pré-échafaudées pour que le déplacement reste peu coûteux. Qu'ils soient encore vides est le but, et c'est écrit dans le propre registre du projet pour qu'une session ultérieure ne les traite pas comme un trou à combler.

Le modèle de données — l'ingénierie vraiment spécifique

La région est un ensemble, pas une valeur. Un segment peut appartenir à deux régions à la fois, et stocker une seule région forcerait un choix faux sur chaque ligne. Un champ séparé enregistre si l'élément est régional tout court, parce que « quelles régions » et « est-ce régional » sont deux questions différentes.

Les annotations s'attachent toujours à des plages de caractères — y compris celles qui portent sur un segment entier, écrites comme une plage couvrant tout le texte plutôt qu'une plage nulle. Une seule forme pour chaque annotation, c'est un seul mécanisme de consensus et un seul chemin de requête, au lieu que chaque consommateur gère deux cas pour toujours.

Les tokens sont des annotations, pas une hiérarchie. La standardisation réécrit le texte. Les annotations ancrées à un offset migrent avec la réécriture ; une hiérarchie de tokens parallèle se désynchronise sans rien dire.

Le consensus est clé sur la plage complète, pas sur le segment et le type. Sinon deux annotations sur des parties différentes d'une même phrase s'écrasent l'une l'autre sans erreur.

Les clés d'idempotence de tâche portent un emplacement obligatoire. Vide pour les tâches cadrées sur l'enregistrement, la plage de caractères pour celles cadrées sur une plage, un ordinal pour le cas « N du même genre ». Le rendre obligatoire plutôt qu'optionnel, c'est toute la décision : un champ optionnel avec un défaut sensé est un champ que quelqu'un omet, et ici l'échec est silencieux.

Le partage train/dev/test est fixé à l'insertion et jamais changé. C'est la seule chose qui rend une affirmation de précision honnête.

La sortie machine n'est jamais un fait. La sortie d'un modèle entre comme une suggestion, attribuée à un utilisateur système et marquée, et il lui faut une confirmation humaine avant d'atteindre un champ canonique.

La retenue comme décision de conception

Trois plans existent — TypeScript, Rust, Python — mais seul celui en TypeScript a du code dedans. Une étape passe à Rust quand elle est mesurée comme un goulet d'étranglement à l'échelle réelle du corpus, pas quand on imagine que ça irait plus vite. Les modules Rust sont échafaudés comme des jointures vides pour que le déplacement reste peu coûteux, et le fait qu'ils soient encore vides est écrit dans le registre du projet, pour que personne ne le lise plus tard comme un trou.

Aucun modèle ML, aucune inférence Python et aucune dépendance GPU avant que le corpus ne soit réel. Rien dans un chemin de requête n'a le droit d'await une inférence. Les services nlp et media sont des stubs health-check seulement jusqu'à leur phase.

Chaque écran contributeur, c'est une question, trois secondes, aucune explication nécessaire. Les niveaux de confiance, les types de tâches et le routage ne sont jamais visibles pour un contributeur. Le corpus ne se construit que si des gens qui ne sont pas linguistes peuvent contribuer sans apprendre le système d'abord.

Construit en solo, ouvert exprès

Les phases un et deux sont cadrées pour que, si le projet s'arrête après la phase deux, il ait quand même produit quelque chose qui n'existait pas avant : un jeu de données de derja publié, citable et étiqueté par région, et un outil public qu'un Tunisien non technique peut utiliser. Définir un point d'arrêt qui compte quand même comme une réussite, c'est ce qui rend viable un projet sans financement et sans échéance.

Le back-end est écrit et testé. Le travail suivant — le front-end contributeur, les sources de scraping, le traducteur par-dessus le corpus — c'est là que les contributeurs entrent. Il y a un registre d'architecture bilingue (EN + FR) qui consigne les règles non négociables et pourquoi chacune existe, pour qu'un nouveau contributeur n'ait pas à re-dériver une décision déjà prise. Le dépôt est privé pour l'instant et devient public avec cette ouverture.

Comment ça a été construit

  • 25 août 2026

    OpenDerja_TN commence

    Un corpus ouvert et régionalement équilibré de la derja tunisienne. Douze millions de personnes écrivent cette langue chaque jour et il n'en existe presque aucune trace correcte.

Les problèmes qui sont sortis de ce projet4

Notes liées