Un Wiki Atproto FR
Une nouvelle section wiki est ajoutée au site atproto.fr, comme les autres projets il s’agit plus d’une expérience technique que réellement une initiative d’ampleur pour l’écosystème français. L’auteur de ce site ayant un gros poil dans la main pour écrire du contenu, il ne faut pas compter sur lui pour remplir ce wiki immédiatement. L’IA peut aider, mais si l’effort d’écriture est absent, il est compréhensible que l’effort de lecture le soit aussi.
Pourquoi faire un wiki ? Pour mieux comprendre comment atproto peut aider à produire un travail collaboratif. C’était aussi le sujet de l’expérience de l’annuaire, où chaque collaborateur peut conserver sur son PDS, une liste de suggestions de comptes à ajouter. Voir les détails ici. L’idée du wiki nous fait cette fois ci travailler non pas sur un jeu de données mais sur un ensemble de pages en format markdown. Pour concrétiser cette idée, nous nous sommes appuyés sur l’analyse de deux applications existantes utilisant atproto.
Lichen.Wiki: une plateforme collaborative d’édition de Wiki.
alt
Page d'accueil de Lichen.Wiki
alt
Exemple de page wiki sur lichen.wiki
alt
Exemple d'édition d'une note de wiki
Lichen.wiki, portée par le développeur français
@juprodh.me, permet de créer et gérer
un wiki collaboratif utilisant des notes Markdown.
Chaque collaborateur peut créer une note ou modifier celle-ci avec
une révision sous la forme d’un git diff qui sera stockée sur le PDS du collaborateur.
Le lexicon wiki.lichen.noteRevision{
"lexicon": 1,
"id": "wiki.lichen.noteRevision",
"defs": {
"main": {
"type": "record",
"description": "A revision to a note, stored as a diff from the previous revision.",
"key": "tid",
"record": {
"type": "object",
"required": [
"noteRef",
"diff",
"diffFormat",
"createdAt"
],
"properties": {
"noteRef": {
"type": "string",
"format": "at-uri",
"description": "AT-URI of the parent note record."
},
"parentRevision": {
"type": "string",
"format": "at-uri",
"description": "AT-URI of the previous revision. Omitted for the first revision of a note."
},
"diff": {
"type": "string",
"maxLength": 1000000,
"description": "The diff content in the format specified by diffFormat."
},
"diffFormat": {
"type": "string",
"maxLength": 32,
"knownValues": [
"diff-match-patch"
],
"description": "Format of the diff string."
},
"message": {
"type": "string",
"maxLength": 1024,
"description": "Optional commit message describing this revision."
},
"createdAt": {
"type": "string",
"format": "datetime",
"description": "When this revision was created."
},
"blobs": {
"type": "array",
"items": {
"type": "blob",
"accept": [
"image/jpeg",
"image/png",
"image/gif",
"image/webp"
],
"maxSize": 2097152
},
"description": "Blobs referenced by this revision's content."
}
}
}
}
}
}
pointe sur la révision précédente et l’ensemble de la chaîne de modification représente l’état du wiki.
L’application https://lichen.wiki écoute le flux
des nouveaux enregistrements de révision, pour proposer au visiteur le rendu final.
L’interface est claire et plutôt facile à utiliser. Le format supporte
les liens wiki [[]] et l’historique de chaque note est consultable.
L’application permet aussi de découvrir d’autres wikis, ce qui donne au
système une dimension sociale.
Le choix du chaînage de révision nécessite d’avoir une certaine confiance dans l’accessibilité du contenu des collaborateurs. Un collaborateur peut supprimer à tout moment ses révisions de son répertoire personnel hébergé sur son PDS, cassant ainsi la chaîne. Comme expliqué par son créateur, l’application lichen.wiki garde en mémoire l’état du wiki et sert donc de sauvegarde. De même un système de reconstruction des révisions depuis cette sauvegarde est en cours de développement. Ce qui est un peu contre-intuitif avec le modèle de flux de données du protocole AT, où la donnée se stocke d’abord sur les répertoires des PDS avant de rejoindre les caches et bases de données des applications et non l’inverse, mais dans notre contexte il s’agirait d’un cas exceptionnel.
Pour un wiki qui ne souhaite pas dépendre de la base de données de lichen.wiki et du bon vouloir de ses collaborateurs de conserver les révisions, la solution la plus évidente est d’auto-héberger l’application lichen.wiki dont le code source est disponible à tous sous licence GNU. Mais les solutions évidentes ne sont pas très divertissantes et le format git diff des révisions fut une inspiration pour une nouvelle expérience d’interopérabilité.
Utiliser Tangled.org
Si le wiki utilise un lexicon enrobant un git diff et ne doit posséder qu’une seule source de vérité, un ensemble de fichiers, en amont de la génération du site internet (Atproto.fr utilise le générateur Astro), alors pourquoi ne pas réutiliser les lexicons de Tangled ?
Tangled.org est une plateforme d’hébergement de code utilisant le protocole AT pour gérer les interactions sociales autour des répertoires de code. La suggestion de changement de code (nommée Pull Request), la création de tickets décrivant les bugs ou les fonctionnalités futures, sont deux exemples de ces interactions.
alt
Page de répertoire Tangled
alt
Page d'une pull request sur la plateforme tangled
alt
Page de profil sur tangled
Le lexicon sh.tangled.repo.pull{
"lexicon": 1,
"id": "sh.tangled.repo.pull",
"needsCbor": true,
"needsType": true,
"defs": {
"main": {
"type": "record",
"key": "tid",
"record": {
"type": "object",
"required": [
"target",
"title",
"createdAt",
"rounds"
],
"properties": {
"title": {
"type": "string"
},
"body": {
"type": "string"
},
"rounds": {
"type": "array",
"items": {
"type": "ref",
"ref": "#round"
}
},
"source": {
"type": "ref",
"ref": "#source"
},
"target": {
"type": "ref",
"ref": "#target"
},
"createdAt": {
"type": "string",
"format": "datetime"
},
"mentions": {
"type": "array",
"items": {
"type": "string",
"format": "did"
}
},
"references": {
"type": "array",
"items": {
"type": "string",
"format": "at-uri"
}
},
"dependentOn": {
"type": "string",
"format": "at-uri"
}
}
}
},
"target": {
"type": "object",
"required": [
"repo",
"branch"
],
"properties": {
"repo": {
"type": "string",
"format": "did"
},
"branch": {
"type": "string"
}
}
},
"source": {
"type": "object",
"required": [
"branch"
],
"properties": {
"branch": {
"type": "string"
},
"repo": {
"type": "string",
"format": "did"
}
}
},
"round": {
"type": "object",
"required": [
"patchBlob",
"createdAt"
],
"description": "revisions of this pull request, newer rounds are appended to this array. appviews may reject records do not treat this field as append-only. the blob format is gzipped text-based git-format-patches.",
"properties": {
"createdAt": {
"type": "string",
"format": "datetime"
},
"patchBlob": {
"type": "blob",
"accept": [
"application/gzip"
]
}
}
}
}
} pointe à la fois sur l’enregistrement
sh.tangled.repo{
"lexicon": 1,
"id": "sh.tangled.repo",
"needsCbor": true,
"needsType": true,
"defs": {
"main": {
"type": "record",
"key": "any",
"record": {
"type": "object",
"required": [
"knot",
"createdAt"
],
"properties": {
"name": {
"type": "string",
"description": "Cosmetic name of the repo."
},
"knot": {
"type": "string",
"description": "knot where the repo was created"
},
"spindle": {
"type": "string",
"description": "CI runner to send jobs to and receive results from"
},
"description": {
"type": "string",
"minGraphemes": 1,
"maxGraphemes": 140
},
"website": {
"type": "string",
"format": "uri",
"description": "Any URI related to the repo"
},
"topics": {
"type": "array",
"description": "Topics related to the repo",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 50
},
"maxLength": 50
},
"source": {
"type": "string",
"format": "uri",
"description": "source of the repo"
},
"labels": {
"type": "array",
"description": "List of labels that this repo subscribes to",
"items": {
"type": "string",
"format": "at-uri"
}
},
"repoDid": {
"type": "string",
"format": "did",
"description": "DID of the repo itself, if assigned"
},
"createdAt": {
"type": "string",
"format": "datetime"
}
}
}
}
}
} décrivant l’emplacement du répertoire de code et sur le git
diff enregistré sous la forme d’un Blob. Le lien vers le knot à l’origine de la
pull request est facultatif, permettant à n’importe qui de créer une Pull
request sur son PDS sans la nécessité d’héberger une copie entière du
répertoire sur un serveur dédié. Cette façon d’envoyer un git diff via le
protocole AT rappelle d’une certaine façon l’envoi d’un git patch via e-mail,
pratique toujours en cours pour contribuer au noyau linux par exemple.
En exploitant ce lexicon, le site atproto.fr peut proposer au visiteur de suggérer une modification de ses propres fichiers en enregistrant une Pull request sur le PDS du visiteur.
La Pull request apparaît ensuite sur la plateforme tangled.org dans la liste des Pull requests d’un répertoire. Par l’interface de relecture de la plateforme, elle peut être acceptée et son code inclus ou bien refusée. Sur le long terme, ce système de modification du wiki peut profiter des outils de modération développés par l’équipe de tangled, comme le nouveau système permettant à un utilisateur d’être garant des bonnes pratiques d’un autre utilisateur.
À l’inverse de lichen.wiki, ce système ne permet pas de découvrir d’autres wikis
par l’usage d’un lexicon dédié comme wiki.lichen.wiki{
"lexicon": 1,
"id": "wiki.lichen.wiki",
"defs": {
"main": {
"type": "record",
"description": "A wiki. The rkey is a permanent slug.",
"key": "any",
"record": {
"type": "object",
"required": [
"name",
"visibility",
"createdAt",
"language"
],
"properties": {
"name": {
"type": "string",
"maxLength": 256,
"description": "Display name of the wiki."
},
"visibility": {
"type": "string",
"maxLength": 32,
"knownValues": [
"public",
"private"
],
"description": "Access level."
},
"createdAt": {
"type": "string",
"format": "datetime",
"description": "When the wiki was created."
},
"language": {
"type": "string",
"maxLength": 16,
"description": "BCP-47 language tag for the wiki content (e.g. 'en', 'fr', 'ja')."
},
"description": {
"type": "string",
"maxLength": 300,
"description": "Short description of the wiki's purpose or topic."
},
"theme": {
"type": "string",
"maxLength": 64,
"knownValues": [
"light",
"dark"
],
"description": "Optional theme preference set by the wiki creator (e.g. 'light', 'dark'). When present, clients should render with this theme; when absent, the viewer's own preference is used. Apps that don't recognize the name should fall back to their default."
}
}
}
}
}
}.
Les répertoires tangled peuvent être marqués par une étiquette wiki,
mais c’est à la charge de leurs propriétaires de le faire.
Quel avenir pour ce wiki ?
Il est difficile de prédire l’avenir de ce wiki, qui sert avant tout d’exemple d’interopérabilité. Son objectif est d’illustrer le potentiel du protocole dans la construction d’applications sociales et collaboratives. L’idée n’est pas d’exercer une pression ou de susciter de la culpabilité chez les contributeurs pour que chaque information soit exhaustive et à jour.









Chargement…