aurora_app() now
sources helpers/*.R into a dedicated environment (parented on the global
env) and parses each router with parse_file(env = ) so handlers still
resolve helpers, without anything landing in .GlobalEnv.aurora_shinyproxy_yaml() and aurora_ruscker_yaml() take file = NULL and
require an explicit path when write = TRUE (no writes to getwd() by
default).DESCRIPTION adds an auto-linked reference to the 'plumber2' web framework.aurora_dockerfile() default pin bumped to @v0.1.12.aurora_ruscker_yaml() emits a Ruscker
app spec for a built aurora image, the counterpart to
aurora_shinyproxy_yaml(). Ruscker is a lightweight ShinyProxy alternative
that reads the same application.yml schema; since an aurora app is a
stateless 'plumber2' API, the spec uses type: api with an api: block
(port, docs-path, health-path, optional rate-limit/cors) and a
replica pool (min-replicas/max-replicas). See vignette("deploy").aurora_dockerfile() default pin bumped to @v0.1.11 (now @v0.1.12).README.md now points
to the canonical https://plumber2.posit.co/ (the old
https://posit-dev.github.io/plumber2/ returned a 301 redirect, flagged by
CRAN incoming checks). aurora_dockerfile() default pin bumped to @v0.1.10.aurora_dockerfile() default
pin bumped to @v0.1.9._aurora.yml gains an optional statics: key -- a map of URL prefix to
directory, served by aurora_app() at that prefix in addition to www/ at
/. Lets several apps share assets (logo, JS libraries, CSS) from one
server-side directory mounted as a volume. Relative paths resolve against the
app root; a missing directory (e.g. an unmounted volume) is skipped with a
warning so the app still starts. The root path / stays reserved for www/.
See vignette("deploy") and ADR-018.aurora_dockerfile(aurora_source = ) default pin bumped to @v0.1.8..dockerignore is bundled un-hidden (as dockerignore) and renamed by
aurora_create_app(); the empty www//www/images/ .gitkeep
placeholders are gone (the scaffold creates www/images/ itself).
Scaffolded apps are unchanged. R CMD check --as-cran is now 0/0/0.aurora_dockerfile(aurora_source = ) default pin bumped to @v0.1.7.aurora_build_image(platform = ) selects the image's target platform via
docker build --platform, defaulting to "linux/amd64" so images built on
Apple Silicon run on the usual x86-64 servers (an arm64 image fails there
with exec format error). Pass platform = NULL to build for the host
architecture.aurora_dockerfile(aurora_source = ) default pin bumped to @v0.1.6.aurora_dockerfile(locale = ) now defaults to "pt_BR.UTF-8" (matching the
tz = "America/Recife" default). Pass locale = "C.UTF-8" for the universal
UTF-8 locale, or any other.apt-get install locales + locale-gen), since the rocker/Ubuntu base ships only en_US.UTF-8.
Combined with the alpine musl-locales support, a non-C locale works on both
flavors out of the box.aurora_dockerfile(locale = ) controls the image ENV LANG/LC_ALL
(default "C.UTF-8"), pairing with tz = .tz and locale arguments are now validated at generation time: an unknown
timezone (not in OlsonNames()) errors instead of silently falling back to
UTC in the container; a non-UTF-8 locale warns.pt_BR.UTF-8) now installs the
musl-locales/musl-locales-lang packages so it actually resolves in R.
musl support is partial (charset/messages apply; collation falls back to C).ENV TZDIR=/usr/share/zoneinfo (alongside tzdata) so the
baked timezone actually resolves in R. r-minimal strips R's bundled zoneinfo,
so without TZDIR R warned "unknown timezone" and fell back to UTC despite
tzdata being installed.tzdata whenever aurora_dockerfile(tz = ) is
set (the default). Alpine ships no timezone database, so ENV TZ previously
fell back to UTC; with tzdata the timezone (e.g. America/Recife) resolves
in the OS, R, and DB drivers.Hardening and ergonomics distilled from migrating and containerizing a real app.
aurora_config() reads data/config.yml anchored to the app root (no cwd pitfall).aurora_check() lints an app: UI code in runtime helpers, packages used but
undeclared in _aurora.yml, missing prebuilt UI.aurora_unbox() / aurora_geojson() / aurora_unique()
(NULL-safe unbox / sf -> GeoJSON / sorted-unique).aurora_app(attach = ) / _aurora.yml: attach: attaches the declared runtime
packages: before sourcing helpers, so handlers can call them unqualified.aurora_run(on_exit = ) runs a cleanup function when the server stops (e.g.
pool::poolClose()), on plumber2's "end" lifecycle event.aurora_dockerfile(tz = ) bakes ENV TZ (default America/Recife); the
default aurora_source is pinned to a release tag for reproducible builds.config::get("data/config.yml"), readRDS("data/x.rds"))
resolve as they did under the plumber-v1 entrypoint.loadNamespace error.sf -> gdal/geos/proj,
RPostgres -> libpq, ...) plus gfortran/libgfortran; .dockerignore excludes
data/.First release (2026-06-01). A complete dev loop, theming, UI↔API wiring, opt-in
auth/data/telemetry, Docker/ShinyProxy generation, three worked examples, and a
pkgdown site. R CMD check is clean (0 errors / 0 warnings).
aurora_create_app() (templates: minimal, auth), aurora_build_ui(),
aurora_app(), aurora_run(), aurora_add_route().aurora_run(watch = TRUE): live-reload rebuilds the static UI when
build_ui.R/ui_modules/ change (polls via later).minimal template ships _brand.yml and uses
bs_theme(version = 5, brand = TRUE); bslib bakes the theme into the static
HTML at build time. aurora builds no theming layer.aurora_component(): thin helper emitting an element wired to a JSON endpoint
via data-endpoint; app JS renders. No rendering JS shipped.aurora_auth_jwt() + aurora_jwt_token(),
aurora_jwt_decode(), aurora_jwt_guard(), aurora_set_auth_cookie(),
aurora_clear_auth_cookie(). The auth template gates /api/* with a
@header guard and reqres::abort_unauthorized().aurora_data_store() + aurora_data_register(), aurora_data_get(),
aurora_data_names(): globals-free store that hot-reloads a dataset when its
file changes on disk.aurora_run(otel = TRUE) / aurora_app(otel=) /
AURORA_OTEL — wires api_logger(logger_otel()), off by default.aurora_dockerfile() with a flavor argument: "debian" (default;
rocker/r-ver + Posit Package Manager binaries) or "alpine" (rhub/r-minimal
installr, a tiny source-built image). aurora_build_image() and
aurora_shinyproxy_yaml() (emits a ShinyProxy proxy.specs block).See the package website for the full reference and articles.