Hace unos días publicamos un artículo en el que comparábamos tres maneras diferentes de usar aplicaciones web. Por un lado, desde el navegador tal cual; por otro, instalando la aplicación y usándola en una ventana separada; y por último haciendo uso de Webapp Manager, lo que creo que es lo mejor con diferencia. Hoy os traigo una opción diferente, una que se basa en parte en la XApp de Linux Mint.
Las aplicaciones instaladas desde el navegador pesan un poco más que lo que crea Webapps Manager. Tienen una ventaja, y es que se puede acceder a las extensiones fácilmente y funcionan todas, como por ejemplo un ecualizador que yo no he hecho funcionar -tampoco he buscado mucho- en las aplicaciones 100% separadas. Pero, por lo general, lo que crea Webapps Manager está a un nivel superior. Lo que pasa es que, por lo menos para los navegadores basados en Chromium más populares, lo único que hace es crear un archivo .desktop con una orden que le dice al navegador que lance una aplicación en un perfil aislado. Conseguir eso es lo que vamos a explicar hoy aquí.
Aplicaciones web en perfil aislado y sin instalar nada
Lo malo de la aplicación de Linux Mint, por ponerle algún pero, es que instala el software principal y algunos módulos de Python extra. Es peccata minuta para el que usa muchas aplicaciones web y además quiere elegir el navegador base, pero si nos es suficiente con Chrome, Brave, Vivaldi o Edge, todo lo que instalemos está de más.
Como decíamos, el secreto está en examinar qué hacen esas aplicaciones, analizar el archivo .desktop y crear uno parecido. Esto, que se puede hacer manualmente a partir del primer archivo que nos crea Webapp Manager, copiando y editando lo necesario, podemos automatizarlo usando Bash. El código sería el siguiente:
#!/bin/bash echo "SSBash ¿Qué quieres hacer? 1. Crear aplicación web 2. Eliminar app existente 3. Salir" read opcion if [ "$opcion" == "1" ]; then echo "Nombre de la aplicación:" read nombre_app id_app=$(echo "$nombre_app" | tr -d ' ') echo "Comentario:" read comentario echo "Categoría": read categoria echo "URL de la aplicación web (sin https/http):" read url echo "Ruta al icono de la app": read icono nombre_imagen=$(basename "$icono") echo "Navegador: 1. Firefox 2. Chrome 3. Chromium 4. Brave 5. Edge 6. Vivaldi 7. Firefox (flatpak) 8. Chrome (flatpak) 9. Chromium (flatpak) 10. Brave (flatpak) 11. Edge (flatpak) 12. Vivaldi (flatpak) 13. ungoogled-chromium (flatpak)" read navegador_elegido case $navegador_elegido in 1) navegador="Firefox" && ejecutable="sh -c 'firefox --class WebApp-$id_app --name WebApp-$id_app --profile $HOME/.config/SSBash/$navegador-$id_app --no-remote \"https://$url\"'" && firefox -CreateProfile "$navegador-$id_app $HOME/.config/SSBash/$navegador-$id_app";; 2) navegador="Chrome" && ejecutable="google-chrome-stable --app="https://$url" --class=WebApp-$id_app --name=WebApp-$id_app --user-data-dir=$HOME/.config/SSBash/$navegador-'$id_app'";; 3) navegador="Chromium" && ejecutable="chromium --app="https://$url" --class=WebApp-$id_app --name=WebApp-$id_app --user-data-dir=$HOME/.config/SSBash/$navegador-'$id_app'";; 4) navegador="Brave" && ejecutable="brave --app="https://$url" --class=WebApp-$id_app --name=WebApp-$id_app --user-data-dir=$HOME/.config/SSBash/$navegador-'$id_app'";; 5) navegador="Edge" && ejecutable="microsoft-edge --app="https://$url" --class=WebApp-$id_app --name=WebApp-$id_app --user-data-dir=$HOME/.config/SSBash/$navegador-'$id_app'";; 6) navegador="Vivaldi" && ejecutable="vivaldi-stable --app="https://$url" --class=WebApp-$id_app --name=WebApp-$id_app --user-data-dir=$HOME/.config/SSBash/$navegador-'$id_app'";; 7) navegador="Firefox-flatpak" && ejecutable="sh -c 'flatpak run org.mozilla.firefox --class WebApp-$id_app --name WebApp-$id_app --profile $HOME/.config/SSBash/$navegador-$id_app --no-remote \"https://$url\"'" && firefox -CreateProfile "$navegador-$id_app $HOME/.config/SSBash/$navegador-$id_app";; 8) navegador="Chrome-flatpak" && ejecutable="flatpak run com.google.Chrome --app="https://$url" --class=WebApp-$id_app --name=WebApp-$id_app --user-data-dir=$HOME/.config/SSBash/$navegador-'$id_app'";; 9) navegador="Chromium-flatpak" && ejecutable="flatpak run org.chromium.Chromium --app="https://$url" --class=WebApp-$id_app --name=WebApp-$id_app --user-data-dir=$HOME/.config/SSBash/$navegador-'$id_app'";; 10) navegador="Brave-flatpak" && ejecutable="flatpak run com.brave.Browser --app="https://$url" --class=WebApp-$id_app --name=WebApp-$id_app --user-data-dir=$HOME/.config/SSBash/$navegador-'$id_app'";; 11) navegador="Edge-flatpak" && ejecutable="flatpak run com.microsoft.Edge --app="https://$url" --class=WebApp-$id_app --name=WebApp-$id_app --user-data-dir=$HOME/.config/SSBash/$navegador-'$id_app'";; 12) navegador="Vivaldi-flatpak" && ejecutable="flatpak run com.vivaldi.Vivaldi --app="https://$url" --class=WebApp-$id_app --name=WebApp-$id_app --user-data-dir=$HOME/.config/SSBash/$navegador-'$id_app'";; 13) navegador="ungoogled-chromium-flatpak" && ejecutable="flatpak run com.github.Eloston.UngoogledChromium --app="https://$url" --class=WebApp-$id_app --name=WebApp-$id_app --user-data-dir=$HOME/.config/SSBash/$navegador-'$id_app'";; *) echo "Opción no válida. Seleccionando Chrome por defecto." && navegador="Chrome";; esac cadena_aleatoria=$(head /dev/urandom | tr -dc a-z0-9 | head -c 30 ; echo '') acceso_directo=$navegador-$id_app-$cadena_aleatoria.desktop touch $acceso_directo mkdir -p "$HOME/.config/SSBash/$navegador-$id_app/img/" cp $icono "$HOME/.config/SSBash/$navegador-$id_app/img/" echo "[Desktop Entry] Version=1.0 Name=$nombre_app Comment=$comentario Exec=$ejecutable Icon=$HOME/.config/SSBash/$navegador-$id_app/img/$nombre_imagen Terminal=false Type=Application Categories=$categoria StartupNotify=true StartupWMClass=WebApp-$id_app" >> "$acceso_directo" chmod +x $acceso_directo mv $acceso_directo ~/.local/share/applications/ if [ "$navegador" == "Firefox" ]; then mkdir -p "$HOME/.config/SSBash/$navegador-$id_app/chrome/" ruta_js="$HOME/.config/SSBash/$navegador-$id_app/user.js" touch $ruta_js ruta_css="$HOME/.config/SSBash/$navegador-$id_app/chrome/userChrome.css" touch $ruta_css echo "user_pref(\"browser.cache.disk.enable\", false); user_pref(\"browser.cache.disk.capacity\", 0); user_pref(\"browser.cache.disk.filesystem_reported\", 1); user_pref(\"browser.cache.disk.smart_size.enabled\", false); user_pref(\"browser.cache.disk.smart_size.first_run\", false); user_pref(\"browser.cache.disk.smart_size.use_old_max\", false); user_pref(\"browser.ctrlTab.previews\", true); user_pref(\"browser.tabs.warnOnClose\", false); user_pref(\"plugin.state.flash\", 2); user_pref(\"toolkit.legacyUserProfileCustomizations.stylesheets\", true); user_pref(\"browser.tabs.drawInTitlebar\", false); user_pref(\"browser.tabs.inTitlebar\", 0); user_pref(\"browser.contentblocking.category\", "strict"); user_pref(\"privacy.clearOnShutdown.offlineApps\", false); user_pref(\"privacy.sanitize.sanitizeOnShutdown\", false); user_pref(\"privacy.sanitize.timeSpan\", 1);" >> "$ruta_js" echo "#nav-bar, #identity-box, #tabbrowser-tabs, #TabsToolbar { visibility: collapse; } #nav-bar * { visibility: visible !important; } " >> "$ruta_css" fi echo " La aplicación '$nombre_app' debería haberse instalado. Por favor, comprueba el archivo desktop en ~/.local/share/applications/ y, tras ejecutarlo, que existe el perfil en ~/.config/SSBash/." elif [ "$opcion" == "2" ]; then if [ -n "$(ls -A "$HOME/.config/SSBash/")" ]; then echo "¿Qué aplicación web quieres eliminar?" && ls $HOME/.config/SSBash/ read app_eliminar if [ -n "$app_eliminar" ] && [ -e "$HOME/.config/SSBash/$app_eliminar" ]; then desktop_eliminar=$(echo "$app_eliminar" | tr -d ' ') rm -rf $HOME/.config/SSBash/"$app_eliminar"/ rm $HOME/.local/share/applications/$desktop_eliminar* echo "La aplicación con id '$app_eliminar' ha sido eliminada. Si era basada en Firefox, elimina manualmente el perfil desde about:config." else echo "La apliación con id '$app_eliminar' no está en la lista." fi else echo "No hay aplicaciones web instaladas." fi elif [ "$opcion" == "3" ]; then echo "Hasta la próxima." else echo "Opción no válida". fi
Explicando el código
El script o programa son menos de 100 líneas, y en él incluso se pueden eliminar las aplicaciones creadas. Es un poco rudimentario, pero hace lo que queremos. Se ejecuta con «bash nombre-del-archivo» -en donde hayamos pegado el código anterior- y todo pasa en el terminal. Se pueden editar las líneas de los navegadores y añadir otros basados en Chromium.
Empieza mostrando un nombre, y cada uno puede poner lo que más le guste. Como este tipo de aplicaciones son SSB por Site-Specific Browser y lo usado es Bash, pues SSBash no suena mal. Luego nos consulta si queremos crear una aplicación web o eliminar alguna de las que ya tenemos. Si le decimos que queremos crearla, nos pedirá el nombre de la aplicación, un comentario para los paneles que los soporten, a qué categoría pertenece, la URL del servicio, ruta al icono y luego un navegador web.
Lo única diferencia que hay entre navegadores es el comando que los lanza, pero las banderas son iguales en todos los casos: crea una aplicación con su clase y un perfil aislado; luego creará el archivo .desktop con una cadena de caracteres aleatoria para evitar coincidencias, lo que se considera una buena práctica; a continuación crea una carpeta para la imagen que será el icono, rellena el archivo .desktop con todo lo necesario, le da permiso de ejecución y lo mueve a la carpeta `~/.local/share/applications/, que es en donde suelen estar los accesos directos propios y de algún otro software como las AppImage. Al lanzar la aplicación por primera vez se completará la creación del perfil.
Algunas precauciones
Si elegimos la opción de eliminar, el software consulta lo que hay en la carpeta de configuración, nos lo muestra y, tras poner exactamente una de las opciones, eliminará el .desktop y la carpeta con el perfil aislado. Está comprobado que funciona, pero ni yo ni LXA nos responsabilizamos de las posibles pérdidas de datos -más que nada accesos directos- que puedan tener lugar. Si alguien no quiere correr ningún riesgo, se pueden eliminar borrando el archivo .desktop de ~/.local/share/applications/ y el perfil de ~/.config/SSBash/nombre-de-la-app. Otra opción es hacer una copia de seguridad del contenido de ~/.local/share/applications/ antes de eliminar una app, comprobar que funciona y luego ya usarlo como se diseñó.
Como decía, es un poco rudimentario y no se gestionan los posibles errores. En ocasiones, dependiendo de la imagen o donde está, es probable que se vea algún fallo, en cuyo caso recomiendo revisar qué hay en el archivo .desktop.
Dos datos que me parece que hay que saber: Opera no está soportado, pero se pueden añadir otros basados en Chromium y probar; y, para que esto sea lo más simple posible, los iconos no los descarga ni nada, hay que buscarlos, descargarlos e indicar la ruta a ellos. Tampoco incluye una opción para instalar aplicaciones como lo hace el navegador… porque eso ya lo hace el navegador.
¿Y las extensiones?
Es posible instalar extensiones en este tipo de aplicaciones web, pero algunas no funcionarán. Por ejemplo, esas del ecualizador que actúan sólo en las pestañas en donde los activamos. Sí funcionarán las extensiones que funcionen en todo el navegador.
Para instalarlas, lo que hay que hacer es abrir una ventana nueva del navegador, lo que se puede conseguir con Ctrl-T o haciendo clic secundario sobre cualquier enlace y abriendo en una pestaña nueva. Se abrirá el navegador en cuestión, y esto permitirá ir a la Chrome Web Store e instalar cualquier extensión. Una vez instaladas podemos cerrar esos navegadores «completos» y volver a usar la aplicación web con la extensión incluída.
Otra manera de tener aplicaciones web
Esta es otra manera de tener aplicaciones web. Y al ejecutarse en un perfil aislado, no se comparte ni historial ni extensiones ni nada, e incluso podemos forzar el cierre del navegador base y no pasa nada. Si alguien prefiere que las aplicaciones sean de Firefox, entonces es mejor usar Webapp Manager.
Lo único a tener en cuenta es que cada perfil/app ocupa un espacio y suele superar los 100mb. Por todo lo demás, creo que merece la pena.