Un éditeur de blocs dont vous gardez les données.
Le confort d'édition de Notion, en TypeScript vanilla, avec un schéma intermédiaire entre l'éditeur et le rendu — et un stockage qui reste lisible le jour où vous arrêtez d'utiliser l'outil.
Un schéma intermédiaire
Le document est une donnée, pas du HTML. Le DOM n'est qu'une projection jetable — jamais la source de vérité.
Lisible sans l'outil
Markdown, CSV, SQLite. Supprimez l'éditeur, vos fichiers restent ouvrables et modifiables ailleurs — et une commande de vérification échoue si ça cesse d'être vrai.
Sept opérations
Tout changement passe par sept opérations inversibles. L'annulation, la persistance et la synchronisation en découlent.
TypeScript vanilla
Le cœur ne connaît ni le DOM ni React. Les liaisons React, Vue et Svelte ont exactement deux dépendances, vérifiées en intégration continue.
Ce qu'il sait faire
L'écart visé est étroit et, autant qu'une étude de 2026 ait pu le dire, inoccupé : personne ne propose une édition de la classe de Notion dont le stockage est un dossier de fichiers Markdown. Obsidian a les fichiers, Notion a l'édition.
Ce qui suit en montre une partie ; le catalogue complet les liste toutes.
Écrire
- Le menu « / » pour poser un bloc, l'autoformat Markdown pour ceux qui préfèrent la syntaxe
- Le keymap standard du système à l'intérieur du contenteditable : ^A, ^E, ^K, ⌥⌫, ⌘⌫
- ⌥↑/⌥↓ déplacent un bloc, ⇧⌥↑/⇧⌥↓ le dupliquent
- Sélection multi-blocs, poignée de glisser-déposer, colonnes (expérimental)
- Gras, italique, souligné, barré, code, exposant, indice, ==surlignage== — tous conservés en Markdown
- Presse-papiers à trois formats, saisie IME sûre, mentions « @ »
Des blocs, y compris les vôtres
- Titres, listes, cases à cocher, citations, toggles, séparateurs, images, sous-pages
- Déposez n'importe quel fichier : il devient un bloc, et un PDF se prévisualise
- Tableaux avec cellules fusionnées et sélection de cellules
- Blocs de code : la coloration est peinte via la CSS Custom Highlight API, jamais injectée dans le texte éditable
- Callouts, sommaire dont les ancres survivent à l'export
- Un bloc = un paquet : son schéma, sa vue, ses projections Markdown et HTML
Des bases de données
- Vues table, tableau, liste et galerie sur la même collection
- Groupement, filtres multiples, tris
- Un langage de formules pur, des relations, des rollups
- Projeté sur le disque : un CSV, un fichier .md par ligne, un fichier .base par vue
Un espace de travail
- Arborescence de pages, rétroliens, recherche classée sur un index SQLite
- Un vault Markdown qui fait l'aller-retour : exportez-le, éditez-le dans Obsidian, réimportez-le avec les identifiants intacts
- Import Notion
- Le JSON canonique fait foi, le Markdown est régénéré — deux copies, une seule vérité
À plusieurs
- CRDT Loro : fusion du texte caractère par caractère, hors ligne compris
- Curseurs en direct, commentaires ancrés au texte et non à un décalage
- Historique du document, avec restauration
- Pair-à-pair WebRTC : le relais négocie puis sort du chemin, et sert de repli — un port, aucun serveur TURN
- nbe serve : un pair permanent sur un NAS, sans base de données
À intégrer
- React, Vue et Svelte : cycle de vie, projection d'état, portails — rien d'autre
- Rendu statique en HTML sans navigateur ni instance d'éditeur
- Chaque fonctionnalité s'attache ou non : ce que vous retirez n'est pas dans votre bundle
- Lecture seule, libellés traduisibles, thème par canaux CSS
Le même éditeur, sous cinq formes
Le cœur ne connaît ni le DOM, ni React, ni un serveur — c'est ce qui rend ces cinq formes possibles sans qu'aucune soit le portage d'une autre.
Une bibliothèque
Un éditeur de texte sans interface, à embarquer dans un produit qui a déjà le sien. Cinq lignes pour la version minimale.
Une app de bureau
Carnet : une fenêtre Tauri dont le stockage est un dossier lisible — un vault Markdown à côté des documents canoniques.
Un plugin Obsidian
L'édition par blocs sur une note à la fois. Le fichier reste du Markdown, et Obsidian garde la main sur tout le reste.
Une app iOS
SwiftUI, un UITextView par bloc, du vrai WebRTC. Une seconde implémentation du format, en Swift, qui lit et écrit le même document.
Un relais headless
nbe relay : un WebSocket, un port, aucune base de données. Plusieurs navigateurs — et nbe peer, un pair sans écran.
Ce qui le tient debout
Des chiffres mesurés plutôt que des adjectifs. Chromium, WebKit — le moteur de Safari et donc d'iOS —, le tactile aux tailles de téléphone et une topologie d'édition alternative bloquent tous la CI ; le port Swift a sa propre suite, et un test échoue si les deux implémentations divergent sur une seule règle d'autoformat.
- 1012tests unitaires
- 4suites navigateur qui bloquent la CI
- 8,3 mspar frappe à 500 blocs
- 3clients sur un même document, sans serveur