Présentation

BraiNOTES est une application open source qui permet d’écrire à la main sur des diapositives PDF directement dans un onglet du navigateur. Aucun compte n’est requis et aucune donnée n’est envoyée à un serveur ; tout reste local. L’interface propose plusieurs outils (stylo à bille, plume, marqueur, surligneur) avec prise en charge de la pression du stylet, ainsi que des pages vierges, ligné, quadrillé ou à points et un tableau blanc sans bordure.

Architecture technique

Le front‑end est construit avec Svelte 5 et SvelteKit en mode adaptateur statique, ce qui génère un site purement client. Les traits sont calculés par la bibliothèque perfect‑freehand, qui transforme les points capturés et la pression du stylet en contours lisses. Un filtre one‑euro est appliqué en temps réel pour réduire les tremblements du crayon. Le rendu des PDF s’appuie sur pdf.js, exécuté dans un worker afin de ne pas bloquer le thread principal. L’écriture de nouvelles pages PDF utilise pdf‑lib (fork pdfme) pour superposer les vecteurs d’encre aux pages originales.

pnpm install
pnpm dev

Le stockage persistant repose sur IndexedDB, accédé via la petite couche idb. Chaque modification déclenche une sauvegarde différée d’une fraction de seconde, garantissant la continuité hors‑ligne dès que le carnet a été ouvert une première fois.

Gestion des données et export

Les carnets, pages et fichiers sont empaquetés dans un fichier .brainotes, qui est simplement un zip contenant un fichier JSON par page, les PDF d’origine et les images insérées. Cette structure facilite la sauvegarde manuelle et le partage sans serveur. L’export vers PDF crée un nouveau document où les pages d’origine sont conservées et les traits sont injectés sous forme de vecteurs, assurant une qualité d’impression équivalente à celle d’un fichier natif. Une option d’export PNG génère des images raster de chaque page, utile pour les environnements qui ne supportent pas le PDF vectoriel.

Performances et limites

Le découpage en « tiles » de canvas permet de ne redessiner que les zones modifiées, limitant la charge graphique lors de longues sessions d’écriture. Cependant, la dépendance à IndexedDB impose une contrainte de taille de stockage qui varie selon le navigateur et le dispositif, ce qui peut devenir un facteur limitant pour des cours très volumineux. Le rendu PDF via pdf.js, bien que efficace, dépend de la capacité du worker à gérer plusieurs pages simultanément ; un grand nombre de pages affichées à haute résolution peut entraîner une latence perceptible. Enfin, l’absence de synchronisation cloud signifie que la collaboration en temps réel n’est pas supportée, ce qui restreint l’usage à des scénarios individuels ou à des échanges de fichiers .brainotes après coup.