Changelog
Les changements notables, du plus récent au plus ancien.
Ce journal recense les changements visibles
(déploiement, formats, réglages). Il vit dans le dépôt (site/changelog.md)
et est publié ici. Les décisions techniques détaillées sont dans
docs/decisions.md.
2026-07-27 — version 0.0.8
Compte, publication, messagerie
- Création de compte dans le front : génération de phrase de récupération et confirmation, sans passer par l’explorateur.
- Invitation à distance : écran partagé « demander / inviter », lien et QR code, chaînon d’invitation diffusé en gossip.
- Messagerie : rédaction d’un message sans fil existant (une clé collée suffit comme destinataire), rafraîchissement du fil après le premier envoi, largeur de bulle bornée, texte copiable.
- Garde de formulaire : quitter un écran de publication avec une saisie non enregistrée demande confirmation.
- Champ prix : contrainte annoncée dans le champ et signalée à la frappe ; la géolocalisation d’une annonce est conservée à l’édition et à la re-publication.
- « Re-publier sous ma clé » sur les contenus importés : reprendre à son compte une annonce ou une page issue de l’import v1.
Favoris et réactions
- Favori privé distinct de la note publique : l’étoile marque désormais un favori privé et chiffré (pour soi), pendant que le cœur/pouce reste la réaction publique agrégée par lignée d’annonce. Page « Mes favoris » dédiée.
Notifications
- Toasts à compte à rebours pour les événements ponctuels et panneau « cloche » listant l’historique des notifications, dans l’app desktop. La synchronisation a sa propre bande d’état : elle n’encombre plus la cloche.
- Notifications sociales : messages reçus et commentaires sur ses propres annonces, avec curseur de lecture persistant.
Carte
- Fond de carte vectoriel PMTiles (Protomaps) embarqué, en remplacement d’OpenStreetMap : rendu hors ligne par construction, plus de dépendance à un service de tuiles tiers pour le fond par défaut. Sprites embarqués : la carte fonctionne sans aucun accès réseau.
- Pages géolocalisées : une page porte un point, la carte les interroge par index et bascule en régime agrégé quand la zone est dense.
- Couches colorées (annonces, membres, pages) avec regroupement compact et menu préfiltré.
- Le fond détaillé (haute résolution) n’est pas distribué dans cette version : la carte s’en tient au fond monde embarqué. L’extraction régionale reproductible et ses mesures de poids sont en place, le choix du niveau de détail reste à faire.
Recherche et filtres (gchange)
- Barre de recherche unifiée (annonces, annuaire, pages) : facettes catégorie, ville, type, prix, auteur, combinables, avec facettes multivaluées (OU par champ) et correctifs de comportement clavier (sélection au clavier, désynchronisation résultats/critères auto-réparée).
- Listes au fil de l’eau : les résultats s’affichent au fur et à mesure au lieu d’attendre la requête complète ; résultats peu pertinents repliés derrière un bouton.
- Affichage des clés en format multibase
(
z6Mk…) plutôt qu’en base58 brut (hexa réservé au mode expert), des deux côtés du pont.
Amorçage et synchronisation
- Adoption creuse + remplissage de fond : un client neuf adopte le squelette d’index de son indexeur puis complète en tâche de fond, au lieu d’attendre un rapatriement massif ; les lectures de l’interface ne font plus la queue derrière la synchronisation.
- Progression réelle (barres de résolution de requête et de remplissage), publiée pendant le lot et non seulement à ses bornes ; un tour de synchronisation sans travail ne publie plus de progression trompeuse.
- Streaming de clôture (
OP_CLOSURE) et progression par compteurs de feuilles. - Incomplétude non silencieuse : une requête qui ne peut pas être satisfaite le dit, au lieu de renvoyer un résultat partiel sans le signaler.
- Indicateur réseau permanent dans la barre d’application (dont l’état « connecté sans pair »).
Modération
- Cascade d’invitation : le lien invitant → invité est tracé, la descendance d’une clé est affichée, et le modérateur publie un acte signé par cible (aucune cascade automatique côté protocole).
Nœud et données
- Fait d’import = fichier source : une donnée importée conserve son fichier JSON d’origine comme fait, ce qui rend l’index re-dérivable sans re-télécharger les dumps v1. Le journal d’import survit à la fusion d’un CAR de données.
- Verrou de règle d’index : un changement de règle
d’indexation verrouille l’index au lieu de produire un état incohérent,
avec un geste de sortie explicite (vider + re-dériver, ou réarmer)
disponible côté serveur (
trame-noded) et depuis l’app. rebuildconstate avant de détruire ;purgedevient le geste destructif séparé.--serve-pmtiles: servir un fond de carte.pmtilesentrame/file(récupérable par CID), idempotent au redémarrage.- Méta
/localpubliées et rapatriées entre pairs : la clé d’administration d’un serveur devient résoluble par ses pairs. - Garbage collection : les blocs de valeur de
/localet l’arbre/privatesont épinglés (le GC effaçait les messages déchiffrés). - Store :
PackStorepar défaut pour un store neuf, avec compactage de l’ancien format un-fichier-par-bloc.
Mémoire et performance
- Empreinte mémoire du client bornée (threads, arènes, caches, budget de requête) et rendu de carte vectoriel au lieu de rasterisé : −400 Mio au pic, mémoire native rendue à la sortie de la carte.
- Remplissage de fond bridé : il ne prive plus l’interface du pont vers le cœur.
- Images décodées à la taille d’affichage, caches bornés et purgés au changement d’état.
Paquets et distribution
- Paquets natifs en plus des archives :
.debet.pkg.tar.zstpour l’app Ğeopod et l’explorateur. (La recette du.debstatique musl detrame-nodedexiste aussi, mais ce paquet n’est pas distribué dans cette version.) - Données pré-amorçées : le CAR de l’état public (2,0 Gio, 1 964 132 entrées d’index) est publié avec la version, dans le registre de paquets — un client neuf démarre dessus au lieu de tout rapatrier bloc à bloc.
- Porte de tests à la publication : le corpus complet doit être vert pour qu’une release soit fabriquée.
- Chaîne de release réparée : les bundles desktop et explorateur ne se construisaient plus (le mini fond de carte, posé en lien symbolique, n’entrait pas dans le contexte du conteneur de build) ; la page de release affiche désormais toujours les notes de version, et son commit ne peut plus rester épinglé à la version précédente.
2026-07-18 — version 0.0.7
Amorçage d’index paginé (clients natifs)
- Diff paginé (
OP_DIFF_PAGE) : le bootstrap d’index d’un client neuf contre un gros nœud (1,96 M d’entrées) se fait désormais par pages bornées au lieu d’un diff monolithique qui dépassait la borne de 64 Mo (stream too long). Rapatriement du CAR complet (~1,3 Go) en ~3 min, puis diff incrémental fonctionnel. Bundles desktop et web de la release rebuildés avec ce correctif.
Client web sans rapatriement massif
- Adoption creuse + fetch paresseux : le client web n’importe plus le CAR ; il adopte le squelette d’index d’un nœud de confiance (~8 200 blocs, ~1,5 s en local) puis chaque requête rapatrie uniquement les blocs qu’elle touche via la passerelle (15–25 blocs, ~50 ms). Première recherche de profils ou d’annonces en ~1,5 s au lieu du téléchargement complet.
- Prefetch borné par le plan de requête : la détection des blocs manquants descend l’arbre en suivant le plan (budget de lignes, sens de parcours), au lieu d’énumérer la structure entière.
Listes par date
- Index
ad-by-time/page-by-time: annonces et pages triées par date nativement dans l’index (pagination keyset, ordre décroissant O(k)). Le root de production change en conséquence (données héritées ré-indexées).
Nœud
- Garbage collection du block store (mark &
sweep) : les blocs inatteignables depuis les racines épinglées sont
balayés ; activable par
--gc-interval/--gc-ttl(désactivé par défaut), inspection parwhy_pinned. Résout la limite connue de la 0.0.5 (anciennes versions des fichiers servis non collectées). - Correctif : le root annoncé en gossip était instable (un heartbeat
index-headnon-progressant était rejournalisé à chaque tick, deux nœuds s’observant mutuellement se recommitaient en boucle toutes les 10 s, aucun client ne pouvait converger) ; les réémissions à root identique sont désormais ignorées et l’annonce est debouncée sur les racines convergentes. - Politique d’échec de sync et observabilité warp : échec+réessai visibles dans l’app (badge), inspection d’un root distant sans fusion.
2026-07-09 — version 0.0.6
Amorçage client (premier démarrage zéro-config)
- Rapatriement massif de l’état par CAR servi en pair-à-pair : une app fraîche télécharge l’état complet chunké depuis le nœud public (~1,25 Go à ~7 Mo/s en conditions réelles) puis l’adopte d’un coup, au lieu de la sync par diff (quelques Mo/min, inutilisable pour un index de millions d’entrées). Le suivi par annonces prend ensuite le relai pour les nouveautés.
- Profils-œuf des clés de confiance : les annonces de root des clés de confiance embarquées sont admissibles dès le premier boot (sans quoi une app vierge rejetait tout comme « auteur sans profil »).
- Adoption automatique du root majoritaire des clés de confiance sur nœud vierge, robuste à la course boot/gossip.
- Correctif : sur un état importé sans faits signés, la détection de « nœud vierge » restait vraie après adoption et rebouclait ; un marqueur persistant scelle l’adoption.
Réactivité
- Recherche pendant l’amorçage : une requête rapatrie à la demande les seuls blocs qu’elle touche (priorité sur la sync de fond), sans attendre la fin du téléchargement complet.
- Bannière d’état de synchronisation (amorçage → index adopté → à jour), poussée en flux plutôt qu’interrogée périodiquement.
2026-07-08 — version 0.0.5
Données de production
- Historique complet Ğchange en production : le nœud public adopte désormais l’historique importé complet (33 098 annonces, 61 842 profils, 39 416 commentaires, 628 358 réactions, 324 879 messages, 1 733 pages — CAR de 1,31 Go, publié via le package registry). Les messages privés sont inclus : donnée publique chiffrée, chacun déchiffre les siens avec son secret.
- Les apps publiées (web, desktop) démarrent zéro-config sur ce nouvel état (flavor mise à jour vers le root de production).
Nœud
--serve-file(optionserveFilesdu module NixOS) : un fichier est chunké dans le block store (trame/file) et devient récupérable pair-à-pair par CID — utilisé pour servir le CAR d’état lui-même via iroh, en plus du téléchargement HTTPS. Limite connue : les anciennes versions ne sont pas encore garbage-collectées du store.
2026-07-07 — version 0.0.4
Ğchange — cycle de vie des annonces
- États d’annonce signés : une annonce est
active, vendue ou fermée ; le propriétaire change l’état depuis la fiche (« Marquer vendue », « Fermer », « Rouvrir »). L’état vit dans le document signé (schémagchange/adv2), pas dans une décision de serveur. - Badges et filtre : badges Vendue/Fermée sur les cartes et la fiche ; les listes, la carte et les compteurs de catégories ne montrent que les annonces actives par défaut, avec une bascule « Annonces terminées » ; « Mes annonces » montre tout.
- Modération douce : un modérateur peut
masquer une annonce (avec motif, trace consultable)
sans l’effacer — acte signé
moderation/mask, réversible. Pas de péremption automatique : l’écartement éditorial est toujours un acte signé (admin/modérateur/bot délégué). - Les annonces importées de gchange v1 avec
stock = 0apparaissent « fermées ».
Premier démarrage et hors-ligne
- Boot non bloquant : l’app s’ouvre immédiatement, l’amorçage réseau se fait en tâche de fond (clé de confiance, adoption du root majoritaire).
- Résolveur de blocs réseau : les données manquantes sont récupérées à la demande pendant la navigation (file à deux priorités).
- Progression de synchronisation en 4 phases, affichée par bannières brèves (« utilisable hors ligne », « tout est à jour »).
- Publication différée : un fait publié hors-ligne est mis en file persistante, re-diffusé et confirmé à la reconnexion.
Divers
- Little Alchemy : plateau drag-and-drop et vue arbre des combinaisons.
- Documentation d’installation du pod : les 3 clés du bandeau de boot.
2026-07-07 — version 0.0.3
Ğchange — écriture et édition
- Écriture sociale câblée : on peut désormais réagir, commenter, envoyer un message privé et signaler depuis l’app (et non plus seulement lire).
- Édition d’annonce : modification d’une annonce publiée (revision de branche, famille de champs couvrante), avec date native et ligne de réactions façon Discourse.
- Profil enrichi (
cesium/profile) éditable par son propriétaire. - Pages Cesium+ : création et édition de pages, et visibilité des pages natives.
Ğchange — recherche et navigation
- Facettes de catégorie indexées (top-N + compteur), calculées côté index.
- Recherche unifiée partagée entre la liste et la carte : même barre, mêmes filtres (titre, ville, catégorie, auteur), état commun ; les points de la carte suivent le filtre appliqué en SQL.
Ğchange — UX
Rafraîchissement réactif au changement de racine, messages d’erreur copiables, barre d’actions repliable, aide contextuelle « ? » (schemadoc).
Cycle de vie des données
- Fork signalé : une révision divergente est détectée
structurellement et matérialisée par un badge dans
l’interface ; la résolution reste côté client (publier
un
trame/merge). - Modération douce : masquage d’une ligne (trace conservée, consultable) via une colonne d’action à provenance propre, distincte de la désindexation/ suppression (modération forte).
Corrections et distribution
- Web : correction des listes grises (préfixe de table résolu via la variante de sync).
- Desktop : artefact portable buildé en conteneur glibc (hors Nix).
- Publication : garde d’évaluation du flake publié
(détecte un fichier lu à l’éval mais manquant, ex.
flavors/geopod.json).
2026-07-07 — version 0.0.2
Messagerie chiffrée v1 (Cesium/Ğchange)
Nouvelle vue Messagerie : les conversations privées
v1 (messages NaCl box de Cesium+/Ğchange) sont déchiffrées
localement avec la clé du compte actif — copies boîte de
réception et d’envoi comprises. Le clair vit dans une
racine locale /private jamais exportée (ne
quitte pas la machine).
Connexion aux comptes Ğ1 v1 (identifiant + mot de passe)
On peut désormais se connecter avec un compte Cesium/Ğ1 v1 existant (identifiant + mot de passe, dérivation scrypt d’origine) et basculer entre plusieurs comptes sans ressaisir le mot de passe. « Mon compte » suit le compte actif ; l’icône utilisateur ouvre son profil.
Ğchange — mode expert
Un réglage mode expert (Paramètres) affiche les CID et un inspecteur de bloc dans les vues Ğchange, pour diagnostiquer sans quitter l’app.
Clés — affichage SS58 par défaut
Les clés s’affichent en SS58 par défaut, les autres formats (hex, Ğ1 v1) à la demande, avec copie de la valeur intégrale.
Requêtes SQL partageables
Une requête SQL peut être enregistrée comme donnée et partagée par CID (reproductible : un même CID rejoue la même requête).
Performance
- Indexation par lots nettement plus rapide : ingestion tout-en-RAM (seuil de flush réglable), flush du store parallélisé, provenance regroupée en un seul bloc.
- Store en pack append-only (
PackStore) détecté automatiquement à l’adoption et au runtime : lève le mur du flush sur les gros imports. - Annuaire et listes O(k) : index ordonné (tri
éliminé) et scan inverse natif
(
ORDER BY <tête> DESCborné, sans doubler l’index).
Durcissement
Plafonds anti-déni-de-service sur le décodage
(parse_diff, lecture de CAR), tailles de chunk saturantes,
ordre GC/cache corrigé. Constantes de convergence regroupées dans un
objet /config structuré.
2026-07-05
Ticket de connexion au format standard iroh
Le ticket d’un nœud est désormais un
EndpointTicket iroh standard (chaîne
endpoint…, base32) au lieu du format maison précédent. Plus
court, interopérable, copiable-collable (lien / QR). Pas de
rétro-compatibilité avec l’ancien format.
Release de données (CAR Ğeopod)
Nouvelle cible de publication
nix run .#publish-data-release -- <tag> : attache un
CAR de données content-addressed à une release de la
forge, avec un manifeste qui précise la taille de la
sélection (root, entrées, lignes par table). Une infra peut
récupérer ce CAR par hash et démarrer un nœud dessus
(trame-noded --state <car>). Le CAR
data-only ne grave ni clé admin ni charte : la
gouvernance est injectée par le nœud au démarrage
(--admin).
L’amorçage d’un nœud sur des données héritées est maintenant documenté (Serveur → Données héritées).
Clé admin — trois écritures acceptées
--admin / TRAME_ADMIN accepte la
même clé en hex (64), base58 brut (Ğ1),
ou PeerId libp2p (12D3Koo…). Cette
dernière est la forme affichée par l’app dans « Mon compte » : on peut
désormais la coller directement, sans conversion.
Passerelle HTTP — modèle découplé (correction)
Correction d’un piège de déploiement : la passerelle
écrit dans son répertoire de données (un montage
lecture seule la faisait planter). Le modèle correct, désormais
documenté et appliqué par le module NixOS trame-gateway :
la passerelle a son propre store inscriptible et
résout les CID absents via iroh en suivant le ticket du
nœud (peers / peerFile) — nœud et
passerelle sont reliés par le réseau, pas par un dossier partagé.
Attention à la course au démarrage : peerFile n’est lu
qu’une fois, démarrer la passerelle après que le nœud a
écrit son ticket.
Documentation de déploiement
- Distinction
--state(adopter un CAR verbatim) vs--import-car(fusionner des données par-dessus) explicitée. - Chaîne bout-en-bout navigateur → relai → nœud
décrite, avec l’option
services.trame-noded.relay. - Réglage relai/bootstrap de l’app web unifié :
GC_SYNC=<relais>|<ticket>(dev) et la flavor (TRAME_RELAY+TRAME_BOOTSTRAP) sont le même couple, figé au build (un bundle statique n’a pas de config à l’exécution).