The max_hourly_cost guard now works on the EC2
backend (the default). Previously estimate_cost()
returned per_hour for Fargate but
total_per_hour for EC2, and the guard read
per_hour — which is NULL on EC2 — so the cost
ceiling was silently never enforced on the default backend.
estimate_cost() now returns a normalized
hourly_rate for every backend, and the guard, cost display,
and starburst_map()/starburst_cluster() all
use it.
cost_alert_threshold is now enforced —
it warns when a plan’s estimated hourly rate exceeds it (previously it
was stored but never read).
starburst_config(auto_cleanup_s3 = …) now
actually controls S3 cleanup. The runtime read a different key
(getOption("starburst.cleanup_s3")) and ignored the stored
setting; cleanup now resolves option → auto_cleanup_s3
config → default TRUE.
starburst_map()/starburst_cluster()
cost estimates match the backend used — they forward
launch_type/instance_type/use_spot,
so an EC2 job no longer reports a Fargate price.
Cost estimates now use live AWS pricing (Pricing
API for On-Demand, EC2 spot-price history for Spot), cached per session
with a built-in static-rate fallback when offline. Reported costs are
estimates (measured runtime × current rate), not AWS
billing figures; docs reworded accordingly.
New features
starburst_setup() now provisions the default
EC2 capacity provider (for c7g.xlarge) so the
default EC2 backend works out of the box — previously the first
starburst_map()/plan(starburst) run failed
because no capacity provider existed. It is created at
DesiredCapacity = 0 (no billable instances launch during
setup). Pass setup_ec2 = FALSE to skip (Fargate-only
users). (#37)
Custom EC2 instance types are now provisioned automatically
on first use. Selecting a non-default
instance_type (e.g. c8a.xlarge) previously
failed with an opaque “AutoScalingGroup not found” because only the
default was provisioned. Now the capacity provider/ASG is created on
demand at first launch (a one-time ~1–2 min step; no instances launched
by provisioning), or on failure you get the exact
starburst_setup_ec2(instance_types = "…") command to
run.
Behavior changes
Detached session$collect() now returns an entry
for every terminal task, including failures. A failed task
comes back as a structured failure
(list(error = TRUE, message = …, task_id = …)) alongside
successful results, instead of being silently omitted — matching the
documented contract.
Clarified session$cleanup(): by default it stops
workers and marks the session terminated but preserves S3
objects; pass force = TRUE to also delete them.
(Behavior unchanged; the docs were wrong and are now correct.)
Breaking changes
Removed the platform argument from
starburst_map() and
starburst_cluster(). It was ignored (architecture
is inferred from instance_type: Graviton *g.*
→ ARM64, else x86_64), and its "X86_64" default even
contradicted the ARM64 c7g.xlarge default. Drop it from
calls; the backend picks the architecture from
instance_type. (platform remains on
starburst_estimate(), where it is functional.)
Renamed starburst_config(max_cost_per_job=) to
max_hourly_cost. The limit was always enforced as
an hourly rate (USD/hour), not a total-job cap; the new name
matches the behavior. Update any
starburst_config(max_cost_per_job = ...) calls to
max_hourly_cost = ....
Bug fixes
starburst_map() and
starburst_cluster() now accept launch_type,
instance_type, and use_spot and
forward them to the backend. Previously these functions had no backend
arguments, so a call like
starburst_map(x, f, launch_type = "FARGATE") silently
passed launch_type to the mapped function .f
(typically an “unused argument” error) instead of switching the backend
— contradicting the 0.3.7 migration note. Backend selection now works
uniformly across plan(starburst),
starburst_map(), starburst_cluster(), and
starburst_session().
Fixed broken/misleading examples: the README detached-session
example used a nonexistent detached = TRUE argument;
S3-read examples used base read.csv()/
readRDS(url()) which cannot read s3://; and
the API rate-limit example aggregated to 10× its stated global limit
across workers.
Public base images are now built multi-arch (amd64 +
arm64). They were published amd64-only, so
use_public_base = TRUE failed the multi-arch environment
build with “no match for platform in manifest” for arm64. The
build-base-images workflow now builds both architectures
(matching the env build), so the public base path works. (#39)
Documentation
Consistency sweep addressing an external documentation review: EC2
is now consistently presented as the default/recommended backend with
Fargate as the optional alternative; the README and example console
output match the current engine (ASCII status markers, one task per
input element — no chunking step); the Getting Started tutorial leads
with starburst_map(); a grouped reference index and an
architecture diagram were added; and starburst_config()
keys are now catalogued.
Trimmed the Getting Started tutorial: the inline Monte Carlo /
bootstrap / genomics snippets (which showed unbatched
future_map(1:10000, …) and hand-written speedup claims) now
link to the canonical, measured example articles and the Workload Shapes
/ Performance guides. The doc-consistency guard
(tools/check-docs.R) now also flags naive
future_map()/future_lapply() big-count calls,
not just starburst_map().
Removed the historical ROADMAP.md (a pre-1.0,
Fargate-first implementation plan that also carried a stale “MIT”
license note); the README Roadmap section is the single source of
truth.
starburst 0.3.8 (2026-03-06)
Reliability & CRAN
readiness
Bug fixes
Worker script: Removed an invalid
timeout parameter from the paws client configuration that
could cause workers to fail on startup.
Environment sync: ensure_environment()
now walks up the directory tree to find the package-root
renv.lock when invoked from a subdirectory (e.g. during
tests), and the environment image hash is computed consistently between
build and lookup, so cached worker images are reused correctly.
Hardened safe_system() usage and resolved
qs2 serialization edge cases surfaced by integration
tests.
Documentation & packaging
All \donttest{} examples are guarded with
starburst_is_configured() so they are safe to run without
AWS credentials.
Pre-built vignettes shipped in inst/doc/ and assorted R
CMD check / CRAN incoming-feasibility fixes. Package accepted on
CRAN.
starburst 0.3.7 (2026-02-17)
Default backend is now EC2
BREAKING CHANGE: the default
launch_type changed from FARGATE to
EC2, with spot instances enabled by
default (use_spot = TRUE,
instance_type = "c7g.xlarge"). EC2 avoids Fargate cold
starts, is 50–90% cheaper with spot, and supports warm pools and a wider
range of instance types. Fargate remains fully supported — pass
launch_type = "FARGATE" to
plan(starburst, ...), starburst_map(),
starburst_cluster(), or starburst_session() to
keep the previous behavior.
Completed the EC2 backend implementation with working end-to-end
execution (warm pools, capacity providers, spot support).
Migration
If you relied on the Fargate default, add
launch_type = "FARGATE" to your
plan()/starburst_*() call. No other changes
are required; the task API is unchanged across backends.
starburst 0.3.6 (2026-02-16)
AWS Integration Testing
& Documentation
Major milestone: Complete AWS integration testing
infrastructure and documentation site launch.
New Features
Comprehensive AWS Integration Testing (#4b36310)
GitHub Actions workflow for automated AWS testing
Local test runner script (run-aws-tests.sh)
Multiple test suites: quick, detached-sessions,
integration-examples, ec2, cleanup
OIDC authentication for secure CI/CD
Comprehensive TESTING.md documentation
Weekly scheduled testing runs
Documentation Site (https://starburst.ing)
Custom domain with HTTPS enabled
Full pkgdown site with all 29+ exported functions
12 vignettes including security and troubleshooting guides
Example scripts and runnable code
Bug Fixes
Test Suite
Fixed missing readLines() stubs in environment tests
(#6514229)
Fixed missing get_starburst_config() stub in Docker
tests (#dad7124)
Fixed environment variable handling in integration tests
(#78dbc2c)
Improved AWS credential handling in test script (#0e916f2)
CI/CD
Removed docs/ directory conflict in pkgdown workflow (#bc97dca)
Complete pkgdown configuration for all functions and vignettes
(#7a562f3)
Removed non-existent function from pkgdown config (#4fe5d97)
Test Results
Unit Tests: 202 passing, 0 failures
Integration Tests: 34 ready to run (local +
CI)
CI Status: All checks passing on 5 platforms
(Ubuntu, Windows, macOS)
Ensures environment rebuilds when package version changes
Prevents stale Docker images with old code
Serialization Update (#cbfad21)
Changed worker scripts from qs to qs2
package
Improved compatibility and performance
Consistent with main package dependencies
Assessment
Minor version bump with critical bug fixes for Docker caching and
serialization consistency.
starburst 0.3.4 (2026-02-14)
Code Quality Fix
Changes
Fixed vapply calls (#b96ace1)
Added missing FUN.VALUE parameters to all
vapply() calls
Ensures type safety in vectorized operations
Follows R best practices for safe functional programming
Assessment
Quick patch release addressing R CMD check warnings about unsafe
vapply usage.
starburst 0.3.3 (2026-02-13)
Zero Lints - Idiomatic R
Code Quality
Goal: Achieve zero linting warnings while
maintaining idiomatic R code style.
Changes
Fixed trivial lint issues (#11)
Fixed infix spacing: collapse= →
collapse =
Split long lines in R/ec2-pool.R and R/plan-starburst.R
3 quick wins for cleaner code
Configured lintr for R best practices
Explicit return() statements (clarity over
implicit)
Descriptive variable names (clarity over brevity)
Suppressed false positives for internal functions
Accepted minor indentation variations (cosmetic only)
Quality Metrics
Lint Progression: - v0.3.0: 325 total lints -
v0.3.1: 198 lints (-39%) - v0.3.2: 113 lints in R/ code (-65% from
v0.3.1) - v0.3.3: 0 lints in R/ code ✅ (-100%)
Philosophy: This release establishes lintr
configuration that prioritizes: 1. Code clarity over
terseness 2. Explicit over implicit 3.
Meaningful names over short names 4. R
idioms over arbitrary style rules
Assessment
The package now has zero linting warnings while maintaining: -
Explicit return statements (R best practice) - Descriptive variable
names (self-documenting code) - Standard R indentation patterns -
Internal function patterns recognized by R
Result: Clean, idiomatic R code with zero
false-positive lint warnings.
starburst 0.3.2 (2026-02-13)
Idiomatic R Code - Go-Level
Quality
Goal: Achieve Go-level code quality standards for R
- clean, consistent, idiomatic.
Changes
Removed unused variables (#10)
Cleaned up 5 truly unused assignments
Fixed cat_warning → cat_warn typo
Simplified code by removing unnecessary intermediate variables
Code quality achieved: The package now meets high
standards for production R code. Remaining lints are acceptable
trade-offs for code clarity and maintainability.
Next Steps (Optional)
For absolute zero-lint perfection (0.3.3 if desired): - Manual
indentation review (46 instances) - Add lintr suppressions for false
positives - Shorten some variable names
starburst 0.3.1 (2026-02-12)
Code Quality Improvements
Complete: All 3 issues from v0.3.1 milestone (#18,
#19, #20)
Changes
Replaced all emojis with ASCII equivalents (#19)
✓ → [OK] (success messages)
⚠ → [WARNING] (warning messages)
💡 → [TIP] (recommendations)
📖 → [INFO] (documentation links)
🚀 → [Starting] (initialization messages)
🧹 → [Cleaning] (cleanup messages)
✗ → [ERROR] (error messages)
14 files updated, better compatibility with older systems
Applied goodpractice suggestions (#20)
Replaced all sapply() with vapply() for
type safety (10 instances in R/)
More predictable return types
Prevents unexpected list returns
Better error handling for edge cases
Fixed lintr warnings (#18)
Removed 127 trailing whitespace instances
Down from 325 to 198 remaining lints (39% improvement)
Remaining lints are cosmetic (indentation, style preferences)
Impact
No functional changes
Better code readability
Improved compatibility
More robust type safety
Remaining Lints (198)
Acceptable cosmetic issues for future polish: - 85 indentation
inconsistencies - 49 unused variable warnings - 29 return() style
preferences - 15 seq_len() suggestions (in examples/vignettes) - 20
other minor style issues
starburst 0.3.0 (2026-02-12)
🎉 Production-Ready Release
staRburst is now enterprise-grade and ready for
production deployment! This release focuses on security hardening,
operational excellence, and comprehensive documentation.
Major Features
Complete resource cleanup -
session$cleanup() now fully implemented
Stops all running ECS tasks when session ends
Deletes S3 session files with force = TRUE option
Tracks ECS task ARNs in session manifest for reliable cleanup
Verification step ensures all resources are properly released
Prevents orphaned workers and runaway costs
Detached session mode - Long-running jobs that
persist after R session ends
Create sessions with starburst_session()
Submit tasks and disconnect: session$submit(expr)
Reattach later with
starburst_session_attach(session_id)
Check progress anytime: session$status()
Workers stay running until absolute timeout (default 24h)
Comprehensive troubleshooting guide - 15+ common
issues documented
Accessing CloudWatch Logs (console and CLI)
Tasks stuck in pending (quota, IAM, network)
Permission errors (ECS, S3, ECR)
High costs and runaway workers
Package installation failures
Each issue includes symptoms, diagnosis, solutions, and
prevention
Security best practices guide - Enterprise security
documentation