From 93c577c5d330e8b096b9dd15b21e5069b962fcb1 Mon Sep 17 00:00:00 2001 From: sucupira Date: Tue, 21 Jul 2026 13:10:12 -0400 Subject: [PATCH] =?UTF-8?q?chore:=20=C3=A9tat=20initial=20avant=20refonte?= =?UTF-8?q?=20(atlas=20SvelteKit=20v4.0.0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Snapshot de l'existant avant application du playbook OKI : background shader Three.js, carte graphe 3D, timeline statique. --- .gitignore | 11 + APACHE_AUTOINDEX.md | 66 + UI UX souveraine Fondements.md | 391 + atlas-fediverse/.gitignore | 9 + atlas-fediverse/package-lock.json | 1856 ++++ atlas-fediverse/package.json | 34 + atlas-fediverse/scripts/postbuild-csp.mjs | 86 + atlas-fediverse/src/app.css | 8 + atlas-fediverse/src/app.html | 74 + .../src/lib/components/Footer.svelte | 239 + .../src/lib/components/Header.svelte | 320 + .../src/lib/components/HeroSection.svelte | 185 + .../src/lib/components/HeroShader.svelte | 201 + .../src/lib/components/NetworkGraph.svelte | 797 ++ .../lib/components/OfflineIndicator.svelte | 52 + .../src/lib/components/ProtocolSection.svelte | 327 + .../src/lib/components/ProtocolStream.svelte | 98 + .../src/lib/components/ShortcutsHelp.svelte | 140 + .../src/lib/components/SoftwareCatalog.svelte | 848 ++ .../src/lib/components/TimelineSection.svelte | 369 + .../lib/components/pages/CompareTable.svelte | 133 + .../lib/components/pages/FeatureGrid.svelte | 80 + .../src/lib/components/pages/Icon.svelte | 62 + .../src/lib/components/pages/StepsGrid.svelte | 84 + atlas-fediverse/src/lib/data/bridges.ts | 120 + atlas-fediverse/src/lib/data/categories.json | 100 + atlas-fediverse/src/lib/data/fediverse.json | 8217 +++++++++++++++++ atlas-fediverse/src/lib/data/index.test.ts | 54 + atlas-fediverse/src/lib/data/index.ts | 52 + atlas-fediverse/src/lib/data/metadata.json | 27 + atlas-fediverse/src/lib/data/network.json | 6278 +++++++++++++ atlas-fediverse/src/lib/data/protocols.json | 97 + atlas-fediverse/src/lib/data/software.json | 1713 ++++ atlas-fediverse/src/lib/data/timeline.ts | 418 + atlas-fediverse/src/lib/data/types.ts | 66 + atlas-fediverse/src/lib/i18n/fr.ts | 69 + atlas-fediverse/src/lib/i18n/gcf.ts | 75 + atlas-fediverse/src/lib/i18n/i18n.svelte.ts | 60 + atlas-fediverse/src/lib/keyboard.ts | 8 + atlas-fediverse/src/lib/pwa.svelte.ts | 51 + atlas-fediverse/src/routes/+layout.svelte | 28 + atlas-fediverse/src/routes/+layout.ts | 6 + atlas-fediverse/src/routes/+page.svelte | 17 + atlas-fediverse/src/routes/nostr/+page.svelte | 702 ++ .../src/routes/simplex/+page.svelte | 497 + atlas-fediverse/src/service-worker.ts | 122 + atlas-fediverse/src/styles/base.css | 116 + atlas-fediverse/src/styles/layouts.css | 55 + atlas-fediverse/src/styles/reset.css | 73 + atlas-fediverse/src/styles/themes/default.css | 74 + atlas-fediverse/src/styles/tokens.css | 37 + atlas-fediverse/static/boot-check.js | 9 + atlas-fediverse/static/data/categories.json | 100 + atlas-fediverse/static/data/categories.yaml | 70 + atlas-fediverse/static/data/fediverse.json | 8217 +++++++++++++++++ atlas-fediverse/static/data/fediverse.yaml | 5969 ++++++++++++ atlas-fediverse/static/data/metadata.json | 27 + atlas-fediverse/static/data/metadata.yaml | 22 + atlas-fediverse/static/data/network.json | 6278 +++++++++++++ atlas-fediverse/static/data/network.yaml | 4353 +++++++++ atlas-fediverse/static/data/protocols.json | 97 + atlas-fediverse/static/data/protocols.yaml | 82 + atlas-fediverse/static/data/software.json | 1713 ++++ atlas-fediverse/static/data/software.yaml | 1431 +++ atlas-fediverse/static/fonts/inter-var.woff2 | Bin 0 -> 72920 bytes .../static/fonts/space-grotesk-var.woff2 | Bin 0 -> 22288 bytes .../static/icons/apple-touch-icon.png | Bin 0 -> 34321 bytes atlas-fediverse/static/icons/favicon-32.png | Bin 0 -> 3706 bytes atlas-fediverse/static/icons/icon-192.png | Bin 0 -> 35597 bytes atlas-fediverse/static/icons/icon-512.png | Bin 0 -> 124387 bytes .../static/icons/icon-maskable-512.png | Bin 0 -> 107395 bytes atlas-fediverse/static/icons/logo.svg | 17 + .../static/infographie-fediverse-2026.pdf | 80 + .../static/infographie-fediverse-2026.svg | 352 + atlas-fediverse/static/manifest.json | 32 + atlas-fediverse/svelte.config.js | 21 + atlas-fediverse/tsconfig.json | 14 + atlas-fediverse/vite.config.ts | 9 + chatcontrol.htaccess | 11 + prompt-pwa-sveltekit.md | 239 + 80 files changed, 54745 insertions(+) create mode 100644 .gitignore create mode 100644 APACHE_AUTOINDEX.md create mode 100644 UI UX souveraine Fondements.md create mode 100644 atlas-fediverse/.gitignore create mode 100644 atlas-fediverse/package-lock.json create mode 100644 atlas-fediverse/package.json create mode 100644 atlas-fediverse/scripts/postbuild-csp.mjs create mode 100644 atlas-fediverse/src/app.css create mode 100644 atlas-fediverse/src/app.html create mode 100644 atlas-fediverse/src/lib/components/Footer.svelte create mode 100644 atlas-fediverse/src/lib/components/Header.svelte create mode 100644 atlas-fediverse/src/lib/components/HeroSection.svelte create mode 100644 atlas-fediverse/src/lib/components/HeroShader.svelte create mode 100644 atlas-fediverse/src/lib/components/NetworkGraph.svelte create mode 100644 atlas-fediverse/src/lib/components/OfflineIndicator.svelte create mode 100644 atlas-fediverse/src/lib/components/ProtocolSection.svelte create mode 100644 atlas-fediverse/src/lib/components/ProtocolStream.svelte create mode 100644 atlas-fediverse/src/lib/components/ShortcutsHelp.svelte create mode 100644 atlas-fediverse/src/lib/components/SoftwareCatalog.svelte create mode 100644 atlas-fediverse/src/lib/components/TimelineSection.svelte create mode 100644 atlas-fediverse/src/lib/components/pages/CompareTable.svelte create mode 100644 atlas-fediverse/src/lib/components/pages/FeatureGrid.svelte create mode 100644 atlas-fediverse/src/lib/components/pages/Icon.svelte create mode 100644 atlas-fediverse/src/lib/components/pages/StepsGrid.svelte create mode 100644 atlas-fediverse/src/lib/data/bridges.ts create mode 100644 atlas-fediverse/src/lib/data/categories.json create mode 100644 atlas-fediverse/src/lib/data/fediverse.json create mode 100644 atlas-fediverse/src/lib/data/index.test.ts create mode 100644 atlas-fediverse/src/lib/data/index.ts create mode 100644 atlas-fediverse/src/lib/data/metadata.json create mode 100644 atlas-fediverse/src/lib/data/network.json create mode 100644 atlas-fediverse/src/lib/data/protocols.json create mode 100644 atlas-fediverse/src/lib/data/software.json create mode 100644 atlas-fediverse/src/lib/data/timeline.ts create mode 100644 atlas-fediverse/src/lib/data/types.ts create mode 100644 atlas-fediverse/src/lib/i18n/fr.ts create mode 100644 atlas-fediverse/src/lib/i18n/gcf.ts create mode 100644 atlas-fediverse/src/lib/i18n/i18n.svelte.ts create mode 100644 atlas-fediverse/src/lib/keyboard.ts create mode 100644 atlas-fediverse/src/lib/pwa.svelte.ts create mode 100644 atlas-fediverse/src/routes/+layout.svelte create mode 100644 atlas-fediverse/src/routes/+layout.ts create mode 100644 atlas-fediverse/src/routes/+page.svelte create mode 100644 atlas-fediverse/src/routes/nostr/+page.svelte create mode 100644 atlas-fediverse/src/routes/simplex/+page.svelte create mode 100644 atlas-fediverse/src/service-worker.ts create mode 100644 atlas-fediverse/src/styles/base.css create mode 100644 atlas-fediverse/src/styles/layouts.css create mode 100644 atlas-fediverse/src/styles/reset.css create mode 100644 atlas-fediverse/src/styles/themes/default.css create mode 100644 atlas-fediverse/src/styles/tokens.css create mode 100644 atlas-fediverse/static/boot-check.js create mode 100644 atlas-fediverse/static/data/categories.json create mode 100644 atlas-fediverse/static/data/categories.yaml create mode 100644 atlas-fediverse/static/data/fediverse.json create mode 100644 atlas-fediverse/static/data/fediverse.yaml create mode 100644 atlas-fediverse/static/data/metadata.json create mode 100644 atlas-fediverse/static/data/metadata.yaml create mode 100644 atlas-fediverse/static/data/network.json create mode 100644 atlas-fediverse/static/data/network.yaml create mode 100644 atlas-fediverse/static/data/protocols.json create mode 100644 atlas-fediverse/static/data/protocols.yaml create mode 100644 atlas-fediverse/static/data/software.json create mode 100644 atlas-fediverse/static/data/software.yaml create mode 100644 atlas-fediverse/static/fonts/inter-var.woff2 create mode 100644 atlas-fediverse/static/fonts/space-grotesk-var.woff2 create mode 100644 atlas-fediverse/static/icons/apple-touch-icon.png create mode 100644 atlas-fediverse/static/icons/favicon-32.png create mode 100644 atlas-fediverse/static/icons/icon-192.png create mode 100644 atlas-fediverse/static/icons/icon-512.png create mode 100644 atlas-fediverse/static/icons/icon-maskable-512.png create mode 100644 atlas-fediverse/static/icons/logo.svg create mode 100644 atlas-fediverse/static/infographie-fediverse-2026.pdf create mode 100644 atlas-fediverse/static/infographie-fediverse-2026.svg create mode 100644 atlas-fediverse/static/manifest.json create mode 100644 atlas-fediverse/svelte.config.js create mode 100644 atlas-fediverse/tsconfig.json create mode 100644 atlas-fediverse/vite.config.ts create mode 100644 chatcontrol.htaccess create mode 100644 prompt-pwa-sveltekit.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8756f43 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +node_modules +**/build +**/.svelte-kit +**/package +.env +.env.* +!.env.example +vite.config.js.timestamp-* +vite.config.ts.timestamp-* +.DS_Store +*.log diff --git a/APACHE_AUTOINDEX.md b/APACHE_AUTOINDEX.md new file mode 100644 index 0000000..cc9a6c6 --- /dev/null +++ b/APACHE_AUTOINDEX.md @@ -0,0 +1,66 @@ +# Piège Apache (o2switch) : « Index of /… » au lieu des pages + +Symptôme : le site est déployé sur un hébergement mutualisé Apache (o2switch), +la page d'accueil s'affiche, mais **cliquer sur un lien interne affiche +« Index of /chatcontrol/quiz »** (un listing de dossier) au lieu de la page. + +## Cause : conflit fichier / dossier + +SvelteKit (adapter-static, `trailingSlash` par défaut = `'never'`) génère : + +``` +build/ +├── quiz.html ← la page +├── quiz/ ← dossier créé pour __data.json +│ └── __data.json +├── outils.html +├── outils/ +│ └── … +``` + +Quand le navigateur demande `/chatcontrol/quiz`, Apache voit qu'un **dossier** +`quiz/` existe et redirige (301) vers `/chatcontrol/quiz/`. Comme ce dossier +ne contient pas de `index.html`, Apache sert son **autoindex** (le listing). +Le fichier `quiz.html`, lui, n'est jamais trouvé. + +Apache donne toujours la priorité au dossier quand les deux existent — +ce problème revient à chaque site statique posé sur du mutualisé Apache. + +## Correctif (déjà appliqué dans ce dépôt) + +`frontend/src/routes/+layout.ts` : + +```ts +export const trailingSlash = 'always' +``` + +Chaque page est alors générée **dans** son dossier : + +``` +build/ +├── quiz/ +│ ├── index.html ← la page, servie par Apache +│ └── __data.json +├── outils/ +│ ├── index.html +│ └── aegis/ +│ └── index.html +``` + +Plus de conflit possible : le dossier existe, il contient un `index.html`, +Apache le sert. + +## Checklist quand ça arrive + +1. `export const trailingSlash = 'always'` dans le `+layout.ts` racine. +2. `pnpm build` → vérifier que `build/quiz/index.html` existe + (et non `build/quiz.html`). +3. **Vider le dossier distant avant de re-uploader** : les anciens + `quiz.html` / `outils.html` et les vieux assets `_app/immutable/` hashés + doivent partir, sinon ils traînent indéfiniment. +4. Tester `curl -s https:////` → du HTML, pas « Index of ». + +Note : les liens internes relatifs (`./outils`) provoquent une petite +redirection 301 vers l'URL avec `/` final. Normal, invisible pour +l'utilisateur. L'éviter exigerait `paths.relative: false`, au prix de la +consultation locale des fichiers du build. diff --git a/UI UX souveraine Fondements.md b/UI UX souveraine Fondements.md new file mode 100644 index 0000000..7ebfa98 --- /dev/null +++ b/UI UX souveraine Fondements.md @@ -0,0 +1,391 @@ +# UI/UX souveraine — Fondements neuro-cognitifs, doctrine multi-device et stack front-end libre + +**Document de référence OKI** · Rédigé le 06/07/2026 · Destiné à l'archivage (Denote) +**Périmètre** : plateformes web OKI (fédérées et éditoriales), applications natives, UI Maskarad +**Licence suggérée du document** : CC BY-SA 4.0 +**Note de fraîcheur** : les fondements neuro-cognitifs sont stables (décennies de littérature). Les versions de frameworks citées (Svelte 5, SvelteKit 2, Tailwind 4, Qt 6.x) correspondent à l'état connu début 2026 — vérifier les numéros de version exacts au moment de l'implémentation, la doctrine reste valable. + +--- + +## Table des matières + +1. Fondements neuro-cognitifs +2. Doctrine par device (mobile, desktop, tablette, montre) +3. Éthique attentionnelle — la calm technology comme avantage compétitif +4. Adoption en contexte caribéen +5. Stack front-end web : Svelte + CSS +6. Applications natives : Qt et alternatives libres +7. Checklist d'audit OKI +8. Application aux projets en cours (fronts fédérés, Maskarad) +9. Références + +--- + +## 1. Fondements neuro-cognitifs + +### 1.1 La vision : fovéale, saccadique, prédictive + +- **Fovéa** : la vision nette couvre ~2° d'angle visuel (un pouce à bout de bras). Tout le reste est périphérique, flou, sensible au mouvement et au contraste — et sert exclusivement à planifier la prochaine **saccade** (3-4 sauts oculaires par seconde). +- **Conséquence** : l'utilisateur ne « voit » pas une page, il la parcourt par sauts. La hiérarchie visuelle (taille, contraste, position, espacement) est le rail des saccades. Ce qui n'est pas sur le rail n'existe pas cognitivement. +- **Motifs de balayage** : motif en **F** pour le contenu textuel (deux bandes horizontales en haut, puis descente verticale à gauche — d'où l'importance capitale des premiers mots de chaque ligne/titre), motif en **Z** pour les pages d'accueil peu denses. +- **Le contraste prime sur la couleur** pour guider l'attention. ~8 % des hommes ont une déficience de vision des couleurs : ne jamais coder une information par la couleur seule (toujours doubler par forme, texte ou icône). +- **Jugement esthétique en 50 ms** (Lindgaard et al., 2006) : la première impression de confiance/qualité se forme avant toute lecture consciente, sur la base de l'harmonie visuelle globale. Elle biaise ensuite tout le reste de l'expérience (effet de halo). + +### 1.2 Attention et mémoire de travail + +- **Système 1 / Système 2** (Kahneman) : ~95 % des interactions se font en mode automatique, rapide, par reconnaissance de motifs. L'utilisateur **ne lit pas, il reconnaît**. Le mode analytique (Système 2) est coûteux, lent, et l'utilisateur l'évite. Toute UI qui exige du Système 2 pour des tâches routinières sera perçue comme « compliquée ». +- **Mémoire de travail : 4±1 éléments** (Cowan, révision moderne du 7±2 de Miller). Chaque écran, menu, formulaire qui demande de tenir plus de 4 éléments simultanément en tête génère de la surcharge. +- **Théorie de la charge cognitive** (Sweller) : distinguer la charge **intrinsèque** (complexité réelle de la tâche — incompressible), **extrinsèque** (générée par la présentation — à éliminer sans pitié), **germane** (effort d'apprentissage utile — à doser). Le design d'interface est essentiellement une guerre contre la charge extrinsèque. +- **Effet Zeigarnik** : les tâches interrompues restent actives en mémoire — exploitable positivement (reprendre où on s'est arrêté, indicateurs de progression) ou toxiquement (notifications qui créent des boucles ouvertes artificielles). +- **Effet de position sérielle** : on retient mieux le premier et le dernier élément d'une liste. Placer l'essentiel aux extrémités des menus et des parcours. +- **Effet Von Restorff** : l'élément visuellement distinct est mémorisé — un seul bouton d'action primaire par écran, visuellement isolé. +- **Règle du pic et de la fin (peak-end, Kahneman)** : une expérience est mémorisée par son moment le plus intense et par sa fin. Soigner les fins de parcours (confirmation de publication, fin d'inscription, fin de session) autant que les débuts. + +### 1.3 Les lois quantitatives de l'interaction + +- **Loi de Fitts** : le temps d'atteinte d'une cible croît avec la distance et décroît avec la taille. Applications : cibles tactiles ≥ 44-48 px ; sur desktop, les bords et coins d'écran sont des cibles « infinies » (le curseur ne peut pas les dépasser) ; regrouper spatialement les actions liées. +- **Loi de Hick-Hyman** : le temps de décision croît logarithmiquement avec le nombre d'options. Applications : navigation à 4-5 entrées max, divulgation progressive, réglages par défaut intelligents plutôt que questions. +- **Seuil de Doherty (~400 ms)** : sous 400 ms, l'interaction est perçue comme un dialogue fluide (état de flow maintenu) ; au-delà de 1 s, l'attention décroche ; au-delà de 10 s, l'utilisateur est mentalement parti. Entre 1 et 10 s : indicateur de progression obligatoire. La **performance perçue** se travaille aussi : skeleton screens, optimistic UI, transitions qui masquent la latence. +- **Loi de Jakob (Nielsen)** : les utilisateurs passent l'essentiel de leur temps ailleurs — ils arrivent avec des schémas mentaux préformés par WhatsApp, Instagram, YouTube. Toute déviation des conventions a un coût cognitif : le dépenser **délibérément** (là où la différenciation a du sens), jamais par accident. +- **Loi de Tesler (conservation de la complexité)** : la complexité d'une tâche ne disparaît jamais, elle se déplace. Soit l'interface l'absorbe (travail de conception), soit l'utilisateur la subit. La complexité fédérative (instances, protocoles) doit être absorbée par l'interface, pas exposée à l'inscription. + +### 1.4 Motricité : le pouce comme curseur + +- En tenue à une main (usage mobile majoritaire), le pouce couvre confortablement le **tiers inférieur** de l'écran ; les coins supérieurs sont pénibles et instables. +- Précision tactile réelle : ~7-10 mm de zone de contact, d'où le standard 44-48 px avec espacement ≥ 8 px entre cibles. +- Les **gestes sont invisibles** donc non découvrables : ils complètent des boutons visibles, ne les remplacent jamais. Exception : les gestes devenus conventions universelles (pincer-zoomer, tirer-rafraîchir, swipe latéral de retour). + +### 1.5 Boucles dopaminergiques et récompense variable + +- Le circuit dopaminergique répond plus fortement à la récompense **imprévisible** qu'à la récompense certaine (conditionnement opérant, Skinner). Les mécaniques pull-to-refresh + contenu aléatoire, scroll infini, compteurs de likes, streaks, sont des programmes de renforcement à ratio variable — littéralement l'architecture des machines à sous. +- Le **scroll infini supprime les points d'arrêt naturels** que le cerveau utilise pour décider consciemment de continuer ou partir. La pagination, les marqueurs « vous êtes à jour », les fins de section restituent ce choix. +- Position OKI (voir §3) : refus explicite de ces mécaniques, transformé en argument d'adoption. + +--- + +## 2. Doctrine par device + +### 2.1 Mobile (le device par défaut) + +**Contexte réel** : sessions courtes (30-90 s), fragmentées, en mobilité, souvent à une main, sur des forfaits data comptés et des réseaux 3G/4G irréguliers (réalité caribéenne). + +Règles : + +1. **Zone du pouce** : actions primaires dans le tiers inférieur (barre d'onglets basse, bouton d'action flottant si justifié) ; le haut de l'écran pour le contexte et les actions rares/destructives. +2. **Valeur en 5 secondes** : chaque écran doit livrer sa raison d'être immédiatement, sans lecture préalable. +3. **Reprennabilité** : état sauvegardé en continu, retour instantané au point d'interruption, aucune tâche exigeant plus de 2-3 minutes ininterrompues sans point de sauvegarde. +4. **Une colonne, un flux** : pas de mise en page multi-colonnes ; hiérarchie verticale stricte. +5. **Cibles 44-48 px minimum**, espacement 8 px, texte de corps ≥ 16 px (empêche aussi le zoom automatique d'iOS sur les champs de formulaire). +6. **Frugalité data** : lazy loading, AVIF/WebP pour l'image, AV1 pour la vidéo (cohérent avec la stack OKI), pas de police web au-delà de 2 fichiers, budget page < 500 Ko idéal, < 1 Mo maximum. +7. **PWA installable + offline-first** : service worker, cache des contenus consultés, file d'attente des actions hors-ligne. Double bénéfice : résilience réseau + **souveraineté** (contournement des stores propriétaires). +8. **Formulaires** : le clavier virtuel mange la moitié de l'écran — un champ visible à la fois, types d'input corrects (`inputmode`, `autocomplete`), jamais plus de champs que strictement nécessaire. + +### 2.2 Desktop + +**Contexte réel** : sessions longues, attention soutenue possible, pointeur précis, clavier, écran large. C'est le device des **contributeurs** (modérateurs, créateurs, administrateurs d'instance). + +Règles : + +1. **Largeur de lecture : 45-75 caractères par ligne** (~65 optimal). Au-delà, les saccades de retour à la ligne fatiguent et font perdre la ligne. Contraindre par `max-width` en `ch`. +2. **Densité maîtrisée et ajustable** : le desktop peut afficher plus, pas afficher n'importe quoi. Offrir un réglage compact/confortable pour les vues de type liste/tableau. +3. **Clavier roi** : navigation complète au clavier (j/k pour les flux comme Mastodon web, / pour la recherche, raccourcis affichés via `?`). Les utilisateurs experts sont ceux qui font vivre une plateforme fédérée — les raccourcis sont un investissement de rétention des contributeurs. +4. **Bords et coins de Fitts** : menus et actions fréquentes contre les bords de fenêtre quand c'est pertinent. +5. **États de survol riches** (prévisualisation, info-bulles) — inexistants sur tactile, donc jamais porteurs d'information exclusive. +6. **Multi-fenêtrage respecté** : l'application doit rester utilisable à 50 % de largeur d'écran (design responsive par container queries, pas par media queries d'appareil — voir §5.2). + +### 2.3 Tablette + +Ni un grand téléphone ni un petit desktop : usage majoritairement **en consommation, tenue à deux mains, pouces sur les bords latéraux**. Actions primaires près des bords gauche/droit, contenu au centre. Cible secondaire pour OKI : la traiter par responsive fluide (container queries) plutôt que par design dédié, sauf pour Maskarad où la lecture de visual novel sur tablette est un cas d'usage premium (paysage, deux zones de pouce pour avancer/menu). + +### 2.4 Montres et périphériques + +Hors périmètre de développement dédié pour OKI à ce stade. Règle d'hygiène : les notifications envoyées par les plateformes doivent être **conçues pour être lues en 2 secondes sur un poignet** (émetteur + verbe + objet), ce qui est de toute façon la bonne discipline de notification (§3). + +### 2.5 Continuité multi-device + +Le même individu utilise plusieurs devices dans la même journée. Exigences : état synchronisé (position de lecture, brouillons), identité unifiée (cohérent avec le chantier IndieWeb), et **parité fonctionnelle raisonnée** — toute fonction essentielle disponible partout, les fonctions de production avancées peuvent rester desktop. + +--- + +## 3. Éthique attentionnelle — la calm technology comme avantage compétitif + +Les plateformes propriétaires optimisent des boucles d'engagement compulsif (§1.5). Une plateforme souveraine peut faire le pari inverse et **le dire** : + +1. **Notifications** : groupées par défaut, paramétrables finement, jamais de notification purement ré-engageante (« Untel a aimé une photo que vous pourriez aimer »). Chaque notification = une information actionnable émise par un humain. +2. **Points d'arrêt naturels** : pagination ou marqueur « ou pa manké ayen » / « vous êtes à jour » dans les flux. Pas de scroll infini sans fin. +3. **Pas de métriques anxiogènes** : compteurs de likes optionnels/masquables, pas de streaks, pas de « vu à ». +4. **Pas de dark patterns** : désinscription aussi facile que l'inscription, pas de confirm-shaming, pas d'urgence artificielle, exports de données en un clic (garanti de toute façon par ActivityPub). +5. **Technologie périphérique** (Amber Case / Mark Weiser) : l'information non urgente reste en périphérie (badges discrets) et n'interrompt jamais. + +**Traduction en communication** : pour un public 16-25 ans saturé et de plus en plus lucide sur la manipulation attentionnelle, « nos plateformes ne sont pas conçues pour vous retenir » est un argument d'adoption explicite. Neuro-cognitivement : on troque l'engagement compulsif court terme contre la **confiance**, qui est le prédicteur de la rétention volontaire long terme et du bouche-à-oreille. + +--- + +## 4. Adoption en contexte caribéen + +### 4.1 Familiarité en surface, différence en profondeur + +Paradoxe central : pour faire adopter le radicalement différent (fédération, souveraineté), l'interface doit être radicalement **familière**. Le Système 1 doit pouvoir utiliser la plateforme sans apprendre ; la différence idéologique se découvre en Système 2, une fois la confiance établie. + +- **Masquer la complexité fédérative à l'entrée** (loi de Tesler) : une instance d'entrée par défaut, inscription < 60 s, le choix d'instance proposé plus tard comme option avancée. L'erreur historique de Mastodon (choisir une instance avant toute valeur perçue = charge cognitive maximale au pire moment) est documentée et évitable. +- **Onboarding par la valeur, pas par la pédagogie** : montrer du contenu du territoire dès le premier écran, expliquer la fédération au moment où elle devient visible (première interaction inter-instances), pas avant. + +### 4.2 Langue et code culturel + +- **Bilinguisme français/créole** dans l'interface : la reconnaissance linguistique active les circuits de confiance et d'appartenance avant toute lecture consciente. Le créole dans les micro-textes (boutons, états vides, confirmations) a un impact affectif disproportionné par rapport à son coût. +- **Iconographie et visuels du territoire** : une plateforme qui *ressemble* au territoire est catégorisée « pour moi » dans la fenêtre des 50 ms (§1.1). Le travail visuel de Maskarad (Mas, Basse-Terre) est le référentiel de qualité. +- **Localisation réelle** : formats de date, exemples, contenus de démonstration ancrés Caraïbe — jamais de Lorem ipsum hexagonal. + +### 4.3 Accessibilité comme rigueur + +- **WCAG 2.2 niveau AA minimum** : contraste 4.5:1 pour le texte courant, 3:1 pour le grand texte et les composants d'interface. Viser AAA (7:1) pour le corps de texte — la méthode modus-vivendi de Protesilaos Stavrou (palette construite *à partir* des ratios de contraste, pas décorée ensuite) est le modèle méthodologique exact : brique par brique appliqué à la couleur. +- **Respect des préférences système** : `prefers-color-scheme`, `prefers-reduced-motion`, `prefers-contrast`, taille de police utilisateur (tout en `rem`, jamais de `font-size` en `px` sur `html`). +- **HTML sémantique d'abord** : landmarks, hiérarchie de titres, ` + {/each} + + + + + + + + + + +
+ {#each downloads as dl (dl.href)} + {dl.label} + {/each} +
+ +
+

{t('footer.rights')}

+

{t('footer.credits')}

+
+ + + + diff --git a/atlas-fediverse/src/lib/components/Header.svelte b/atlas-fediverse/src/lib/components/Header.svelte new file mode 100644 index 0000000..9de04d2 --- /dev/null +++ b/atlas-fediverse/src/lib/components/Header.svelte @@ -0,0 +1,320 @@ + + +
+
+ + + Atlas + + + + +
+ {#if canInstall()} + + {/if} + +
+
+ + {#if menuOpen} + + {/if} +
+ + diff --git a/atlas-fediverse/src/lib/components/HeroSection.svelte b/atlas-fediverse/src/lib/components/HeroSection.svelte new file mode 100644 index 0000000..ffe5769 --- /dev/null +++ b/atlas-fediverse/src/lib/components/HeroSection.svelte @@ -0,0 +1,185 @@ + + +
+ + + +
+

+ Le réseau social,
+ sans les chaînes +

+ +

+ Explorez le Fédiverse : une cartographie visuelle des + {stats.totalSoftwares} logiciels + qui redéfinissent la communication en ligne. +

+ + + Plonger dans la carte + + +
+ + +
+ + diff --git a/atlas-fediverse/src/lib/components/HeroShader.svelte b/atlas-fediverse/src/lib/components/HeroShader.svelte new file mode 100644 index 0000000..00a1dda --- /dev/null +++ b/atlas-fediverse/src/lib/components/HeroShader.svelte @@ -0,0 +1,201 @@ + + + + + diff --git a/atlas-fediverse/src/lib/components/NetworkGraph.svelte b/atlas-fediverse/src/lib/components/NetworkGraph.svelte new file mode 100644 index 0000000..7d4cf43 --- /dev/null +++ b/atlas-fediverse/src/lib/components/NetworkGraph.svelte @@ -0,0 +1,797 @@ + + +
+
+

Cartographie

+

L'Écosystème

+

+ {activeCount} catégories actives · Survolez ou touchez un nœud pour plus d'infos +

+
+ +
+ + + + + {#if tooltip} +
+
+ +

{tooltip.node.id}

+ {#if tooltip.pinned} + + {/if} +
+

{tooltip.node.description}

+
+
Licence
{tooltip.node.licence}
+ {#if tooltip.software} +
Langage
{tooltip.software.language}
+ {/if} +
État
{tooltip.node.etat}
+
ActivityPub
{tooltip.node.compatibiliteAP}
+
+
+ {/if} +
+
+ + diff --git a/atlas-fediverse/src/lib/components/OfflineIndicator.svelte b/atlas-fediverse/src/lib/components/OfflineIndicator.svelte new file mode 100644 index 0000000..7579b78 --- /dev/null +++ b/atlas-fediverse/src/lib/components/OfflineIndicator.svelte @@ -0,0 +1,52 @@ + + +{#if !online} +
+ + {t('offline.indicator')} +
+{/if} + + diff --git a/atlas-fediverse/src/lib/components/ProtocolSection.svelte b/atlas-fediverse/src/lib/components/ProtocolSection.svelte new file mode 100644 index 0000000..3c66574 --- /dev/null +++ b/atlas-fediverse/src/lib/components/ProtocolSection.svelte @@ -0,0 +1,327 @@ + + +
+ + + +
+
+

Standards & Protocoles

+

Les fondations du Fédiverse

+

+ Comprendre les protocoles qui permettent la communication décentralisée entre les + différentes plateformes. +

+
+ +
    + {#each protocols as proto (proto.id)} +
  • +
    +
    +
    + + + +
    + +
    +
    +

    {proto.name}

    + {TYPES[proto.type].label} + + {proto.statut} + +
    +

    {proto.description}

    + {#if proto.rfc} + {proto.rfc} + {/if} +
    +
    +
    +
  • + {/each} +
+ +
    + {#each TYPE_ORDER as type (type)} +
  • + {TYPES[type].label} +
  • + {/each} +
+
+
+ + diff --git a/atlas-fediverse/src/lib/components/ProtocolStream.svelte b/atlas-fediverse/src/lib/components/ProtocolStream.svelte new file mode 100644 index 0000000..d6aa485 --- /dev/null +++ b/atlas-fediverse/src/lib/components/ProtocolStream.svelte @@ -0,0 +1,98 @@ + + + + + diff --git a/atlas-fediverse/src/lib/components/ShortcutsHelp.svelte b/atlas-fediverse/src/lib/components/ShortcutsHelp.svelte new file mode 100644 index 0000000..0cadedf --- /dev/null +++ b/atlas-fediverse/src/lib/components/ShortcutsHelp.svelte @@ -0,0 +1,140 @@ + + +{#if open} +
(open = false)} + onkeydown={(e) => e.key === 'Escape' && (open = false)} + role="presentation" + >
+ +{/if} + + diff --git a/atlas-fediverse/src/lib/components/SoftwareCatalog.svelte b/atlas-fediverse/src/lib/components/SoftwareCatalog.svelte new file mode 100644 index 0000000..a581f33 --- /dev/null +++ b/atlas-fediverse/src/lib/components/SoftwareCatalog.svelte @@ -0,0 +1,848 @@ + + +
+
+
+

Répertoire

+

Les logiciels du Fédiverse

+

+ {softwares.length} logiciels référencés, classés par catégorie et filtrables par statut + d'activité. +

+
+ +
+
+ + + + {#if search} + + {/if} +
+ +
+ + +
+
+ +

+ {t('catalog.results', { count: filtered.length })}{#if activeCategory !== 'all'} + dans {categoryById.get(activeCategory)?.name ?? activeCategory}{/if}{#if activeStatus !== 'all'} + · statut : {activeStatus}{/if}{#if search.trim()} + pour « {search.trim()} »{/if} +

+ + {#if filtered.length === 0} +
+

{t('common.emptyResults')}

+ +
+ {:else} +
+ {#each filtered as software (software.id)} + {@const category = categoryOf(software)} + + {/each} +
+ +

+ + {t('catalog.upToDate')} · {t('catalog.upToDateCreole')} +

+ {/if} +
+
+ +{#if selectedSoftware} + {@const software = selectedSoftware} + {@const category = categoryOf(software)} + + +{/if} + + diff --git a/atlas-fediverse/src/lib/components/TimelineSection.svelte b/atlas-fediverse/src/lib/components/TimelineSection.svelte new file mode 100644 index 0000000..27f5662 --- /dev/null +++ b/atlas-fediverse/src/lib/components/TimelineSection.svelte @@ -0,0 +1,369 @@ + + +
+
+
+

🕐 Chronologie

+

L'évolution du Fédiverse

+

+ De StatusNet en 2008 à l'Atlas de 2026 : {stats.yearsOfHistory} ans d'histoire du réseau + social décentralisé. +

+
+ +
+ {#each categoryFilters as filter (filter.key)} + + {/each} +
+ +
+ {#each yearGroups as [year, events] (year)} +
+

{year}

+
    + {#each events as event, i (`${year}-${event.title}`)} + {@const cat = categoryConfig[event.category]} +
  1. +
    +

    + + {cat.label} +

    +

    {event.title}

    +

    {event.description}

    +
    +
  2. + {/each} +
+
+ {/each} +
+ +
+ {#each finalStats as stat (stat.label)} +
+

{stat.value}

+

{stat.label}

+
+ {/each} +
+
+
+ + diff --git a/atlas-fediverse/src/lib/components/pages/CompareTable.svelte b/atlas-fediverse/src/lib/components/pages/CompareTable.svelte new file mode 100644 index 0000000..e1a5deb --- /dev/null +++ b/atlas-fediverse/src/lib/components/pages/CompareTable.svelte @@ -0,0 +1,133 @@ + + + +
+ + + + + + {#each columns as column, i (column)} + + {/each} + + + + {#each rows as row (row.aspect)} + + + {#each row.values as value, i (i)} + + {/each} + + {/each} + +
{caption}
{firstColumn}{column}
{row.aspect}{value}
+
+ + diff --git a/atlas-fediverse/src/lib/components/pages/FeatureGrid.svelte b/atlas-fediverse/src/lib/components/pages/FeatureGrid.svelte new file mode 100644 index 0000000..98d51dc --- /dev/null +++ b/atlas-fediverse/src/lib/components/pages/FeatureGrid.svelte @@ -0,0 +1,80 @@ + + +
+
    + {#each items as item (item.title)} +
  • + +
    +

    {item.title}

    +

    {item.description}

    +
    +
  • + {/each} +
+
+ + diff --git a/atlas-fediverse/src/lib/components/pages/Icon.svelte b/atlas-fediverse/src/lib/components/pages/Icon.svelte new file mode 100644 index 0000000..ceb31a9 --- /dev/null +++ b/atlas-fediverse/src/lib/components/pages/Icon.svelte @@ -0,0 +1,62 @@ + + + + + diff --git a/atlas-fediverse/src/lib/components/pages/StepsGrid.svelte b/atlas-fediverse/src/lib/components/pages/StepsGrid.svelte new file mode 100644 index 0000000..a1daf77 --- /dev/null +++ b/atlas-fediverse/src/lib/components/pages/StepsGrid.svelte @@ -0,0 +1,84 @@ + + +
+
    + {#each items as item (item.step)} +
  1. + + +

    {item.title}

    +

    {item.description}

    +
  2. + {/each} +
+
+ + diff --git a/atlas-fediverse/src/lib/data/bridges.ts b/atlas-fediverse/src/lib/data/bridges.ts new file mode 100644 index 0000000..cbadc78 --- /dev/null +++ b/atlas-fediverse/src/lib/data/bridges.ts @@ -0,0 +1,120 @@ +export interface Bridge { + id: string; + name: string; + description: string; + fromProtocol: string; + toProtocol: string; + fromColor: string; + toColor: string; + status: 'Actif' | 'En développement' | 'Expérimental' | 'Planifié'; + url?: string; + github?: string; + details: string; + limitations: string[]; +} + +export const bridges: Bridge[] = [ + { + id: 'mostr', + name: 'Mostr', + description: 'Pont unidirectionnel ActivityPub → Nostr. Permet de suivre des comptes ActivityPub depuis Nostr.', + fromProtocol: 'ActivityPub', + toProtocol: 'Nostr', + fromColor: '#F72585', + toColor: '#F7931A', + status: 'Actif', + url: 'https://mostr.pub/', + github: 'https://github.com/gfanton/mostr', + details: 'Mostr relay publie les activités ActivityPub sur Nostr. Créé par Guilhem Fanton (gfanton). Les utilisateurs Nostr peuvent suivre des comptes Mastodon/Pleroma via des clés npub dérivées.', + limitations: [ + 'Unidirectionnel (AP → Nostr uniquement)', + 'Ne supporte pas encore les médias riches', + 'Dépend de la disponibilité des instances AP', + ], + }, + { + id: 'nostr-ap-bridge', + name: 'Nostr-AP Bridge', + description: 'Pont bidirectionnel expérimental entre Nostr et ActivityPub. Synchronise notes et réponses.', + fromProtocol: 'Nostr', + toProtocol: 'ActivityPub', + fromColor: '#F7931A', + toColor: '#F72585', + status: 'Expérimental', + github: 'https://github.com/nostr-protocol/nostr', + details: 'Implémentation expérimentale permettant la publication croisée entre les deux protocoles. Les notes Nostr apparaissent comme des posts ActivityPub et vice-versa.', + limitations: [ + 'En phase expérimentale précoce', + 'Problèmes de formatage des contenus riches', + 'Gestion des threads complexe', + ], + }, + { + id: 'activitypub-nostr-gateway', + name: 'AP-Nostr Gateway', + description: 'Passerelle permettant aux instances ActivityPub de communiquer avec le réseau Nostr.', + fromProtocol: 'ActivityPub', + toProtocol: 'Nostr', + fromColor: '#F72585', + toColor: '#F7931A', + status: 'En développement', + github: 'https://github.com/fediverse', + details: 'Projet communautaire visant à créer une passerelle standard entre ActivityPub et Nostr. Supporte la conversion de formats d\'activités.', + limitations: [ + 'Non standardisé', + 'Performance limitée', + 'Nécessite un relay dédié', + ], + }, + { + id: 'fedify-nostr', + name: 'Fedify + Nostr', + description: 'Le framework Fedify explore le support multi-protocoles incluant Nostr.', + fromProtocol: 'ActivityPub', + toProtocol: 'Nostr', + fromColor: '#F72585', + toColor: '#F7931A', + status: 'Planifié', + url: 'https://fedify.dev/', + github: 'https://github.com/dahlia/fedify', + details: 'Fedify, le framework TypeScript pour ActivityPub, envisage d\'ajouter le support Nostr pour permettre aux développeurs de construire des applications multi-protocoles.', + limitations: [ + 'En phase de planification', + 'Pas de release date annoncée', + 'Complexité technique élevée', + ], + }, + { + id: 'soapbox-nostr', + name: 'Soapbox Nostr Bridge', + description: 'Pont intégré à Soapbox (frontend Pleroma) pour la cross-publication Nostr.', + fromProtocol: 'ActivityPub', + toProtocol: 'Nostr', + fromColor: '#F72585', + toColor: '#F7931A', + status: 'En développement', + url: 'https://soapbox.pub/', + details: 'Soapbox, le frontend alternatif pour Pleroma, développe un module de bridge Nostr permettant aux utilisateurs de cross-publier leurs contenus.', + limitations: [ + 'Spécifique à Soapbox/Pleroma', + 'Configuration requise par l\'administrateur', + 'Support partiel des formats', + ], + }, +]; + +export const bridgeProtocolOrder = [ + { name: 'ActivityPub', color: '#F72585' }, + { name: 'Nostr', color: '#F7931A' }, + { name: 'XMPP', color: '#06D6A0' }, + { name: 'Matrix', color: '#4361EE' }, + { name: 'AT Protocol', color: '#4CC9F0' }, + { name: 'SimpleX', color: '#2EC4B6' }, +]; + +export const bridgeStatusInfo: Record = { + Actif: { label: '✅ Actif', color: '#2EC4B6' }, + 'En développement': { label: '🔧 En développement', color: '#F9C74F' }, + Expérimental: { label: '🧪 Expérimental', color: '#F7931A' }, + Planifié: { label: '📋 Planifié', color: '#4CC9F0' }, +}; diff --git a/atlas-fediverse/src/lib/data/categories.json b/atlas-fediverse/src/lib/data/categories.json new file mode 100644 index 0000000..b5d0e35 --- /dev/null +++ b/atlas-fediverse/src/lib/data/categories.json @@ -0,0 +1,100 @@ +[ + { + "id": "social", + "name": "Réseaux sociaux", + "icon": "Users", + "color": "#4CC9F0", + "description": "Plateformes sociales fédérées" + }, + { + "id": "microblog", + "name": "Microblogging", + "icon": "MessageSquare", + "color": "#F9C74F", + "description": "Micro-blogs et status updates" + }, + { + "id": "photo", + "name": "Photographie", + "icon": "Camera", + "color": "#F8961E", + "description": "Partage de photos et images" + }, + { + "id": "video", + "name": "Vidéo", + "icon": "Video", + "color": "#F72585", + "description": "Streaming et partage vidéo" + }, + { + "id": "audio", + "name": "Audio & Podcast", + "icon": "Headphones", + "color": "#B5179E", + "description": "Musique, podcasts et audio" + }, + { + "id": "blog", + "name": "Blogs", + "icon": "FileText", + "color": "#7209B7", + "description": "Plateformes de blogging" + }, + { + "id": "forum", + "name": "Forums", + "icon": "MessageCircle", + "color": "#3A0CA3", + "description": "Forums et agrégateurs" + }, + { + "id": "events", + "name": "Événements", + "icon": "Calendar", + "color": "#4361EE", + "description": "Gestion d'événements" + }, + { + "id": "dev", + "name": "Développement", + "icon": "Code", + "color": "#4CC9F0", + "description": "Forge et développement logiciel" + }, + { + "id": "collab", + "name": "Collaboration", + "icon": "FolderOpen", + "color": "#2EC4B6", + "description": "Outils collaboratifs et cloud" + }, + { + "id": "books", + "name": "Livres", + "icon": "BookOpen", + "color": "#E71D36", + "description": "Lecture et partage de livres" + }, + { + "id": "wiki", + "name": "Wiki", + "icon": "Globe", + "color": "#662E9B", + "description": "Encyclopédies collaboratives" + }, + { + "id": "messaging", + "name": "Messagerie", + "icon": "Send", + "color": "#06D6A0", + "description": "Messagerie instantanée privée et sécurisée" + }, + { + "id": "nostr", + "name": "Nostr", + "icon": "Zap", + "color": "#F7931A", + "description": "Écosystème Nostr — protocole voisin" + } +] \ No newline at end of file diff --git a/atlas-fediverse/src/lib/data/fediverse.json b/atlas-fediverse/src/lib/data/fediverse.json new file mode 100644 index 0000000..22ddf26 --- /dev/null +++ b/atlas-fediverse/src/lib/data/fediverse.json @@ -0,0 +1,8217 @@ +{ + "metadata": { + "title": "Le Grand Atlas du Fédiverse", + "version": "4.0", + "year": 2026, + "language": "fr", + "licence": "CC BY-SA 4.0", + "lastUpdated": "2026-07-12", + "statistics": { + "totalSoftwares": 105, + "totalProtocols": 12, + "totalCategories": 14, + "activeSoftwares": 93, + "maintenanceSoftwares": 4, + "experimentalSoftwares": 5, + "historicalSoftwares": 3, + "fullAPCompatibility": 45, + "partialAPCompatibility": 4, + "extensionAPCompatibility": 9 + }, + "attribution": { + "inspiredBy": "Per Axbom (axbom.com/fediverse)", + "originalVersion": "3.0 (January 2023)", + "maintainers": [ + "Community" + ] + } + }, + "softwares": [ + { + "id": "mastodon", + "name": "Mastodon", + "description": "Le réseau social fédéré le plus populaire. Microblogging avec une audience mondiale.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Ruby on Rails", + "site": "https://joinmastodon.org/", + "github": "https://github.com/mastodon/mastodon", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2016, + "version": "4.3" + }, + { + "id": "gotosocial", + "name": "GoToSocial", + "description": "Serveur ActivityPub léger et rapide écrit en Go. Approche minimaliste et efficace.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Go", + "site": "https://gotosocial.org/", + "github": "https://github.com/superseriousbusiness/gotosocial", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2021, + "version": "0.17" + }, + { + "id": "akkoma", + "name": "Akkoma", + "description": "Fork de Pleroma avec des fonctionnalités enrichies et une personnalisation avancée.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Elixir", + "site": "https://akkoma.social/", + "github": "https://akkoma.dev/AkkomaGang/akkoma", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2022, + "version": "3.15" + }, + { + "id": "pleroma", + "name": "Pleroma", + "description": "Serveur ActivityPub léger et hautement configurable. Alternative rapide à Mastodon.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Elixir", + "site": "https://pleroma.social/", + "github": "https://git.pleroma.social/pleroma/pleroma", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2017, + "version": "2.7" + }, + { + "id": "misskey", + "name": "Misskey", + "description": "Plateforme sociale japonaise avec des fonctionnalités créatives (notes, réactions, drive).", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Node.js", + "site": "https://misskey-hub.net/", + "github": "https://github.com/misskey-dev/misskey", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2014, + "version": "2024" + }, + { + "id": "sharkey", + "name": "Sharkey", + "description": "Fork de Misskey avec des améliorations de performance et de nouvelles fonctionnalités.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Node.js", + "site": "https://sharkey.keyber.net/", + "github": "https://activitypub.software/TransFem-org/Sharkey", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2023 + }, + { + "id": "friendica", + "name": "Friendica", + "description": "Réseau social décentralisé avec interopérabilité étendue (ActivityPub, Diaspora*, RSS).", + "category": "social", + "protocols": [ + "ActivityPub", + "Diaspora* Protocol" + ], + "licence": "AGPL-3.0", + "language": "PHP", + "site": "https://friendi.ca/", + "github": "https://github.com/friendica/friendica", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2010, + "version": "2024.03" + }, + { + "id": "hubzilla", + "name": "Hubzilla", + "description": "Plateforme de communications décentralisées avec contrôle d'accès avancé et nomadisme d'identité.", + "category": "social", + "protocols": [ + "Zot", + "ActivityPub" + ], + "licence": "MIT", + "language": "PHP", + "site": "https://hubzilla.org/", + "github": "https://framagit.org/hubzilla/core", + "etat": "Actif", + "compatibiliteAP": "Partielle", + "createdYear": 2012 + }, + { + "id": "streams", + "name": "Streams", + "description": "Fork de Hubzilla axé sur la privacy et le contrôle granulaire des permissions.", + "category": "social", + "protocols": [ + "Nomad", + "ActivityPub" + ], + "licence": "MIT", + "language": "PHP", + "site": "https://codeberg.org/streams/streams", + "github": "https://codeberg.org/streams/streams", + "etat": "Actif", + "compatibiliteAP": "Partielle", + "createdYear": 2022 + }, + { + "id": "iceshrimp", + "name": "Iceshrimp", + "description": "Fork de Misskey optimisé pour la performance et la stabilité.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Node.js", + "site": "https://iceshrimp.dev/", + "github": "https://iceshrimp.dev/iceshrimp/iceshrimp", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2023 + }, + { + "id": "gnusocial", + "name": "GNU social", + "description": "Pionnier des réseaux sociaux fédérés. Précurseur historique du Fédiverse.", + "category": "social", + "protocols": [ + "ActivityPub", + "OStatus" + ], + "licence": "AGPL-3.0", + "language": "PHP", + "site": "https://www.gnu.io/social/", + "github": "https://codeberg.org/GNUsocial/gnu-social", + "etat": "Maintenance", + "compatibiliteAP": "Pleine", + "createdYear": 2010 + }, + { + "id": "bonfire", + "name": "Bonfire", + "description": "Réseau social modulaire écrit en Elixir axé sur la gouvernance communautaire.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Elixir", + "site": "https://bonfirenetworks.org/", + "github": "https://github.com/bonfire-networks/bonfire", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2020 + }, + { + "id": "microblogpub", + "name": "microblog.pub", + "description": "Serveur ActivityPub minimaliste et auto-hébergeable pour le microblogging.", + "category": "microblog", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Python", + "site": "https://docs.microblog.pub/", + "github": "https://github.com/tsileo/microblog.pub", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2018 + }, + { + "id": "pixelfed", + "name": "PixelFed", + "description": "Plateforme de partage de photos fédérée. Alternative à Instagram.", + "category": "photo", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "PHP", + "site": "https://pixelfed.org/", + "github": "https://github.com/pixelfed/pixelfed", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2018, + "version": "0.12" + }, + { + "id": "vernissage", + "name": "Vernissage", + "description": "Application de galerie photo fédérée pour le Fédiverse.", + "category": "photo", + "protocols": [ + "ActivityPub" + ], + "licence": "EUPL-1.2", + "language": "Swift", + "site": "https://vernissage.photos/", + "github": "https://github.com/VernissageApp/Vernissage", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2023 + }, + { + "id": "peertube", + "name": "PeerTube", + "description": "Plateforme vidéo fédérée décentralisée. Alternative à YouTube.", + "category": "video", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Node.js", + "site": "https://joinpeertube.org/", + "github": "https://github.com/Chocobozzz/PeerTube", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2015, + "version": "6.3" + }, + { + "id": "owncast", + "name": "Owncast", + "description": "Serveur de streaming live auto-hébergeable. Alternative à Twitch.", + "category": "video", + "protocols": [ + "ActivityPub", + "RSS" + ], + "licence": "MIT", + "language": "Go", + "site": "https://owncast.online/", + "github": "https://github.com/owncast/owncast", + "etat": "Actif", + "compatibiliteAP": "Extension", + "createdYear": 2020, + "version": "0.2" + }, + { + "id": "tube", + "name": "Tube (Framasoft)", + "description": "Ancien nom du projet ayant mené à PeerTube.", + "category": "video", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Node.js", + "site": "https://framatube.org/", + "github": "https://github.com/Chocobozzz/PeerTube", + "etat": "Historique", + "compatibiliteAP": "Pleine", + "createdYear": 2015 + }, + { + "id": "castopod", + "name": "Castopod", + "description": "Plateforme de podcasting fédérée avec ActivityPub. Alternative à Spotify/Apple Podcasts.", + "category": "audio", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "PHP", + "site": "https://castopod.org/", + "github": "https://codeberg.org/adaur/castopod", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2020, + "version": "1.12" + }, + { + "id": "funkwhale", + "name": "Funkwhale", + "description": "Plateforme musicale fédérée pour écouter et partager de la musique.", + "category": "audio", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Python", + "site": "https://funkwhale.audio/", + "github": "https://dev.funkwhale.audio/funkwhale/funkwhale", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2018, + "version": "1.4" + }, + { + "id": "loops", + "name": "Loops", + "description": "Plateforme de vidéos courtes fédérée. Alternative à TikTok/Instagram Reels.", + "category": "video", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "PHP", + "site": "https://loops.video/", + "github": "https://github.com/MozillaSocial/loops", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2024 + }, + { + "id": "ghost", + "name": "Ghost", + "description": "Plateforme de publication professionnelle avec support ActivityPub.", + "category": "blog", + "protocols": [ + "ActivityPub" + ], + "licence": "MIT", + "language": "Node.js", + "site": "https://ghost.org/", + "github": "https://github.com/TryGhost/Ghost", + "etat": "Actif", + "compatibiliteAP": "Extension", + "createdYear": 2013, + "version": "5.0+" + }, + { + "id": "writefreely", + "name": "WriteFreely", + "description": "Plateforme de blogging minimaliste et fédérée axée sur l'écriture.", + "category": "blog", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Go", + "site": "https://writefreely.org/", + "github": "https://github.com/writefreely/writefreely", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2018, + "version": "0.15" + }, + { + "id": "plume", + "name": "Plume", + "description": "Moteur de blog fédéré axé sur la collaboration et la publication longue.", + "category": "blog", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Rust", + "site": "https://joinplu.me/", + "github": "https://github.com/Plume-org/Plume", + "etat": "Maintenance", + "compatibiliteAP": "Pleine", + "createdYear": 2018 + }, + { + "id": "wordpress-ap", + "name": "WordPress + ActivityPub", + "description": "Plugin ActivityPub pour WordPress permettant de fédérer les publications.", + "category": "blog", + "protocols": [ + "ActivityPub" + ], + "licence": "MIT", + "language": "PHP", + "site": "https://activitypub.plugin.wordpress.com/", + "github": "https://github.com/Automattic/wordpress-activitypub", + "etat": "Actif", + "compatibiliteAP": "Extension", + "createdYear": 2019 + }, + { + "id": "drupal-ap", + "name": "Drupal + ActivityPub", + "description": "Module ActivityPub pour Drupal permettant la fédération des contenus.", + "category": "blog", + "protocols": [ + "ActivityPub" + ], + "licence": "GPL-2.0", + "language": "PHP", + "site": "https://www.drupal.org/project/activitypub", + "github": "https://git.drupalcode.org/project/activitypub", + "etat": "Actif", + "compatibiliteAP": "Extension", + "createdYear": 2023 + }, + { + "id": "lemmy", + "name": "Lemmy", + "description": "Agrégateur de liens et forum fédéré. Alternative à Reddit.", + "category": "forum", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Rust", + "site": "https://join-lemmy.org/", + "github": "https://github.com/LemmyNet/lemmy", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2019, + "version": "0.19" + }, + { + "id": "mbin", + "name": "Mbin", + "description": "Successeur de kbin, agrégateur de liens fédéré avec des fonctionnalités améliorées.", + "category": "forum", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "PHP", + "site": "https://mbin.org/", + "github": "https://github.com/MbinOrg/mbin", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2023 + }, + { + "id": "nodebb-ap", + "name": "NodeBB", + "description": "Forum moderne avec support ActivityPub pour la fédération.", + "category": "forum", + "protocols": [ + "ActivityPub" + ], + "licence": "GPL-3.0", + "language": "Node.js", + "site": "https://nodebb.org/", + "github": "https://github.com/NodeBB/NodeBB", + "etat": "Actif", + "compatibiliteAP": "Extension", + "createdYear": 2014 + }, + { + "id": "mobilizon", + "name": "Mobilizon", + "description": "Plateforme d\\événements fédérée pour organiser et découvrir des événements.", + "category": "events", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Elixir", + "site": "https://mobilizon.org/", + "github": "https://framagit.org/framasoft/mobilizon", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2019, + "version": "4.1" + }, + { + "id": "gancio", + "name": "Gancio", + "description": "Agrégateur d\\événements fédéré auto-hébergeable.", + "category": "events", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Node.js", + "site": "https://gancio.org/", + "github": "https://framagit.org/les/gancio", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2022 + }, + { + "id": "forgejo", + "name": "Forgejo", + "description": "Forge logicielle libre forkée de Gitea. Support ActivityPub en développement.", + "category": "dev", + "protocols": [ + "ActivityPub" + ], + "licence": "MIT", + "language": "Go", + "site": "https://forgejo.org/", + "github": "https://codeberg.org/forgejo/forgejo", + "etat": "Actif", + "compatibiliteAP": "En développement", + "createdYear": 2022 + }, + { + "id": "gitea-ap", + "name": "Gitea", + "description": "Forge logicielle légère et rapide avec support ActivityPub via plugin.", + "category": "dev", + "protocols": [ + "ActivityPub" + ], + "licence": "MIT", + "language": "Go", + "site": "https://gitea.com/", + "github": "https://github.com/go-gitea/gitea", + "etat": "Actif", + "compatibiliteAP": "Extension", + "createdYear": 2016 + }, + { + "id": "nextcloud", + "name": "Nextcloud", + "description": "Suite de collaboration cloud auto-hébergeable avec support ActivityPub.", + "category": "collab", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "PHP", + "site": "https://nextcloud.com/", + "github": "https://github.com/nextcloud/server", + "etat": "Actif", + "compatibiliteAP": "Extension", + "createdYear": 2016, + "version": "30" + }, + { + "id": "owncloud", + "name": "ownCloud", + "description": "Plateforme de partage de fichiers et de collaboration en ligne.", + "category": "collab", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "PHP", + "site": "https://owncloud.com/", + "github": "https://github.com/owncloud/core", + "etat": "Actif", + "compatibiliteAP": "Extension", + "createdYear": 2010 + }, + { + "id": "bookwyrm", + "name": "BookWyrm", + "description": "Réseau social de lecture fédéré. Alternative à Goodreads.", + "category": "books", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Python", + "site": "https://joinbookwyrm.com/", + "github": "https://github.com/bookwyrm-social/bookwyrm", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2020, + "version": "0.7" + }, + { + "id": "wikidata", + "name": "Wikidata", + "description": "Base de connaissances libre et collaborative structurée.", + "category": "wiki", + "protocols": [ + "ActivityPub" + ], + "licence": "CC0", + "language": "PHP", + "site": "https://www.wikidata.org/", + "github": "https://github.com/wikimedia/wikidata-query-rdf", + "etat": "Actif", + "compatibiliteAP": "Partielle", + "createdYear": 2012 + }, + { + "id": "diaspora-soft", + "name": "Diaspora*", + "description": "Réseau social décentralisé historique. Précurseur du Fédiverse moderne.", + "category": "social", + "protocols": [ + "Diaspora* Protocol" + ], + "licence": "AGPL-3.0", + "language": "Ruby", + "site": "https://diasporafoundation.org/", + "github": "https://github.com/diaspora/diaspora", + "etat": "Maintenance", + "compatibiliteAP": "Aucune", + "createdYear": 2010 + }, + { + "id": "matrix-element", + "name": "Element", + "description": "Client Matrix pour la messagerie temps réel fédérée.", + "category": "collab", + "protocols": [ + "Matrix Protocol" + ], + "licence": "Apache-2.0", + "language": "TypeScript", + "site": "https://element.io/", + "github": "https://github.com/element-hq/element-web", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2016 + }, + { + "id": "fedify", + "name": "Fedify", + "description": "Framework TypeScript/Deno pour construire des serveurs ActivityPub.", + "category": "dev", + "protocols": [ + "ActivityPub" + ], + "licence": "MIT", + "language": "TypeScript", + "site": "https://fedify.dev/", + "github": "https://github.com/dahlia/fedify", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2024 + }, + { + "id": "mitra", + "name": "Mitra", + "description": "Serveur ActivityPub écrit en Rust avec support des monnaies complémentaires.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Rust", + "site": "https://mitra.social/", + "github": "https://codeberg.org/silverpill/mitra", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2022 + }, + { + "id": "socialhome", + "name": "Socialhome", + "description": "Réseau social fédéré avec un flux de contenu personnalisable.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Python", + "site": "https://socialhome.network/", + "github": "https://github.com/jaywink/socialhome", + "etat": "Maintenance", + "compatibiliteAP": "Partielle", + "createdYear": 2016 + }, + { + "id": "kbin", + "name": "kbin", + "description": "Agrégateur de contenu fédéré. Prédécesseur de Mbin.", + "category": "forum", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "PHP", + "site": "https://kbin.pub/", + "github": "https://github.com/ernestws/kbin", + "etat": "Historique", + "compatibiliteAP": "Pleine", + "createdYear": 2023 + }, + { + "id": "epicyon", + "name": "Epicyon", + "description": "Serveur ActivityPub minimaliste avec approche low-tech. Conçu pour les petites instances communautaires.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Python", + "site": "https://epicyon.net/", + "github": "https://gitlab.com/bashrc2/epicyon", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2020 + }, + { + "id": "takahe", + "name": "Takahē", + "description": "Serveur ActivityPub multi-domaine moderne. Permet d'héberger plusieurs domaines sur une seule instance.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "BSD", + "language": "Python", + "site": "https://jointakahe.org/", + "github": "https://github.com/jointakahe/takahe", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2022 + }, + { + "id": "smithereen", + "name": "Smithereen", + "description": "Serveur ActivityPub axé sur les réseaux sociaux avec interface style VKontakte.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Java", + "site": "https://smithereen.software/", + "github": "https://github.com/grishka/Smithereen", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2021 + }, + { + "id": "kroeg", + "name": "Kroeg", + "description": "Serveur ActivityPub en Rust avec architecture modulaire et extensible.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "MIT", + "language": "Rust", + "site": "https://github.com/puckipedia/Kroeg", + "github": "https://github.com/puckipedia/Kroeg", + "etat": "Experimental", + "compatibiliteAP": "Pleine", + "createdYear": 2018 + }, + { + "id": "lotide", + "name": "Lotide", + "description": "Agrégateur de liens fédéré léger. Alternative minimaliste à Lemmy.", + "category": "forum", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Rust", + "site": "https://sr.ht/~vpzom/lotide/", + "github": "https://git.sr.ht/~vpzom/lotide", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2020 + }, + { + "id": "sublinks", + "name": "Sublinks", + "description": "Plateforme de forums fédérée. Fork moderne de Lemmy avec des améliorations significatives.", + "category": "forum", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Rust", + "site": "https://sublinks.org/", + "github": "https://github.com/sublinks/sublinks", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2024 + }, + { + "id": "roadhouse", + "name": "RoadHouse", + "description": "Plateforme de forums fédérée avec une approche communautaire différente.", + "category": "forum", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Rust", + "site": "https://github.com/LemmyNet/lemmy", + "github": "https://github.com/LemmyNet/lemmy", + "etat": "Experimental", + "compatibiliteAP": "Pleine", + "createdYear": 2024 + }, + { + "id": "pieoneers", + "name": "Pieoneers", + "description": "Plateforme de partage de recettes fédérée avec ActivityPub.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "MIT", + "language": "Python", + "site": "https://git.sr.ht/~ Associazione/pieoneers", + "github": "https://git.sr.ht/~ Associazione/pieoneers", + "etat": "Experimental", + "compatibiliteAP": "Pleine", + "createdYear": 2023 + }, + { + "id": "wordpress-mu-ap", + "name": "WordPress MU + ActivityPub", + "description": "Plugin ActivityPub pour WordPress Multisite. Permet de fédérer des réseaux de blogs.", + "category": "blog", + "protocols": [ + "ActivityPub" + ], + "licence": "MIT", + "language": "PHP", + "site": "https://activitypub.plugin.wordpress.com/", + "github": "https://github.com/Automattic/wordpress-activitypub", + "etat": "Actif", + "compatibiliteAP": "Extension", + "createdYear": 2023 + }, + { + "id": "emissary", + "name": "Emissary", + "description": "Serveur ActivityPub modulaire avec support de streams et de collections.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "MIT", + "language": "Go", + "site": "https://github.com/EmissarySocial/emissary", + "github": "https://github.com/EmissarySocial/emissary", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2022 + }, + { + "id": "hometown", + "name": "Hometown", + "description": "Fork de Mastodon avec des fonctionnalités communautaires additionnelles.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Ruby", + "site": "https://github.com/hometown-fork/hometown", + "github": "https://github.com/hometown-fork/hometown", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2019 + }, + { + "id": " glitchsoc", + "name": "GlitchSoc", + "description": "Fork de Mastodon avec des fonctionnalités expérimentales et une customisation poussée.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Ruby", + "site": "https://glitch-soc.github.io/docs/", + "github": "https://github.com/glitch-soc/mastodon", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2017 + }, + { + "id": "akkoma-fe", + "name": "Akkoma-FE", + "description": "Frontend alternatif pour Akkoma avec des améliorations UI/UX.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Vue.js", + "site": "https://akkoma.social/", + "github": "https://akkoma.dev/AkkomaGang/akkoma-fe", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2022 + }, + { + "id": "postmarks", + "name": "Postmarks", + "description": "Système de bookmarks/bookmarques fédéré avec ActivityPub. Partagez vos signets.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "MIT", + "language": "JavaScript", + "site": "https://postmarks.glitch.me/", + "github": "https://github.com/ckolderup/postmarks", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2023 + }, + { + "id": "aoderelay", + "name": "AodeRelay", + "description": "Relay ActivityPub pour connecter des instances et améliorer la découverte.", + "category": "dev", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Rust", + "site": "https://github.com/Byron/gitoxide", + "github": "https://github.com/asonix/activitypub-relay", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2020 + }, + { + "id": "coracle", + "name": "Coracle", + "description": "Client web Nostr haut de gamme avec une interface soignée et des performances optimisées.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "TypeScript", + "site": "https://coracle.social/", + "github": "https://github.com/coracle-social/coracle", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "nostrudel", + "name": "Nostrudel", + "description": "Client web Nostr avec UX moderne et support avancé des relays.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "TypeScript", + "site": "https://nostrudel.ninja/", + "github": "https://github.com/hzrd149/nostrudel", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "lume", + "name": "Lume", + "description": "Client desktop Nostr rapide et léger.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "GPL-3.0", + "language": "Rust", + "site": "https://lume.nu/", + "github": "https://github.com/lumehq/lume", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "gossip", + "name": "Gossip", + "description": "Client desktop Nostr en Rust avec interface native rapide.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "Rust", + "site": "https://github.com/mikedilger/gossip", + "github": "https://github.com/mikedilger/gossip", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "current", + "name": "Current", + "description": "Client iOS Nostr avec une interface épurée et moderne.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "Swift", + "site": "https://getcurrent.io/", + "github": "https://github.com/current/nostr", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "plebstr", + "name": "Plebstr", + "description": "Client mobile Nostr pour iOS et Android.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "TypeScript", + "site": "https://plebstr.com/", + "github": "https://github.com/verbiricha/plebstr", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "nostrples", + "name": "Nostrpels", + "description": "Client Nostr avec support de médias riches et expérience sociale améliorée.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "TypeScript", + "site": "https://nostrpels.com/", + "github": "https://github.com/nostrpels/nostrpels", + "etat": "Experimental", + "compatibiliteAP": "Aucune", + "createdYear": 2024 + }, + { + "id": "zapstream", + "name": "ZapStream", + "description": "Plateforme de streaming live sur Nostr avec Lightning Zaps intégrés.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "TypeScript", + "site": "https://zapstream.live/", + "github": "https://github.com/v0l/zapstream", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "nostrcheck", + "name": "NostrCheck.me", + "description": "Service de vérification d'identité et de badges pour Nostr.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "TypeScript", + "site": "https://nostrcheck.me/", + "github": "https://github.com/quentintaranpino/nostrcheck-api-ts", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "nostrmarket", + "name": "NostrMarket", + "description": "Place de marché décentralisée sur Nostr. Commerce P2P avec Lightning.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "TypeScript", + "site": "https://github.com/lnbits/nostrmarket", + "github": "https://github.com/lnbits/nostrmarket", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "prosody", + "name": "Prosody", + "description": "Serveur XMPP moderne, léger et facile à configurer.", + "category": "messaging", + "protocols": [ + "XMPP" + ], + "licence": "MIT", + "language": "Lua", + "site": "https://prosody.im/", + "github": "https://github.com/bjc/prosody", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2008, + "version": "0.12" + }, + { + "id": "ejabberd", + "name": "ejabberd", + "description": "Serveur XMPP robuste et scalable utilisé par de grandes plateformes.", + "category": "messaging", + "protocols": [ + "XMPP" + ], + "licence": "GPL-2.0", + "language": "Erlang", + "site": "https://www.ejabberd.im/", + "github": "https://github.com/processone/ejabberd", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2002, + "version": "24.02" + }, + { + "id": "openfire", + "name": "Openfire", + "description": "Serveur XMPP en Java avec interface d'administration web.", + "category": "messaging", + "protocols": [ + "XMPP" + ], + "licence": "Apache-2.0", + "language": "Java", + "site": "https://www.igniterealtime.org/projects/openfire/", + "github": "https://github.com/igniterealtime/Openfire", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2002, + "version": "4.8" + }, + { + "id": "tigase", + "name": "Tigase", + "description": "Serveur XMPP en Java avec support avancé de clustering.", + "category": "messaging", + "protocols": [ + "XMPP" + ], + "licence": "AGPL-3.0", + "language": "Java", + "site": "https://tigase.net/", + "github": "https://github.com/tigase/tigase-server", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2004 + }, + { + "id": "conversations", + "name": "Conversations", + "description": "Client XMPP Android moderne. Référence du messaging mobile décentralisé.", + "category": "messaging", + "protocols": [ + "XMPP" + ], + "licence": "GPL-3.0", + "language": "Java", + "site": "https://conversations.im/", + "github": "https://github.com/iNPUTmice/Conversations", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2014 + }, + { + "id": "dino", + "name": "Dino", + "description": "Client XMPP desktop moderne pour Linux. Interface épurée et moderne.", + "category": "messaging", + "protocols": [ + "XMPP" + ], + "licence": "GPL-3.0", + "language": "Vala", + "site": "https://dino.im/", + "github": "https://github.com/dino/dino", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2017 + }, + { + "id": "gajim", + "name": "Gajim", + "description": "Client XMPP desktop complet. Le client de référence historique.", + "category": "messaging", + "protocols": [ + "XMPP" + ], + "licence": "GPL-3.0", + "language": "Python", + "site": "https://gajim.org/", + "github": "https://dev.gajim.org/gajim/gajim", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2004 + }, + { + "id": "monal", + "name": "Monal", + "description": "Client XMPP pour iOS et macOS. Le meilleur client Apple pour XMPP.", + "category": "messaging", + "protocols": [ + "XMPP" + ], + "licence": "BSD", + "language": "Swift", + "site": "https://monal-im.org/", + "github": "https://github.com/monal-im/Monal", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2010 + }, + { + "id": "snikket", + "name": "Snikket", + "description": "'Le Mastodon du XMPP' — bundle serveur + client qui simplifie XMPP pour le grand public.", + "category": "messaging", + "protocols": [ + "XMPP" + ], + "licence": "AGPL-3.0", + "language": "Lua", + "site": "https://snikket.org/", + "github": "https://github.com/snikket-im/snikket-server", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2020 + }, + { + "id": "movim", + "name": "Movim", + "description": "Réseau social basé sur XMPP. Interface web moderne avec microblogging.", + "category": "messaging", + "protocols": [ + "XMPP" + ], + "licence": "AGPL-3.0", + "language": "PHP", + "site": "https://movim.eu/", + "github": "https://github.com/movim/movim", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2009 + }, + { + "id": "jabber", + "name": "Jabber", + "description": "Le protocole historique de messagerie instantanée. Ancêtre de XMPP, toujours utilisé.", + "category": "messaging", + "protocols": [ + "XMPP" + ], + "licence": "Open Standard", + "language": "Protocol", + "site": "https://www.jabber.org/", + "github": "https://www.jabber.org/", + "etat": "Historique", + "compatibiliteAP": "Aucune", + "createdYear": 1999 + }, + { + "id": "bluesky", + "name": "Bluesky", + "description": "Le réseau social décentralisé basé sur AT Protocol. Créé par l'ancienne équipe de Twitter.", + "category": "social", + "protocols": [ + "AT Protocol" + ], + "licence": "Proprietary", + "language": "TypeScript", + "site": "https://bsky.app/", + "github": "https://github.com/bluesky-social/social-app", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "graysky", + "name": "Graysky", + "description": "Client alternatif pour Bluesky/AT Protocol. iOS et Android.", + "category": "social", + "protocols": [ + "AT Protocol" + ], + "licence": "MIT", + "language": "TypeScript", + "site": "https://graysky.app/", + "github": "https://github.com/mozzius/graysky", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "tokimeki", + "name": "Tokimeki", + "description": "Client web alternatif pour Bluesky avec approche japonaise.", + "category": "social", + "protocols": [ + "AT Protocol" + ], + "licence": "MIT", + "language": "TypeScript", + "site": "https://tokimeki.blue/", + "github": "https://github.com/spuithori/tokimeki", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "briar", + "name": "Briar", + "description": "Messagerie P2P via Bluetooth/WiFi/Tor. Fonctionne sans connexion Internet.", + "category": "messaging", + "protocols": [ + "Briar Protocol" + ], + "licence": "GPL-3.0", + "language": "Java", + "site": "https://briarproject.org/", + "github": "https://code.briarproject.org/briar/briar", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2018 + }, + { + "id": "jami", + "name": "Jami", + "description": "Communication décentralisée GNU. Messages, appels vidéo, partage d'écran — tout en P2P.", + "category": "messaging", + "protocols": [ + "SIP", + "DHT" + ], + "licence": "GPL-3.0", + "language": "C++", + "site": "https://jami.net/", + "github": "https://git.jami.net/savoirfairelinux/ring-project", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2015 + }, + { + "id": "cryptpad", + "name": "CryptPad", + "description": "Suite bureautique chiffrée de bout en bout. Documents, tableurs, présentations, votes.", + "category": "collab", + "protocols": [ + "CryptPad Protocol" + ], + "licence": "AGPL-3.0", + "language": "JavaScript", + "site": "https://cryptpad.fr/", + "github": "https://github.com/cryptpad/cryptpad", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2016, + "version": "5.3" + }, + { + "id": "hedgedoc", + "name": "HedgeDoc", + "description": "Édition collaborative de Markdown en temps réel.", + "category": "collab", + "protocols": [ + "WebSocket" + ], + "licence": "AGPL-3.0", + "language": "TypeScript", + "site": "https://hedgedoc.org/", + "github": "https://github.com/hedgedoc/hedgedoc", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2016, + "version": "2.0" + }, + { + "id": "immich", + "name": "Immich", + "description": "Auto-hébergement de photos et vidéos avec IA. Alternative à Google Photos.", + "category": "collab", + "protocols": [ + "REST API" + ], + "licence": "AGPL-3.0", + "language": "TypeScript", + "site": "https://immich.app/", + "github": "https://github.com/immich-app/immich", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2022 + }, + { + "id": "photoprism", + "name": "PhotoPrism", + "description": "Gestion de photos auto-hébergée avec IA. Reconnaissance faciale et classement automatique.", + "category": "collab", + "protocols": [ + "REST API" + ], + "licence": "AGPL-3.0", + "language": "Go", + "site": "https://www.photoprism.app/", + "github": "https://github.com/photoprism/photoprism", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2018 + }, + { + "id": "synapse", + "name": "Synapse", + "description": "Serveur Matrix de référence par Element. Le serveur le plus utilisé de l'écosystème Matrix.", + "category": "collab", + "protocols": [ + "Matrix Protocol" + ], + "licence": "Apache-2.0", + "language": "Python", + "site": "https://matrix-org.github.io/synapse/", + "github": "https://github.com/element-hq/synapse", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2014 + }, + { + "id": "dendrite", + "name": "Dendrite", + "description": "Serveur Matrix de deuxième génération par Element. Plus léger et performant que Synapse.", + "category": "collab", + "protocols": [ + "Matrix Protocol" + ], + "licence": "Apache-2.0", + "language": "Go", + "site": "https://matrix-org.github.io/dendrite/", + "github": "https://github.com/element-hq/dendrite", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2017 + }, + { + "id": "conduit", + "name": "Conduit", + "description": "Serveur Matrix léger en Rust. Alternative rapide et efficace à Synapse.", + "category": "collab", + "protocols": [ + "Matrix Protocol" + ], + "licence": "Apache-2.0", + "language": "Rust", + "site": "https://conduit.rs/", + "github": "https://gitlab.com/famedly/conduit", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2020 + }, + { + "id": "cinny", + "name": "Cinny", + "description": "Client web Matrix avec interface moderne et intuitive. Alternative à Element.", + "category": "collab", + "protocols": [ + "Matrix Protocol" + ], + "licence": "MIT", + "language": "JavaScript", + "site": "https://cinny.in/", + "github": "https://github.com/cinnyapp/cinny", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2021 + }, + { + "id": "fluffychat", + "name": "FluffyChat", + "description": "Client Matrix pour mobile et desktop. Interface douce et accessible.", + "category": "collab", + "protocols": [ + "Matrix Protocol" + ], + "licence": "AGPL-3.0", + "language": "Dart/Flutter", + "site": "https://fluffychat.im/", + "github": "https://github.com/krille-chan/fluffychat", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2019 + }, + { + "id": "fedibridge", + "name": "FediBridge", + "description": "Outil de bridge entre différents réseaux fédérés. Interconnexion multi-protocoles.", + "category": "dev", + "protocols": [ + "ActivityPub", + "XMPP", + "Matrix" + ], + "licence": "MIT", + "language": "Python", + "site": "https://github.com/fediverse/fedibridge", + "github": "https://github.com/fediverse/fedibridge", + "etat": "Experimental", + "compatibiliteAP": "Pleine", + "createdYear": 2023 + }, + { + "id": "activitypub-relay", + "name": "ActivityPub Relay", + "description": "Relay public pour connecter des instances ActivityPub et améliorer la fédération.", + "category": "dev", + "protocols": [ + "ActivityPub" + ], + "licence": "MIT", + "language": "Go", + "site": "https://github.com/yukimochi/ActivityPub-Relay", + "github": "https://github.com/yukimochi/ActivityPub-Relay", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2018 + }, + { + "id": "sepiasearch", + "name": "Sepia Search", + "description": "Moteur de recherche fédéré pour PeerTube. Recherche cross-instance.", + "category": "video", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "TypeScript", + "site": "https://sepiasearch.org/", + "github": "https://github.com/framasoft/peertube-plugin-sepiasearch", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2020 + }, + { + "id": "simplexchat", + "name": "SimpleX Chat", + "description": "Messagerie décentralisée de nouvelle génération sans identifiants d'utilisateur. Protection de la vie privée par défaut avec chiffrement de bout en bout.", + "category": "messaging", + "protocols": [ + "SimpleX Messaging Protocol" + ], + "licence": "AGPL-3.0", + "language": "Haskell", + "site": "https://simplex.chat/", + "github": "https://github.com/simplex-chat/simplex-chat", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2020, + "version": "6.0" + }, + { + "id": "nostr-protocol", + "name": "Nostr Protocol", + "description": "Protocole simple et ouvert pour créer des réseaux sociaux résistants à la censure, basé sur des relays et des clés cryptographiques.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "Public Domain", + "language": "Specification", + "site": "https://nostr.com/", + "github": "https://github.com/nostr-protocol/nips", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2019 + }, + { + "id": "damus", + "name": "Damus", + "description": "Client iOS pour Nostr. Le client mobile le plus populaire de l'écosystème Nostr.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "GPL-3.0", + "language": "Swift", + "site": "https://damus.io/", + "github": "https://github.com/damus-io/damus", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2022 + }, + { + "id": "amethyst", + "name": "Amethyst", + "description": "Client Android pour Nostr. Application native Kotlin avec support complet des NIPs.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "Kotlin", + "site": "https://github.com/vitorpamplona/amethyst", + "github": "https://github.com/vitorpamplona/amethyst", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "iris", + "name": "Iris", + "description": "Client web pour Nostr. Interface moderne et réactive pour le réseau Nostr.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "TypeScript", + "site": "https://iris.to/", + "github": "https://github.com/irislib/iris-messenger", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2022 + }, + { + "id": "primal", + "name": "Primal", + "description": "Client Nostr avec un backend optimisé pour des performances ultra-rapides.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "Proprietary", + "language": "TypeScript", + "site": "https://primal.net/", + "github": "https://github.com/PrimalHQ", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "habla", + "name": "Habla.news", + "description": "Plateforme de publication longue sur Nostr. Alternative à Medium.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "TypeScript", + "site": "https://habla.news/", + "github": "https://github.com/verbiricha/habla.news", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "nostrgram", + "name": "Nostr.band", + "description": "Moteur de recherche et explorateur pour le réseau Nostr.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "JavaScript", + "site": "https://nostr.band/", + "github": "https://github.com/dtonon/nostr-band", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "snort", + "name": "Snort", + "description": "Client web Nostr rapide et léger avec support des relays multiples.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "TypeScript", + "site": "https://snort.social/", + "github": "https://github.com/v0l/snort", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + } + ], + "protocols": [ + { + "id": "activitypub", + "name": "ActivityPub", + "description": "Protocole de réseautage social décentralisé recommandé par le W3C. Le standard principal du Fédiverse.", + "type": "fediverse", + "statut": "Actif", + "site": "https://activitypub.rocks/", + "rfc": "W3C Recommendation" + }, + { + "id": "activitystreams", + "name": "ActivityStreams 2.0", + "description": "Format de données pour décrire les activités sociales. Base sur laquelle repose ActivityPub.", + "type": "fediverse", + "statut": "Actif", + "rfc": "W3C Recommendation" + }, + { + "id": "webfinger", + "name": "WebFinger", + "description": "Protocole de découverte d'informations sur les ressources identifiées par des URI web.", + "type": "fediverse", + "statut": "Actif", + "rfc": "RFC 7033" + }, + { + "id": "httpsignatures", + "name": "HTTP Signatures", + "description": "Mécanisme de signature des requêtes HTTP pour l'authentification entre instances.", + "type": "fediverse", + "statut": "Actif", + "rfc": "IETF Draft" + }, + { + "id": "nodeinfo", + "name": "NodeInfo", + "description": "Schéma de métadonnées pour décrire les instances fédérées et leurs capacités.", + "type": "fediverse", + "statut": "Actif", + "rfc": "nodeinfo.diaspora.software" + }, + { + "id": "zot", + "name": "Zot / Nomad", + "description": "Protocole de communications décentralisées avec prise en charge avancée de la privacy et du nomadisme d'identité.", + "type": "connexe", + "statut": "Actif", + "site": "https://zotlabs.org/" + }, + { + "id": "diaspora", + "name": "Diaspora* Protocol", + "description": "Protocole historique du réseau Diaspora*, précurseur du Fédiverse moderne.", + "type": "connexe", + "statut": "Historique" + }, + { + "id": "ostatus", + "name": "OStatus", + "description": "Suite de protocoles (Atom, Salmon, WebSub) utilisée par les premières plateformes fédérées.", + "type": "connexe", + "statut": "Historique" + }, + { + "id": "matrix", + "name": "Matrix Protocol", + "description": "Protocole ouvert pour la communication temps réel (chat, VoIP). Interopère avec ActivityPub.", + "type": "connexe", + "statut": "Actif", + "site": "https://matrix.org/" + }, + { + "id": "xmpp", + "name": "XMPP", + "description": "Extensible Messaging and Presence Protocol. Standard historique de messagerie instantanée.", + "type": "connexe", + "statut": "Actif", + "rfc": "RFC 6120" + }, + { + "id": "atproto", + "name": "AT Protocol", + "description": "Protocole d'identité décentralisé utilisé par Bluesky. Écosystème voisin mais distinct du Fédiverse.", + "type": "voisin", + "statut": "En développement", + "site": "https://atproto.com/" + }, + { + "id": "nostr", + "name": "Nostr", + "description": "Protocole simple et ouvert pour créer des réseaux sociaux résistants à la censure.", + "type": "voisin", + "statut": "En développement", + "site": "https://nostr.com/" + } + ], + "categories": [ + { + "id": "social", + "name": "Réseaux sociaux", + "icon": "Users", + "color": "#4CC9F0", + "description": "Plateformes sociales fédérées" + }, + { + "id": "microblog", + "name": "Microblogging", + "icon": "MessageSquare", + "color": "#F9C74F", + "description": "Micro-blogs et status updates" + }, + { + "id": "photo", + "name": "Photographie", + "icon": "Camera", + "color": "#F8961E", + "description": "Partage de photos et images" + }, + { + "id": "video", + "name": "Vidéo", + "icon": "Video", + "color": "#F72585", + "description": "Streaming et partage vidéo" + }, + { + "id": "audio", + "name": "Audio & Podcast", + "icon": "Headphones", + "color": "#B5179E", + "description": "Musique, podcasts et audio" + }, + { + "id": "blog", + "name": "Blogs", + "icon": "FileText", + "color": "#7209B7", + "description": "Plateformes de blogging" + }, + { + "id": "forum", + "name": "Forums", + "icon": "MessageCircle", + "color": "#3A0CA3", + "description": "Forums et agrégateurs" + }, + { + "id": "events", + "name": "Événements", + "icon": "Calendar", + "color": "#4361EE", + "description": "Gestion d'événements" + }, + { + "id": "dev", + "name": "Développement", + "icon": "Code", + "color": "#4CC9F0", + "description": "Forge et développement logiciel" + }, + { + "id": "collab", + "name": "Collaboration", + "icon": "FolderOpen", + "color": "#2EC4B6", + "description": "Outils collaboratifs et cloud" + }, + { + "id": "books", + "name": "Livres", + "icon": "BookOpen", + "color": "#E71D36", + "description": "Lecture et partage de livres" + }, + { + "id": "wiki", + "name": "Wiki", + "icon": "Globe", + "color": "#662E9B", + "description": "Encyclopédies collaboratives" + }, + { + "id": "messaging", + "name": "Messagerie", + "icon": "Send", + "color": "#06D6A0", + "description": "Messagerie instantanée privée et sécurisée" + }, + { + "id": "nostr", + "name": "Nostr", + "icon": "Zap", + "color": "#F7931A", + "description": "Écosystème Nostr — protocole voisin" + } + ], + "network": { + "nodes": [ + { + "id": "Mastodon", + "group": 1, + "val": 8, + "description": "Le réseau social fédéré le plus populaire. Microblogging avec une audience mondiale.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "GoToSocial", + "group": 1, + "val": 8, + "description": "Serveur ActivityPub léger et rapide écrit en Go. Approche minimaliste et efficace.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Akkoma", + "group": 1, + "val": 8, + "description": "Fork de Pleroma avec des fonctionnalités enrichies et une personnalisation avancée.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Pleroma", + "group": 1, + "val": 8, + "description": "Serveur ActivityPub léger et hautement configurable. Alternative rapide à Mastodon.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Misskey", + "group": 1, + "val": 8, + "description": "Plateforme sociale japonaise avec des fonctionnalités créatives (notes, réactions, drive).", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Sharkey", + "group": 1, + "val": 8, + "description": "Fork de Misskey avec des améliorations de performance et de nouvelles fonctionnalités.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Friendica", + "group": 1, + "val": 8, + "description": "Réseau social décentralisé avec interopérabilité étendue (ActivityPub, Diaspora*, RSS).", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Hubzilla", + "group": 1, + "val": 8, + "description": "Plateforme de communications décentralisées avec contrôle d'accès avancé et nomadisme d'identité.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Partielle", + "licence": "MIT" + }, + { + "id": "Streams", + "group": 1, + "val": 8, + "description": "Fork de Hubzilla axé sur la privacy et le contrôle granulaire des permissions.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Partielle", + "licence": "MIT" + }, + { + "id": "Iceshrimp", + "group": 1, + "val": 8, + "description": "Fork de Misskey optimisé pour la performance et la stabilité.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "GNU social", + "group": 1, + "val": 5, + "description": "Pionnier des réseaux sociaux fédérés. Précurseur historique du Fédiverse.", + "category": "social", + "color": "#4CC9F0", + "etat": "Maintenance", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Bonfire", + "group": 1, + "val": 8, + "description": "Réseau social modulaire écrit en Elixir axé sur la gouvernance communautaire.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "microblog.pub", + "group": 2, + "val": 8, + "description": "Serveur ActivityPub minimaliste et auto-hébergeable pour le microblogging.", + "category": "microblog", + "color": "#F9C74F", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "PixelFed", + "group": 3, + "val": 8, + "description": "Plateforme de partage de photos fédérée. Alternative à Instagram.", + "category": "photo", + "color": "#F8961E", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Vernissage", + "group": 3, + "val": 8, + "description": "Application de galerie photo fédérée pour le Fédiverse.", + "category": "photo", + "color": "#F8961E", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "EUPL-1.2" + }, + { + "id": "PeerTube", + "group": 4, + "val": 8, + "description": "Plateforme vidéo fédérée décentralisée. Alternative à YouTube.", + "category": "video", + "color": "#F72585", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Owncast", + "group": 4, + "val": 8, + "description": "Serveur de streaming live auto-hébergeable. Alternative à Twitch.", + "category": "video", + "color": "#F72585", + "etat": "Actif", + "compatibiliteAP": "Extension", + "licence": "MIT" + }, + { + "id": "Tube (Framasoft)", + "group": 4, + "val": 3, + "description": "Ancien nom du projet ayant mené à PeerTube.", + "category": "video", + "color": "#F72585", + "etat": "Historique", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Castopod", + "group": 5, + "val": 8, + "description": "Plateforme de podcasting fédérée avec ActivityPub. Alternative à Spotify/Apple Podcasts.", + "category": "audio", + "color": "#B5179E", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Funkwhale", + "group": 5, + "val": 8, + "description": "Plateforme musicale fédérée pour écouter et partager de la musique.", + "category": "audio", + "color": "#B5179E", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Loops", + "group": 4, + "val": 8, + "description": "Plateforme de vidéos courtes fédérée. Alternative à TikTok/Instagram Reels.", + "category": "video", + "color": "#F72585", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Ghost", + "group": 6, + "val": 8, + "description": "Plateforme de publication professionnelle avec support ActivityPub.", + "category": "blog", + "color": "#7209B7", + "etat": "Actif", + "compatibiliteAP": "Extension", + "licence": "MIT" + }, + { + "id": "WriteFreely", + "group": 6, + "val": 8, + "description": "Plateforme de blogging minimaliste et fédérée axée sur l'écriture.", + "category": "blog", + "color": "#7209B7", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Plume", + "group": 6, + "val": 5, + "description": "Moteur de blog fédéré axé sur la collaboration et la publication longue.", + "category": "blog", + "color": "#7209B7", + "etat": "Maintenance", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "WordPress + ActivityPub", + "group": 6, + "val": 8, + "description": "Plugin ActivityPub pour WordPress permettant de fédérer les publications.", + "category": "blog", + "color": "#7209B7", + "etat": "Actif", + "compatibiliteAP": "Extension", + "licence": "MIT" + }, + { + "id": "Drupal + ActivityPub", + "group": 6, + "val": 8, + "description": "Module ActivityPub pour Drupal permettant la fédération des contenus.", + "category": "blog", + "color": "#7209B7", + "etat": "Actif", + "compatibiliteAP": "Extension", + "licence": "GPL-2.0" + }, + { + "id": "Lemmy", + "group": 7, + "val": 8, + "description": "Agrégateur de liens et forum fédéré. Alternative à Reddit.", + "category": "forum", + "color": "#3A0CA3", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Mbin", + "group": 7, + "val": 8, + "description": "Successeur de kbin, agrégateur de liens fédéré avec des fonctionnalités améliorées.", + "category": "forum", + "color": "#3A0CA3", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "NodeBB", + "group": 7, + "val": 8, + "description": "Forum moderne avec support ActivityPub pour la fédération.", + "category": "forum", + "color": "#3A0CA3", + "etat": "Actif", + "compatibiliteAP": "Extension", + "licence": "GPL-3.0" + }, + { + "id": "Mobilizon", + "group": 8, + "val": 8, + "description": "Plateforme d\\événements fédérée pour organiser et découvrir des événements.", + "category": "events", + "color": "#4361EE", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Gancio", + "group": 8, + "val": 8, + "description": "Agrégateur d\\événements fédéré auto-hébergeable.", + "category": "events", + "color": "#4361EE", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Forgejo", + "group": 9, + "val": 8, + "description": "Forge logicielle libre forkée de Gitea. Support ActivityPub en développement.", + "category": "dev", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "En développement", + "licence": "MIT" + }, + { + "id": "Gitea", + "group": 9, + "val": 8, + "description": "Forge logicielle légère et rapide avec support ActivityPub via plugin.", + "category": "dev", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Extension", + "licence": "MIT" + }, + { + "id": "Nextcloud", + "group": 10, + "val": 8, + "description": "Suite de collaboration cloud auto-hébergeable avec support ActivityPub.", + "category": "collab", + "color": "#2EC4B6", + "etat": "Actif", + "compatibiliteAP": "Extension", + "licence": "AGPL-3.0" + }, + { + "id": "ownCloud", + "group": 10, + "val": 8, + "description": "Plateforme de partage de fichiers et de collaboration en ligne.", + "category": "collab", + "color": "#2EC4B6", + "etat": "Actif", + "compatibiliteAP": "Extension", + "licence": "AGPL-3.0" + }, + { + "id": "BookWyrm", + "group": 11, + "val": 8, + "description": "Réseau social de lecture fédéré. Alternative à Goodreads.", + "category": "books", + "color": "#E71D36", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Wikidata", + "group": 12, + "val": 8, + "description": "Base de connaissances libre et collaborative structurée.", + "category": "wiki", + "color": "#662E9B", + "etat": "Actif", + "compatibiliteAP": "Partielle", + "licence": "CC0" + }, + { + "id": "Diaspora*", + "group": 1, + "val": 5, + "description": "Réseau social décentralisé historique. Précurseur du Fédiverse moderne.", + "category": "social", + "color": "#4CC9F0", + "etat": "Maintenance", + "compatibiliteAP": "Aucune", + "licence": "AGPL-3.0" + }, + { + "id": "Element", + "group": 10, + "val": 8, + "description": "Client Matrix pour la messagerie temps réel fédérée.", + "category": "collab", + "color": "#2EC4B6", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "Apache-2.0" + }, + { + "id": "Fedify", + "group": 9, + "val": 8, + "description": "Framework TypeScript/Deno pour construire des serveurs ActivityPub.", + "category": "dev", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "MIT" + }, + { + "id": "Mitra", + "group": 1, + "val": 8, + "description": "Serveur ActivityPub écrit en Rust avec support des monnaies complémentaires.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Socialhome", + "group": 1, + "val": 5, + "description": "Réseau social fédéré avec un flux de contenu personnalisable.", + "category": "social", + "color": "#4CC9F0", + "etat": "Maintenance", + "compatibiliteAP": "Partielle", + "licence": "AGPL-3.0" + }, + { + "id": "kbin", + "group": 7, + "val": 3, + "description": "Agrégateur de contenu fédéré. Prédécesseur de Mbin.", + "category": "forum", + "color": "#3A0CA3", + "etat": "Historique", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Epicyon", + "group": 1, + "val": 8, + "description": "Serveur ActivityPub minimaliste avec approche low-tech. Conçu pour les petites instances communautaires.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Takahē", + "group": 1, + "val": 8, + "description": "Serveur ActivityPub multi-domaine moderne. Permet d'héberger plusieurs domaines sur une seule instance.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "BSD" + }, + { + "id": "Smithereen", + "group": 1, + "val": 8, + "description": "Serveur ActivityPub axé sur les réseaux sociaux avec interface style VKontakte.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Kroeg", + "group": 1, + "val": 3, + "description": "Serveur ActivityPub en Rust avec architecture modulaire et extensible.", + "category": "social", + "color": "#4CC9F0", + "etat": "Experimental", + "compatibiliteAP": "Pleine", + "licence": "MIT" + }, + { + "id": "Lotide", + "group": 7, + "val": 8, + "description": "Agrégateur de liens fédéré léger. Alternative minimaliste à Lemmy.", + "category": "forum", + "color": "#3A0CA3", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Sublinks", + "group": 7, + "val": 8, + "description": "Plateforme de forums fédérée. Fork moderne de Lemmy avec des améliorations significatives.", + "category": "forum", + "color": "#3A0CA3", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "RoadHouse", + "group": 7, + "val": 3, + "description": "Plateforme de forums fédérée avec une approche communautaire différente.", + "category": "forum", + "color": "#3A0CA3", + "etat": "Experimental", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Pieoneers", + "group": 1, + "val": 3, + "description": "Plateforme de partage de recettes fédérée avec ActivityPub.", + "category": "social", + "color": "#4CC9F0", + "etat": "Experimental", + "compatibiliteAP": "Pleine", + "licence": "MIT" + }, + { + "id": "WordPress MU + ActivityPub", + "group": 6, + "val": 8, + "description": "Plugin ActivityPub pour WordPress Multisite. Permet de fédérer des réseaux de blogs.", + "category": "blog", + "color": "#7209B7", + "etat": "Actif", + "compatibiliteAP": "Extension", + "licence": "MIT" + }, + { + "id": "Emissary", + "group": 1, + "val": 8, + "description": "Serveur ActivityPub modulaire avec support de streams et de collections.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "MIT" + }, + { + "id": "Hometown", + "group": 1, + "val": 8, + "description": "Fork de Mastodon avec des fonctionnalités communautaires additionnelles.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "GlitchSoc", + "group": 1, + "val": 8, + "description": "Fork de Mastodon avec des fonctionnalités expérimentales et une customisation poussée.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Akkoma-FE", + "group": 1, + "val": 8, + "description": "Frontend alternatif pour Akkoma avec des améliorations UI/UX.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Postmarks", + "group": 1, + "val": 8, + "description": "Système de bookmarks/bookmarques fédéré avec ActivityPub. Partagez vos signets.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "MIT" + }, + { + "id": "AodeRelay", + "group": 9, + "val": 8, + "description": "Relay ActivityPub pour connecter des instances et améliorer la découverte.", + "category": "dev", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Coracle", + "group": 14, + "val": 8, + "description": "Client web Nostr haut de gamme avec une interface soignée et des performances optimisées.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "Nostrudel", + "group": 14, + "val": 8, + "description": "Client web Nostr avec UX moderne et support avancé des relays.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "Lume", + "group": 14, + "val": 8, + "description": "Client desktop Nostr rapide et léger.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "GPL-3.0" + }, + { + "id": "Gossip", + "group": 14, + "val": 8, + "description": "Client desktop Nostr en Rust avec interface native rapide.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "Current", + "group": 14, + "val": 8, + "description": "Client iOS Nostr avec une interface épurée et moderne.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "Plebstr", + "group": 14, + "val": 8, + "description": "Client mobile Nostr pour iOS et Android.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "Nostrpels", + "group": 14, + "val": 3, + "description": "Client Nostr avec support de médias riches et expérience sociale améliorée.", + "category": "nostr", + "color": "#F7931A", + "etat": "Experimental", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "ZapStream", + "group": 14, + "val": 8, + "description": "Plateforme de streaming live sur Nostr avec Lightning Zaps intégrés.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "NostrCheck.me", + "group": 14, + "val": 8, + "description": "Service de vérification d'identité et de badges pour Nostr.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "NostrMarket", + "group": 14, + "val": 8, + "description": "Place de marché décentralisée sur Nostr. Commerce P2P avec Lightning.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "Prosody", + "group": 13, + "val": 8, + "description": "Serveur XMPP moderne, léger et facile à configurer.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "ejabberd", + "group": 13, + "val": 8, + "description": "Serveur XMPP robuste et scalable utilisé par de grandes plateformes.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "GPL-2.0" + }, + { + "id": "Openfire", + "group": 13, + "val": 8, + "description": "Serveur XMPP en Java avec interface d'administration web.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "Apache-2.0" + }, + { + "id": "Tigase", + "group": 13, + "val": 8, + "description": "Serveur XMPP en Java avec support avancé de clustering.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "AGPL-3.0" + }, + { + "id": "Conversations", + "group": 13, + "val": 8, + "description": "Client XMPP Android moderne. Référence du messaging mobile décentralisé.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "GPL-3.0" + }, + { + "id": "Dino", + "group": 13, + "val": 8, + "description": "Client XMPP desktop moderne pour Linux. Interface épurée et moderne.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "GPL-3.0" + }, + { + "id": "Gajim", + "group": 13, + "val": 8, + "description": "Client XMPP desktop complet. Le client de référence historique.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "GPL-3.0" + }, + { + "id": "Monal", + "group": 13, + "val": 8, + "description": "Client XMPP pour iOS et macOS. Le meilleur client Apple pour XMPP.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "BSD" + }, + { + "id": "Snikket", + "group": 13, + "val": 8, + "description": "'Le Mastodon du XMPP' — bundle serveur + client qui simplifie XMPP pour le grand public.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "AGPL-3.0" + }, + { + "id": "Movim", + "group": 13, + "val": 8, + "description": "Réseau social basé sur XMPP. Interface web moderne avec microblogging.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "AGPL-3.0" + }, + { + "id": "Jabber", + "group": 13, + "val": 3, + "description": "Le protocole historique de messagerie instantanée. Ancêtre de XMPP, toujours utilisé.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Historique", + "compatibiliteAP": "Aucune", + "licence": "Open Standard" + }, + { + "id": "Bluesky", + "group": 1, + "val": 8, + "description": "Le réseau social décentralisé basé sur AT Protocol. Créé par l'ancienne équipe de Twitter.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "Proprietary" + }, + { + "id": "Graysky", + "group": 1, + "val": 8, + "description": "Client alternatif pour Bluesky/AT Protocol. iOS et Android.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "Tokimeki", + "group": 1, + "val": 8, + "description": "Client web alternatif pour Bluesky avec approche japonaise.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "Briar", + "group": 13, + "val": 8, + "description": "Messagerie P2P via Bluetooth/WiFi/Tor. Fonctionne sans connexion Internet.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "GPL-3.0" + }, + { + "id": "Jami", + "group": 13, + "val": 8, + "description": "Communication décentralisée GNU. Messages, appels vidéo, partage d'écran — tout en P2P.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "GPL-3.0" + }, + { + "id": "CryptPad", + "group": 10, + "val": 8, + "description": "Suite bureautique chiffrée de bout en bout. Documents, tableurs, présentations, votes.", + "category": "collab", + "color": "#2EC4B6", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "AGPL-3.0" + }, + { + "id": "HedgeDoc", + "group": 10, + "val": 8, + "description": "Édition collaborative de Markdown en temps réel.", + "category": "collab", + "color": "#2EC4B6", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "AGPL-3.0" + }, + { + "id": "Immich", + "group": 10, + "val": 8, + "description": "Auto-hébergement de photos et vidéos avec IA. Alternative à Google Photos.", + "category": "collab", + "color": "#2EC4B6", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "AGPL-3.0" + }, + { + "id": "PhotoPrism", + "group": 10, + "val": 8, + "description": "Gestion de photos auto-hébergée avec IA. Reconnaissance faciale et classement automatique.", + "category": "collab", + "color": "#2EC4B6", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "AGPL-3.0" + }, + { + "id": "Synapse", + "group": 10, + "val": 8, + "description": "Serveur Matrix de référence par Element. Le serveur le plus utilisé de l'écosystème Matrix.", + "category": "collab", + "color": "#2EC4B6", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "Apache-2.0" + }, + { + "id": "Dendrite", + "group": 10, + "val": 8, + "description": "Serveur Matrix de deuxième génération par Element. Plus léger et performant que Synapse.", + "category": "collab", + "color": "#2EC4B6", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "Apache-2.0" + }, + { + "id": "Conduit", + "group": 10, + "val": 8, + "description": "Serveur Matrix léger en Rust. Alternative rapide et efficace à Synapse.", + "category": "collab", + "color": "#2EC4B6", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "Apache-2.0" + }, + { + "id": "Cinny", + "group": 10, + "val": 8, + "description": "Client web Matrix avec interface moderne et intuitive. Alternative à Element.", + "category": "collab", + "color": "#2EC4B6", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "FluffyChat", + "group": 10, + "val": 8, + "description": "Client Matrix pour mobile et desktop. Interface douce et accessible.", + "category": "collab", + "color": "#2EC4B6", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "AGPL-3.0" + }, + { + "id": "FediBridge", + "group": 9, + "val": 3, + "description": "Outil de bridge entre différents réseaux fédérés. Interconnexion multi-protocoles.", + "category": "dev", + "color": "#4CC9F0", + "etat": "Experimental", + "compatibiliteAP": "Pleine", + "licence": "MIT" + }, + { + "id": "ActivityPub Relay", + "group": 9, + "val": 8, + "description": "Relay public pour connecter des instances ActivityPub et améliorer la fédération.", + "category": "dev", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "MIT" + }, + { + "id": "Sepia Search", + "group": 4, + "val": 8, + "description": "Moteur de recherche fédéré pour PeerTube. Recherche cross-instance.", + "category": "video", + "color": "#F72585", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "SimpleX Chat", + "group": 13, + "val": 8, + "description": "Messagerie décentralisée de nouvelle génération sans identifiants d'utilisateur. Protection de la vie privée par défaut avec chiffrement de bout en bout.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "AGPL-3.0" + }, + { + "id": "Nostr Protocol", + "group": 14, + "val": 8, + "description": "Protocole simple et ouvert pour créer des réseaux sociaux résistants à la censure, basé sur des relays et des clés cryptographiques.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "Public Domain" + }, + { + "id": "Damus", + "group": 14, + "val": 8, + "description": "Client iOS pour Nostr. Le client mobile le plus populaire de l'écosystème Nostr.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "GPL-3.0" + }, + { + "id": "Amethyst", + "group": 14, + "val": 8, + "description": "Client Android pour Nostr. Application native Kotlin avec support complet des NIPs.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "Iris", + "group": 14, + "val": 8, + "description": "Client web pour Nostr. Interface moderne et réactive pour le réseau Nostr.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "Primal", + "group": 14, + "val": 8, + "description": "Client Nostr avec un backend optimisé pour des performances ultra-rapides.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "Proprietary" + }, + { + "id": "Habla.news", + "group": 14, + "val": 8, + "description": "Plateforme de publication longue sur Nostr. Alternative à Medium.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "Nostr.band", + "group": 14, + "val": 8, + "description": "Moteur de recherche et explorateur pour le réseau Nostr.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "Snort", + "group": 14, + "val": 8, + "description": "Client web Nostr rapide et léger avec support des relays multiples.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + } + ], + "links": [ + { + "source": "Mastodon", + "target": "GoToSocial", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Akkoma", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Pleroma", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Misskey", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Sharkey", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Friendica", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Hubzilla", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Streams", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Iceshrimp", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "GNU social", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Bonfire", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Castopod", + "type": "strong" + }, + { + "source": "Mastodon", + "target": "Diaspora*", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Fedify", + "type": "strong" + }, + { + "source": "Mastodon", + "target": "Mitra", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Akkoma", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Pleroma", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Misskey", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Sharkey", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Friendica", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Hubzilla", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Streams", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Iceshrimp", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "GNU social", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Bonfire", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Diaspora*", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Mitra", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "RoadHouse", + "type": "strong" + }, + { + "source": "GoToSocial", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Pleroma", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Misskey", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Sharkey", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Friendica", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Hubzilla", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Streams", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Iceshrimp", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "GNU social", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Bonfire", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "PeerTube", + "type": "strong" + }, + { + "source": "Akkoma", + "target": "Funkwhale", + "type": "strong" + }, + { + "source": "Akkoma", + "target": "Mbin", + "type": "strong" + }, + { + "source": "Akkoma", + "target": "Diaspora*", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Fedify", + "type": "strong" + }, + { + "source": "Akkoma", + "target": "Mitra", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "AodeRelay", + "type": "strong" + }, + { + "source": "Akkoma", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Misskey", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Sharkey", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Friendica", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Hubzilla", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Streams", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Iceshrimp", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "GNU social", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Bonfire", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Castopod", + "type": "strong" + }, + { + "source": "Pleroma", + "target": "BookWyrm", + "type": "strong" + }, + { + "source": "Pleroma", + "target": "Diaspora*", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Mitra", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Lotide", + "type": "strong" + }, + { + "source": "Pleroma", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Sharkey", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Friendica", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Hubzilla", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Streams", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Iceshrimp", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "GNU social", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Bonfire", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Castopod", + "type": "strong" + }, + { + "source": "Misskey", + "target": "Funkwhale", + "type": "strong" + }, + { + "source": "Misskey", + "target": "Diaspora*", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Mitra", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "kbin", + "type": "strong" + }, + { + "source": "Misskey", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Sublinks", + "type": "strong" + }, + { + "source": "Misskey", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Friendica", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Hubzilla", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Streams", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Iceshrimp", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "GNU social", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Bonfire", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "PeerTube", + "type": "strong" + }, + { + "source": "Sharkey", + "target": "Loops", + "type": "strong" + }, + { + "source": "Sharkey", + "target": "WriteFreely", + "type": "strong" + }, + { + "source": "Sharkey", + "target": "BookWyrm", + "type": "strong" + }, + { + "source": "Sharkey", + "target": "Diaspora*", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Mitra", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "RoadHouse", + "type": "strong" + }, + { + "source": "Sharkey", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "FediBridge", + "type": "strong" + }, + { + "source": "Friendica", + "target": "Hubzilla", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Streams", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Iceshrimp", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "GNU social", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Bonfire", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Funkwhale", + "type": "strong" + }, + { + "source": "Friendica", + "target": "Loops", + "type": "strong" + }, + { + "source": "Friendica", + "target": "Diaspora*", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Mitra", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Streams", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Iceshrimp", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "GNU social", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Bonfire", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Diaspora*", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Mitra", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Iceshrimp", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "GNU social", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Bonfire", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Diaspora*", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Mitra", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "GNU social", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Bonfire", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Diaspora*", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Mitra", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Sublinks", + "type": "strong" + }, + { + "source": "Iceshrimp", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "AodeRelay", + "type": "strong" + }, + { + "source": "Iceshrimp", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Bonfire", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Diaspora*", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Mitra", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "PeerTube", + "type": "strong" + }, + { + "source": "Bonfire", + "target": "Funkwhale", + "type": "strong" + }, + { + "source": "Bonfire", + "target": "Plume", + "type": "strong" + }, + { + "source": "Bonfire", + "target": "Diaspora*", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Mitra", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Sepia Search", + "type": "strong" + }, + { + "source": "microblog.pub", + "target": "WriteFreely", + "type": "strong" + }, + { + "source": "microblog.pub", + "target": "BookWyrm", + "type": "strong" + }, + { + "source": "microblog.pub", + "target": "Smithereen", + "type": "strong" + }, + { + "source": "microblog.pub", + "target": "Lotide", + "type": "strong" + }, + { + "source": "microblog.pub", + "target": "Emissary", + "type": "strong" + }, + { + "source": "PixelFed", + "target": "Vernissage", + "type": "weak", + "category": "photo" + }, + { + "source": "PixelFed", + "target": "PeerTube", + "type": "strong" + }, + { + "source": "PixelFed", + "target": "Takahē", + "type": "strong" + }, + { + "source": "PixelFed", + "target": "Kroeg", + "type": "strong" + }, + { + "source": "PixelFed", + "target": "Hometown", + "type": "strong" + }, + { + "source": "PixelFed", + "target": "Sepia Search", + "type": "strong" + }, + { + "source": "Vernissage", + "target": "WriteFreely", + "type": "strong" + }, + { + "source": "Vernissage", + "target": "Plume", + "type": "strong" + }, + { + "source": "Vernissage", + "target": "RoadHouse", + "type": "strong" + }, + { + "source": "PeerTube", + "target": "Owncast", + "type": "weak", + "category": "video" + }, + { + "source": "PeerTube", + "target": "Tube (Framasoft)", + "type": "weak", + "category": "video" + }, + { + "source": "PeerTube", + "target": "Loops", + "type": "weak", + "category": "video" + }, + { + "source": "PeerTube", + "target": "Mbin", + "type": "strong" + }, + { + "source": "PeerTube", + "target": "Kroeg", + "type": "strong" + }, + { + "source": "PeerTube", + "target": "Sublinks", + "type": "strong" + }, + { + "source": "PeerTube", + "target": "Hometown", + "type": "strong" + }, + { + "source": "PeerTube", + "target": "FediBridge", + "type": "strong" + }, + { + "source": "PeerTube", + "target": "Sepia Search", + "type": "weak", + "category": "video" + }, + { + "source": "Owncast", + "target": "Tube (Framasoft)", + "type": "weak", + "category": "video" + }, + { + "source": "Owncast", + "target": "Loops", + "type": "weak", + "category": "video" + }, + { + "source": "Owncast", + "target": "Sepia Search", + "type": "weak", + "category": "video" + }, + { + "source": "Tube (Framasoft)", + "target": "Loops", + "type": "weak", + "category": "video" + }, + { + "source": "Tube (Framasoft)", + "target": "Kroeg", + "type": "strong" + }, + { + "source": "Tube (Framasoft)", + "target": "Sublinks", + "type": "strong" + }, + { + "source": "Tube (Framasoft)", + "target": "Sepia Search", + "type": "weak", + "category": "video" + }, + { + "source": "Castopod", + "target": "Funkwhale", + "type": "weak", + "category": "audio" + }, + { + "source": "Castopod", + "target": "Plume", + "type": "strong" + }, + { + "source": "Castopod", + "target": "Lemmy", + "type": "strong" + }, + { + "source": "Castopod", + "target": "BookWyrm", + "type": "strong" + }, + { + "source": "Castopod", + "target": "Smithereen", + "type": "strong" + }, + { + "source": "Castopod", + "target": "ActivityPub Relay", + "type": "strong" + }, + { + "source": "Funkwhale", + "target": "Epicyon", + "type": "strong" + }, + { + "source": "Funkwhale", + "target": "Lotide", + "type": "strong" + }, + { + "source": "Funkwhale", + "target": "RoadHouse", + "type": "strong" + }, + { + "source": "Funkwhale", + "target": "Emissary", + "type": "strong" + }, + { + "source": "Loops", + "target": "Mitra", + "type": "strong" + }, + { + "source": "Loops", + "target": "kbin", + "type": "strong" + }, + { + "source": "Loops", + "target": "Takahē", + "type": "strong" + }, + { + "source": "Loops", + "target": "RoadHouse", + "type": "strong" + }, + { + "source": "Loops", + "target": "Postmarks", + "type": "strong" + }, + { + "source": "Loops", + "target": "Sepia Search", + "type": "weak", + "category": "video" + }, + { + "source": "Ghost", + "target": "WriteFreely", + "type": "weak", + "category": "blog" + }, + { + "source": "Ghost", + "target": "Plume", + "type": "weak", + "category": "blog" + }, + { + "source": "Ghost", + "target": "WordPress + ActivityPub", + "type": "weak", + "category": "blog" + }, + { + "source": "Ghost", + "target": "Drupal + ActivityPub", + "type": "weak", + "category": "blog" + }, + { + "source": "Ghost", + "target": "WordPress MU + ActivityPub", + "type": "weak", + "category": "blog" + }, + { + "source": "WriteFreely", + "target": "Plume", + "type": "weak", + "category": "blog" + }, + { + "source": "WriteFreely", + "target": "WordPress + ActivityPub", + "type": "weak", + "category": "blog" + }, + { + "source": "WriteFreely", + "target": "Drupal + ActivityPub", + "type": "weak", + "category": "blog" + }, + { + "source": "WriteFreely", + "target": "Gancio", + "type": "strong" + }, + { + "source": "WriteFreely", + "target": "Lotide", + "type": "strong" + }, + { + "source": "WriteFreely", + "target": "Sublinks", + "type": "strong" + }, + { + "source": "WriteFreely", + "target": "WordPress MU + ActivityPub", + "type": "weak", + "category": "blog" + }, + { + "source": "Plume", + "target": "WordPress + ActivityPub", + "type": "weak", + "category": "blog" + }, + { + "source": "Plume", + "target": "Drupal + ActivityPub", + "type": "weak", + "category": "blog" + }, + { + "source": "Plume", + "target": "Gancio", + "type": "strong" + }, + { + "source": "Plume", + "target": "BookWyrm", + "type": "strong" + }, + { + "source": "Plume", + "target": "Kroeg", + "type": "strong" + }, + { + "source": "Plume", + "target": "Lotide", + "type": "strong" + }, + { + "source": "Plume", + "target": "Sublinks", + "type": "strong" + }, + { + "source": "Plume", + "target": "WordPress MU + ActivityPub", + "type": "weak", + "category": "blog" + }, + { + "source": "Plume", + "target": "Hometown", + "type": "strong" + }, + { + "source": "Plume", + "target": "Akkoma-FE", + "type": "strong" + }, + { + "source": "Plume", + "target": "AodeRelay", + "type": "strong" + }, + { + "source": "WordPress + ActivityPub", + "target": "Drupal + ActivityPub", + "type": "weak", + "category": "blog" + }, + { + "source": "WordPress + ActivityPub", + "target": "WordPress MU + ActivityPub", + "type": "weak", + "category": "blog" + }, + { + "source": "Drupal + ActivityPub", + "target": "WordPress MU + ActivityPub", + "type": "weak", + "category": "blog" + }, + { + "source": "Lemmy", + "target": "Mbin", + "type": "weak", + "category": "forum" + }, + { + "source": "Lemmy", + "target": "NodeBB", + "type": "weak", + "category": "forum" + }, + { + "source": "Lemmy", + "target": "kbin", + "type": "weak", + "category": "forum" + }, + { + "source": "Lemmy", + "target": "Takahē", + "type": "strong" + }, + { + "source": "Lemmy", + "target": "Smithereen", + "type": "strong" + }, + { + "source": "Lemmy", + "target": "Kroeg", + "type": "strong" + }, + { + "source": "Lemmy", + "target": "Lotide", + "type": "weak", + "category": "forum" + }, + { + "source": "Lemmy", + "target": "Sublinks", + "type": "weak", + "category": "forum" + }, + { + "source": "Lemmy", + "target": "RoadHouse", + "type": "weak", + "category": "forum" + }, + { + "source": "Lemmy", + "target": "Emissary", + "type": "strong" + }, + { + "source": "Mbin", + "target": "NodeBB", + "type": "weak", + "category": "forum" + }, + { + "source": "Mbin", + "target": "Mitra", + "type": "strong" + }, + { + "source": "Mbin", + "target": "kbin", + "type": "weak", + "category": "forum" + }, + { + "source": "Mbin", + "target": "Takahē", + "type": "strong" + }, + { + "source": "Mbin", + "target": "Kroeg", + "type": "strong" + }, + { + "source": "Mbin", + "target": "Lotide", + "type": "weak", + "category": "forum" + }, + { + "source": "Mbin", + "target": "Sublinks", + "type": "weak", + "category": "forum" + }, + { + "source": "Mbin", + "target": "RoadHouse", + "type": "weak", + "category": "forum" + }, + { + "source": "Mbin", + "target": "Pieoneers", + "type": "strong" + }, + { + "source": "Mbin", + "target": "Emissary", + "type": "strong" + }, + { + "source": "NodeBB", + "target": "kbin", + "type": "weak", + "category": "forum" + }, + { + "source": "NodeBB", + "target": "Lotide", + "type": "weak", + "category": "forum" + }, + { + "source": "NodeBB", + "target": "Sublinks", + "type": "weak", + "category": "forum" + }, + { + "source": "NodeBB", + "target": "RoadHouse", + "type": "weak", + "category": "forum" + }, + { + "source": "Mobilizon", + "target": "Gancio", + "type": "weak", + "category": "events" + }, + { + "source": "Mobilizon", + "target": "Fedify", + "type": "strong" + }, + { + "source": "Mobilizon", + "target": "Sublinks", + "type": "strong" + }, + { + "source": "Mobilizon", + "target": "AodeRelay", + "type": "strong" + }, + { + "source": "Mobilizon", + "target": "Sepia Search", + "type": "strong" + }, + { + "source": "Gancio", + "target": "Epicyon", + "type": "strong" + }, + { + "source": "Gancio", + "target": "RoadHouse", + "type": "strong" + }, + { + "source": "Gancio", + "target": "Akkoma-FE", + "type": "strong" + }, + { + "source": "Gancio", + "target": "AodeRelay", + "type": "strong" + }, + { + "source": "Gancio", + "target": "ActivityPub Relay", + "type": "strong" + }, + { + "source": "Forgejo", + "target": "Gitea", + "type": "weak", + "category": "dev" + }, + { + "source": "Forgejo", + "target": "Fedify", + "type": "weak", + "category": "dev" + }, + { + "source": "Forgejo", + "target": "AodeRelay", + "type": "weak", + "category": "dev" + }, + { + "source": "Forgejo", + "target": "FediBridge", + "type": "weak", + "category": "dev" + }, + { + "source": "Forgejo", + "target": "ActivityPub Relay", + "type": "weak", + "category": "dev" + }, + { + "source": "Gitea", + "target": "Fedify", + "type": "weak", + "category": "dev" + }, + { + "source": "Gitea", + "target": "AodeRelay", + "type": "weak", + "category": "dev" + }, + { + "source": "Gitea", + "target": "FediBridge", + "type": "weak", + "category": "dev" + }, + { + "source": "Gitea", + "target": "ActivityPub Relay", + "type": "weak", + "category": "dev" + }, + { + "source": "Nextcloud", + "target": "ownCloud", + "type": "weak", + "category": "collab" + }, + { + "source": "Nextcloud", + "target": "Element", + "type": "weak", + "category": "collab" + }, + { + "source": "Nextcloud", + "target": "CryptPad", + "type": "weak", + "category": "collab" + }, + { + "source": "Nextcloud", + "target": "HedgeDoc", + "type": "weak", + "category": "collab" + }, + { + "source": "Nextcloud", + "target": "Immich", + "type": "weak", + "category": "collab" + }, + { + "source": "Nextcloud", + "target": "PhotoPrism", + "type": "weak", + "category": "collab" + }, + { + "source": "Nextcloud", + "target": "Synapse", + "type": "weak", + "category": "collab" + }, + { + "source": "Nextcloud", + "target": "Dendrite", + "type": "weak", + "category": "collab" + }, + { + "source": "Nextcloud", + "target": "Conduit", + "type": "weak", + "category": "collab" + }, + { + "source": "Nextcloud", + "target": "Cinny", + "type": "weak", + "category": "collab" + }, + { + "source": "Nextcloud", + "target": "FluffyChat", + "type": "weak", + "category": "collab" + }, + { + "source": "ownCloud", + "target": "Element", + "type": "weak", + "category": "collab" + }, + { + "source": "ownCloud", + "target": "CryptPad", + "type": "weak", + "category": "collab" + }, + { + "source": "ownCloud", + "target": "HedgeDoc", + "type": "weak", + "category": "collab" + }, + { + "source": "ownCloud", + "target": "Immich", + "type": "weak", + "category": "collab" + }, + { + "source": "ownCloud", + "target": "PhotoPrism", + "type": "weak", + "category": "collab" + }, + { + "source": "ownCloud", + "target": "Synapse", + "type": "weak", + "category": "collab" + }, + { + "source": "ownCloud", + "target": "Dendrite", + "type": "weak", + "category": "collab" + }, + { + "source": "ownCloud", + "target": "Conduit", + "type": "weak", + "category": "collab" + }, + { + "source": "ownCloud", + "target": "Cinny", + "type": "weak", + "category": "collab" + }, + { + "source": "ownCloud", + "target": "FluffyChat", + "type": "weak", + "category": "collab" + }, + { + "source": "BookWyrm", + "target": "Epicyon", + "type": "strong" + }, + { + "source": "BookWyrm", + "target": "Smithereen", + "type": "strong" + }, + { + "source": "BookWyrm", + "target": "Pieoneers", + "type": "strong" + }, + { + "source": "BookWyrm", + "target": "ActivityPub Relay", + "type": "strong" + }, + { + "source": "BookWyrm", + "target": "Sepia Search", + "type": "strong" + }, + { + "source": "Diaspora*", + "target": "Mitra", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Element", + "target": "CryptPad", + "type": "weak", + "category": "collab" + }, + { + "source": "Element", + "target": "HedgeDoc", + "type": "weak", + "category": "collab" + }, + { + "source": "Element", + "target": "Immich", + "type": "weak", + "category": "collab" + }, + { + "source": "Element", + "target": "PhotoPrism", + "type": "weak", + "category": "collab" + }, + { + "source": "Element", + "target": "Synapse", + "type": "weak", + "category": "collab" + }, + { + "source": "Element", + "target": "Dendrite", + "type": "weak", + "category": "collab" + }, + { + "source": "Element", + "target": "Conduit", + "type": "weak", + "category": "collab" + }, + { + "source": "Element", + "target": "Cinny", + "type": "weak", + "category": "collab" + }, + { + "source": "Element", + "target": "FluffyChat", + "type": "weak", + "category": "collab" + }, + { + "source": "Fedify", + "target": "Epicyon", + "type": "strong" + }, + { + "source": "Fedify", + "target": "Pieoneers", + "type": "strong" + }, + { + "source": "Fedify", + "target": "Emissary", + "type": "strong" + }, + { + "source": "Fedify", + "target": "Postmarks", + "type": "strong" + }, + { + "source": "Fedify", + "target": "AodeRelay", + "type": "weak", + "category": "dev" + }, + { + "source": "Fedify", + "target": "FediBridge", + "type": "weak", + "category": "dev" + }, + { + "source": "Fedify", + "target": "ActivityPub Relay", + "type": "weak", + "category": "dev" + }, + { + "source": "Mitra", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "Mitra", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "Mitra", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Mitra", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Mitra", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Mitra", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Mitra", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Mitra", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Mitra", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Mitra", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Mitra", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Mitra", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Mitra", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Mitra", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Socialhome", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "Socialhome", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Socialhome", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Socialhome", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Socialhome", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Socialhome", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Socialhome", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Socialhome", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Socialhome", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Socialhome", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Socialhome", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Socialhome", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Socialhome", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "kbin", + "target": "Epicyon", + "type": "strong" + }, + { + "source": "kbin", + "target": "Lotide", + "type": "weak", + "category": "forum" + }, + { + "source": "kbin", + "target": "Sublinks", + "type": "weak", + "category": "forum" + }, + { + "source": "kbin", + "target": "RoadHouse", + "type": "weak", + "category": "forum" + }, + { + "source": "kbin", + "target": "Akkoma-FE", + "type": "strong" + }, + { + "source": "kbin", + "target": "AodeRelay", + "type": "strong" + }, + { + "source": "Epicyon", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Epicyon", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Epicyon", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Epicyon", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Epicyon", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Epicyon", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Epicyon", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Epicyon", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Epicyon", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Epicyon", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Epicyon", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Epicyon", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Epicyon", + "target": "Sepia Search", + "type": "strong" + }, + { + "source": "Takahē", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Takahē", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Takahē", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Takahē", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Takahē", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Takahē", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Takahē", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Takahē", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Takahē", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Takahē", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Takahē", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Takahē", + "target": "FediBridge", + "type": "strong" + }, + { + "source": "Smithereen", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Smithereen", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Smithereen", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Smithereen", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Smithereen", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Smithereen", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Smithereen", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Smithereen", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Smithereen", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Smithereen", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Smithereen", + "target": "FediBridge", + "type": "strong" + }, + { + "source": "Kroeg", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Kroeg", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Kroeg", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Kroeg", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Kroeg", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Kroeg", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Kroeg", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Kroeg", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Kroeg", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Kroeg", + "target": "ActivityPub Relay", + "type": "strong" + }, + { + "source": "Lotide", + "target": "Sublinks", + "type": "weak", + "category": "forum" + }, + { + "source": "Lotide", + "target": "RoadHouse", + "type": "weak", + "category": "forum" + }, + { + "source": "Lotide", + "target": "Akkoma-FE", + "type": "strong" + }, + { + "source": "Sublinks", + "target": "RoadHouse", + "type": "weak", + "category": "forum" + }, + { + "source": "Sublinks", + "target": "Emissary", + "type": "strong" + }, + { + "source": "Sublinks", + "target": "Postmarks", + "type": "strong" + }, + { + "source": "Sublinks", + "target": "ActivityPub Relay", + "type": "strong" + }, + { + "source": "RoadHouse", + "target": "Pieoneers", + "type": "strong" + }, + { + "source": "RoadHouse", + "target": "Emissary", + "type": "strong" + }, + { + "source": "RoadHouse", + "target": "AodeRelay", + "type": "strong" + }, + { + "source": "RoadHouse", + "target": "FediBridge", + "type": "strong" + }, + { + "source": "RoadHouse", + "target": "Sepia Search", + "type": "strong" + }, + { + "source": "Pieoneers", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Pieoneers", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Pieoneers", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Pieoneers", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Pieoneers", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Pieoneers", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Pieoneers", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Pieoneers", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Pieoneers", + "target": "FediBridge", + "type": "strong" + }, + { + "source": "Pieoneers", + "target": "ActivityPub Relay", + "type": "strong" + }, + { + "source": "Emissary", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Emissary", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Emissary", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Emissary", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Emissary", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Emissary", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Emissary", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Hometown", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Hometown", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Hometown", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Hometown", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Hometown", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Hometown", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "GlitchSoc", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "GlitchSoc", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "GlitchSoc", + "target": "AodeRelay", + "type": "strong" + }, + { + "source": "GlitchSoc", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "GlitchSoc", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "GlitchSoc", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma-FE", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma-FE", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma-FE", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma-FE", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Postmarks", + "target": "AodeRelay", + "type": "strong" + }, + { + "source": "Postmarks", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Postmarks", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Postmarks", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "AodeRelay", + "target": "FediBridge", + "type": "weak", + "category": "dev" + }, + { + "source": "AodeRelay", + "target": "ActivityPub Relay", + "type": "weak", + "category": "dev" + }, + { + "source": "Coracle", + "target": "Nostrudel", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "Lume", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "Gossip", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "Current", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "Plebstr", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "Nostrpels", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "ZapStream", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "NostrCheck.me", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "NostrMarket", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "Nostr Protocol", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "Damus", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "Amethyst", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "Iris", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "Lume", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "Gossip", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "Current", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "Plebstr", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "Nostrpels", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "ZapStream", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "NostrCheck.me", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "NostrMarket", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "Nostr Protocol", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "Damus", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "Amethyst", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "Iris", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "Gossip", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "Current", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "Plebstr", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "Nostrpels", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "ZapStream", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "NostrCheck.me", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "NostrMarket", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "Nostr Protocol", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "Damus", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "Amethyst", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "Iris", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "Current", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "Plebstr", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "Nostrpels", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "ZapStream", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "NostrCheck.me", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "NostrMarket", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "Nostr Protocol", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "Damus", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "Amethyst", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "Iris", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "Current", + "target": "Plebstr", + "type": "weak", + "category": "nostr" + }, + { + "source": "Current", + "target": "Nostrpels", + "type": "weak", + "category": "nostr" + }, + { + "source": "Current", + "target": "ZapStream", + "type": "weak", + "category": "nostr" + }, + { + "source": "Current", + "target": "NostrCheck.me", + "type": "weak", + "category": "nostr" + }, + { + "source": "Current", + "target": "NostrMarket", + "type": "weak", + "category": "nostr" + }, + { + "source": "Current", + "target": "Nostr Protocol", + "type": "weak", + "category": "nostr" + }, + { + "source": "Current", + "target": "Damus", + "type": "weak", + "category": "nostr" + }, + { + "source": "Current", + "target": "Amethyst", + "type": "weak", + "category": "nostr" + }, + { + "source": "Current", + "target": "Iris", + "type": "weak", + "category": "nostr" + }, + { + "source": "Current", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "Current", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "Current", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "Current", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "Plebstr", + "target": "Nostrpels", + "type": "weak", + "category": "nostr" + }, + { + "source": "Plebstr", + "target": "ZapStream", + "type": "weak", + "category": "nostr" + }, + { + "source": "Plebstr", + "target": "NostrCheck.me", + "type": "weak", + "category": "nostr" + }, + { + "source": "Plebstr", + "target": "NostrMarket", + "type": "weak", + "category": "nostr" + }, + { + "source": "Plebstr", + "target": "Nostr Protocol", + "type": "weak", + "category": "nostr" + }, + { + "source": "Plebstr", + "target": "Damus", + "type": "weak", + "category": "nostr" + }, + { + "source": "Plebstr", + "target": "Amethyst", + "type": "weak", + "category": "nostr" + }, + { + "source": "Plebstr", + "target": "Iris", + "type": "weak", + "category": "nostr" + }, + { + "source": "Plebstr", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "Plebstr", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "Plebstr", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "Plebstr", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrpels", + "target": "ZapStream", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrpels", + "target": "NostrCheck.me", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrpels", + "target": "NostrMarket", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrpels", + "target": "Nostr Protocol", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrpels", + "target": "Damus", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrpels", + "target": "Amethyst", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrpels", + "target": "Iris", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrpels", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrpels", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrpels", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrpels", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "ZapStream", + "target": "NostrCheck.me", + "type": "weak", + "category": "nostr" + }, + { + "source": "ZapStream", + "target": "NostrMarket", + "type": "weak", + "category": "nostr" + }, + { + "source": "ZapStream", + "target": "Nostr Protocol", + "type": "weak", + "category": "nostr" + }, + { + "source": "ZapStream", + "target": "Damus", + "type": "weak", + "category": "nostr" + }, + { + "source": "ZapStream", + "target": "Amethyst", + "type": "weak", + "category": "nostr" + }, + { + "source": "ZapStream", + "target": "Iris", + "type": "weak", + "category": "nostr" + }, + { + "source": "ZapStream", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "ZapStream", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "ZapStream", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "ZapStream", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrCheck.me", + "target": "NostrMarket", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrCheck.me", + "target": "Nostr Protocol", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrCheck.me", + "target": "Damus", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrCheck.me", + "target": "Amethyst", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrCheck.me", + "target": "Iris", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrCheck.me", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrCheck.me", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrCheck.me", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrCheck.me", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrMarket", + "target": "Nostr Protocol", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrMarket", + "target": "Damus", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrMarket", + "target": "Amethyst", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrMarket", + "target": "Iris", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrMarket", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrMarket", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrMarket", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrMarket", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "Prosody", + "target": "ejabberd", + "type": "weak", + "category": "messaging" + }, + { + "source": "Prosody", + "target": "Openfire", + "type": "weak", + "category": "messaging" + }, + { + "source": "Prosody", + "target": "Tigase", + "type": "weak", + "category": "messaging" + }, + { + "source": "Prosody", + "target": "Conversations", + "type": "weak", + "category": "messaging" + }, + { + "source": "Prosody", + "target": "Dino", + "type": "weak", + "category": "messaging" + }, + { + "source": "Prosody", + "target": "Gajim", + "type": "weak", + "category": "messaging" + }, + { + "source": "Prosody", + "target": "Monal", + "type": "weak", + "category": "messaging" + }, + { + "source": "Prosody", + "target": "Snikket", + "type": "weak", + "category": "messaging" + }, + { + "source": "Prosody", + "target": "Movim", + "type": "weak", + "category": "messaging" + }, + { + "source": "Prosody", + "target": "Jabber", + "type": "weak", + "category": "messaging" + }, + { + "source": "Prosody", + "target": "Briar", + "type": "weak", + "category": "messaging" + }, + { + "source": "Prosody", + "target": "Jami", + "type": "weak", + "category": "messaging" + }, + { + "source": "Prosody", + "target": "SimpleX Chat", + "type": "weak", + "category": "messaging" + }, + { + "source": "ejabberd", + "target": "Openfire", + "type": "weak", + "category": "messaging" + }, + { + "source": "ejabberd", + "target": "Tigase", + "type": "weak", + "category": "messaging" + }, + { + "source": "ejabberd", + "target": "Conversations", + "type": "weak", + "category": "messaging" + }, + { + "source": "ejabberd", + "target": "Dino", + "type": "weak", + "category": "messaging" + }, + { + "source": "ejabberd", + "target": "Gajim", + "type": "weak", + "category": "messaging" + }, + { + "source": "ejabberd", + "target": "Monal", + "type": "weak", + "category": "messaging" + }, + { + "source": "ejabberd", + "target": "Snikket", + "type": "weak", + "category": "messaging" + }, + { + "source": "ejabberd", + "target": "Movim", + "type": "weak", + "category": "messaging" + }, + { + "source": "ejabberd", + "target": "Jabber", + "type": "weak", + "category": "messaging" + }, + { + "source": "ejabberd", + "target": "Briar", + "type": "weak", + "category": "messaging" + }, + { + "source": "ejabberd", + "target": "Jami", + "type": "weak", + "category": "messaging" + }, + { + "source": "ejabberd", + "target": "SimpleX Chat", + "type": "weak", + "category": "messaging" + }, + { + "source": "Openfire", + "target": "Tigase", + "type": "weak", + "category": "messaging" + }, + { + "source": "Openfire", + "target": "Conversations", + "type": "weak", + "category": "messaging" + }, + { + "source": "Openfire", + "target": "Dino", + "type": "weak", + "category": "messaging" + }, + { + "source": "Openfire", + "target": "Gajim", + "type": "weak", + "category": "messaging" + }, + { + "source": "Openfire", + "target": "Monal", + "type": "weak", + "category": "messaging" + }, + { + "source": "Openfire", + "target": "Snikket", + "type": "weak", + "category": "messaging" + }, + { + "source": "Openfire", + "target": "Movim", + "type": "weak", + "category": "messaging" + }, + { + "source": "Openfire", + "target": "Jabber", + "type": "weak", + "category": "messaging" + }, + { + "source": "Openfire", + "target": "Briar", + "type": "weak", + "category": "messaging" + }, + { + "source": "Openfire", + "target": "Jami", + "type": "weak", + "category": "messaging" + }, + { + "source": "Openfire", + "target": "SimpleX Chat", + "type": "weak", + "category": "messaging" + }, + { + "source": "Tigase", + "target": "Conversations", + "type": "weak", + "category": "messaging" + }, + { + "source": "Tigase", + "target": "Dino", + "type": "weak", + "category": "messaging" + }, + { + "source": "Tigase", + "target": "Gajim", + "type": "weak", + "category": "messaging" + }, + { + "source": "Tigase", + "target": "Monal", + "type": "weak", + "category": "messaging" + }, + { + "source": "Tigase", + "target": "Snikket", + "type": "weak", + "category": "messaging" + }, + { + "source": "Tigase", + "target": "Movim", + "type": "weak", + "category": "messaging" + }, + { + "source": "Tigase", + "target": "Jabber", + "type": "weak", + "category": "messaging" + }, + { + "source": "Tigase", + "target": "Briar", + "type": "weak", + "category": "messaging" + }, + { + "source": "Tigase", + "target": "Jami", + "type": "weak", + "category": "messaging" + }, + { + "source": "Tigase", + "target": "SimpleX Chat", + "type": "weak", + "category": "messaging" + }, + { + "source": "Conversations", + "target": "Dino", + "type": "weak", + "category": "messaging" + }, + { + "source": "Conversations", + "target": "Gajim", + "type": "weak", + "category": "messaging" + }, + { + "source": "Conversations", + "target": "Monal", + "type": "weak", + "category": "messaging" + }, + { + "source": "Conversations", + "target": "Snikket", + "type": "weak", + "category": "messaging" + }, + { + "source": "Conversations", + "target": "Movim", + "type": "weak", + "category": "messaging" + }, + { + "source": "Conversations", + "target": "Jabber", + "type": "weak", + "category": "messaging" + }, + { + "source": "Conversations", + "target": "Briar", + "type": "weak", + "category": "messaging" + }, + { + "source": "Conversations", + "target": "Jami", + "type": "weak", + "category": "messaging" + }, + { + "source": "Conversations", + "target": "SimpleX Chat", + "type": "weak", + "category": "messaging" + }, + { + "source": "Dino", + "target": "Gajim", + "type": "weak", + "category": "messaging" + }, + { + "source": "Dino", + "target": "Monal", + "type": "weak", + "category": "messaging" + }, + { + "source": "Dino", + "target": "Snikket", + "type": "weak", + "category": "messaging" + }, + { + "source": "Dino", + "target": "Movim", + "type": "weak", + "category": "messaging" + }, + { + "source": "Dino", + "target": "Jabber", + "type": "weak", + "category": "messaging" + }, + { + "source": "Dino", + "target": "Briar", + "type": "weak", + "category": "messaging" + }, + { + "source": "Dino", + "target": "Jami", + "type": "weak", + "category": "messaging" + }, + { + "source": "Dino", + "target": "SimpleX Chat", + "type": "weak", + "category": "messaging" + }, + { + "source": "Gajim", + "target": "Monal", + "type": "weak", + "category": "messaging" + }, + { + "source": "Gajim", + "target": "Snikket", + "type": "weak", + "category": "messaging" + }, + { + "source": "Gajim", + "target": "Movim", + "type": "weak", + "category": "messaging" + }, + { + "source": "Gajim", + "target": "Jabber", + "type": "weak", + "category": "messaging" + }, + { + "source": "Gajim", + "target": "Briar", + "type": "weak", + "category": "messaging" + }, + { + "source": "Gajim", + "target": "Jami", + "type": "weak", + "category": "messaging" + }, + { + "source": "Gajim", + "target": "SimpleX Chat", + "type": "weak", + "category": "messaging" + }, + { + "source": "Monal", + "target": "Snikket", + "type": "weak", + "category": "messaging" + }, + { + "source": "Monal", + "target": "Movim", + "type": "weak", + "category": "messaging" + }, + { + "source": "Monal", + "target": "Jabber", + "type": "weak", + "category": "messaging" + }, + { + "source": "Monal", + "target": "Briar", + "type": "weak", + "category": "messaging" + }, + { + "source": "Monal", + "target": "Jami", + "type": "weak", + "category": "messaging" + }, + { + "source": "Monal", + "target": "SimpleX Chat", + "type": "weak", + "category": "messaging" + }, + { + "source": "Snikket", + "target": "Movim", + "type": "weak", + "category": "messaging" + }, + { + "source": "Snikket", + "target": "Jabber", + "type": "weak", + "category": "messaging" + }, + { + "source": "Snikket", + "target": "Briar", + "type": "weak", + "category": "messaging" + }, + { + "source": "Snikket", + "target": "Jami", + "type": "weak", + "category": "messaging" + }, + { + "source": "Snikket", + "target": "SimpleX Chat", + "type": "weak", + "category": "messaging" + }, + { + "source": "Movim", + "target": "Jabber", + "type": "weak", + "category": "messaging" + }, + { + "source": "Movim", + "target": "Briar", + "type": "weak", + "category": "messaging" + }, + { + "source": "Movim", + "target": "Jami", + "type": "weak", + "category": "messaging" + }, + { + "source": "Movim", + "target": "SimpleX Chat", + "type": "weak", + "category": "messaging" + }, + { + "source": "Jabber", + "target": "Briar", + "type": "weak", + "category": "messaging" + }, + { + "source": "Jabber", + "target": "Jami", + "type": "weak", + "category": "messaging" + }, + { + "source": "Jabber", + "target": "SimpleX Chat", + "type": "weak", + "category": "messaging" + }, + { + "source": "Bluesky", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Bluesky", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Graysky", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Briar", + "target": "Jami", + "type": "weak", + "category": "messaging" + }, + { + "source": "Briar", + "target": "SimpleX Chat", + "type": "weak", + "category": "messaging" + }, + { + "source": "Jami", + "target": "SimpleX Chat", + "type": "weak", + "category": "messaging" + }, + { + "source": "CryptPad", + "target": "HedgeDoc", + "type": "weak", + "category": "collab" + }, + { + "source": "CryptPad", + "target": "Immich", + "type": "weak", + "category": "collab" + }, + { + "source": "CryptPad", + "target": "PhotoPrism", + "type": "weak", + "category": "collab" + }, + { + "source": "CryptPad", + "target": "Synapse", + "type": "weak", + "category": "collab" + }, + { + "source": "CryptPad", + "target": "Dendrite", + "type": "weak", + "category": "collab" + }, + { + "source": "CryptPad", + "target": "Conduit", + "type": "weak", + "category": "collab" + }, + { + "source": "CryptPad", + "target": "Cinny", + "type": "weak", + "category": "collab" + }, + { + "source": "CryptPad", + "target": "FluffyChat", + "type": "weak", + "category": "collab" + }, + { + "source": "HedgeDoc", + "target": "Immich", + "type": "weak", + "category": "collab" + }, + { + "source": "HedgeDoc", + "target": "PhotoPrism", + "type": "weak", + "category": "collab" + }, + { + "source": "HedgeDoc", + "target": "Synapse", + "type": "weak", + "category": "collab" + }, + { + "source": "HedgeDoc", + "target": "Dendrite", + "type": "weak", + "category": "collab" + }, + { + "source": "HedgeDoc", + "target": "Conduit", + "type": "weak", + "category": "collab" + }, + { + "source": "HedgeDoc", + "target": "Cinny", + "type": "weak", + "category": "collab" + }, + { + "source": "HedgeDoc", + "target": "FluffyChat", + "type": "weak", + "category": "collab" + }, + { + "source": "Immich", + "target": "PhotoPrism", + "type": "weak", + "category": "collab" + }, + { + "source": "Immich", + "target": "Synapse", + "type": "weak", + "category": "collab" + }, + { + "source": "Immich", + "target": "Dendrite", + "type": "weak", + "category": "collab" + }, + { + "source": "Immich", + "target": "Conduit", + "type": "weak", + "category": "collab" + }, + { + "source": "Immich", + "target": "Cinny", + "type": "weak", + "category": "collab" + }, + { + "source": "Immich", + "target": "FluffyChat", + "type": "weak", + "category": "collab" + }, + { + "source": "PhotoPrism", + "target": "Synapse", + "type": "weak", + "category": "collab" + }, + { + "source": "PhotoPrism", + "target": "Dendrite", + "type": "weak", + "category": "collab" + }, + { + "source": "PhotoPrism", + "target": "Conduit", + "type": "weak", + "category": "collab" + }, + { + "source": "PhotoPrism", + "target": "Cinny", + "type": "weak", + "category": "collab" + }, + { + "source": "PhotoPrism", + "target": "FluffyChat", + "type": "weak", + "category": "collab" + }, + { + "source": "Synapse", + "target": "Dendrite", + "type": "weak", + "category": "collab" + }, + { + "source": "Synapse", + "target": "Conduit", + "type": "weak", + "category": "collab" + }, + { + "source": "Synapse", + "target": "Cinny", + "type": "weak", + "category": "collab" + }, + { + "source": "Synapse", + "target": "FluffyChat", + "type": "weak", + "category": "collab" + }, + { + "source": "Dendrite", + "target": "Conduit", + "type": "weak", + "category": "collab" + }, + { + "source": "Dendrite", + "target": "Cinny", + "type": "weak", + "category": "collab" + }, + { + "source": "Dendrite", + "target": "FluffyChat", + "type": "weak", + "category": "collab" + }, + { + "source": "Conduit", + "target": "Cinny", + "type": "weak", + "category": "collab" + }, + { + "source": "Conduit", + "target": "FluffyChat", + "type": "weak", + "category": "collab" + }, + { + "source": "Cinny", + "target": "FluffyChat", + "type": "weak", + "category": "collab" + }, + { + "source": "FediBridge", + "target": "ActivityPub Relay", + "type": "weak", + "category": "dev" + }, + { + "source": "Nostr Protocol", + "target": "Damus", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostr Protocol", + "target": "Amethyst", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostr Protocol", + "target": "Iris", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostr Protocol", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostr Protocol", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostr Protocol", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostr Protocol", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "Damus", + "target": "Amethyst", + "type": "weak", + "category": "nostr" + }, + { + "source": "Damus", + "target": "Iris", + "type": "weak", + "category": "nostr" + }, + { + "source": "Damus", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "Damus", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "Damus", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "Damus", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "Amethyst", + "target": "Iris", + "type": "weak", + "category": "nostr" + }, + { + "source": "Amethyst", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "Amethyst", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "Amethyst", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "Amethyst", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "Iris", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "Iris", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "Iris", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "Iris", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "Primal", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "Primal", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "Primal", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "Habla.news", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "Habla.news", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostr.band", + "target": "Snort", + "type": "weak", + "category": "nostr" + } + ] + } +} \ No newline at end of file diff --git a/atlas-fediverse/src/lib/data/index.test.ts b/atlas-fediverse/src/lib/data/index.test.ts new file mode 100644 index 0000000..f3730aa --- /dev/null +++ b/atlas-fediverse/src/lib/data/index.test.ts @@ -0,0 +1,54 @@ +import { describe, expect, it } from 'vitest'; +import { + categories, + categoryById, + networkData, + protocols, + softwares, + stats +} from './index'; +import { timelineEvents } from './timeline'; +import { bridges } from './bridges'; + +describe('données de l’Atlas', () => { + it('référence 105 logiciels, 12 protocoles, 14 catégories', () => { + expect(softwares).toHaveLength(105); + expect(protocols).toHaveLength(12); + expect(categories).toHaveLength(14); + }); + + it('chaque logiciel pointe vers une catégorie existante', () => { + for (const software of softwares) { + expect(categoryById.has(software.category)).toBe(true); + } + }); + + it('les compteurs dérivés sont cohérents avec les métadonnées', () => { + expect(stats.totalSoftwares).toBe(105); + expect(stats.activeSoftwares).toBe(93); + }); + + it('le graphe réseau est déterministe et couvre les 105 logiciels', () => { + expect(networkData.nodes).toHaveLength(105); + expect(networkData.links.length).toBeGreaterThan(0); + const nodeIds = new Set(networkData.nodes.map((n) => n.id)); + for (const link of networkData.links) { + const source = typeof link.source === 'string' ? link.source : link.source.id; + const target = typeof link.target === 'string' ? link.target : link.target.id; + expect(nodeIds.has(source)).toBe(true); + expect(nodeIds.has(target)).toBe(true); + } + }); + + it('la chronologie couvre 2008 → 2026 dans l’ordre croissant', () => { + expect(timelineEvents.length).toBeGreaterThanOrEqual(30); + expect(timelineEvents[0].year).toBe(2008); + for (let i = 1; i < timelineEvents.length; i++) { + expect(timelineEvents[i].year).toBeGreaterThanOrEqual(timelineEvents[i - 1].year); + } + }); + + it('les ponts Nostr ↔ ActivityPub sont présents', () => { + expect(bridges.length).toBeGreaterThanOrEqual(5); + }); +}); diff --git a/atlas-fediverse/src/lib/data/index.ts b/atlas-fediverse/src/lib/data/index.ts new file mode 100644 index 0000000..5d543aa --- /dev/null +++ b/atlas-fediverse/src/lib/data/index.ts @@ -0,0 +1,52 @@ +/* Point d'entrée des données de l'Atlas — modules JSON typés. + Source de vérité : /public/data du projet v4 (réutilisés tels quels). */ + +import softwareJson from './software.json'; +import protocolsJson from './protocols.json'; +import categoriesJson from './categories.json'; +import networkJson from './network.json'; +import metadataJson from './metadata.json'; +import type { Category, NetworkData, Protocol, Software } from './types'; + +export const softwares = softwareJson as Software[]; +export const protocols = protocolsJson as Protocol[]; +export const categories = categoriesJson as Category[]; +export const networkData = networkJson as NetworkData; +export const metadata = metadataJson; + +export const categoryById: ReadonlyMap = new Map(categories.map((c) => [c.id, c])); + +export const softwareById: ReadonlyMap = new Map(softwares.map((s) => [s.id, s])); + +/** Ordre de tri des états d'activité (Actif d'abord). */ +export const ETAT_ORDER: readonly Software['etat'][] = [ + 'Actif', + 'Maintenance', + 'Experimental', + 'Historique' +]; + +export const ETATS: readonly Software['etat'][] = ETAT_ORDER; + +export const COMPATIBILITES_AP: readonly Software['compatibiliteAP'][] = [ + 'Pleine', + 'Partielle', + 'Extension', + 'Aucune', + 'En développement' +]; + +export function softwaresByCategory(categoryId: string): Software[] { + return softwares.filter((s) => s.category === categoryId); +} + +export const stats = { + totalSoftwares: softwares.length, + totalProtocols: protocols.length, + totalCategories: categories.length, + activeSoftwares: softwares.filter((s) => s.etat === 'Actif').length, + networkLinks: networkData.links.length, + yearsOfHistory: new Date().getFullYear() - 2008 +} as const; + +export type { Category, NetworkData, NetworkLink, NetworkNode, Protocol, Software } from './types'; diff --git a/atlas-fediverse/src/lib/data/metadata.json b/atlas-fediverse/src/lib/data/metadata.json new file mode 100644 index 0000000..86fc685 --- /dev/null +++ b/atlas-fediverse/src/lib/data/metadata.json @@ -0,0 +1,27 @@ +{ + "title": "Le Grand Atlas du Fédiverse", + "version": "4.0", + "year": 2026, + "language": "fr", + "licence": "CC BY-SA 4.0", + "lastUpdated": "2026-07-12", + "statistics": { + "totalSoftwares": 105, + "totalProtocols": 12, + "totalCategories": 14, + "activeSoftwares": 93, + "maintenanceSoftwares": 4, + "experimentalSoftwares": 5, + "historicalSoftwares": 3, + "fullAPCompatibility": 45, + "partialAPCompatibility": 4, + "extensionAPCompatibility": 9 + }, + "attribution": { + "inspiredBy": "Per Axbom (axbom.com/fediverse)", + "originalVersion": "3.0 (January 2023)", + "maintainers": [ + "Community" + ] + } +} \ No newline at end of file diff --git a/atlas-fediverse/src/lib/data/network.json b/atlas-fediverse/src/lib/data/network.json new file mode 100644 index 0000000..1d6fa98 --- /dev/null +++ b/atlas-fediverse/src/lib/data/network.json @@ -0,0 +1,6278 @@ +{ + "nodes": [ + { + "id": "Mastodon", + "group": 1, + "val": 8, + "description": "Le réseau social fédéré le plus populaire. Microblogging avec une audience mondiale.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "GoToSocial", + "group": 1, + "val": 8, + "description": "Serveur ActivityPub léger et rapide écrit en Go. Approche minimaliste et efficace.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Akkoma", + "group": 1, + "val": 8, + "description": "Fork de Pleroma avec des fonctionnalités enrichies et une personnalisation avancée.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Pleroma", + "group": 1, + "val": 8, + "description": "Serveur ActivityPub léger et hautement configurable. Alternative rapide à Mastodon.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Misskey", + "group": 1, + "val": 8, + "description": "Plateforme sociale japonaise avec des fonctionnalités créatives (notes, réactions, drive).", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Sharkey", + "group": 1, + "val": 8, + "description": "Fork de Misskey avec des améliorations de performance et de nouvelles fonctionnalités.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Friendica", + "group": 1, + "val": 8, + "description": "Réseau social décentralisé avec interopérabilité étendue (ActivityPub, Diaspora*, RSS).", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Hubzilla", + "group": 1, + "val": 8, + "description": "Plateforme de communications décentralisées avec contrôle d'accès avancé et nomadisme d'identité.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Partielle", + "licence": "MIT" + }, + { + "id": "Streams", + "group": 1, + "val": 8, + "description": "Fork de Hubzilla axé sur la privacy et le contrôle granulaire des permissions.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Partielle", + "licence": "MIT" + }, + { + "id": "Iceshrimp", + "group": 1, + "val": 8, + "description": "Fork de Misskey optimisé pour la performance et la stabilité.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "GNU social", + "group": 1, + "val": 5, + "description": "Pionnier des réseaux sociaux fédérés. Précurseur historique du Fédiverse.", + "category": "social", + "color": "#4CC9F0", + "etat": "Maintenance", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Bonfire", + "group": 1, + "val": 8, + "description": "Réseau social modulaire écrit en Elixir axé sur la gouvernance communautaire.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "microblog.pub", + "group": 2, + "val": 8, + "description": "Serveur ActivityPub minimaliste et auto-hébergeable pour le microblogging.", + "category": "microblog", + "color": "#F9C74F", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "PixelFed", + "group": 3, + "val": 8, + "description": "Plateforme de partage de photos fédérée. Alternative à Instagram.", + "category": "photo", + "color": "#F8961E", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Vernissage", + "group": 3, + "val": 8, + "description": "Application de galerie photo fédérée pour le Fédiverse.", + "category": "photo", + "color": "#F8961E", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "EUPL-1.2" + }, + { + "id": "PeerTube", + "group": 4, + "val": 8, + "description": "Plateforme vidéo fédérée décentralisée. Alternative à YouTube.", + "category": "video", + "color": "#F72585", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Owncast", + "group": 4, + "val": 8, + "description": "Serveur de streaming live auto-hébergeable. Alternative à Twitch.", + "category": "video", + "color": "#F72585", + "etat": "Actif", + "compatibiliteAP": "Extension", + "licence": "MIT" + }, + { + "id": "Tube (Framasoft)", + "group": 4, + "val": 3, + "description": "Ancien nom du projet ayant mené à PeerTube.", + "category": "video", + "color": "#F72585", + "etat": "Historique", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Castopod", + "group": 5, + "val": 8, + "description": "Plateforme de podcasting fédérée avec ActivityPub. Alternative à Spotify/Apple Podcasts.", + "category": "audio", + "color": "#B5179E", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Funkwhale", + "group": 5, + "val": 8, + "description": "Plateforme musicale fédérée pour écouter et partager de la musique.", + "category": "audio", + "color": "#B5179E", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Loops", + "group": 4, + "val": 8, + "description": "Plateforme de vidéos courtes fédérée. Alternative à TikTok/Instagram Reels.", + "category": "video", + "color": "#F72585", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Ghost", + "group": 6, + "val": 8, + "description": "Plateforme de publication professionnelle avec support ActivityPub.", + "category": "blog", + "color": "#7209B7", + "etat": "Actif", + "compatibiliteAP": "Extension", + "licence": "MIT" + }, + { + "id": "WriteFreely", + "group": 6, + "val": 8, + "description": "Plateforme de blogging minimaliste et fédérée axée sur l'écriture.", + "category": "blog", + "color": "#7209B7", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Plume", + "group": 6, + "val": 5, + "description": "Moteur de blog fédéré axé sur la collaboration et la publication longue.", + "category": "blog", + "color": "#7209B7", + "etat": "Maintenance", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "WordPress + ActivityPub", + "group": 6, + "val": 8, + "description": "Plugin ActivityPub pour WordPress permettant de fédérer les publications.", + "category": "blog", + "color": "#7209B7", + "etat": "Actif", + "compatibiliteAP": "Extension", + "licence": "MIT" + }, + { + "id": "Drupal + ActivityPub", + "group": 6, + "val": 8, + "description": "Module ActivityPub pour Drupal permettant la fédération des contenus.", + "category": "blog", + "color": "#7209B7", + "etat": "Actif", + "compatibiliteAP": "Extension", + "licence": "GPL-2.0" + }, + { + "id": "Lemmy", + "group": 7, + "val": 8, + "description": "Agrégateur de liens et forum fédéré. Alternative à Reddit.", + "category": "forum", + "color": "#3A0CA3", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Mbin", + "group": 7, + "val": 8, + "description": "Successeur de kbin, agrégateur de liens fédéré avec des fonctionnalités améliorées.", + "category": "forum", + "color": "#3A0CA3", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "NodeBB", + "group": 7, + "val": 8, + "description": "Forum moderne avec support ActivityPub pour la fédération.", + "category": "forum", + "color": "#3A0CA3", + "etat": "Actif", + "compatibiliteAP": "Extension", + "licence": "GPL-3.0" + }, + { + "id": "Mobilizon", + "group": 8, + "val": 8, + "description": "Plateforme d\\événements fédérée pour organiser et découvrir des événements.", + "category": "events", + "color": "#4361EE", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Gancio", + "group": 8, + "val": 8, + "description": "Agrégateur d\\événements fédéré auto-hébergeable.", + "category": "events", + "color": "#4361EE", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Forgejo", + "group": 9, + "val": 8, + "description": "Forge logicielle libre forkée de Gitea. Support ActivityPub en développement.", + "category": "dev", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "En développement", + "licence": "MIT" + }, + { + "id": "Gitea", + "group": 9, + "val": 8, + "description": "Forge logicielle légère et rapide avec support ActivityPub via plugin.", + "category": "dev", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Extension", + "licence": "MIT" + }, + { + "id": "Nextcloud", + "group": 10, + "val": 8, + "description": "Suite de collaboration cloud auto-hébergeable avec support ActivityPub.", + "category": "collab", + "color": "#2EC4B6", + "etat": "Actif", + "compatibiliteAP": "Extension", + "licence": "AGPL-3.0" + }, + { + "id": "ownCloud", + "group": 10, + "val": 8, + "description": "Plateforme de partage de fichiers et de collaboration en ligne.", + "category": "collab", + "color": "#2EC4B6", + "etat": "Actif", + "compatibiliteAP": "Extension", + "licence": "AGPL-3.0" + }, + { + "id": "BookWyrm", + "group": 11, + "val": 8, + "description": "Réseau social de lecture fédéré. Alternative à Goodreads.", + "category": "books", + "color": "#E71D36", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Wikidata", + "group": 12, + "val": 8, + "description": "Base de connaissances libre et collaborative structurée.", + "category": "wiki", + "color": "#662E9B", + "etat": "Actif", + "compatibiliteAP": "Partielle", + "licence": "CC0" + }, + { + "id": "Diaspora*", + "group": 1, + "val": 5, + "description": "Réseau social décentralisé historique. Précurseur du Fédiverse moderne.", + "category": "social", + "color": "#4CC9F0", + "etat": "Maintenance", + "compatibiliteAP": "Aucune", + "licence": "AGPL-3.0" + }, + { + "id": "Element", + "group": 10, + "val": 8, + "description": "Client Matrix pour la messagerie temps réel fédérée.", + "category": "collab", + "color": "#2EC4B6", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "Apache-2.0" + }, + { + "id": "Fedify", + "group": 9, + "val": 8, + "description": "Framework TypeScript/Deno pour construire des serveurs ActivityPub.", + "category": "dev", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "MIT" + }, + { + "id": "Mitra", + "group": 1, + "val": 8, + "description": "Serveur ActivityPub écrit en Rust avec support des monnaies complémentaires.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Socialhome", + "group": 1, + "val": 5, + "description": "Réseau social fédéré avec un flux de contenu personnalisable.", + "category": "social", + "color": "#4CC9F0", + "etat": "Maintenance", + "compatibiliteAP": "Partielle", + "licence": "AGPL-3.0" + }, + { + "id": "kbin", + "group": 7, + "val": 3, + "description": "Agrégateur de contenu fédéré. Prédécesseur de Mbin.", + "category": "forum", + "color": "#3A0CA3", + "etat": "Historique", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Epicyon", + "group": 1, + "val": 8, + "description": "Serveur ActivityPub minimaliste avec approche low-tech. Conçu pour les petites instances communautaires.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Takahē", + "group": 1, + "val": 8, + "description": "Serveur ActivityPub multi-domaine moderne. Permet d'héberger plusieurs domaines sur une seule instance.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "BSD" + }, + { + "id": "Smithereen", + "group": 1, + "val": 8, + "description": "Serveur ActivityPub axé sur les réseaux sociaux avec interface style VKontakte.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Kroeg", + "group": 1, + "val": 3, + "description": "Serveur ActivityPub en Rust avec architecture modulaire et extensible.", + "category": "social", + "color": "#4CC9F0", + "etat": "Experimental", + "compatibiliteAP": "Pleine", + "licence": "MIT" + }, + { + "id": "Lotide", + "group": 7, + "val": 8, + "description": "Agrégateur de liens fédéré léger. Alternative minimaliste à Lemmy.", + "category": "forum", + "color": "#3A0CA3", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Sublinks", + "group": 7, + "val": 8, + "description": "Plateforme de forums fédérée. Fork moderne de Lemmy avec des améliorations significatives.", + "category": "forum", + "color": "#3A0CA3", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "RoadHouse", + "group": 7, + "val": 3, + "description": "Plateforme de forums fédérée avec une approche communautaire différente.", + "category": "forum", + "color": "#3A0CA3", + "etat": "Experimental", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Pieoneers", + "group": 1, + "val": 3, + "description": "Plateforme de partage de recettes fédérée avec ActivityPub.", + "category": "social", + "color": "#4CC9F0", + "etat": "Experimental", + "compatibiliteAP": "Pleine", + "licence": "MIT" + }, + { + "id": "WordPress MU + ActivityPub", + "group": 6, + "val": 8, + "description": "Plugin ActivityPub pour WordPress Multisite. Permet de fédérer des réseaux de blogs.", + "category": "blog", + "color": "#7209B7", + "etat": "Actif", + "compatibiliteAP": "Extension", + "licence": "MIT" + }, + { + "id": "Emissary", + "group": 1, + "val": 8, + "description": "Serveur ActivityPub modulaire avec support de streams et de collections.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "MIT" + }, + { + "id": "Hometown", + "group": 1, + "val": 8, + "description": "Fork de Mastodon avec des fonctionnalités communautaires additionnelles.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "GlitchSoc", + "group": 1, + "val": 8, + "description": "Fork de Mastodon avec des fonctionnalités expérimentales et une customisation poussée.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Akkoma-FE", + "group": 1, + "val": 8, + "description": "Frontend alternatif pour Akkoma avec des améliorations UI/UX.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Postmarks", + "group": 1, + "val": 8, + "description": "Système de bookmarks/bookmarques fédéré avec ActivityPub. Partagez vos signets.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "MIT" + }, + { + "id": "AodeRelay", + "group": 9, + "val": 8, + "description": "Relay ActivityPub pour connecter des instances et améliorer la découverte.", + "category": "dev", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "Coracle", + "group": 14, + "val": 8, + "description": "Client web Nostr haut de gamme avec une interface soignée et des performances optimisées.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "Nostrudel", + "group": 14, + "val": 8, + "description": "Client web Nostr avec UX moderne et support avancé des relays.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "Lume", + "group": 14, + "val": 8, + "description": "Client desktop Nostr rapide et léger.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "GPL-3.0" + }, + { + "id": "Gossip", + "group": 14, + "val": 8, + "description": "Client desktop Nostr en Rust avec interface native rapide.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "Current", + "group": 14, + "val": 8, + "description": "Client iOS Nostr avec une interface épurée et moderne.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "Plebstr", + "group": 14, + "val": 8, + "description": "Client mobile Nostr pour iOS et Android.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "Nostrpels", + "group": 14, + "val": 3, + "description": "Client Nostr avec support de médias riches et expérience sociale améliorée.", + "category": "nostr", + "color": "#F7931A", + "etat": "Experimental", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "ZapStream", + "group": 14, + "val": 8, + "description": "Plateforme de streaming live sur Nostr avec Lightning Zaps intégrés.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "NostrCheck.me", + "group": 14, + "val": 8, + "description": "Service de vérification d'identité et de badges pour Nostr.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "NostrMarket", + "group": 14, + "val": 8, + "description": "Place de marché décentralisée sur Nostr. Commerce P2P avec Lightning.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "Prosody", + "group": 13, + "val": 8, + "description": "Serveur XMPP moderne, léger et facile à configurer.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "ejabberd", + "group": 13, + "val": 8, + "description": "Serveur XMPP robuste et scalable utilisé par de grandes plateformes.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "GPL-2.0" + }, + { + "id": "Openfire", + "group": 13, + "val": 8, + "description": "Serveur XMPP en Java avec interface d'administration web.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "Apache-2.0" + }, + { + "id": "Tigase", + "group": 13, + "val": 8, + "description": "Serveur XMPP en Java avec support avancé de clustering.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "AGPL-3.0" + }, + { + "id": "Conversations", + "group": 13, + "val": 8, + "description": "Client XMPP Android moderne. Référence du messaging mobile décentralisé.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "GPL-3.0" + }, + { + "id": "Dino", + "group": 13, + "val": 8, + "description": "Client XMPP desktop moderne pour Linux. Interface épurée et moderne.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "GPL-3.0" + }, + { + "id": "Gajim", + "group": 13, + "val": 8, + "description": "Client XMPP desktop complet. Le client de référence historique.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "GPL-3.0" + }, + { + "id": "Monal", + "group": 13, + "val": 8, + "description": "Client XMPP pour iOS et macOS. Le meilleur client Apple pour XMPP.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "BSD" + }, + { + "id": "Snikket", + "group": 13, + "val": 8, + "description": "'Le Mastodon du XMPP' — bundle serveur + client qui simplifie XMPP pour le grand public.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "AGPL-3.0" + }, + { + "id": "Movim", + "group": 13, + "val": 8, + "description": "Réseau social basé sur XMPP. Interface web moderne avec microblogging.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "AGPL-3.0" + }, + { + "id": "Jabber", + "group": 13, + "val": 3, + "description": "Le protocole historique de messagerie instantanée. Ancêtre de XMPP, toujours utilisé.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Historique", + "compatibiliteAP": "Aucune", + "licence": "Open Standard" + }, + { + "id": "Bluesky", + "group": 1, + "val": 8, + "description": "Le réseau social décentralisé basé sur AT Protocol. Créé par l'ancienne équipe de Twitter.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "Proprietary" + }, + { + "id": "Graysky", + "group": 1, + "val": 8, + "description": "Client alternatif pour Bluesky/AT Protocol. iOS et Android.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "Tokimeki", + "group": 1, + "val": 8, + "description": "Client web alternatif pour Bluesky avec approche japonaise.", + "category": "social", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "Briar", + "group": 13, + "val": 8, + "description": "Messagerie P2P via Bluetooth/WiFi/Tor. Fonctionne sans connexion Internet.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "GPL-3.0" + }, + { + "id": "Jami", + "group": 13, + "val": 8, + "description": "Communication décentralisée GNU. Messages, appels vidéo, partage d'écran — tout en P2P.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "GPL-3.0" + }, + { + "id": "CryptPad", + "group": 10, + "val": 8, + "description": "Suite bureautique chiffrée de bout en bout. Documents, tableurs, présentations, votes.", + "category": "collab", + "color": "#2EC4B6", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "AGPL-3.0" + }, + { + "id": "HedgeDoc", + "group": 10, + "val": 8, + "description": "Édition collaborative de Markdown en temps réel.", + "category": "collab", + "color": "#2EC4B6", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "AGPL-3.0" + }, + { + "id": "Immich", + "group": 10, + "val": 8, + "description": "Auto-hébergement de photos et vidéos avec IA. Alternative à Google Photos.", + "category": "collab", + "color": "#2EC4B6", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "AGPL-3.0" + }, + { + "id": "PhotoPrism", + "group": 10, + "val": 8, + "description": "Gestion de photos auto-hébergée avec IA. Reconnaissance faciale et classement automatique.", + "category": "collab", + "color": "#2EC4B6", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "AGPL-3.0" + }, + { + "id": "Synapse", + "group": 10, + "val": 8, + "description": "Serveur Matrix de référence par Element. Le serveur le plus utilisé de l'écosystème Matrix.", + "category": "collab", + "color": "#2EC4B6", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "Apache-2.0" + }, + { + "id": "Dendrite", + "group": 10, + "val": 8, + "description": "Serveur Matrix de deuxième génération par Element. Plus léger et performant que Synapse.", + "category": "collab", + "color": "#2EC4B6", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "Apache-2.0" + }, + { + "id": "Conduit", + "group": 10, + "val": 8, + "description": "Serveur Matrix léger en Rust. Alternative rapide et efficace à Synapse.", + "category": "collab", + "color": "#2EC4B6", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "Apache-2.0" + }, + { + "id": "Cinny", + "group": 10, + "val": 8, + "description": "Client web Matrix avec interface moderne et intuitive. Alternative à Element.", + "category": "collab", + "color": "#2EC4B6", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "FluffyChat", + "group": 10, + "val": 8, + "description": "Client Matrix pour mobile et desktop. Interface douce et accessible.", + "category": "collab", + "color": "#2EC4B6", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "AGPL-3.0" + }, + { + "id": "FediBridge", + "group": 9, + "val": 3, + "description": "Outil de bridge entre différents réseaux fédérés. Interconnexion multi-protocoles.", + "category": "dev", + "color": "#4CC9F0", + "etat": "Experimental", + "compatibiliteAP": "Pleine", + "licence": "MIT" + }, + { + "id": "ActivityPub Relay", + "group": 9, + "val": 8, + "description": "Relay public pour connecter des instances ActivityPub et améliorer la fédération.", + "category": "dev", + "color": "#4CC9F0", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "MIT" + }, + { + "id": "Sepia Search", + "group": 4, + "val": 8, + "description": "Moteur de recherche fédéré pour PeerTube. Recherche cross-instance.", + "category": "video", + "color": "#F72585", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "licence": "AGPL-3.0" + }, + { + "id": "SimpleX Chat", + "group": 13, + "val": 8, + "description": "Messagerie décentralisée de nouvelle génération sans identifiants d'utilisateur. Protection de la vie privée par défaut avec chiffrement de bout en bout.", + "category": "messaging", + "color": "#06D6A0", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "AGPL-3.0" + }, + { + "id": "Nostr Protocol", + "group": 14, + "val": 8, + "description": "Protocole simple et ouvert pour créer des réseaux sociaux résistants à la censure, basé sur des relays et des clés cryptographiques.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "Public Domain" + }, + { + "id": "Damus", + "group": 14, + "val": 8, + "description": "Client iOS pour Nostr. Le client mobile le plus populaire de l'écosystème Nostr.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "GPL-3.0" + }, + { + "id": "Amethyst", + "group": 14, + "val": 8, + "description": "Client Android pour Nostr. Application native Kotlin avec support complet des NIPs.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "Iris", + "group": 14, + "val": 8, + "description": "Client web pour Nostr. Interface moderne et réactive pour le réseau Nostr.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "Primal", + "group": 14, + "val": 8, + "description": "Client Nostr avec un backend optimisé pour des performances ultra-rapides.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "Proprietary" + }, + { + "id": "Habla.news", + "group": 14, + "val": 8, + "description": "Plateforme de publication longue sur Nostr. Alternative à Medium.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "Nostr.band", + "group": 14, + "val": 8, + "description": "Moteur de recherche et explorateur pour le réseau Nostr.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + }, + { + "id": "Snort", + "group": 14, + "val": 8, + "description": "Client web Nostr rapide et léger avec support des relays multiples.", + "category": "nostr", + "color": "#F7931A", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "licence": "MIT" + } + ], + "links": [ + { + "source": "Mastodon", + "target": "GoToSocial", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Akkoma", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Pleroma", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Misskey", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Sharkey", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Friendica", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Hubzilla", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Streams", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Iceshrimp", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "GNU social", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Bonfire", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Castopod", + "type": "strong" + }, + { + "source": "Mastodon", + "target": "Diaspora*", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Fedify", + "type": "strong" + }, + { + "source": "Mastodon", + "target": "Mitra", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Mastodon", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Akkoma", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Pleroma", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Misskey", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Sharkey", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Friendica", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Hubzilla", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Streams", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Iceshrimp", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "GNU social", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Bonfire", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Diaspora*", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Mitra", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "RoadHouse", + "type": "strong" + }, + { + "source": "GoToSocial", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "GoToSocial", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Pleroma", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Misskey", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Sharkey", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Friendica", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Hubzilla", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Streams", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Iceshrimp", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "GNU social", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Bonfire", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "PeerTube", + "type": "strong" + }, + { + "source": "Akkoma", + "target": "Funkwhale", + "type": "strong" + }, + { + "source": "Akkoma", + "target": "Mbin", + "type": "strong" + }, + { + "source": "Akkoma", + "target": "Diaspora*", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Fedify", + "type": "strong" + }, + { + "source": "Akkoma", + "target": "Mitra", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "AodeRelay", + "type": "strong" + }, + { + "source": "Akkoma", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Misskey", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Sharkey", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Friendica", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Hubzilla", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Streams", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Iceshrimp", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "GNU social", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Bonfire", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Castopod", + "type": "strong" + }, + { + "source": "Pleroma", + "target": "BookWyrm", + "type": "strong" + }, + { + "source": "Pleroma", + "target": "Diaspora*", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Mitra", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Lotide", + "type": "strong" + }, + { + "source": "Pleroma", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Pleroma", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Sharkey", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Friendica", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Hubzilla", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Streams", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Iceshrimp", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "GNU social", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Bonfire", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Castopod", + "type": "strong" + }, + { + "source": "Misskey", + "target": "Funkwhale", + "type": "strong" + }, + { + "source": "Misskey", + "target": "Diaspora*", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Mitra", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "kbin", + "type": "strong" + }, + { + "source": "Misskey", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Sublinks", + "type": "strong" + }, + { + "source": "Misskey", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Misskey", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Friendica", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Hubzilla", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Streams", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Iceshrimp", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "GNU social", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Bonfire", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "PeerTube", + "type": "strong" + }, + { + "source": "Sharkey", + "target": "Loops", + "type": "strong" + }, + { + "source": "Sharkey", + "target": "WriteFreely", + "type": "strong" + }, + { + "source": "Sharkey", + "target": "BookWyrm", + "type": "strong" + }, + { + "source": "Sharkey", + "target": "Diaspora*", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Mitra", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "RoadHouse", + "type": "strong" + }, + { + "source": "Sharkey", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Sharkey", + "target": "FediBridge", + "type": "strong" + }, + { + "source": "Friendica", + "target": "Hubzilla", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Streams", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Iceshrimp", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "GNU social", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Bonfire", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Funkwhale", + "type": "strong" + }, + { + "source": "Friendica", + "target": "Loops", + "type": "strong" + }, + { + "source": "Friendica", + "target": "Diaspora*", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Mitra", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Friendica", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Streams", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Iceshrimp", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "GNU social", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Bonfire", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Diaspora*", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Mitra", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Hubzilla", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Iceshrimp", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "GNU social", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Bonfire", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Diaspora*", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Mitra", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Streams", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "GNU social", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Bonfire", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Diaspora*", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Mitra", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Sublinks", + "type": "strong" + }, + { + "source": "Iceshrimp", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "AodeRelay", + "type": "strong" + }, + { + "source": "Iceshrimp", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Iceshrimp", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Bonfire", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Diaspora*", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Mitra", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "GNU social", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "PeerTube", + "type": "strong" + }, + { + "source": "Bonfire", + "target": "Funkwhale", + "type": "strong" + }, + { + "source": "Bonfire", + "target": "Plume", + "type": "strong" + }, + { + "source": "Bonfire", + "target": "Diaspora*", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Mitra", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Bonfire", + "target": "Sepia Search", + "type": "strong" + }, + { + "source": "microblog.pub", + "target": "WriteFreely", + "type": "strong" + }, + { + "source": "microblog.pub", + "target": "BookWyrm", + "type": "strong" + }, + { + "source": "microblog.pub", + "target": "Smithereen", + "type": "strong" + }, + { + "source": "microblog.pub", + "target": "Lotide", + "type": "strong" + }, + { + "source": "microblog.pub", + "target": "Emissary", + "type": "strong" + }, + { + "source": "PixelFed", + "target": "Vernissage", + "type": "weak", + "category": "photo" + }, + { + "source": "PixelFed", + "target": "PeerTube", + "type": "strong" + }, + { + "source": "PixelFed", + "target": "Takahē", + "type": "strong" + }, + { + "source": "PixelFed", + "target": "Kroeg", + "type": "strong" + }, + { + "source": "PixelFed", + "target": "Hometown", + "type": "strong" + }, + { + "source": "PixelFed", + "target": "Sepia Search", + "type": "strong" + }, + { + "source": "Vernissage", + "target": "WriteFreely", + "type": "strong" + }, + { + "source": "Vernissage", + "target": "Plume", + "type": "strong" + }, + { + "source": "Vernissage", + "target": "RoadHouse", + "type": "strong" + }, + { + "source": "PeerTube", + "target": "Owncast", + "type": "weak", + "category": "video" + }, + { + "source": "PeerTube", + "target": "Tube (Framasoft)", + "type": "weak", + "category": "video" + }, + { + "source": "PeerTube", + "target": "Loops", + "type": "weak", + "category": "video" + }, + { + "source": "PeerTube", + "target": "Mbin", + "type": "strong" + }, + { + "source": "PeerTube", + "target": "Kroeg", + "type": "strong" + }, + { + "source": "PeerTube", + "target": "Sublinks", + "type": "strong" + }, + { + "source": "PeerTube", + "target": "Hometown", + "type": "strong" + }, + { + "source": "PeerTube", + "target": "FediBridge", + "type": "strong" + }, + { + "source": "PeerTube", + "target": "Sepia Search", + "type": "weak", + "category": "video" + }, + { + "source": "Owncast", + "target": "Tube (Framasoft)", + "type": "weak", + "category": "video" + }, + { + "source": "Owncast", + "target": "Loops", + "type": "weak", + "category": "video" + }, + { + "source": "Owncast", + "target": "Sepia Search", + "type": "weak", + "category": "video" + }, + { + "source": "Tube (Framasoft)", + "target": "Loops", + "type": "weak", + "category": "video" + }, + { + "source": "Tube (Framasoft)", + "target": "Kroeg", + "type": "strong" + }, + { + "source": "Tube (Framasoft)", + "target": "Sublinks", + "type": "strong" + }, + { + "source": "Tube (Framasoft)", + "target": "Sepia Search", + "type": "weak", + "category": "video" + }, + { + "source": "Castopod", + "target": "Funkwhale", + "type": "weak", + "category": "audio" + }, + { + "source": "Castopod", + "target": "Plume", + "type": "strong" + }, + { + "source": "Castopod", + "target": "Lemmy", + "type": "strong" + }, + { + "source": "Castopod", + "target": "BookWyrm", + "type": "strong" + }, + { + "source": "Castopod", + "target": "Smithereen", + "type": "strong" + }, + { + "source": "Castopod", + "target": "ActivityPub Relay", + "type": "strong" + }, + { + "source": "Funkwhale", + "target": "Epicyon", + "type": "strong" + }, + { + "source": "Funkwhale", + "target": "Lotide", + "type": "strong" + }, + { + "source": "Funkwhale", + "target": "RoadHouse", + "type": "strong" + }, + { + "source": "Funkwhale", + "target": "Emissary", + "type": "strong" + }, + { + "source": "Loops", + "target": "Mitra", + "type": "strong" + }, + { + "source": "Loops", + "target": "kbin", + "type": "strong" + }, + { + "source": "Loops", + "target": "Takahē", + "type": "strong" + }, + { + "source": "Loops", + "target": "RoadHouse", + "type": "strong" + }, + { + "source": "Loops", + "target": "Postmarks", + "type": "strong" + }, + { + "source": "Loops", + "target": "Sepia Search", + "type": "weak", + "category": "video" + }, + { + "source": "Ghost", + "target": "WriteFreely", + "type": "weak", + "category": "blog" + }, + { + "source": "Ghost", + "target": "Plume", + "type": "weak", + "category": "blog" + }, + { + "source": "Ghost", + "target": "WordPress + ActivityPub", + "type": "weak", + "category": "blog" + }, + { + "source": "Ghost", + "target": "Drupal + ActivityPub", + "type": "weak", + "category": "blog" + }, + { + "source": "Ghost", + "target": "WordPress MU + ActivityPub", + "type": "weak", + "category": "blog" + }, + { + "source": "WriteFreely", + "target": "Plume", + "type": "weak", + "category": "blog" + }, + { + "source": "WriteFreely", + "target": "WordPress + ActivityPub", + "type": "weak", + "category": "blog" + }, + { + "source": "WriteFreely", + "target": "Drupal + ActivityPub", + "type": "weak", + "category": "blog" + }, + { + "source": "WriteFreely", + "target": "Gancio", + "type": "strong" + }, + { + "source": "WriteFreely", + "target": "Lotide", + "type": "strong" + }, + { + "source": "WriteFreely", + "target": "Sublinks", + "type": "strong" + }, + { + "source": "WriteFreely", + "target": "WordPress MU + ActivityPub", + "type": "weak", + "category": "blog" + }, + { + "source": "Plume", + "target": "WordPress + ActivityPub", + "type": "weak", + "category": "blog" + }, + { + "source": "Plume", + "target": "Drupal + ActivityPub", + "type": "weak", + "category": "blog" + }, + { + "source": "Plume", + "target": "Gancio", + "type": "strong" + }, + { + "source": "Plume", + "target": "BookWyrm", + "type": "strong" + }, + { + "source": "Plume", + "target": "Kroeg", + "type": "strong" + }, + { + "source": "Plume", + "target": "Lotide", + "type": "strong" + }, + { + "source": "Plume", + "target": "Sublinks", + "type": "strong" + }, + { + "source": "Plume", + "target": "WordPress MU + ActivityPub", + "type": "weak", + "category": "blog" + }, + { + "source": "Plume", + "target": "Hometown", + "type": "strong" + }, + { + "source": "Plume", + "target": "Akkoma-FE", + "type": "strong" + }, + { + "source": "Plume", + "target": "AodeRelay", + "type": "strong" + }, + { + "source": "WordPress + ActivityPub", + "target": "Drupal + ActivityPub", + "type": "weak", + "category": "blog" + }, + { + "source": "WordPress + ActivityPub", + "target": "WordPress MU + ActivityPub", + "type": "weak", + "category": "blog" + }, + { + "source": "Drupal + ActivityPub", + "target": "WordPress MU + ActivityPub", + "type": "weak", + "category": "blog" + }, + { + "source": "Lemmy", + "target": "Mbin", + "type": "weak", + "category": "forum" + }, + { + "source": "Lemmy", + "target": "NodeBB", + "type": "weak", + "category": "forum" + }, + { + "source": "Lemmy", + "target": "kbin", + "type": "weak", + "category": "forum" + }, + { + "source": "Lemmy", + "target": "Takahē", + "type": "strong" + }, + { + "source": "Lemmy", + "target": "Smithereen", + "type": "strong" + }, + { + "source": "Lemmy", + "target": "Kroeg", + "type": "strong" + }, + { + "source": "Lemmy", + "target": "Lotide", + "type": "weak", + "category": "forum" + }, + { + "source": "Lemmy", + "target": "Sublinks", + "type": "weak", + "category": "forum" + }, + { + "source": "Lemmy", + "target": "RoadHouse", + "type": "weak", + "category": "forum" + }, + { + "source": "Lemmy", + "target": "Emissary", + "type": "strong" + }, + { + "source": "Mbin", + "target": "NodeBB", + "type": "weak", + "category": "forum" + }, + { + "source": "Mbin", + "target": "Mitra", + "type": "strong" + }, + { + "source": "Mbin", + "target": "kbin", + "type": "weak", + "category": "forum" + }, + { + "source": "Mbin", + "target": "Takahē", + "type": "strong" + }, + { + "source": "Mbin", + "target": "Kroeg", + "type": "strong" + }, + { + "source": "Mbin", + "target": "Lotide", + "type": "weak", + "category": "forum" + }, + { + "source": "Mbin", + "target": "Sublinks", + "type": "weak", + "category": "forum" + }, + { + "source": "Mbin", + "target": "RoadHouse", + "type": "weak", + "category": "forum" + }, + { + "source": "Mbin", + "target": "Pieoneers", + "type": "strong" + }, + { + "source": "Mbin", + "target": "Emissary", + "type": "strong" + }, + { + "source": "NodeBB", + "target": "kbin", + "type": "weak", + "category": "forum" + }, + { + "source": "NodeBB", + "target": "Lotide", + "type": "weak", + "category": "forum" + }, + { + "source": "NodeBB", + "target": "Sublinks", + "type": "weak", + "category": "forum" + }, + { + "source": "NodeBB", + "target": "RoadHouse", + "type": "weak", + "category": "forum" + }, + { + "source": "Mobilizon", + "target": "Gancio", + "type": "weak", + "category": "events" + }, + { + "source": "Mobilizon", + "target": "Fedify", + "type": "strong" + }, + { + "source": "Mobilizon", + "target": "Sublinks", + "type": "strong" + }, + { + "source": "Mobilizon", + "target": "AodeRelay", + "type": "strong" + }, + { + "source": "Mobilizon", + "target": "Sepia Search", + "type": "strong" + }, + { + "source": "Gancio", + "target": "Epicyon", + "type": "strong" + }, + { + "source": "Gancio", + "target": "RoadHouse", + "type": "strong" + }, + { + "source": "Gancio", + "target": "Akkoma-FE", + "type": "strong" + }, + { + "source": "Gancio", + "target": "AodeRelay", + "type": "strong" + }, + { + "source": "Gancio", + "target": "ActivityPub Relay", + "type": "strong" + }, + { + "source": "Forgejo", + "target": "Gitea", + "type": "weak", + "category": "dev" + }, + { + "source": "Forgejo", + "target": "Fedify", + "type": "weak", + "category": "dev" + }, + { + "source": "Forgejo", + "target": "AodeRelay", + "type": "weak", + "category": "dev" + }, + { + "source": "Forgejo", + "target": "FediBridge", + "type": "weak", + "category": "dev" + }, + { + "source": "Forgejo", + "target": "ActivityPub Relay", + "type": "weak", + "category": "dev" + }, + { + "source": "Gitea", + "target": "Fedify", + "type": "weak", + "category": "dev" + }, + { + "source": "Gitea", + "target": "AodeRelay", + "type": "weak", + "category": "dev" + }, + { + "source": "Gitea", + "target": "FediBridge", + "type": "weak", + "category": "dev" + }, + { + "source": "Gitea", + "target": "ActivityPub Relay", + "type": "weak", + "category": "dev" + }, + { + "source": "Nextcloud", + "target": "ownCloud", + "type": "weak", + "category": "collab" + }, + { + "source": "Nextcloud", + "target": "Element", + "type": "weak", + "category": "collab" + }, + { + "source": "Nextcloud", + "target": "CryptPad", + "type": "weak", + "category": "collab" + }, + { + "source": "Nextcloud", + "target": "HedgeDoc", + "type": "weak", + "category": "collab" + }, + { + "source": "Nextcloud", + "target": "Immich", + "type": "weak", + "category": "collab" + }, + { + "source": "Nextcloud", + "target": "PhotoPrism", + "type": "weak", + "category": "collab" + }, + { + "source": "Nextcloud", + "target": "Synapse", + "type": "weak", + "category": "collab" + }, + { + "source": "Nextcloud", + "target": "Dendrite", + "type": "weak", + "category": "collab" + }, + { + "source": "Nextcloud", + "target": "Conduit", + "type": "weak", + "category": "collab" + }, + { + "source": "Nextcloud", + "target": "Cinny", + "type": "weak", + "category": "collab" + }, + { + "source": "Nextcloud", + "target": "FluffyChat", + "type": "weak", + "category": "collab" + }, + { + "source": "ownCloud", + "target": "Element", + "type": "weak", + "category": "collab" + }, + { + "source": "ownCloud", + "target": "CryptPad", + "type": "weak", + "category": "collab" + }, + { + "source": "ownCloud", + "target": "HedgeDoc", + "type": "weak", + "category": "collab" + }, + { + "source": "ownCloud", + "target": "Immich", + "type": "weak", + "category": "collab" + }, + { + "source": "ownCloud", + "target": "PhotoPrism", + "type": "weak", + "category": "collab" + }, + { + "source": "ownCloud", + "target": "Synapse", + "type": "weak", + "category": "collab" + }, + { + "source": "ownCloud", + "target": "Dendrite", + "type": "weak", + "category": "collab" + }, + { + "source": "ownCloud", + "target": "Conduit", + "type": "weak", + "category": "collab" + }, + { + "source": "ownCloud", + "target": "Cinny", + "type": "weak", + "category": "collab" + }, + { + "source": "ownCloud", + "target": "FluffyChat", + "type": "weak", + "category": "collab" + }, + { + "source": "BookWyrm", + "target": "Epicyon", + "type": "strong" + }, + { + "source": "BookWyrm", + "target": "Smithereen", + "type": "strong" + }, + { + "source": "BookWyrm", + "target": "Pieoneers", + "type": "strong" + }, + { + "source": "BookWyrm", + "target": "ActivityPub Relay", + "type": "strong" + }, + { + "source": "BookWyrm", + "target": "Sepia Search", + "type": "strong" + }, + { + "source": "Diaspora*", + "target": "Mitra", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Diaspora*", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Element", + "target": "CryptPad", + "type": "weak", + "category": "collab" + }, + { + "source": "Element", + "target": "HedgeDoc", + "type": "weak", + "category": "collab" + }, + { + "source": "Element", + "target": "Immich", + "type": "weak", + "category": "collab" + }, + { + "source": "Element", + "target": "PhotoPrism", + "type": "weak", + "category": "collab" + }, + { + "source": "Element", + "target": "Synapse", + "type": "weak", + "category": "collab" + }, + { + "source": "Element", + "target": "Dendrite", + "type": "weak", + "category": "collab" + }, + { + "source": "Element", + "target": "Conduit", + "type": "weak", + "category": "collab" + }, + { + "source": "Element", + "target": "Cinny", + "type": "weak", + "category": "collab" + }, + { + "source": "Element", + "target": "FluffyChat", + "type": "weak", + "category": "collab" + }, + { + "source": "Fedify", + "target": "Epicyon", + "type": "strong" + }, + { + "source": "Fedify", + "target": "Pieoneers", + "type": "strong" + }, + { + "source": "Fedify", + "target": "Emissary", + "type": "strong" + }, + { + "source": "Fedify", + "target": "Postmarks", + "type": "strong" + }, + { + "source": "Fedify", + "target": "AodeRelay", + "type": "weak", + "category": "dev" + }, + { + "source": "Fedify", + "target": "FediBridge", + "type": "weak", + "category": "dev" + }, + { + "source": "Fedify", + "target": "ActivityPub Relay", + "type": "weak", + "category": "dev" + }, + { + "source": "Mitra", + "target": "Socialhome", + "type": "weak", + "category": "social" + }, + { + "source": "Mitra", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "Mitra", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Mitra", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Mitra", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Mitra", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Mitra", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Mitra", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Mitra", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Mitra", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Mitra", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Mitra", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Mitra", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Mitra", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Socialhome", + "target": "Epicyon", + "type": "weak", + "category": "social" + }, + { + "source": "Socialhome", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Socialhome", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Socialhome", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Socialhome", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Socialhome", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Socialhome", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Socialhome", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Socialhome", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Socialhome", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Socialhome", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Socialhome", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Socialhome", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "kbin", + "target": "Epicyon", + "type": "strong" + }, + { + "source": "kbin", + "target": "Lotide", + "type": "weak", + "category": "forum" + }, + { + "source": "kbin", + "target": "Sublinks", + "type": "weak", + "category": "forum" + }, + { + "source": "kbin", + "target": "RoadHouse", + "type": "weak", + "category": "forum" + }, + { + "source": "kbin", + "target": "Akkoma-FE", + "type": "strong" + }, + { + "source": "kbin", + "target": "AodeRelay", + "type": "strong" + }, + { + "source": "Epicyon", + "target": "Takahē", + "type": "weak", + "category": "social" + }, + { + "source": "Epicyon", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Epicyon", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Epicyon", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Epicyon", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Epicyon", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Epicyon", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Epicyon", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Epicyon", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Epicyon", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Epicyon", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Epicyon", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Epicyon", + "target": "Sepia Search", + "type": "strong" + }, + { + "source": "Takahē", + "target": "Smithereen", + "type": "weak", + "category": "social" + }, + { + "source": "Takahē", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Takahē", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Takahē", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Takahē", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Takahē", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Takahē", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Takahē", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Takahē", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Takahē", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Takahē", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Takahē", + "target": "FediBridge", + "type": "strong" + }, + { + "source": "Smithereen", + "target": "Kroeg", + "type": "weak", + "category": "social" + }, + { + "source": "Smithereen", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Smithereen", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Smithereen", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Smithereen", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Smithereen", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Smithereen", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Smithereen", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Smithereen", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Smithereen", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Smithereen", + "target": "FediBridge", + "type": "strong" + }, + { + "source": "Kroeg", + "target": "Pieoneers", + "type": "weak", + "category": "social" + }, + { + "source": "Kroeg", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Kroeg", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Kroeg", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Kroeg", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Kroeg", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Kroeg", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Kroeg", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Kroeg", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Kroeg", + "target": "ActivityPub Relay", + "type": "strong" + }, + { + "source": "Lotide", + "target": "Sublinks", + "type": "weak", + "category": "forum" + }, + { + "source": "Lotide", + "target": "RoadHouse", + "type": "weak", + "category": "forum" + }, + { + "source": "Lotide", + "target": "Akkoma-FE", + "type": "strong" + }, + { + "source": "Sublinks", + "target": "RoadHouse", + "type": "weak", + "category": "forum" + }, + { + "source": "Sublinks", + "target": "Emissary", + "type": "strong" + }, + { + "source": "Sublinks", + "target": "Postmarks", + "type": "strong" + }, + { + "source": "Sublinks", + "target": "ActivityPub Relay", + "type": "strong" + }, + { + "source": "RoadHouse", + "target": "Pieoneers", + "type": "strong" + }, + { + "source": "RoadHouse", + "target": "Emissary", + "type": "strong" + }, + { + "source": "RoadHouse", + "target": "AodeRelay", + "type": "strong" + }, + { + "source": "RoadHouse", + "target": "FediBridge", + "type": "strong" + }, + { + "source": "RoadHouse", + "target": "Sepia Search", + "type": "strong" + }, + { + "source": "Pieoneers", + "target": "Emissary", + "type": "weak", + "category": "social" + }, + { + "source": "Pieoneers", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Pieoneers", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Pieoneers", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Pieoneers", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Pieoneers", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Pieoneers", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Pieoneers", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Pieoneers", + "target": "FediBridge", + "type": "strong" + }, + { + "source": "Pieoneers", + "target": "ActivityPub Relay", + "type": "strong" + }, + { + "source": "Emissary", + "target": "Hometown", + "type": "weak", + "category": "social" + }, + { + "source": "Emissary", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Emissary", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Emissary", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Emissary", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Emissary", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Emissary", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Hometown", + "target": "GlitchSoc", + "type": "weak", + "category": "social" + }, + { + "source": "Hometown", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "Hometown", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Hometown", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Hometown", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Hometown", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "GlitchSoc", + "target": "Akkoma-FE", + "type": "weak", + "category": "social" + }, + { + "source": "GlitchSoc", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "GlitchSoc", + "target": "AodeRelay", + "type": "strong" + }, + { + "source": "GlitchSoc", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "GlitchSoc", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "GlitchSoc", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma-FE", + "target": "Postmarks", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma-FE", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma-FE", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Akkoma-FE", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Postmarks", + "target": "AodeRelay", + "type": "strong" + }, + { + "source": "Postmarks", + "target": "Bluesky", + "type": "weak", + "category": "social" + }, + { + "source": "Postmarks", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Postmarks", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "AodeRelay", + "target": "FediBridge", + "type": "weak", + "category": "dev" + }, + { + "source": "AodeRelay", + "target": "ActivityPub Relay", + "type": "weak", + "category": "dev" + }, + { + "source": "Coracle", + "target": "Nostrudel", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "Lume", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "Gossip", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "Current", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "Plebstr", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "Nostrpels", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "ZapStream", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "NostrCheck.me", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "NostrMarket", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "Nostr Protocol", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "Damus", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "Amethyst", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "Iris", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "Coracle", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "Lume", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "Gossip", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "Current", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "Plebstr", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "Nostrpels", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "ZapStream", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "NostrCheck.me", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "NostrMarket", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "Nostr Protocol", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "Damus", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "Amethyst", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "Iris", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrudel", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "Gossip", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "Current", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "Plebstr", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "Nostrpels", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "ZapStream", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "NostrCheck.me", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "NostrMarket", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "Nostr Protocol", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "Damus", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "Amethyst", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "Iris", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "Lume", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "Current", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "Plebstr", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "Nostrpels", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "ZapStream", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "NostrCheck.me", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "NostrMarket", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "Nostr Protocol", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "Damus", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "Amethyst", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "Iris", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "Gossip", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "Current", + "target": "Plebstr", + "type": "weak", + "category": "nostr" + }, + { + "source": "Current", + "target": "Nostrpels", + "type": "weak", + "category": "nostr" + }, + { + "source": "Current", + "target": "ZapStream", + "type": "weak", + "category": "nostr" + }, + { + "source": "Current", + "target": "NostrCheck.me", + "type": "weak", + "category": "nostr" + }, + { + "source": "Current", + "target": "NostrMarket", + "type": "weak", + "category": "nostr" + }, + { + "source": "Current", + "target": "Nostr Protocol", + "type": "weak", + "category": "nostr" + }, + { + "source": "Current", + "target": "Damus", + "type": "weak", + "category": "nostr" + }, + { + "source": "Current", + "target": "Amethyst", + "type": "weak", + "category": "nostr" + }, + { + "source": "Current", + "target": "Iris", + "type": "weak", + "category": "nostr" + }, + { + "source": "Current", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "Current", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "Current", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "Current", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "Plebstr", + "target": "Nostrpels", + "type": "weak", + "category": "nostr" + }, + { + "source": "Plebstr", + "target": "ZapStream", + "type": "weak", + "category": "nostr" + }, + { + "source": "Plebstr", + "target": "NostrCheck.me", + "type": "weak", + "category": "nostr" + }, + { + "source": "Plebstr", + "target": "NostrMarket", + "type": "weak", + "category": "nostr" + }, + { + "source": "Plebstr", + "target": "Nostr Protocol", + "type": "weak", + "category": "nostr" + }, + { + "source": "Plebstr", + "target": "Damus", + "type": "weak", + "category": "nostr" + }, + { + "source": "Plebstr", + "target": "Amethyst", + "type": "weak", + "category": "nostr" + }, + { + "source": "Plebstr", + "target": "Iris", + "type": "weak", + "category": "nostr" + }, + { + "source": "Plebstr", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "Plebstr", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "Plebstr", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "Plebstr", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrpels", + "target": "ZapStream", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrpels", + "target": "NostrCheck.me", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrpels", + "target": "NostrMarket", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrpels", + "target": "Nostr Protocol", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrpels", + "target": "Damus", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrpels", + "target": "Amethyst", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrpels", + "target": "Iris", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrpels", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrpels", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrpels", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostrpels", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "ZapStream", + "target": "NostrCheck.me", + "type": "weak", + "category": "nostr" + }, + { + "source": "ZapStream", + "target": "NostrMarket", + "type": "weak", + "category": "nostr" + }, + { + "source": "ZapStream", + "target": "Nostr Protocol", + "type": "weak", + "category": "nostr" + }, + { + "source": "ZapStream", + "target": "Damus", + "type": "weak", + "category": "nostr" + }, + { + "source": "ZapStream", + "target": "Amethyst", + "type": "weak", + "category": "nostr" + }, + { + "source": "ZapStream", + "target": "Iris", + "type": "weak", + "category": "nostr" + }, + { + "source": "ZapStream", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "ZapStream", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "ZapStream", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "ZapStream", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrCheck.me", + "target": "NostrMarket", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrCheck.me", + "target": "Nostr Protocol", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrCheck.me", + "target": "Damus", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrCheck.me", + "target": "Amethyst", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrCheck.me", + "target": "Iris", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrCheck.me", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrCheck.me", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrCheck.me", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrCheck.me", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrMarket", + "target": "Nostr Protocol", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrMarket", + "target": "Damus", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrMarket", + "target": "Amethyst", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrMarket", + "target": "Iris", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrMarket", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrMarket", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrMarket", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "NostrMarket", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "Prosody", + "target": "ejabberd", + "type": "weak", + "category": "messaging" + }, + { + "source": "Prosody", + "target": "Openfire", + "type": "weak", + "category": "messaging" + }, + { + "source": "Prosody", + "target": "Tigase", + "type": "weak", + "category": "messaging" + }, + { + "source": "Prosody", + "target": "Conversations", + "type": "weak", + "category": "messaging" + }, + { + "source": "Prosody", + "target": "Dino", + "type": "weak", + "category": "messaging" + }, + { + "source": "Prosody", + "target": "Gajim", + "type": "weak", + "category": "messaging" + }, + { + "source": "Prosody", + "target": "Monal", + "type": "weak", + "category": "messaging" + }, + { + "source": "Prosody", + "target": "Snikket", + "type": "weak", + "category": "messaging" + }, + { + "source": "Prosody", + "target": "Movim", + "type": "weak", + "category": "messaging" + }, + { + "source": "Prosody", + "target": "Jabber", + "type": "weak", + "category": "messaging" + }, + { + "source": "Prosody", + "target": "Briar", + "type": "weak", + "category": "messaging" + }, + { + "source": "Prosody", + "target": "Jami", + "type": "weak", + "category": "messaging" + }, + { + "source": "Prosody", + "target": "SimpleX Chat", + "type": "weak", + "category": "messaging" + }, + { + "source": "ejabberd", + "target": "Openfire", + "type": "weak", + "category": "messaging" + }, + { + "source": "ejabberd", + "target": "Tigase", + "type": "weak", + "category": "messaging" + }, + { + "source": "ejabberd", + "target": "Conversations", + "type": "weak", + "category": "messaging" + }, + { + "source": "ejabberd", + "target": "Dino", + "type": "weak", + "category": "messaging" + }, + { + "source": "ejabberd", + "target": "Gajim", + "type": "weak", + "category": "messaging" + }, + { + "source": "ejabberd", + "target": "Monal", + "type": "weak", + "category": "messaging" + }, + { + "source": "ejabberd", + "target": "Snikket", + "type": "weak", + "category": "messaging" + }, + { + "source": "ejabberd", + "target": "Movim", + "type": "weak", + "category": "messaging" + }, + { + "source": "ejabberd", + "target": "Jabber", + "type": "weak", + "category": "messaging" + }, + { + "source": "ejabberd", + "target": "Briar", + "type": "weak", + "category": "messaging" + }, + { + "source": "ejabberd", + "target": "Jami", + "type": "weak", + "category": "messaging" + }, + { + "source": "ejabberd", + "target": "SimpleX Chat", + "type": "weak", + "category": "messaging" + }, + { + "source": "Openfire", + "target": "Tigase", + "type": "weak", + "category": "messaging" + }, + { + "source": "Openfire", + "target": "Conversations", + "type": "weak", + "category": "messaging" + }, + { + "source": "Openfire", + "target": "Dino", + "type": "weak", + "category": "messaging" + }, + { + "source": "Openfire", + "target": "Gajim", + "type": "weak", + "category": "messaging" + }, + { + "source": "Openfire", + "target": "Monal", + "type": "weak", + "category": "messaging" + }, + { + "source": "Openfire", + "target": "Snikket", + "type": "weak", + "category": "messaging" + }, + { + "source": "Openfire", + "target": "Movim", + "type": "weak", + "category": "messaging" + }, + { + "source": "Openfire", + "target": "Jabber", + "type": "weak", + "category": "messaging" + }, + { + "source": "Openfire", + "target": "Briar", + "type": "weak", + "category": "messaging" + }, + { + "source": "Openfire", + "target": "Jami", + "type": "weak", + "category": "messaging" + }, + { + "source": "Openfire", + "target": "SimpleX Chat", + "type": "weak", + "category": "messaging" + }, + { + "source": "Tigase", + "target": "Conversations", + "type": "weak", + "category": "messaging" + }, + { + "source": "Tigase", + "target": "Dino", + "type": "weak", + "category": "messaging" + }, + { + "source": "Tigase", + "target": "Gajim", + "type": "weak", + "category": "messaging" + }, + { + "source": "Tigase", + "target": "Monal", + "type": "weak", + "category": "messaging" + }, + { + "source": "Tigase", + "target": "Snikket", + "type": "weak", + "category": "messaging" + }, + { + "source": "Tigase", + "target": "Movim", + "type": "weak", + "category": "messaging" + }, + { + "source": "Tigase", + "target": "Jabber", + "type": "weak", + "category": "messaging" + }, + { + "source": "Tigase", + "target": "Briar", + "type": "weak", + "category": "messaging" + }, + { + "source": "Tigase", + "target": "Jami", + "type": "weak", + "category": "messaging" + }, + { + "source": "Tigase", + "target": "SimpleX Chat", + "type": "weak", + "category": "messaging" + }, + { + "source": "Conversations", + "target": "Dino", + "type": "weak", + "category": "messaging" + }, + { + "source": "Conversations", + "target": "Gajim", + "type": "weak", + "category": "messaging" + }, + { + "source": "Conversations", + "target": "Monal", + "type": "weak", + "category": "messaging" + }, + { + "source": "Conversations", + "target": "Snikket", + "type": "weak", + "category": "messaging" + }, + { + "source": "Conversations", + "target": "Movim", + "type": "weak", + "category": "messaging" + }, + { + "source": "Conversations", + "target": "Jabber", + "type": "weak", + "category": "messaging" + }, + { + "source": "Conversations", + "target": "Briar", + "type": "weak", + "category": "messaging" + }, + { + "source": "Conversations", + "target": "Jami", + "type": "weak", + "category": "messaging" + }, + { + "source": "Conversations", + "target": "SimpleX Chat", + "type": "weak", + "category": "messaging" + }, + { + "source": "Dino", + "target": "Gajim", + "type": "weak", + "category": "messaging" + }, + { + "source": "Dino", + "target": "Monal", + "type": "weak", + "category": "messaging" + }, + { + "source": "Dino", + "target": "Snikket", + "type": "weak", + "category": "messaging" + }, + { + "source": "Dino", + "target": "Movim", + "type": "weak", + "category": "messaging" + }, + { + "source": "Dino", + "target": "Jabber", + "type": "weak", + "category": "messaging" + }, + { + "source": "Dino", + "target": "Briar", + "type": "weak", + "category": "messaging" + }, + { + "source": "Dino", + "target": "Jami", + "type": "weak", + "category": "messaging" + }, + { + "source": "Dino", + "target": "SimpleX Chat", + "type": "weak", + "category": "messaging" + }, + { + "source": "Gajim", + "target": "Monal", + "type": "weak", + "category": "messaging" + }, + { + "source": "Gajim", + "target": "Snikket", + "type": "weak", + "category": "messaging" + }, + { + "source": "Gajim", + "target": "Movim", + "type": "weak", + "category": "messaging" + }, + { + "source": "Gajim", + "target": "Jabber", + "type": "weak", + "category": "messaging" + }, + { + "source": "Gajim", + "target": "Briar", + "type": "weak", + "category": "messaging" + }, + { + "source": "Gajim", + "target": "Jami", + "type": "weak", + "category": "messaging" + }, + { + "source": "Gajim", + "target": "SimpleX Chat", + "type": "weak", + "category": "messaging" + }, + { + "source": "Monal", + "target": "Snikket", + "type": "weak", + "category": "messaging" + }, + { + "source": "Monal", + "target": "Movim", + "type": "weak", + "category": "messaging" + }, + { + "source": "Monal", + "target": "Jabber", + "type": "weak", + "category": "messaging" + }, + { + "source": "Monal", + "target": "Briar", + "type": "weak", + "category": "messaging" + }, + { + "source": "Monal", + "target": "Jami", + "type": "weak", + "category": "messaging" + }, + { + "source": "Monal", + "target": "SimpleX Chat", + "type": "weak", + "category": "messaging" + }, + { + "source": "Snikket", + "target": "Movim", + "type": "weak", + "category": "messaging" + }, + { + "source": "Snikket", + "target": "Jabber", + "type": "weak", + "category": "messaging" + }, + { + "source": "Snikket", + "target": "Briar", + "type": "weak", + "category": "messaging" + }, + { + "source": "Snikket", + "target": "Jami", + "type": "weak", + "category": "messaging" + }, + { + "source": "Snikket", + "target": "SimpleX Chat", + "type": "weak", + "category": "messaging" + }, + { + "source": "Movim", + "target": "Jabber", + "type": "weak", + "category": "messaging" + }, + { + "source": "Movim", + "target": "Briar", + "type": "weak", + "category": "messaging" + }, + { + "source": "Movim", + "target": "Jami", + "type": "weak", + "category": "messaging" + }, + { + "source": "Movim", + "target": "SimpleX Chat", + "type": "weak", + "category": "messaging" + }, + { + "source": "Jabber", + "target": "Briar", + "type": "weak", + "category": "messaging" + }, + { + "source": "Jabber", + "target": "Jami", + "type": "weak", + "category": "messaging" + }, + { + "source": "Jabber", + "target": "SimpleX Chat", + "type": "weak", + "category": "messaging" + }, + { + "source": "Bluesky", + "target": "Graysky", + "type": "weak", + "category": "social" + }, + { + "source": "Bluesky", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Graysky", + "target": "Tokimeki", + "type": "weak", + "category": "social" + }, + { + "source": "Briar", + "target": "Jami", + "type": "weak", + "category": "messaging" + }, + { + "source": "Briar", + "target": "SimpleX Chat", + "type": "weak", + "category": "messaging" + }, + { + "source": "Jami", + "target": "SimpleX Chat", + "type": "weak", + "category": "messaging" + }, + { + "source": "CryptPad", + "target": "HedgeDoc", + "type": "weak", + "category": "collab" + }, + { + "source": "CryptPad", + "target": "Immich", + "type": "weak", + "category": "collab" + }, + { + "source": "CryptPad", + "target": "PhotoPrism", + "type": "weak", + "category": "collab" + }, + { + "source": "CryptPad", + "target": "Synapse", + "type": "weak", + "category": "collab" + }, + { + "source": "CryptPad", + "target": "Dendrite", + "type": "weak", + "category": "collab" + }, + { + "source": "CryptPad", + "target": "Conduit", + "type": "weak", + "category": "collab" + }, + { + "source": "CryptPad", + "target": "Cinny", + "type": "weak", + "category": "collab" + }, + { + "source": "CryptPad", + "target": "FluffyChat", + "type": "weak", + "category": "collab" + }, + { + "source": "HedgeDoc", + "target": "Immich", + "type": "weak", + "category": "collab" + }, + { + "source": "HedgeDoc", + "target": "PhotoPrism", + "type": "weak", + "category": "collab" + }, + { + "source": "HedgeDoc", + "target": "Synapse", + "type": "weak", + "category": "collab" + }, + { + "source": "HedgeDoc", + "target": "Dendrite", + "type": "weak", + "category": "collab" + }, + { + "source": "HedgeDoc", + "target": "Conduit", + "type": "weak", + "category": "collab" + }, + { + "source": "HedgeDoc", + "target": "Cinny", + "type": "weak", + "category": "collab" + }, + { + "source": "HedgeDoc", + "target": "FluffyChat", + "type": "weak", + "category": "collab" + }, + { + "source": "Immich", + "target": "PhotoPrism", + "type": "weak", + "category": "collab" + }, + { + "source": "Immich", + "target": "Synapse", + "type": "weak", + "category": "collab" + }, + { + "source": "Immich", + "target": "Dendrite", + "type": "weak", + "category": "collab" + }, + { + "source": "Immich", + "target": "Conduit", + "type": "weak", + "category": "collab" + }, + { + "source": "Immich", + "target": "Cinny", + "type": "weak", + "category": "collab" + }, + { + "source": "Immich", + "target": "FluffyChat", + "type": "weak", + "category": "collab" + }, + { + "source": "PhotoPrism", + "target": "Synapse", + "type": "weak", + "category": "collab" + }, + { + "source": "PhotoPrism", + "target": "Dendrite", + "type": "weak", + "category": "collab" + }, + { + "source": "PhotoPrism", + "target": "Conduit", + "type": "weak", + "category": "collab" + }, + { + "source": "PhotoPrism", + "target": "Cinny", + "type": "weak", + "category": "collab" + }, + { + "source": "PhotoPrism", + "target": "FluffyChat", + "type": "weak", + "category": "collab" + }, + { + "source": "Synapse", + "target": "Dendrite", + "type": "weak", + "category": "collab" + }, + { + "source": "Synapse", + "target": "Conduit", + "type": "weak", + "category": "collab" + }, + { + "source": "Synapse", + "target": "Cinny", + "type": "weak", + "category": "collab" + }, + { + "source": "Synapse", + "target": "FluffyChat", + "type": "weak", + "category": "collab" + }, + { + "source": "Dendrite", + "target": "Conduit", + "type": "weak", + "category": "collab" + }, + { + "source": "Dendrite", + "target": "Cinny", + "type": "weak", + "category": "collab" + }, + { + "source": "Dendrite", + "target": "FluffyChat", + "type": "weak", + "category": "collab" + }, + { + "source": "Conduit", + "target": "Cinny", + "type": "weak", + "category": "collab" + }, + { + "source": "Conduit", + "target": "FluffyChat", + "type": "weak", + "category": "collab" + }, + { + "source": "Cinny", + "target": "FluffyChat", + "type": "weak", + "category": "collab" + }, + { + "source": "FediBridge", + "target": "ActivityPub Relay", + "type": "weak", + "category": "dev" + }, + { + "source": "Nostr Protocol", + "target": "Damus", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostr Protocol", + "target": "Amethyst", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostr Protocol", + "target": "Iris", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostr Protocol", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostr Protocol", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostr Protocol", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostr Protocol", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "Damus", + "target": "Amethyst", + "type": "weak", + "category": "nostr" + }, + { + "source": "Damus", + "target": "Iris", + "type": "weak", + "category": "nostr" + }, + { + "source": "Damus", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "Damus", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "Damus", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "Damus", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "Amethyst", + "target": "Iris", + "type": "weak", + "category": "nostr" + }, + { + "source": "Amethyst", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "Amethyst", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "Amethyst", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "Amethyst", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "Iris", + "target": "Primal", + "type": "weak", + "category": "nostr" + }, + { + "source": "Iris", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "Iris", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "Iris", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "Primal", + "target": "Habla.news", + "type": "weak", + "category": "nostr" + }, + { + "source": "Primal", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "Primal", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "Habla.news", + "target": "Nostr.band", + "type": "weak", + "category": "nostr" + }, + { + "source": "Habla.news", + "target": "Snort", + "type": "weak", + "category": "nostr" + }, + { + "source": "Nostr.band", + "target": "Snort", + "type": "weak", + "category": "nostr" + } + ] +} \ No newline at end of file diff --git a/atlas-fediverse/src/lib/data/protocols.json b/atlas-fediverse/src/lib/data/protocols.json new file mode 100644 index 0000000..1b85b8a --- /dev/null +++ b/atlas-fediverse/src/lib/data/protocols.json @@ -0,0 +1,97 @@ +[ + { + "id": "activitypub", + "name": "ActivityPub", + "description": "Protocole de réseautage social décentralisé recommandé par le W3C. Le standard principal du Fédiverse.", + "type": "fediverse", + "statut": "Actif", + "site": "https://activitypub.rocks/", + "rfc": "W3C Recommendation" + }, + { + "id": "activitystreams", + "name": "ActivityStreams 2.0", + "description": "Format de données pour décrire les activités sociales. Base sur laquelle repose ActivityPub.", + "type": "fediverse", + "statut": "Actif", + "rfc": "W3C Recommendation" + }, + { + "id": "webfinger", + "name": "WebFinger", + "description": "Protocole de découverte d'informations sur les ressources identifiées par des URI web.", + "type": "fediverse", + "statut": "Actif", + "rfc": "RFC 7033" + }, + { + "id": "httpsignatures", + "name": "HTTP Signatures", + "description": "Mécanisme de signature des requêtes HTTP pour l'authentification entre instances.", + "type": "fediverse", + "statut": "Actif", + "rfc": "IETF Draft" + }, + { + "id": "nodeinfo", + "name": "NodeInfo", + "description": "Schéma de métadonnées pour décrire les instances fédérées et leurs capacités.", + "type": "fediverse", + "statut": "Actif", + "rfc": "nodeinfo.diaspora.software" + }, + { + "id": "zot", + "name": "Zot / Nomad", + "description": "Protocole de communications décentralisées avec prise en charge avancée de la privacy et du nomadisme d'identité.", + "type": "connexe", + "statut": "Actif", + "site": "https://zotlabs.org/" + }, + { + "id": "diaspora", + "name": "Diaspora* Protocol", + "description": "Protocole historique du réseau Diaspora*, précurseur du Fédiverse moderne.", + "type": "connexe", + "statut": "Historique" + }, + { + "id": "ostatus", + "name": "OStatus", + "description": "Suite de protocoles (Atom, Salmon, WebSub) utilisée par les premières plateformes fédérées.", + "type": "connexe", + "statut": "Historique" + }, + { + "id": "matrix", + "name": "Matrix Protocol", + "description": "Protocole ouvert pour la communication temps réel (chat, VoIP). Interopère avec ActivityPub.", + "type": "connexe", + "statut": "Actif", + "site": "https://matrix.org/" + }, + { + "id": "xmpp", + "name": "XMPP", + "description": "Extensible Messaging and Presence Protocol. Standard historique de messagerie instantanée.", + "type": "connexe", + "statut": "Actif", + "rfc": "RFC 6120" + }, + { + "id": "atproto", + "name": "AT Protocol", + "description": "Protocole d'identité décentralisé utilisé par Bluesky. Écosystème voisin mais distinct du Fédiverse.", + "type": "voisin", + "statut": "En développement", + "site": "https://atproto.com/" + }, + { + "id": "nostr", + "name": "Nostr", + "description": "Protocole simple et ouvert pour créer des réseaux sociaux résistants à la censure.", + "type": "voisin", + "statut": "En développement", + "site": "https://nostr.com/" + } +] \ No newline at end of file diff --git a/atlas-fediverse/src/lib/data/software.json b/atlas-fediverse/src/lib/data/software.json new file mode 100644 index 0000000..097c84d --- /dev/null +++ b/atlas-fediverse/src/lib/data/software.json @@ -0,0 +1,1713 @@ +[ + { + "id": "mastodon", + "name": "Mastodon", + "description": "Le réseau social fédéré le plus populaire. Microblogging avec une audience mondiale.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Ruby on Rails", + "site": "https://joinmastodon.org/", + "github": "https://github.com/mastodon/mastodon", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2016, + "version": "4.3" + }, + { + "id": "gotosocial", + "name": "GoToSocial", + "description": "Serveur ActivityPub léger et rapide écrit en Go. Approche minimaliste et efficace.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Go", + "site": "https://gotosocial.org/", + "github": "https://github.com/superseriousbusiness/gotosocial", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2021, + "version": "0.17" + }, + { + "id": "akkoma", + "name": "Akkoma", + "description": "Fork de Pleroma avec des fonctionnalités enrichies et une personnalisation avancée.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Elixir", + "site": "https://akkoma.social/", + "github": "https://akkoma.dev/AkkomaGang/akkoma", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2022, + "version": "3.15" + }, + { + "id": "pleroma", + "name": "Pleroma", + "description": "Serveur ActivityPub léger et hautement configurable. Alternative rapide à Mastodon.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Elixir", + "site": "https://pleroma.social/", + "github": "https://git.pleroma.social/pleroma/pleroma", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2017, + "version": "2.7" + }, + { + "id": "misskey", + "name": "Misskey", + "description": "Plateforme sociale japonaise avec des fonctionnalités créatives (notes, réactions, drive).", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Node.js", + "site": "https://misskey-hub.net/", + "github": "https://github.com/misskey-dev/misskey", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2014, + "version": "2024" + }, + { + "id": "sharkey", + "name": "Sharkey", + "description": "Fork de Misskey avec des améliorations de performance et de nouvelles fonctionnalités.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Node.js", + "site": "https://sharkey.keyber.net/", + "github": "https://activitypub.software/TransFem-org/Sharkey", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2023 + }, + { + "id": "friendica", + "name": "Friendica", + "description": "Réseau social décentralisé avec interopérabilité étendue (ActivityPub, Diaspora*, RSS).", + "category": "social", + "protocols": [ + "ActivityPub", + "Diaspora* Protocol" + ], + "licence": "AGPL-3.0", + "language": "PHP", + "site": "https://friendi.ca/", + "github": "https://github.com/friendica/friendica", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2010, + "version": "2024.03" + }, + { + "id": "hubzilla", + "name": "Hubzilla", + "description": "Plateforme de communications décentralisées avec contrôle d'accès avancé et nomadisme d'identité.", + "category": "social", + "protocols": [ + "Zot", + "ActivityPub" + ], + "licence": "MIT", + "language": "PHP", + "site": "https://hubzilla.org/", + "github": "https://framagit.org/hubzilla/core", + "etat": "Actif", + "compatibiliteAP": "Partielle", + "createdYear": 2012 + }, + { + "id": "streams", + "name": "Streams", + "description": "Fork de Hubzilla axé sur la privacy et le contrôle granulaire des permissions.", + "category": "social", + "protocols": [ + "Nomad", + "ActivityPub" + ], + "licence": "MIT", + "language": "PHP", + "site": "https://codeberg.org/streams/streams", + "github": "https://codeberg.org/streams/streams", + "etat": "Actif", + "compatibiliteAP": "Partielle", + "createdYear": 2022 + }, + { + "id": "iceshrimp", + "name": "Iceshrimp", + "description": "Fork de Misskey optimisé pour la performance et la stabilité.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Node.js", + "site": "https://iceshrimp.dev/", + "github": "https://iceshrimp.dev/iceshrimp/iceshrimp", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2023 + }, + { + "id": "gnusocial", + "name": "GNU social", + "description": "Pionnier des réseaux sociaux fédérés. Précurseur historique du Fédiverse.", + "category": "social", + "protocols": [ + "ActivityPub", + "OStatus" + ], + "licence": "AGPL-3.0", + "language": "PHP", + "site": "https://www.gnu.io/social/", + "github": "https://codeberg.org/GNUsocial/gnu-social", + "etat": "Maintenance", + "compatibiliteAP": "Pleine", + "createdYear": 2010 + }, + { + "id": "bonfire", + "name": "Bonfire", + "description": "Réseau social modulaire écrit en Elixir axé sur la gouvernance communautaire.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Elixir", + "site": "https://bonfirenetworks.org/", + "github": "https://github.com/bonfire-networks/bonfire", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2020 + }, + { + "id": "microblogpub", + "name": "microblog.pub", + "description": "Serveur ActivityPub minimaliste et auto-hébergeable pour le microblogging.", + "category": "microblog", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Python", + "site": "https://docs.microblog.pub/", + "github": "https://github.com/tsileo/microblog.pub", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2018 + }, + { + "id": "pixelfed", + "name": "PixelFed", + "description": "Plateforme de partage de photos fédérée. Alternative à Instagram.", + "category": "photo", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "PHP", + "site": "https://pixelfed.org/", + "github": "https://github.com/pixelfed/pixelfed", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2018, + "version": "0.12" + }, + { + "id": "vernissage", + "name": "Vernissage", + "description": "Application de galerie photo fédérée pour le Fédiverse.", + "category": "photo", + "protocols": [ + "ActivityPub" + ], + "licence": "EUPL-1.2", + "language": "Swift", + "site": "https://vernissage.photos/", + "github": "https://github.com/VernissageApp/Vernissage", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2023 + }, + { + "id": "peertube", + "name": "PeerTube", + "description": "Plateforme vidéo fédérée décentralisée. Alternative à YouTube.", + "category": "video", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Node.js", + "site": "https://joinpeertube.org/", + "github": "https://github.com/Chocobozzz/PeerTube", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2015, + "version": "6.3" + }, + { + "id": "owncast", + "name": "Owncast", + "description": "Serveur de streaming live auto-hébergeable. Alternative à Twitch.", + "category": "video", + "protocols": [ + "ActivityPub", + "RSS" + ], + "licence": "MIT", + "language": "Go", + "site": "https://owncast.online/", + "github": "https://github.com/owncast/owncast", + "etat": "Actif", + "compatibiliteAP": "Extension", + "createdYear": 2020, + "version": "0.2" + }, + { + "id": "tube", + "name": "Tube (Framasoft)", + "description": "Ancien nom du projet ayant mené à PeerTube.", + "category": "video", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Node.js", + "site": "https://framatube.org/", + "github": "https://github.com/Chocobozzz/PeerTube", + "etat": "Historique", + "compatibiliteAP": "Pleine", + "createdYear": 2015 + }, + { + "id": "castopod", + "name": "Castopod", + "description": "Plateforme de podcasting fédérée avec ActivityPub. Alternative à Spotify/Apple Podcasts.", + "category": "audio", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "PHP", + "site": "https://castopod.org/", + "github": "https://codeberg.org/adaur/castopod", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2020, + "version": "1.12" + }, + { + "id": "funkwhale", + "name": "Funkwhale", + "description": "Plateforme musicale fédérée pour écouter et partager de la musique.", + "category": "audio", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Python", + "site": "https://funkwhale.audio/", + "github": "https://dev.funkwhale.audio/funkwhale/funkwhale", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2018, + "version": "1.4" + }, + { + "id": "loops", + "name": "Loops", + "description": "Plateforme de vidéos courtes fédérée. Alternative à TikTok/Instagram Reels.", + "category": "video", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "PHP", + "site": "https://loops.video/", + "github": "https://github.com/MozillaSocial/loops", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2024 + }, + { + "id": "ghost", + "name": "Ghost", + "description": "Plateforme de publication professionnelle avec support ActivityPub.", + "category": "blog", + "protocols": [ + "ActivityPub" + ], + "licence": "MIT", + "language": "Node.js", + "site": "https://ghost.org/", + "github": "https://github.com/TryGhost/Ghost", + "etat": "Actif", + "compatibiliteAP": "Extension", + "createdYear": 2013, + "version": "5.0+" + }, + { + "id": "writefreely", + "name": "WriteFreely", + "description": "Plateforme de blogging minimaliste et fédérée axée sur l'écriture.", + "category": "blog", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Go", + "site": "https://writefreely.org/", + "github": "https://github.com/writefreely/writefreely", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2018, + "version": "0.15" + }, + { + "id": "plume", + "name": "Plume", + "description": "Moteur de blog fédéré axé sur la collaboration et la publication longue.", + "category": "blog", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Rust", + "site": "https://joinplu.me/", + "github": "https://github.com/Plume-org/Plume", + "etat": "Maintenance", + "compatibiliteAP": "Pleine", + "createdYear": 2018 + }, + { + "id": "wordpress-ap", + "name": "WordPress + ActivityPub", + "description": "Plugin ActivityPub pour WordPress permettant de fédérer les publications.", + "category": "blog", + "protocols": [ + "ActivityPub" + ], + "licence": "MIT", + "language": "PHP", + "site": "https://activitypub.plugin.wordpress.com/", + "github": "https://github.com/Automattic/wordpress-activitypub", + "etat": "Actif", + "compatibiliteAP": "Extension", + "createdYear": 2019 + }, + { + "id": "drupal-ap", + "name": "Drupal + ActivityPub", + "description": "Module ActivityPub pour Drupal permettant la fédération des contenus.", + "category": "blog", + "protocols": [ + "ActivityPub" + ], + "licence": "GPL-2.0", + "language": "PHP", + "site": "https://www.drupal.org/project/activitypub", + "github": "https://git.drupalcode.org/project/activitypub", + "etat": "Actif", + "compatibiliteAP": "Extension", + "createdYear": 2023 + }, + { + "id": "lemmy", + "name": "Lemmy", + "description": "Agrégateur de liens et forum fédéré. Alternative à Reddit.", + "category": "forum", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Rust", + "site": "https://join-lemmy.org/", + "github": "https://github.com/LemmyNet/lemmy", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2019, + "version": "0.19" + }, + { + "id": "mbin", + "name": "Mbin", + "description": "Successeur de kbin, agrégateur de liens fédéré avec des fonctionnalités améliorées.", + "category": "forum", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "PHP", + "site": "https://mbin.org/", + "github": "https://github.com/MbinOrg/mbin", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2023 + }, + { + "id": "nodebb-ap", + "name": "NodeBB", + "description": "Forum moderne avec support ActivityPub pour la fédération.", + "category": "forum", + "protocols": [ + "ActivityPub" + ], + "licence": "GPL-3.0", + "language": "Node.js", + "site": "https://nodebb.org/", + "github": "https://github.com/NodeBB/NodeBB", + "etat": "Actif", + "compatibiliteAP": "Extension", + "createdYear": 2014 + }, + { + "id": "mobilizon", + "name": "Mobilizon", + "description": "Plateforme d\\événements fédérée pour organiser et découvrir des événements.", + "category": "events", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Elixir", + "site": "https://mobilizon.org/", + "github": "https://framagit.org/framasoft/mobilizon", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2019, + "version": "4.1" + }, + { + "id": "gancio", + "name": "Gancio", + "description": "Agrégateur d\\événements fédéré auto-hébergeable.", + "category": "events", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Node.js", + "site": "https://gancio.org/", + "github": "https://framagit.org/les/gancio", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2022 + }, + { + "id": "forgejo", + "name": "Forgejo", + "description": "Forge logicielle libre forkée de Gitea. Support ActivityPub en développement.", + "category": "dev", + "protocols": [ + "ActivityPub" + ], + "licence": "MIT", + "language": "Go", + "site": "https://forgejo.org/", + "github": "https://codeberg.org/forgejo/forgejo", + "etat": "Actif", + "compatibiliteAP": "En développement", + "createdYear": 2022 + }, + { + "id": "gitea-ap", + "name": "Gitea", + "description": "Forge logicielle légère et rapide avec support ActivityPub via plugin.", + "category": "dev", + "protocols": [ + "ActivityPub" + ], + "licence": "MIT", + "language": "Go", + "site": "https://gitea.com/", + "github": "https://github.com/go-gitea/gitea", + "etat": "Actif", + "compatibiliteAP": "Extension", + "createdYear": 2016 + }, + { + "id": "nextcloud", + "name": "Nextcloud", + "description": "Suite de collaboration cloud auto-hébergeable avec support ActivityPub.", + "category": "collab", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "PHP", + "site": "https://nextcloud.com/", + "github": "https://github.com/nextcloud/server", + "etat": "Actif", + "compatibiliteAP": "Extension", + "createdYear": 2016, + "version": "30" + }, + { + "id": "owncloud", + "name": "ownCloud", + "description": "Plateforme de partage de fichiers et de collaboration en ligne.", + "category": "collab", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "PHP", + "site": "https://owncloud.com/", + "github": "https://github.com/owncloud/core", + "etat": "Actif", + "compatibiliteAP": "Extension", + "createdYear": 2010 + }, + { + "id": "bookwyrm", + "name": "BookWyrm", + "description": "Réseau social de lecture fédéré. Alternative à Goodreads.", + "category": "books", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Python", + "site": "https://joinbookwyrm.com/", + "github": "https://github.com/bookwyrm-social/bookwyrm", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2020, + "version": "0.7" + }, + { + "id": "wikidata", + "name": "Wikidata", + "description": "Base de connaissances libre et collaborative structurée.", + "category": "wiki", + "protocols": [ + "ActivityPub" + ], + "licence": "CC0", + "language": "PHP", + "site": "https://www.wikidata.org/", + "github": "https://github.com/wikimedia/wikidata-query-rdf", + "etat": "Actif", + "compatibiliteAP": "Partielle", + "createdYear": 2012 + }, + { + "id": "diaspora-soft", + "name": "Diaspora*", + "description": "Réseau social décentralisé historique. Précurseur du Fédiverse moderne.", + "category": "social", + "protocols": [ + "Diaspora* Protocol" + ], + "licence": "AGPL-3.0", + "language": "Ruby", + "site": "https://diasporafoundation.org/", + "github": "https://github.com/diaspora/diaspora", + "etat": "Maintenance", + "compatibiliteAP": "Aucune", + "createdYear": 2010 + }, + { + "id": "matrix-element", + "name": "Element", + "description": "Client Matrix pour la messagerie temps réel fédérée.", + "category": "collab", + "protocols": [ + "Matrix Protocol" + ], + "licence": "Apache-2.0", + "language": "TypeScript", + "site": "https://element.io/", + "github": "https://github.com/element-hq/element-web", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2016 + }, + { + "id": "fedify", + "name": "Fedify", + "description": "Framework TypeScript/Deno pour construire des serveurs ActivityPub.", + "category": "dev", + "protocols": [ + "ActivityPub" + ], + "licence": "MIT", + "language": "TypeScript", + "site": "https://fedify.dev/", + "github": "https://github.com/dahlia/fedify", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2024 + }, + { + "id": "mitra", + "name": "Mitra", + "description": "Serveur ActivityPub écrit en Rust avec support des monnaies complémentaires.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Rust", + "site": "https://mitra.social/", + "github": "https://codeberg.org/silverpill/mitra", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2022 + }, + { + "id": "socialhome", + "name": "Socialhome", + "description": "Réseau social fédéré avec un flux de contenu personnalisable.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Python", + "site": "https://socialhome.network/", + "github": "https://github.com/jaywink/socialhome", + "etat": "Maintenance", + "compatibiliteAP": "Partielle", + "createdYear": 2016 + }, + { + "id": "kbin", + "name": "kbin", + "description": "Agrégateur de contenu fédéré. Prédécesseur de Mbin.", + "category": "forum", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "PHP", + "site": "https://kbin.pub/", + "github": "https://github.com/ernestws/kbin", + "etat": "Historique", + "compatibiliteAP": "Pleine", + "createdYear": 2023 + }, + { + "id": "epicyon", + "name": "Epicyon", + "description": "Serveur ActivityPub minimaliste avec approche low-tech. Conçu pour les petites instances communautaires.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Python", + "site": "https://epicyon.net/", + "github": "https://gitlab.com/bashrc2/epicyon", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2020 + }, + { + "id": "takahe", + "name": "Takahē", + "description": "Serveur ActivityPub multi-domaine moderne. Permet d'héberger plusieurs domaines sur une seule instance.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "BSD", + "language": "Python", + "site": "https://jointakahe.org/", + "github": "https://github.com/jointakahe/takahe", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2022 + }, + { + "id": "smithereen", + "name": "Smithereen", + "description": "Serveur ActivityPub axé sur les réseaux sociaux avec interface style VKontakte.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Java", + "site": "https://smithereen.software/", + "github": "https://github.com/grishka/Smithereen", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2021 + }, + { + "id": "kroeg", + "name": "Kroeg", + "description": "Serveur ActivityPub en Rust avec architecture modulaire et extensible.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "MIT", + "language": "Rust", + "site": "https://github.com/puckipedia/Kroeg", + "github": "https://github.com/puckipedia/Kroeg", + "etat": "Experimental", + "compatibiliteAP": "Pleine", + "createdYear": 2018 + }, + { + "id": "lotide", + "name": "Lotide", + "description": "Agrégateur de liens fédéré léger. Alternative minimaliste à Lemmy.", + "category": "forum", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Rust", + "site": "https://sr.ht/~vpzom/lotide/", + "github": "https://git.sr.ht/~vpzom/lotide", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2020 + }, + { + "id": "sublinks", + "name": "Sublinks", + "description": "Plateforme de forums fédérée. Fork moderne de Lemmy avec des améliorations significatives.", + "category": "forum", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Rust", + "site": "https://sublinks.org/", + "github": "https://github.com/sublinks/sublinks", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2024 + }, + { + "id": "roadhouse", + "name": "RoadHouse", + "description": "Plateforme de forums fédérée avec une approche communautaire différente.", + "category": "forum", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Rust", + "site": "https://github.com/LemmyNet/lemmy", + "github": "https://github.com/LemmyNet/lemmy", + "etat": "Experimental", + "compatibiliteAP": "Pleine", + "createdYear": 2024 + }, + { + "id": "pieoneers", + "name": "Pieoneers", + "description": "Plateforme de partage de recettes fédérée avec ActivityPub.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "MIT", + "language": "Python", + "site": "https://git.sr.ht/~ Associazione/pieoneers", + "github": "https://git.sr.ht/~ Associazione/pieoneers", + "etat": "Experimental", + "compatibiliteAP": "Pleine", + "createdYear": 2023 + }, + { + "id": "wordpress-mu-ap", + "name": "WordPress MU + ActivityPub", + "description": "Plugin ActivityPub pour WordPress Multisite. Permet de fédérer des réseaux de blogs.", + "category": "blog", + "protocols": [ + "ActivityPub" + ], + "licence": "MIT", + "language": "PHP", + "site": "https://activitypub.plugin.wordpress.com/", + "github": "https://github.com/Automattic/wordpress-activitypub", + "etat": "Actif", + "compatibiliteAP": "Extension", + "createdYear": 2023 + }, + { + "id": "emissary", + "name": "Emissary", + "description": "Serveur ActivityPub modulaire avec support de streams et de collections.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "MIT", + "language": "Go", + "site": "https://github.com/EmissarySocial/emissary", + "github": "https://github.com/EmissarySocial/emissary", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2022 + }, + { + "id": "hometown", + "name": "Hometown", + "description": "Fork de Mastodon avec des fonctionnalités communautaires additionnelles.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Ruby", + "site": "https://github.com/hometown-fork/hometown", + "github": "https://github.com/hometown-fork/hometown", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2019 + }, + { + "id": " glitchsoc", + "name": "GlitchSoc", + "description": "Fork de Mastodon avec des fonctionnalités expérimentales et une customisation poussée.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Ruby", + "site": "https://glitch-soc.github.io/docs/", + "github": "https://github.com/glitch-soc/mastodon", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2017 + }, + { + "id": "akkoma-fe", + "name": "Akkoma-FE", + "description": "Frontend alternatif pour Akkoma avec des améliorations UI/UX.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Vue.js", + "site": "https://akkoma.social/", + "github": "https://akkoma.dev/AkkomaGang/akkoma-fe", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2022 + }, + { + "id": "postmarks", + "name": "Postmarks", + "description": "Système de bookmarks/bookmarques fédéré avec ActivityPub. Partagez vos signets.", + "category": "social", + "protocols": [ + "ActivityPub" + ], + "licence": "MIT", + "language": "JavaScript", + "site": "https://postmarks.glitch.me/", + "github": "https://github.com/ckolderup/postmarks", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2023 + }, + { + "id": "aoderelay", + "name": "AodeRelay", + "description": "Relay ActivityPub pour connecter des instances et améliorer la découverte.", + "category": "dev", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "Rust", + "site": "https://github.com/Byron/gitoxide", + "github": "https://github.com/asonix/activitypub-relay", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2020 + }, + { + "id": "coracle", + "name": "Coracle", + "description": "Client web Nostr haut de gamme avec une interface soignée et des performances optimisées.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "TypeScript", + "site": "https://coracle.social/", + "github": "https://github.com/coracle-social/coracle", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "nostrudel", + "name": "Nostrudel", + "description": "Client web Nostr avec UX moderne et support avancé des relays.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "TypeScript", + "site": "https://nostrudel.ninja/", + "github": "https://github.com/hzrd149/nostrudel", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "lume", + "name": "Lume", + "description": "Client desktop Nostr rapide et léger.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "GPL-3.0", + "language": "Rust", + "site": "https://lume.nu/", + "github": "https://github.com/lumehq/lume", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "gossip", + "name": "Gossip", + "description": "Client desktop Nostr en Rust avec interface native rapide.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "Rust", + "site": "https://github.com/mikedilger/gossip", + "github": "https://github.com/mikedilger/gossip", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "current", + "name": "Current", + "description": "Client iOS Nostr avec une interface épurée et moderne.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "Swift", + "site": "https://getcurrent.io/", + "github": "https://github.com/current/nostr", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "plebstr", + "name": "Plebstr", + "description": "Client mobile Nostr pour iOS et Android.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "TypeScript", + "site": "https://plebstr.com/", + "github": "https://github.com/verbiricha/plebstr", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "nostrples", + "name": "Nostrpels", + "description": "Client Nostr avec support de médias riches et expérience sociale améliorée.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "TypeScript", + "site": "https://nostrpels.com/", + "github": "https://github.com/nostrpels/nostrpels", + "etat": "Experimental", + "compatibiliteAP": "Aucune", + "createdYear": 2024 + }, + { + "id": "zapstream", + "name": "ZapStream", + "description": "Plateforme de streaming live sur Nostr avec Lightning Zaps intégrés.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "TypeScript", + "site": "https://zapstream.live/", + "github": "https://github.com/v0l/zapstream", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "nostrcheck", + "name": "NostrCheck.me", + "description": "Service de vérification d'identité et de badges pour Nostr.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "TypeScript", + "site": "https://nostrcheck.me/", + "github": "https://github.com/quentintaranpino/nostrcheck-api-ts", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "nostrmarket", + "name": "NostrMarket", + "description": "Place de marché décentralisée sur Nostr. Commerce P2P avec Lightning.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "TypeScript", + "site": "https://github.com/lnbits/nostrmarket", + "github": "https://github.com/lnbits/nostrmarket", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "prosody", + "name": "Prosody", + "description": "Serveur XMPP moderne, léger et facile à configurer.", + "category": "messaging", + "protocols": [ + "XMPP" + ], + "licence": "MIT", + "language": "Lua", + "site": "https://prosody.im/", + "github": "https://github.com/bjc/prosody", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2008, + "version": "0.12" + }, + { + "id": "ejabberd", + "name": "ejabberd", + "description": "Serveur XMPP robuste et scalable utilisé par de grandes plateformes.", + "category": "messaging", + "protocols": [ + "XMPP" + ], + "licence": "GPL-2.0", + "language": "Erlang", + "site": "https://www.ejabberd.im/", + "github": "https://github.com/processone/ejabberd", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2002, + "version": "24.02" + }, + { + "id": "openfire", + "name": "Openfire", + "description": "Serveur XMPP en Java avec interface d'administration web.", + "category": "messaging", + "protocols": [ + "XMPP" + ], + "licence": "Apache-2.0", + "language": "Java", + "site": "https://www.igniterealtime.org/projects/openfire/", + "github": "https://github.com/igniterealtime/Openfire", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2002, + "version": "4.8" + }, + { + "id": "tigase", + "name": "Tigase", + "description": "Serveur XMPP en Java avec support avancé de clustering.", + "category": "messaging", + "protocols": [ + "XMPP" + ], + "licence": "AGPL-3.0", + "language": "Java", + "site": "https://tigase.net/", + "github": "https://github.com/tigase/tigase-server", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2004 + }, + { + "id": "conversations", + "name": "Conversations", + "description": "Client XMPP Android moderne. Référence du messaging mobile décentralisé.", + "category": "messaging", + "protocols": [ + "XMPP" + ], + "licence": "GPL-3.0", + "language": "Java", + "site": "https://conversations.im/", + "github": "https://github.com/iNPUTmice/Conversations", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2014 + }, + { + "id": "dino", + "name": "Dino", + "description": "Client XMPP desktop moderne pour Linux. Interface épurée et moderne.", + "category": "messaging", + "protocols": [ + "XMPP" + ], + "licence": "GPL-3.0", + "language": "Vala", + "site": "https://dino.im/", + "github": "https://github.com/dino/dino", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2017 + }, + { + "id": "gajim", + "name": "Gajim", + "description": "Client XMPP desktop complet. Le client de référence historique.", + "category": "messaging", + "protocols": [ + "XMPP" + ], + "licence": "GPL-3.0", + "language": "Python", + "site": "https://gajim.org/", + "github": "https://dev.gajim.org/gajim/gajim", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2004 + }, + { + "id": "monal", + "name": "Monal", + "description": "Client XMPP pour iOS et macOS. Le meilleur client Apple pour XMPP.", + "category": "messaging", + "protocols": [ + "XMPP" + ], + "licence": "BSD", + "language": "Swift", + "site": "https://monal-im.org/", + "github": "https://github.com/monal-im/Monal", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2010 + }, + { + "id": "snikket", + "name": "Snikket", + "description": "'Le Mastodon du XMPP' — bundle serveur + client qui simplifie XMPP pour le grand public.", + "category": "messaging", + "protocols": [ + "XMPP" + ], + "licence": "AGPL-3.0", + "language": "Lua", + "site": "https://snikket.org/", + "github": "https://github.com/snikket-im/snikket-server", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2020 + }, + { + "id": "movim", + "name": "Movim", + "description": "Réseau social basé sur XMPP. Interface web moderne avec microblogging.", + "category": "messaging", + "protocols": [ + "XMPP" + ], + "licence": "AGPL-3.0", + "language": "PHP", + "site": "https://movim.eu/", + "github": "https://github.com/movim/movim", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2009 + }, + { + "id": "jabber", + "name": "Jabber", + "description": "Le protocole historique de messagerie instantanée. Ancêtre de XMPP, toujours utilisé.", + "category": "messaging", + "protocols": [ + "XMPP" + ], + "licence": "Open Standard", + "language": "Protocol", + "site": "https://www.jabber.org/", + "github": "https://www.jabber.org/", + "etat": "Historique", + "compatibiliteAP": "Aucune", + "createdYear": 1999 + }, + { + "id": "bluesky", + "name": "Bluesky", + "description": "Le réseau social décentralisé basé sur AT Protocol. Créé par l'ancienne équipe de Twitter.", + "category": "social", + "protocols": [ + "AT Protocol" + ], + "licence": "Proprietary", + "language": "TypeScript", + "site": "https://bsky.app/", + "github": "https://github.com/bluesky-social/social-app", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "graysky", + "name": "Graysky", + "description": "Client alternatif pour Bluesky/AT Protocol. iOS et Android.", + "category": "social", + "protocols": [ + "AT Protocol" + ], + "licence": "MIT", + "language": "TypeScript", + "site": "https://graysky.app/", + "github": "https://github.com/mozzius/graysky", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "tokimeki", + "name": "Tokimeki", + "description": "Client web alternatif pour Bluesky avec approche japonaise.", + "category": "social", + "protocols": [ + "AT Protocol" + ], + "licence": "MIT", + "language": "TypeScript", + "site": "https://tokimeki.blue/", + "github": "https://github.com/spuithori/tokimeki", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "briar", + "name": "Briar", + "description": "Messagerie P2P via Bluetooth/WiFi/Tor. Fonctionne sans connexion Internet.", + "category": "messaging", + "protocols": [ + "Briar Protocol" + ], + "licence": "GPL-3.0", + "language": "Java", + "site": "https://briarproject.org/", + "github": "https://code.briarproject.org/briar/briar", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2018 + }, + { + "id": "jami", + "name": "Jami", + "description": "Communication décentralisée GNU. Messages, appels vidéo, partage d'écran — tout en P2P.", + "category": "messaging", + "protocols": [ + "SIP", + "DHT" + ], + "licence": "GPL-3.0", + "language": "C++", + "site": "https://jami.net/", + "github": "https://git.jami.net/savoirfairelinux/ring-project", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2015 + }, + { + "id": "cryptpad", + "name": "CryptPad", + "description": "Suite bureautique chiffrée de bout en bout. Documents, tableurs, présentations, votes.", + "category": "collab", + "protocols": [ + "CryptPad Protocol" + ], + "licence": "AGPL-3.0", + "language": "JavaScript", + "site": "https://cryptpad.fr/", + "github": "https://github.com/cryptpad/cryptpad", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2016, + "version": "5.3" + }, + { + "id": "hedgedoc", + "name": "HedgeDoc", + "description": "Édition collaborative de Markdown en temps réel.", + "category": "collab", + "protocols": [ + "WebSocket" + ], + "licence": "AGPL-3.0", + "language": "TypeScript", + "site": "https://hedgedoc.org/", + "github": "https://github.com/hedgedoc/hedgedoc", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2016, + "version": "2.0" + }, + { + "id": "immich", + "name": "Immich", + "description": "Auto-hébergement de photos et vidéos avec IA. Alternative à Google Photos.", + "category": "collab", + "protocols": [ + "REST API" + ], + "licence": "AGPL-3.0", + "language": "TypeScript", + "site": "https://immich.app/", + "github": "https://github.com/immich-app/immich", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2022 + }, + { + "id": "photoprism", + "name": "PhotoPrism", + "description": "Gestion de photos auto-hébergée avec IA. Reconnaissance faciale et classement automatique.", + "category": "collab", + "protocols": [ + "REST API" + ], + "licence": "AGPL-3.0", + "language": "Go", + "site": "https://www.photoprism.app/", + "github": "https://github.com/photoprism/photoprism", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2018 + }, + { + "id": "synapse", + "name": "Synapse", + "description": "Serveur Matrix de référence par Element. Le serveur le plus utilisé de l'écosystème Matrix.", + "category": "collab", + "protocols": [ + "Matrix Protocol" + ], + "licence": "Apache-2.0", + "language": "Python", + "site": "https://matrix-org.github.io/synapse/", + "github": "https://github.com/element-hq/synapse", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2014 + }, + { + "id": "dendrite", + "name": "Dendrite", + "description": "Serveur Matrix de deuxième génération par Element. Plus léger et performant que Synapse.", + "category": "collab", + "protocols": [ + "Matrix Protocol" + ], + "licence": "Apache-2.0", + "language": "Go", + "site": "https://matrix-org.github.io/dendrite/", + "github": "https://github.com/element-hq/dendrite", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2017 + }, + { + "id": "conduit", + "name": "Conduit", + "description": "Serveur Matrix léger en Rust. Alternative rapide et efficace à Synapse.", + "category": "collab", + "protocols": [ + "Matrix Protocol" + ], + "licence": "Apache-2.0", + "language": "Rust", + "site": "https://conduit.rs/", + "github": "https://gitlab.com/famedly/conduit", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2020 + }, + { + "id": "cinny", + "name": "Cinny", + "description": "Client web Matrix avec interface moderne et intuitive. Alternative à Element.", + "category": "collab", + "protocols": [ + "Matrix Protocol" + ], + "licence": "MIT", + "language": "JavaScript", + "site": "https://cinny.in/", + "github": "https://github.com/cinnyapp/cinny", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2021 + }, + { + "id": "fluffychat", + "name": "FluffyChat", + "description": "Client Matrix pour mobile et desktop. Interface douce et accessible.", + "category": "collab", + "protocols": [ + "Matrix Protocol" + ], + "licence": "AGPL-3.0", + "language": "Dart/Flutter", + "site": "https://fluffychat.im/", + "github": "https://github.com/krille-chan/fluffychat", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2019 + }, + { + "id": "fedibridge", + "name": "FediBridge", + "description": "Outil de bridge entre différents réseaux fédérés. Interconnexion multi-protocoles.", + "category": "dev", + "protocols": [ + "ActivityPub", + "XMPP", + "Matrix" + ], + "licence": "MIT", + "language": "Python", + "site": "https://github.com/fediverse/fedibridge", + "github": "https://github.com/fediverse/fedibridge", + "etat": "Experimental", + "compatibiliteAP": "Pleine", + "createdYear": 2023 + }, + { + "id": "activitypub-relay", + "name": "ActivityPub Relay", + "description": "Relay public pour connecter des instances ActivityPub et améliorer la fédération.", + "category": "dev", + "protocols": [ + "ActivityPub" + ], + "licence": "MIT", + "language": "Go", + "site": "https://github.com/yukimochi/ActivityPub-Relay", + "github": "https://github.com/yukimochi/ActivityPub-Relay", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2018 + }, + { + "id": "sepiasearch", + "name": "Sepia Search", + "description": "Moteur de recherche fédéré pour PeerTube. Recherche cross-instance.", + "category": "video", + "protocols": [ + "ActivityPub" + ], + "licence": "AGPL-3.0", + "language": "TypeScript", + "site": "https://sepiasearch.org/", + "github": "https://github.com/framasoft/peertube-plugin-sepiasearch", + "etat": "Actif", + "compatibiliteAP": "Pleine", + "createdYear": 2020 + }, + { + "id": "simplexchat", + "name": "SimpleX Chat", + "description": "Messagerie décentralisée de nouvelle génération sans identifiants d'utilisateur. Protection de la vie privée par défaut avec chiffrement de bout en bout.", + "category": "messaging", + "protocols": [ + "SimpleX Messaging Protocol" + ], + "licence": "AGPL-3.0", + "language": "Haskell", + "site": "https://simplex.chat/", + "github": "https://github.com/simplex-chat/simplex-chat", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2020, + "version": "6.0" + }, + { + "id": "nostr-protocol", + "name": "Nostr Protocol", + "description": "Protocole simple et ouvert pour créer des réseaux sociaux résistants à la censure, basé sur des relays et des clés cryptographiques.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "Public Domain", + "language": "Specification", + "site": "https://nostr.com/", + "github": "https://github.com/nostr-protocol/nips", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2019 + }, + { + "id": "damus", + "name": "Damus", + "description": "Client iOS pour Nostr. Le client mobile le plus populaire de l'écosystème Nostr.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "GPL-3.0", + "language": "Swift", + "site": "https://damus.io/", + "github": "https://github.com/damus-io/damus", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2022 + }, + { + "id": "amethyst", + "name": "Amethyst", + "description": "Client Android pour Nostr. Application native Kotlin avec support complet des NIPs.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "Kotlin", + "site": "https://github.com/vitorpamplona/amethyst", + "github": "https://github.com/vitorpamplona/amethyst", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "iris", + "name": "Iris", + "description": "Client web pour Nostr. Interface moderne et réactive pour le réseau Nostr.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "TypeScript", + "site": "https://iris.to/", + "github": "https://github.com/irislib/iris-messenger", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2022 + }, + { + "id": "primal", + "name": "Primal", + "description": "Client Nostr avec un backend optimisé pour des performances ultra-rapides.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "Proprietary", + "language": "TypeScript", + "site": "https://primal.net/", + "github": "https://github.com/PrimalHQ", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "habla", + "name": "Habla.news", + "description": "Plateforme de publication longue sur Nostr. Alternative à Medium.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "TypeScript", + "site": "https://habla.news/", + "github": "https://github.com/verbiricha/habla.news", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "nostrgram", + "name": "Nostr.band", + "description": "Moteur de recherche et explorateur pour le réseau Nostr.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "JavaScript", + "site": "https://nostr.band/", + "github": "https://github.com/dtonon/nostr-band", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + }, + { + "id": "snort", + "name": "Snort", + "description": "Client web Nostr rapide et léger avec support des relays multiples.", + "category": "nostr", + "protocols": [ + "Nostr" + ], + "licence": "MIT", + "language": "TypeScript", + "site": "https://snort.social/", + "github": "https://github.com/v0l/snort", + "etat": "Actif", + "compatibiliteAP": "Aucune", + "createdYear": 2023 + } +] \ No newline at end of file diff --git a/atlas-fediverse/src/lib/data/timeline.ts b/atlas-fediverse/src/lib/data/timeline.ts new file mode 100644 index 0000000..56242b8 --- /dev/null +++ b/atlas-fediverse/src/lib/data/timeline.ts @@ -0,0 +1,418 @@ +export interface TimelineEvent { + year: number; + month?: number; + title: string; + description: string; + category: 'foundation' | 'protocol' | 'software' | 'milestone' | 'ecosystem'; + softwareId?: string; + protocolId?: string; + color: string; +} + +export const timelineEvents: TimelineEvent[] = [ + // 2008 + { + year: 2008, + title: 'StatusNet / Identi.ca', + description: "Evan Prodromou lance Identi.ca basé sur StatusNet. Première plateforme de microblogging décentralisée utilisant le protocole OStatus.", + category: 'foundation', + color: '#6C757D', + }, + // 2010 + { + year: 2010, + title: 'GNU social', + description: "Fork de StatusNet. Devient le pionnier du réseau social fédéré avec le protocole OStatus.", + category: 'software', + softwareId: 'gnusocial', + color: '#4CC9F0', + }, + { + year: 2010, + title: 'Diaspora*', + description: "Lancement de Diaspora* après une campagne Kickstarter. Réseau social décentralisé avec son propre protocole. Précurseur du Fédiverse moderne.", + category: 'software', + softwareId: 'diaspora-soft', + color: '#4CC9F0', + }, + { + year: 2010, + title: 'ownCloud', + description: "Lancement de la plateforme de cloud auto-hébergeable. Posera plus tard les bases de Nextcloud.", + category: 'software', + softwareId: 'owncloud', + color: '#2EC4B6', + }, + // 2011 + { + year: 2011, + title: 'Friendica', + description: "Plateforme sociale fédérée avec support multi-protocoles (OStatus, Diaspora*, plus tard ActivityPub).", + category: 'software', + softwareId: 'friendica', + color: '#4CC9F0', + }, + // 2012 + { + year: 2012, + title: 'Hubzilla', + description: "Plateforme de communications décentralisées avec contrôle d'accès granulaire et nomadisme d'identité via le protocole Zot.", + category: 'software', + softwareId: 'hubzilla', + color: '#4CC9F0', + }, + { + year: 2012, + title: 'W3C Social Web Working Group', + description: "Création du groupe de travail W3C sur le web social. Aboutira à la standardisation d'ActivityPub.", + category: 'foundation', + color: '#F72585', + }, + // 2014 + { + year: 2014, + title: 'Misskey', + description: "Lancement au Japon de Misskey, une plateforme sociale fédérée avec des fonctionnalités créatives uniques.", + category: 'software', + softwareId: 'misskey', + color: '#4CC9F0', + }, + // 2015 + { + year: 2015, + title: 'PeerTube', + description: "Framasoft lance PeerTube, une plateforme vidéo fédérée et décentralisée. Alternative libre à YouTube.", + category: 'software', + softwareId: 'peertube', + color: '#F72585', + }, + { + year: 2015, + title: 'Mastodon', + description: "Eugen Rochko lance Mastodon. Le début de l'explosion du Fédiverse moderne. Utilise OStatus, migrera plus tard vers ActivityPub.", + category: 'software', + softwareId: 'mastodon', + color: '#4CC9F0', + }, + // 2016 + { + year: 2016, + title: 'Pleroma', + description: "Serveur ActivityPub léger et configurable. Alternative rapide et ressource-efficiente à Mastodon.", + category: 'software', + softwareId: 'pleroma', + color: '#4CC9F0', + }, + { + year: 2016, + title: 'Matrix Protocol', + description: "Standardisation du protocole Matrix pour la communication temps réel décentralisée.", + category: 'protocol', + color: '#4361EE', + }, + { + year: 2016, + title: 'Nextcloud', + description: "Fork de ownCloud devenu la référence du cloud auto-hébergeable. Ajoutera plus tard le support ActivityPub.", + category: 'software', + softwareId: 'nextcloud', + color: '#2EC4B6', + }, + // 2017 + { + year: 2017, + title: 'W3C ActivityPub — Candidate Recommendation', + description: "ActivityPub atteint le statut de Candidate Recommendation au W3C. Le Fédiverse a désormais son standard.", + category: 'protocol', + color: '#F72585', + }, + { + year: 2017, + title: 'PixelFed', + description: "Lancement de PixelFed, plateforme de partage de photos fédérée. Alternative à Instagram.", + category: 'software', + softwareId: 'pixelfed', + color: '#F8961E', + }, + { + year: 2017, + title: 'WriteFreely', + description: "Plateforme de blogging minimaliste et fédérée axée sur l'écriture pure.", + category: 'software', + softwareId: 'writefreely', + color: '#7209B7', + }, + // 2018 + { + year: 2018, + title: 'ActivityPub — W3C Recommendation', + description: "ActivityPub devient une recommandation officielle du W3C. Le standard est désormais finalisé.", + category: 'milestone', + color: '#F72585', + }, + { + year: 2018, + title: 'BookWyrm', + description: "Réseau social de lecture fédéré. Alternative libre à Goodreads.", + category: 'software', + softwareId: 'bookwyrm', + color: '#E71D36', + }, + { + year: 2018, + title: 'Plume', + description: "Moteur de blog fédéré axé sur la collaboration et les publications longues.", + category: 'software', + softwareId: 'plume', + color: '#7209B7', + }, + { + year: 2018, + title: 'Funkwhale', + description: "Plateforme musicale fédérée pour écouter, partager et découvrir de la musique.", + category: 'software', + softwareId: 'funkwhale', + color: '#B5179E', + }, + { + year: 2018, + title: 'microblog.pub', + description: "Serveur ActivityPub minimaliste et auto-hébergeable pour le microblogging.", + category: 'software', + softwareId: 'microblogpub', + color: '#F9C74F', + }, + // 2019 + { + year: 2019, + title: 'Lemmy', + description: "Agrégateur de liens et forum fédéré. Alternative à Reddit.", + category: 'software', + softwareId: 'lemmy', + color: '#3A0CA3', + }, + { + year: 2019, + title: 'Mobilizon', + description: "Plateforme d'événements fédérée par Framasoft. Alternative à Facebook Events.", + category: 'software', + softwareId: 'mobilizon', + color: '#4361EE', + }, + { + year: 2019, + title: 'WordPress + ActivityPub', + description: "Automattic publie le plugin ActivityPub pour WordPress. Le plus grand CMS du monde rejoint le Fédiverse.", + category: 'software', + softwareId: 'wordpress-ap', + color: '#7209B7', + }, + { + year: 2019, + title: 'Nostr Protocol', + description: "Publication du protocole Nostr par fiatjaf. Une approche radicalement différente : pas de serveurs, pas d'instances, juste des relays et des clés.", + category: 'protocol', + color: '#F7931A', + }, + // 2020 + { + year: 2020, + title: 'Owncast', + description: "Serveur de streaming live auto-hébergeable. Alternative à Twitch.", + category: 'software', + softwareId: 'owncast', + color: '#F72585', + }, + { + year: 2020, + title: 'Bonfire', + description: "Réseau social modulaire axé sur la gouvernance communautaire et la coordination sociale.", + category: 'software', + softwareId: 'bonfire', + color: '#4CC9F0', + }, + { + year: 2020, + title: 'Castopod', + description: "Plateforme de podcasting fédérée avec ActivityPub. Alternative à Spotify/Apple Podcasts.", + category: 'software', + softwareId: 'castopod', + color: '#B5179E', + }, + { + year: 2020, + title: 'SimpleX Chat', + description: "Lancement de SimpleX Chat, une messagerie décentralisée de nouvelle génération sans identifiants utilisateur.", + category: 'software', + softwareId: 'simplexchat', + color: '#06D6A0', + }, + // 2021 + { + year: 2021, + title: 'Twitter → Mastodon', + description: "Vague massive de migrations de Twitter vers Mastodon après l'acquisition par Elon Musk. Le Fédiverse passe de 2M à 10M+ d'utilisateurs.", + category: 'milestone', + color: '#F72585', + }, + { + year: 2021, + title: 'GoToSocial', + description: "Serveur ActivityPub léger écrit en Go. Approche minimaliste et efficace pour auto-héberger son instance.", + category: 'software', + softwareId: 'gotosocial', + color: '#4CC9F0', + }, + // 2022 + { + year: 2022, + title: 'Akkoma', + description: "Fork de Pleroma avec des fonctionnalités enrichies et une personnalisation poussée.", + category: 'software', + softwareId: 'akkoma', + color: '#4CC9F0', + }, + { + year: 2022, + title: 'Mbin', + description: "Successeur de kbin, agrégateur de liens fédéré avec améliorations significatives.", + category: 'software', + softwareId: 'mbin', + color: '#3A0CA3', + }, + { + year: 2022, + title: 'Gancio', + description: "Agrégateur d'événements fédéré auto-hébergeable.", + category: 'software', + softwareId: 'gancio', + color: '#4361EE', + }, + { + year: 2022, + title: 'Forgejo', + description: "Forge logicielle libre forkée de Gitea. Le GitHub libre se fédère.", + category: 'software', + softwareId: 'forgejo', + color: '#4CC9F0', + }, + { + year: 2022, + title: 'Mitra', + description: "Serveur ActivityPub en Rust avec support des monnaies complémentaires et des économies locales.", + category: 'software', + softwareId: 'mitra', + color: '#4CC9F0', + }, + { + year: 2022, + title: 'Streams', + description: "Fork de Hubzilla axé sur la privacy et le contrôle granulaire des permissions.", + category: 'software', + softwareId: 'streams', + color: '#4CC9F0', + }, + // 2023 + { + year: 2023, + title: 'Threads → ActivityPub', + description: "Meta annonce que Threads intégrera ActivityPub. Le géant des réseaux sociaux rejoint le protocole fédéré.", + category: 'milestone', + color: '#F72585', + }, + { + year: 2023, + title: 'Sharkey', + description: "Fork de Misskey avec améliorations de performance et nouvelles fonctionnalités.", + category: 'software', + softwareId: 'sharkey', + color: '#4CC9F0', + }, + { + year: 2023, + title: 'Iceshrimp', + description: "Fork de Misskey optimisé pour la performance et la stabilité.", + category: 'software', + softwareId: 'iceshrimp', + color: '#4CC9F0', + }, + { + year: 2023, + title: 'NodeBB + ActivityPub', + description: "NodeBB ajoute le support ActivityPub. Les forums classiques rejoignent le Fédiverse.", + category: 'software', + softwareId: 'nodebb-ap', + color: '#3A0CA3', + }, + { + year: 2023, + title: 'Ghost + ActivityPub', + description: "Ghost intègre ActivityPub. Le CMS de blogging professionnel devient fédéré.", + category: 'software', + softwareId: 'ghost', + color: '#7209B7', + }, + { + year: 2023, + title: 'Bluesky ouvre au public', + description: "Bluesky (AT Protocol) ouvre ses portes. L'écosystème des réseaux décentralisés gagne en visibilité.", + category: 'ecosystem', + color: '#4CC9F0', + }, + // 2024 + { + year: 2024, + title: 'Loops', + description: "Plateforme de vidéos courtes fédérée par Mozilla. Alternative à TikTok/Instagram Reels.", + category: 'software', + softwareId: 'loops', + color: '#F72585', + }, + { + year: 2024, + title: 'Fedify', + description: "Framework TypeScript/Deno pour construire des serveurs ActivityPub. Simplifie le développement fédéré.", + category: 'software', + softwareId: 'fedify', + color: '#4CC9F0', + }, + { + year: 2024, + title: 'Vernissage', + description: "Application de galerie photo fédérée pour le Fédiverse.", + category: 'software', + softwareId: 'vernissage', + color: '#F8961E', + }, + { + year: 2024, + title: 'Nostr — Croissance explosive', + description: "Nostr atteint des millions d'utilisateurs. Damus, Amethyst, Primal et d'autres clients dominent. Bitcoin Lightning s'intègre pour les zaps.", + category: 'ecosystem', + color: '#F7931A', + }, + // 2025 + { + year: 2025, + title: 'Interconnexion Nostr ↔ ActivityPub', + description: "Les premiers ponts bidirectionnels entre Nostr et ActivityPub voient le jour. Les deux écosystèmes communiquent.", + category: 'milestone', + color: '#F7931A', + }, + { + year: 2025, + title: 'SimpleX Chat — v6.0', + description: "SimpleX atteint la v6.0 avec des groupes chiffrés de grande taille et des appels vidéo. Alternative mature à Signal et WhatsApp.", + category: 'software', + softwareId: 'simplexchat', + color: '#06D6A0', + }, + // 2026 + { + year: 2026, + title: 'Le Grand Atlas du Fédiverse v4.0', + description: "Publication de cette cartographie complète recensant 55+ logiciels, 12 protocoles et 18 ans d'histoire du réseau fédéré.", + category: 'milestone', + color: '#F72585', + }, +]; diff --git a/atlas-fediverse/src/lib/data/types.ts b/atlas-fediverse/src/lib/data/types.ts new file mode 100644 index 0000000..5b495a0 --- /dev/null +++ b/atlas-fediverse/src/lib/data/types.ts @@ -0,0 +1,66 @@ +export interface Software { + id: string; + name: string; + description: string; + category: string; + protocols: string[]; + licence: string; + language: string; + site: string; + github: string; + etat: 'Actif' | 'Maintenance' | 'Experimental' | 'Historique'; + compatibiliteAP: 'Pleine' | 'Partielle' | 'Extension' | 'Aucune' | 'En développement'; + version?: string; + createdYear?: number; +} + +export interface Protocol { + id: string; + name: string; + description: string; + type: 'fediverse' | 'connexe' | 'voisin'; + statut: 'Actif' | 'Historique' | 'En développement'; + site?: string; + rfc?: string; +} + +export interface Category { + id: string; + name: string; + icon: string; + color: string; + description: string; +} + +export interface NetworkNode { + id: string; + group: number; + val: number; + description: string; + category: string; + color: string; + etat: string; + compatibiliteAP: string; + licence: string; + x?: number; + y?: number; + z?: number; + vx?: number; + vy?: number; + vz?: number; + fx?: number | null; + fy?: number | null; + fz?: number | null; + index?: number; +} + +export interface NetworkLink { + source: string | NetworkNode; + target: string | NetworkNode; + type: 'strong' | 'weak'; +} + +export interface NetworkData { + nodes: NetworkNode[]; + links: NetworkLink[]; +} diff --git a/atlas-fediverse/src/lib/i18n/fr.ts b/atlas-fediverse/src/lib/i18n/fr.ts new file mode 100644 index 0000000..9b51b83 --- /dev/null +++ b/atlas-fediverse/src/lib/i18n/fr.ts @@ -0,0 +1,69 @@ +/* Dictionnaire français — locale de référence. + Structure de clés partagée avec gcf.ts (fallback automatique vers fr). */ + +export const fr = { + a11y: { + skipToContent: 'Aller au contenu principal' + }, + nav: { + map: 'Carte', + protocols: 'Protocoles', + timeline: 'Chronologie', + catalog: 'Logiciels', + nostr: 'Nostr', + simplex: 'SimpleX', + main: 'Navigation principale', + openMenu: 'Ouvrir le menu', + closeMenu: 'Fermer le menu' + }, + header: { + home: "Le Grand Atlas du Fédiverse — retour à l'accueil", + backToAtlas: "Retour à l'Atlas", + install: "Installer l'application", + installed: 'Application installée' + }, + offline: { + indicator: 'Hors connexion — vous naviguez sur la copie locale' + }, + common: { + close: 'Fermer', + loading: 'Chargement…', + search: 'Rechercher', + clear: 'Effacer', + resetFilters: 'Réinitialiser les filtres', + emptyResults: 'Aucun résultat pour ces critères', + officialSite: 'Site officiel', + sourceCode: 'Code source', + backToTop: 'Retour en haut de page' + }, + catalog: { + upToDate: 'Vous êtes à jour', + upToDateCreole: 'ou pa manké ayen', + results: '{count} résultat(s)' + }, + shortcuts: { + title: 'Raccourcis clavier', + open: 'Afficher les raccourcis clavier', + search: 'Aller à la recherche du catalogue', + help: 'Afficher cette aide', + next: 'Logiciel suivant dans le catalogue', + prev: 'Logiciel précédent dans le catalogue', + close: 'Fermer la fenêtre' + }, + footer: { + baseline: + 'Une cartographie interactive et communautaire du réseau fédéré décentralisé. Maintenue à jour par et pour la communauté francophone.', + madeIn: 'Fait avec ❤ en Guadeloupe', + project: 'Projet', + about: 'À propos', + license: 'Licence CC BY-SA', + source: 'Code source', + api: 'Données (JSON)', + resources: 'Ressources', + community: 'Communauté', + rights: 'Le Grand Atlas du Fédiverse © 2026 — Sous licence CC BY-SA 4.0', + credits: + 'Inspiré par Per Axbom (axbom.com/fediverse) · Données mises à jour régulièrement par la communauté', + localeLabel: 'Langue de l’interface' + } +}; diff --git a/atlas-fediverse/src/lib/i18n/gcf.ts b/atlas-fediverse/src/lib/i18n/gcf.ts new file mode 100644 index 0000000..57015c9 --- /dev/null +++ b/atlas-fediverse/src/lib/i18n/gcf.ts @@ -0,0 +1,75 @@ +/* Dictionnaire créole guadeloupéen (gcf). + Traduction progressive : les clés absentes retombent sur le français. */ + +import type { fr } from './fr'; + +type DeepPartial = { + [K in keyof T]?: T[K] extends object ? DeepPartial : T[K]; +}; + +export const gcf: DeepPartial = { + a11y: { + skipToContent: 'Alé o kontni prensipal' + }, + nav: { + map: 'Kat', + protocols: 'Pwotokòl', + timeline: 'Kronoloji', + catalog: 'Lojisyèl', + nostr: 'Nostr', + simplex: 'SimpleX', + main: 'Navigasyon prensipal', + openMenu: 'Ouvri meni an', + closeMenu: 'Fèmé meni an' + }, + header: { + home: 'Gran Atlas Fédiverse — tounen aksèy', + backToAtlas: 'Tounen an Atlas la', + install: 'Enstalé aplikasyon an', + installed: 'Aplikasyon enstalé' + }, + offline: { + indicator: 'San kònèksyon — w ap gadé kopi lokal la' + }, + common: { + close: 'Fèmé', + loading: 'Sa ap chajé…', + search: 'Chèchè', + clear: 'Éfasé', + resetFilters: 'Rémèt filtr yo a zéwo', + emptyResults: 'Pa ni pyès rézilta pou kritè sa-yo', + officialSite: 'Sit ofisyèl', + sourceCode: 'Kòd sous', + backToTop: 'Tounen anlè paj la' + }, + catalog: { + upToDate: 'Ou pa manké ayen', + upToDateCreole: 'vous êtes à jour', + results: '{count} rézilta' + }, + shortcuts: { + title: 'Rakoursi klavyé', + open: 'Afiché rakoursi klavyé yo', + search: 'Alé ba rachech katalòg la', + help: 'Afiché èd sa a', + next: 'Lojisyèl swivan an katalòg la', + prev: 'Lojisyèl avan an katalòg la', + close: 'Fèmé fenèt la' + }, + footer: { + baseline: + 'Yon kat entèaktif é kominotèr di rézo fédéré désantralizé a. Kominoté frankofonn ka tjouwen li ajou.', + madeIn: 'Fè ké lanmou an Gwadloup', + project: 'Pwojè', + about: 'Konsènan', + license: 'Lisans CC BY-SA', + source: 'Kòd sous', + api: 'Done (JSON)', + resources: 'Résous', + community: 'Kominoté', + rights: 'Gran Atlas Fédiverse © 2026 — Anba lisans CC BY-SA 4.0', + credits: + 'Enspiré pa Per Axbom (axbom.com/fediverse) · Done yo ka mèt ajou souvan pa kominoté a', + localeLabel: 'Lang entèfas la' + } +}; diff --git a/atlas-fediverse/src/lib/i18n/i18n.svelte.ts b/atlas-fediverse/src/lib/i18n/i18n.svelte.ts new file mode 100644 index 0000000..6d830b3 --- /dev/null +++ b/atlas-fediverse/src/lib/i18n/i18n.svelte.ts @@ -0,0 +1,60 @@ +/* i18n réactif (runes Svelte 5) — préparation bilinguisme FR / créole. + Usage dans un composant : `import { t } from '$lib/i18n/i18n.svelte';` + puis `{t('nav.map')}` dans le template (réactif au changement de locale). */ + +import { browser } from '$app/environment'; +import { fr } from './fr'; +import { gcf } from './gcf'; + +export const LOCALES = [ + { id: 'fr', label: 'Français' }, + { id: 'gcf', label: 'Kréyòl' } +] as const; + +export type Locale = (typeof LOCALES)[number]['id']; + +const STORAGE_KEY = 'atlas-locale'; + +const dicts: Record = { fr, gcf }; + +let locale = $state('fr'); + +function lookup(dict: unknown, path: string): string | undefined { + let node: unknown = dict; + for (const part of path.split('.')) { + if (node === null || typeof node !== 'object') return undefined; + node = (node as Record)[part]; + } + return typeof node === 'string' ? node : undefined; +} + +/** Traduit une clé (ex. 'nav.map'). Retombe sur le français si absente. + Supporte l'interpolation `{name}` via params. */ +export function t(key: string, params?: Record): string { + // La lecture de `locale` rend l'appel réactif dans les templates Svelte 5. + const raw = lookup(dicts[locale], key) ?? lookup(fr, key) ?? key; + if (!params) return raw; + return raw.replaceAll(/\{(\w+)\}/g, (_, name: string) => String(params[name] ?? `{${name}}`)); +} + +export function getLocale(): Locale { + return locale; +} + +export function setLocale(next: Locale): void { + locale = next; + if (browser) { + localStorage.setItem(STORAGE_KEY, next); + document.documentElement.lang = next; + } +} + +/** À appeler une fois côté client (layout racine). */ +export function initLocale(): void { + if (!browser) return; + const saved = localStorage.getItem(STORAGE_KEY); + if (saved === 'fr' || saved === 'gcf') { + locale = saved; + } + document.documentElement.lang = locale; +} diff --git a/atlas-fediverse/src/lib/keyboard.ts b/atlas-fediverse/src/lib/keyboard.ts new file mode 100644 index 0000000..ece3a0f --- /dev/null +++ b/atlas-fediverse/src/lib/keyboard.ts @@ -0,0 +1,8 @@ +/** Garde commune : ne pas intercepter les raccourcis pendant la saisie. */ +export function isTypingTarget(target: EventTarget | null): boolean { + if (!(target instanceof HTMLElement)) return false; + const tag = target.tagName; + return ( + tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || target.isContentEditable + ); +} diff --git a/atlas-fediverse/src/lib/pwa.svelte.ts b/atlas-fediverse/src/lib/pwa.svelte.ts new file mode 100644 index 0000000..8b9347c --- /dev/null +++ b/atlas-fediverse/src/lib/pwa.svelte.ts @@ -0,0 +1,51 @@ +/* État PWA partagé (runes) — capture beforeinstallprompt, détection installée. */ + +import { browser } from '$app/environment'; + +interface BeforeInstallPromptEvent extends Event { + prompt(): Promise; + userChoice: Promise<{ outcome: 'accepted' | 'dismissed' }>; +} + +let deferredPrompt = $state(null); +let installed = $state(false); + +let initialized = false; + +/** À appeler une fois côté client (layout racine). */ +export function initPwa(): void { + if (!browser || initialized) return; + initialized = true; + + if (window.matchMedia('(display-mode: standalone)').matches) { + installed = true; + } + + window.addEventListener('beforeinstallprompt', (event) => { + event.preventDefault(); + deferredPrompt = event as BeforeInstallPromptEvent; + }); + + window.addEventListener('appinstalled', () => { + installed = true; + deferredPrompt = null; + }); +} + +export function canInstall(): boolean { + return deferredPrompt !== null; +} + +export function isInstalled(): boolean { + return installed; +} + +/** Déclenche le prompt d'installation natif. Retourne true si accepté. */ +export async function promptInstall(): Promise { + if (!deferredPrompt) return false; + const promptEvent = deferredPrompt; + deferredPrompt = null; + await promptEvent.prompt(); + const { outcome } = await promptEvent.userChoice; + return outcome === 'accepted'; +} diff --git a/atlas-fediverse/src/routes/+layout.svelte b/atlas-fediverse/src/routes/+layout.svelte new file mode 100644 index 0000000..ba656fd --- /dev/null +++ b/atlas-fediverse/src/routes/+layout.svelte @@ -0,0 +1,28 @@ + + + +
+
+ {@render children()} +
+