Changelog
Source:NEWS.md
shinyelectron 0.2.0
This release grows shinyelectron from an R shinylive exporter into a general Shiny-to-desktop toolkit, adding Python apps, five runtime strategies, and multi-app suites.
Breaking changes
-
app_typenow takes only"r-shiny","py-shiny", orNULL(autodetected), and shinylive is aruntime_strategyrather than an app type. The old"r-shinylive"and"py-shinylive"values still work with a deprecation warning and will be removed in a future release.
New features
- Python Shiny apps are supported alongside R.
app_typeautodetects"r-shiny"or"py-shiny"fromappdir, soexport(appdir, destdir)works with no other arguments. -
runtime_strategyselects how an app runs, and all five strategies work with both languages:shinylive(the default; compiled to WebAssembly and run offline in the browser),bundled(embeds a portable R or Python runtime),system(uses an installed interpreter),auto-download(fetches the runtime on first launch), andcontainer(runs in Docker or Podman). - Multi-app suites bundle several apps into one Electron shell with a launcher. An
appsarray in_shinyelectron.ymllists them, and each app can set its ownruntime_strategy. -
export()andbuild_electron_app()gain asignargument for macOS signing and notarization and Windows Authenticode, driven by the usualCSC_*andAPPLE_*environment variables. -
enable_auto_updates(),disable_auto_updates(), andcheck_auto_update_status()manage electron-updater configuration. -
install_r_portable(),install_python_standalone(), andinstall_nodejs()download and cache portable runtimes, andcache_dir(),cache_info(), andcache_remove()inspect and prune the cache. -
dependencies.r.version,dependencies.python.version, anddependencies.electron.versionpin the versions a build uses; each acceptsnull,"latest", or an exact version. - App dependencies are detected automatically for native, bundled, and container builds, from
library()andrequire()calls for R andrequirements.txtorpyproject.tomlfor Python. - A configurable lifecycle splash and preloader report startup progress, and a system tray and application menu are set through
_shinyelectron.yml. - The Electron shell streams the renderer console (webR, Pyodide, and Shiny output) into the app log, so browser-side messages and errors appear alongside the main-process logs.
-
app_check()validates an app before building,wizard()generates a config interactively,show_config()prints the merged configuration, andavailable_examples()andexample_app()browse the bundled demos. -
app_dependencies()reports the R or Python packages a Shiny app or multi-app suite uses, which helps install an app’s dependencies before a shinylive build. - Apps can supply a Posit
_brand.ymlfor theming. - Prebuilt demo installers are published for every strategy and platform, listed in the new Download Prebuilt Demos article.
Minor improvements and fixes
- The
runtime_strategyargument overrides a suite’sbuild.runtime_strategyfor apps that set no per-app strategy, so a suite built asshinylivereally is shinylive rather than falling back to the config default. - A
_brand.ymlthat names palette colors (for exampleprimary: plum) resolves those references before theming the shell. - Error screens allow selecting and copying the message and log details.
- Building with the shinylive strategy checks that the app’s R packages are installed and names any that are missing, since
shinylive::export()compiles the WebAssembly bundle from installed packages. -
build_electron_app()refuses to overwrite protected directories such as~,/, andR.home(). -
convert_shiny_to_shinylive()removes its temporary copy on every exit path. -
export()cleans up partial output when a build fails, so a retry no longer needsoverwrite = TRUE, for single apps and multi-app suites alike. -
export()no longer aborts or deletes a finished build when arun_afteroropen_afterstep fails; those steps now only warn. -
init_config()escapes app names so the generated YAML round-trips, andbuild.typemay be omitted and autodetected. -
run_electron_app()reports the real exit code and stderr on failure and returnsNULLwhen interrupted. -
sitrep_shinyelectron()also checks the Python shinylive CLI and shiny package. - Directory copying keeps consistent cross-platform semantics on Windows.
- Python subprocesses spawn without
LD_LIBRARY_PATH, fixing a LinuxNo module named shinyliveerror. - Portable runtimes extract with the system
taron macOS and Linux and bsdtar on Windows, handling archives R’s internal tar cannot read. - Native apps bind to an OS-assigned free port to avoid collisions, and native startup failures surface in the lifecycle splash.
- The
systemstrategy checks for R >= 4.4.0 or Python >= 3.9.0 and fails with an actionable message. - Invalid configuration values warn and fall back to defaults instead of aborting later in the build.
- Configuration keys that were never read (
splash.width,splash.height,preloader.enabled,lifecycle.splash_min_duration) are removed, andmenu.templateaccepts only"default"and"minimal". - Downloaded runtimes are verified against upstream SHA-256 checksums before extraction.
- Vignettes cover getting started, configuration, runtime strategies, multi-app suites, code signing, containers, security, and auto-updates.
shinyelectron 0.1.0
- Initial release with
r-shinylivesupport. - Export R Shiny apps as standalone Electron desktop applications via WebR.
- Cross-platform builds for macOS, Windows, and Linux.
- Node.js local installation and management.
- Configuration via
_shinyelectron.yml. - Automatic updates via
electron-updater.