L'open source, ouvert à tous.
Plateforme de découverte et de valorisation de la contribution open source, pensée pour les développeurs africains.
Des agrégateurs de « good first issues » existent déjà. OpenToAll ajoute ce qui manquait pour beaucoup de contributeurs africains :
- Réactivité des mainteneurs
- Bienveillance envers les débutants (
CONTRIBUTING.md, score débutant) - Poids du dépôt (clone réaliste avec une connexion limitée)
- Visibilité : profils + classement par pays
| Bloc | Description |
|---|---|
| Agrégateur | Issues good first issue / help wanted via l’API GitHub, filtrées (langage, niveau, non assignées) |
| Contraintes réelles | Réactivité, bienveillance, poids du clone |
| Profils & classement | Profil public + leaderboard alimentés par les PR mergées GitHub du compte connecté |
Le bouton « Ouvre sur GitHub » ouvre seulement l’issue sur GitHub. Il ne crée pas une contribution sur OpenToAll.
Le flux réel aujourd’hui :
- Tu te connectes avec GitHub (OAuth).
- OpenToAll enregistre ton profil (
login, avatar, bio…). - À la connexion, la plateforme interroge l’API GitHub pour tes PR publiques
mergées (
author:toi type:pr is:merged) et les enregistre dans la tableContribution. - Le classement compte ces contributions par utilisateur / pays.
Donc : merge une PR sur GitHub → reconnecte-toi (ou attends la prochaine sync à la connexion) → tu apparais / montes dans le classement.
Ce n’est pas un webhook temps réel ni un tracking du clic « Contribuer ». C’est une sync des PR déjà mergées liées à ton compte GitHub.
- Django 6 + HTMX + templates
- PostgreSQL (prod) / SQLite (dev)
- Celery + Redis (optionnel ; en prod légère : cron +
/internal/fetch-issues/) - django-allauth (OAuth App GitHub — pas une GitHub App)
- Tailwind (CDN) + WhiteNoise + Gunicorn
- Déploiement typique : Fly.io + Neon (Postgres)
git clone https://github.com/Ymax27/opentoall.git
cd opentoall
python -m venv venv && source venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
python manage.py migrate
python manage.py seed_demo # démo UI uniquement — pas pour la prod
python manage.py runserverDocker (web + Postgres + Redis + Celery) :
cp .env.example .env
docker compose up --builddjango-allauth attend une OAuth App classique :
GitHub → Settings → Developer settings → OAuth Apps
| Champ | Local | Prod (exemple Fly) |
|---|---|---|
| Homepage URL | http://localhost:8000 |
https://opentoall.fly.dev |
| Authorization callback URL | http://localhost:8000/accounts/github/login/callback/ |
https://opentoall.fly.dev/accounts/github/login/callback/ |
Puis dans les secrets / .env :
GITHUB_CLIENT_ID/GITHUB_CLIENT_SECRET→ ceux de l’OAuth AppGITHUB_PAT→ Personal Access Token pour l’ingestion d’issues (données publiques)
Une GitHub App (onglet GitHub Apps) n’est pas interchangeable avec une
OAuth App pour ce projet. Client ID / secret d’une GitHub App, callbacks
d’installation, ou mauvais type d’app → erreurs OAuth (redirect_uri_mismatch,
incorrect_client_credentials, boucle de login, etc.).
À faire : créer / utiliser une OAuth App, pas une GitHub App.
- L’app GitHub est bien une OAuth App (pas GitHub App).
- Callback URL exacte (https, domaine,
/accounts/github/login/callback/, slash final). GITHUB_CLIENT_IDetGITHUB_CLIENT_SECRETsur Fly = ceux de cette OAuth App.- Django Sites (
/admin/→ Sites) : domaine =opentoall.fly.dev(sanshttps://). - Pas de doublon contradictoire : si une entrée Social applications existe dans l’admin allauth, ses credentials doivent être identiques aux secrets Fly (sinon allauth peut utiliser les mauvais).
DEBUG=False, cookies sécurisés, site servi en HTTPS.- Après fix : vider cookies du site / refaire un login en navigation privée.
# Local (GITHUB_PAT requis)
python manage.py fetch_issues --pages 1
python manage.py fetch_issues --pages 2 --languages Python Go JavaScript TypeScript Rust JavaEn prod (Fly), sans Celery :
https://opentoall.fly.dev/internal/fetch-issues/?token=FETCH_ISSUES_TOKEN&pages=1
Réponse attendue : 202. Relancer si le rate limit GitHub a stoppé après le premier langage (ex. seulement Python dans les filtres) — la progression est sauvegardée, un second run complète les autres langages.
Ne lance jamais
seed_demoen production (liens GitHub factices / issues fermées).
- Neon →
DATABASE_URL - Secrets Fly :
SECRET_KEY,DATABASE_URL,GITHUB_CLIENT_ID,GITHUB_CLIENT_SECRET,GITHUB_PAT,FETCH_ISSUES_TOKEN,DEBUG=False,USE_REDIS_CACHE=0(tant qu’il n’y a pas de Redis distant) fly deploy- Configurer l’OAuth App + Site Django (checklist ci-dessus)
- Premier
fetch-issues+ cron toutes les 6 h (cron-job.org)
Détails machines / fly.toml : voir le fichier à la racine du repo.
pytestVoir CONTRIBUTING.md et le Code de conduite.
MIT — voir LICENSE.