Changes in version 0.2.1 (2026-08-07) Breaking changes - shinyelectron now requires R 4.5.0 or newer, since it verifies downloaded runtimes with tools::sha256sum(), which was added in R 4.5.0. The README and sitrep_electron_system() now report this minimum. Apps built with the system strategy still accept R 4.4.0 or newer on the end user's machine. - Installer and artifact file names change. They now come from the slug and always include the architecture, as in my-app-1.0.0-arm64.dmg, my-app-Setup-1.0.0-x64.exe, and my-app-1.0.0-x86_64.AppImage, so building several architectures into one dist/ no longer overwrites installers. Update release scripts that look for the old names. - The installed app now carries the display name instead of the slug: the macOS app bundle and App menu, the Windows Start Menu shortcut and Apps & Features entry, and the installer window. export() now also takes the display name from app.name in _shinyelectron.yml when no app_name is given, as documented, instead of from the directory name. The slug, which is the app's identity, keeps coming from app.slug, then the app_name argument, then the directory name, so installed copies keep updating. The Windows executable keeps the slug as well, and updates reuse the existing install folder, so pinned shortcuts and existing installs carry over. On macOS, reinstalling from the disk image leaves the old .app in Applications to delete by hand. - export() now builds for build.platforms and build.architectures in _shinyelectron.yml when its platform and arch arguments are not given, for single apps and multi-app suites alike. Each argument overrides only its own list. Before, the lists had no effect: the build, the choice of icon, and the signing and Windows installer checks all used the current machine. Check the lists in your configuration files. Earlier versions of wizard() suggested mac and wrote it to build.platforms, so a file written with them on Windows or Linux may list platforms: mac; change or remove platforms there. wizard() now leaves platforms out unless you name some, so each build targets the machine it runs on. If you copied the Getting Started or Configuration Guide example that paired runtime_strategy: "bundled" with platforms: [mac, win], remove platforms, since a bundled or auto-download build stops when the targets name more than one platform or architecture. A list with no valid value means the current platform or architecture, and a value listed twice is built once. - export() now checks the targets before converting anything. It stops when a target is mac and the build machine is not a Mac: macOS apps build only on macOS, and such an export used to report success without making an installer. A bundled or auto-download build for more than one target now stops before any files are copied, and an invalid platform or arch argument stops the export even with build = FALSE. app_check() reports these problems too, and wizard() asks for a single platform when you choose the bundled or auto-download strategy. New features - New lifecycle.startup_timeout sets how long, in milliseconds, an app waits for its R, Python, or container server to start (default 180000, three minutes). R and Python apps used to give up after 60 seconds and container apps after 120. This timeout and lifecycle.shutdown_timeout must be whole numbers from 1000 to 2147483647; any other value warns and falls back to the default. Before, a shutdown_timeout such as "10s" built an app that could not launch. - installer.allow_to_change_installation_directory: true adds a page to the Windows setup wizard where users choose the installation folder. It requires installer.one_click: false; otherwise reading the configuration fails with an error. - installer.per_machine: true installs the Windows app for all users. Every install and update then needs administrator rights. - Bundled R builds now leave out files that a running app does not use: the test suites (tests/, testme/, tinytest/) of every embedded package, and the portable R's own regression tests, PDF and HTML manuals, and news and FAQ files. Package examples, demos, NEWS files, and headers are kept, as are R's license notices. Pruning is on by default; set dependencies.r.prune: false in _shinyelectron.yml to ship the runtime unchanged. A quoted "true" or "false" is read with a warning, and any other value stops the build before anything is downloaded. - dependencies.r.local_packages installs R packages that are not on a repository, such as in-house packages, into the R library of a bundled build. List package source folders or .tar.gz source tarballs relative to the app directory. Each package is built and installed with the bundled R after its dependencies, and the build stops unless it loads. - New app.description, app.author, app.homepage, and app.copyright settings describe the app. They fill the generated package.json and the installer metadata, and Help > About shows them, with buttons to visit the homepage or email the author. app.author takes an npm-style "Name (url)" string or a map with name, email, and url, and app.homepage must be an http:// or https:// URL. On macOS, the App menu's About panel shows the same name, version, copyright, description, and author. Straight double quotes in the app name, author, and copyright become typographic quotes in the installer metadata, and a $ in the app name, description, author, or copyright, which the Windows installer cannot hold, stops a Windows build. - With auto-updates enabled, Help > About offers Check for Updates on Windows and Linux. It reports that the app is up to date, offers to download a newer version, or explains why the check failed. - export() shows the app's slug next to its display name and says when app.slug could choose another. init_config() and wizard() write the slug into the new configuration, and init_config() warns when a configuration it replaces gave a different slug. Minor improvements and fixes - shinyelectron now imports rlang. cli builds cli_abort() and cli_warn() on rlang but only suggests it. Without rlang installed, errors from cli_abort() showed "there is no package called 'rlang'" instead of their own message, and warnings from cli_warn() became that same error, stopping operations meant to continue, such as a Node.js install whose checksum list could not be downloaded. - The situation reports (sitrep_shinyelectron() and friends) no longer report Node.js, npm or Python as missing when the withr package is not installed. withr is only a suggested dependency, and the probe used to fail without it. - The Security Considerations guide gains a "Secrets and per-user credentials" section. It covers which environment variables and .Renviron files reach an app's R, Python, or container process, and how to give each user their own token without bundling it. - Keys in _shinyelectron.yml that shinyelectron does not recognize, such as a misspelled widht or a key placed in the wrong section, now trigger a warning of class shinyelectron_unknown_config_key that names each one by its dotted path (for example window.widht). They were previously ignored without notice. - The top-level logging section documented in the Configuration Guide now takes effect; its log_dir and log_level were previously ignored. If you copied the guide's earlier example, drop its log_dir: "/var/log/my-app" line: log_dir should be an absolute path that the app's user can write to, and without it logs go to the app's userData/logs folder. app.log_dir and app.log_level still work. When both set a key to different values, logging wins with a warning of class shinyelectron_logging_conflict. init_config() now suggests the logging form. - init_config() no longer suggests nodejs.auto_install, which has no effect yet. - App names and other settings that contain quotes or backslashes no longer break the generated app. Settings placed in JavaScript strings in main.js or in the splash and preloader page are now escaped, so a name like "Children's Dashboard" or a Windows log_dir such as C:\Users\me\logs works, and the About and quit dialogs and the tray tooltip show & instead of &. - App names and descriptions in a multi-app suite that contain