El día de hoy te enseñaré una aplicación simple, gratuita y open source para gestionar notas y listas (To Do app). Está hecha con JavaScript usando Svelte, utiliza SQLite3 para el almacenamiento, Tailwind para el diseño y se agrega encriptación con la web crypto API.
Con esta app de notas podrás agregar notas y listas de pendientes, además de poder encriptarlas usando AES en modo CBC. Cada nota y cada lista puede ser encriptada de manera independiente y con una contraseña distinta, generado el vector de inicialización y derivando la clave a partir de una contraseña.

Puedes agregar etiquetas a cada lista y nota, para que puedas filtrarlas más adelante.
Lo mejor de esto es que la app puede ser instalada como una aplicación nativa gracias al poder de las PWA, así que puedes usarla en móviles y dispositivos de escritprio.
Me emocioné tanto con la llegada de SQLite3 a la web con OPFS que hice esta app para aprender Svelte y Tailwind, pero terminé haciendo también la app de cumpleaños y luego experimenté un poco con WASM.
Veamos entonces esta webapp de tareas pendientes totalmente open source.
Mostrar notas y listas
En la base de datos, cada lista y nota es independiente. Además, los elementos de las listas se guardan en otra tabla. Entonces para empezar hay 3 tablas: las notas, las listas y los elementos de las listas.
Para mostrar las listas y notas combinadas primero se obtienen por separado, después se combinan con concat
y finalmente se ordenan por la fecha de creación.
Una vez que tenemos la lista combinada como un Array, las mostramos con Svelte:
Para diferenciar si es una nota o una lista se comprueba la propiedad contenido
; las notas tienen esa propiedad, las listas no. Estoy utilizando componentes de Svelte para mostrar las vistas previas. Por ejemplo, el de la lista se ve así:
De hecho hay varios componentes para esta app de pendientes, pues también existe el componente que muestra las etiquetas, pero eso lo podrás ver en los vídeos del desarrollo de la app o en GitHub.
La encriptación
En esta aplicación open source con JavaScript podemos encriptar el contenido de las notas y listas usando la Web Crypto API y el algoritmo AES con CBC, derivando la clave a partir de una contraseña y generando una sal; todo muy seguro.
Ya te había mostrado cómo encriptar información con JavaScript en el lado del cliente en otro post, así que esto no es nuevo. Lo nuevo es encriptar el contenido cada vez que se guarda una nota o lista:
Te he mostrado lo más importante, obviamente en el código fuente completo podrás ver todas las funciones.
Después, en la vista previa solo agrego la clase “desenfocado” si la nota está encriptada. Esto es solo para que se vea “seguro”, pero realmente el contenido es una cadena en base64 que contiene la información encriptada y que nadie puede desencriptar al menos que tenga la contraseña.
El estilo CSS es el siguiente:
Menú

Cuando tocas el botón para agregar una cosa, puedes elegir entre agregar una nota, lista, nota encriptada o lista encriptada. Ese menú está hecho con Svelte y se ve así:
Los elementos del menú son simples enlaces que llevan a otro componente de la app, ya que estoy usando un enrutador para Svelte. Lo demás está hecho con animaciones propias de Svelte así como iconos y HTML.
Base de datos
Como lo dije anteriormente, esta aplicación web de elementos pendientes usa SQLite3 para almacenar todos los datos. Utiliza relaciones entre las tablas y consultas SQL.
Debido a que solo se puede interactuar con OPFS desde un Web Worker, he expuesto el funcionamiento con Comlink. Al final queda así:
Para que la aplicación tenga un rendimiento aceptable he colocado la base de datos en un singleton usando las stores de Svelte, así que ahora en donde sea que quiera interactuar con la BD primero hago un servicio:
Y en el constructor del servicio espero recibir la instancia de la base de datos. Ahora dentro de los componentes simplemente lo invoco usando el store previamente mencionado. Por ejemplo, en el onMount
:
De este modo solo tengo una instancia de la base de datos; las consultas (DELETE, SELECT, UPDATE e INSERT) las hago en los servicios. Con ello puedo invocar a los servicios desde cualquier lugar pasándoles la base de datos gracias al singleton.
Poniendo todo junto
Te he explicado los detalles más importantes, pero si quieres puedes estudiar el código fuente completo en GitHub: https://github.com/parzibyte/notas_sqlite3_svelte/
También he grabado casi todo el proceso de creación de esta webapp, ya que aunque parezca sencillo no lo es. Puedes revisar las mejoras aplicadas y las complicaciones encontradas en la siguiente lista de reproducción: https://www.youtube.com/playlist?list=PLat1rFhO_zZiYdjPRpCGkAYSFWSDsoR9e
Hice esta app para probar el rendimiento de SQLite3 en el lado del cliente, y al parecer todo funciona de maravilla, así que seguramente escribiré más programas usando estas tecnologías. También me gustó la facilidad de las stores de Svelte y los estilos de Tailwind.
Para terminar te dejo con más tutoriales de JavaScript y Svelte en mi blog.
Excelente trabajo. muy util y super sencillo.
Muchas Gracias!