Jusqu’ici, un espace de travail Notez n’accueillait qu’une seule personne. Depuis la v0.3.0, il peut en réunir plusieurs : invitez quelqu’un par e-mail, et vous partagez les notes, les étiquettes, les tableaux et le chat IA qui couvre le tout.
Le plus intéressant, c’est ce que j’ai laissé de côté.
La fonction que tout le monde demande en premier
« Deux personnes peuvent-elles modifier la même note en même temps ? »
Au sens de Google Docs, avec deux curseurs dans un même paragraphe et des caractères qui s’entremêlent à la frappe : non. C’est un problème réellement difficile, et le résoudre correctement exige des CRDT ou des transformations opérationnelles, une connexion persistante par document ouvert, et une réécriture du stockage des notes : non plus un document, mais un flux d’opérations que l’on rejoue.
C’est une bonne fonction. C’est aussi, à elle seule, l’essentiel d’un produit, et elle aurait retardé le partage de plusieurs mois pour servir un cas rare dans une application de notes. En général, deux personnes n’écrivent pas le même paragraphe en même temps. Elles écrivent des notes différentes, ou la même note à des moments différents.
J’ai donc conçu le partage pour ce qui se passe réellement, et rendu le cas rare sûr plutôt que fluide.
Ce qui se passe réellement
Trois choses, par ordre d’importance.
Vous voulez savoir que quelqu’un d’autre est là. Ouvrez une note qu’un collègue a ouverte, et son avatar apparaît à côté de l’état d’enregistrement. Il se met à jour à quelques secondes d’intervalle et disparaît environ une minute après que votre collègue a fermé la note.
C’est volontairement de la présence, pas un indicateur de frappe. Elle répond à « quelqu’un d’autre est-il ici en ce moment ? », la question qui vous fait attendre ou continuer. Techniquement, c’est un hash Redis par note avec un TTL de 60 secondes et une interrogation périodique, sans WebSocket ni diffusion d’abonnements. La fonction tient en quelques dizaines de lignes, et si Redis est brièvement indisponible, la note s’ouvre et s’enregistre quand même.
Vous voulez savoir qui a modifié quoi. L’état d’enregistrement affiche désormais Modifié par Sam il y a 4 minutes quand la dernière écriture n’était pas la vôtre, et une simple date quand elle l’était. Avec les 30 jours d’historique des versions que chaque note garde déjà, la question « à quoi ressemblait cette note avant que Sam y touche ? » a une réponse.
L’attribution s’est révélée être ce que les gens attendaient le plus de la collaboration, et elle coûte deux colonnes.
Vous ne voulez pas perdre de travail. C’est le point qui compte.
Refuser l’enregistrement
Avec un partage naïf, la défaillance est silencieuse et totale : vous ouvrez une note, la modifiez pendant dix minutes, enregistrez, et votre version remplace celle que votre collègue a enregistrée huit minutes plus tôt. Aucune erreur. Son travail a simplement disparu, et aucun de vous deux ne s’en aperçoit avant que quelqu’un remarque un paragraphe manquant la semaine suivante.
Notez donne désormais à chaque note un numéro de version. Quand votre éditeur charge une note, il retient la version qu’il a vue, et chaque enregistrement renvoie ce numéro. La mise à jour s’exécute ainsi :
UPDATE "Note" SET ... WHERE id = $1 AND "contentVersion" = $2
Si quelqu’un a enregistré entre-temps, la version ne correspond plus, la clause WHERE ne trouve aucune ligne, et l’écriture n’a pas lieu. Un bandeau vous indique qui a modifié la note, avec un bouton Recharger.
Le détail important : le garde-fou se trouve dans la clause WHERE, et non dans une instruction if placée au-dessus. Une vérification suivie d’une écriture laisse une fenêtre entre les deux. Elle est courte, mais deux enregistrements qui arrivent au même instant, c’est précisément le moment où le garde-fou doit tenir. Mettre la version dans la condition de mise à jour, c’est laisser la base de données trancher, de façon atomique, et le second à écrire perd.
Perdre est le bon résultat. L’alternative au refus, c’est deviner comment combiner deux versions d’un paragraphe, et une mauvaise supposition est pire qu’une erreur franche, parce qu’une mauvaise supposition a l’air d’avoir marché.
Ce que je n’ai pas fait, exprès
Pas de permissions par note. L’accès se règle par espace de travail. Toute personne invitée peut tout y lire, y compris la corbeille. Des ACL par note impliqueraient une vérification de permission sur chaque chemin de lecture, une interface pour les gérer, et des demandes de support de gens qui ne comprennent pas pourquoi une note est invisible. Si vous avez besoin d’une frontière, créez un second espace de travail : c’est gratuit, et les espaces sont complètement isolés.
Pas de commentaires. Un fil de commentaires est un petit réseau social. Pas maintenant.
Pas de curseurs en direct. Voir plus haut.
Pas de facturation par place. Les membres n’ont pas besoin de leur propre forfait. Les places viennent de celui du propriétaire : 3 avec Free, 10 avec Pro, 25 avec Ultra, et tout ce que l’espace de travail stocke est décompté du quota du propriétaire.
Où passe la frontière
Le partage se fait par espace de travail, et les espaces de travail étaient déjà la frontière d’isolation dans Notez : le chat IA ne voit que l’espace courant, et une clé MCP est liée à un seul espace. Cette propriété survit au partage : invitez un collègue dans Travail, et il n’obtient rien de Personnel, ni dans la recherche, ni par l’IA, ni par une clé.
C’est appliqué côté serveur, à chaque requête, et c’est la raison pour laquelle j’ai choisi l’espace de travail comme unité de partage au lieu d’en inventer une nouvelle.
Si vous gardiez tout dans un seul espace de travail et voulez maintenant en partager une partie, déplacez d’abord ces notes dans leur propre espace de travail, puis invitez.
Les détails sont dans Partager un espace de travail avec d’autres personnes. Tout ce qui est sorti avec cette version : v0.3.0.
À lire aussi
La personne assignée qui ne travaille plus ici — pourquoi retirer quelqu’un d’un espace de travail efface ses attributions au lieu de laisser un nom grisé sur quarante notes.
Quatre filets de sécurité pour vos notes, de l’annulation à l’enregistrement refusé — ce que rattrapent l’annulation, les 30 jours d’historique des versions, la corbeille et la protection contre les conflits d’enregistrement, et où chacun s’arrête.
Notez, une application de prise de notes pour les développeurs — ce qu’est Notez, les façons d’y faire entrer une note et ce que comprend chaque forfait.