fix: Correct Azure auth provider configuration in docs @osterman (#1928)
what
- Correct Azure authentication provider YAML configuration structure in tutorial documentation
- Move
tenant_id,subscription_id,location, and other provider-specific fields under aspecblock for all Azure providers (device-code, oidc, service-principal) - Update 8 Azure provider configuration examples throughout the tutorial
why
Azure authentication providers require configuration to be nested under a spec block according to the schema and provider implementation. The documentation was showing an incorrect structure that would fail when users attempted to use it. This fix aligns the documentation with the actual implementation.
references
User report: Azure authentication tutorial showed incorrect YAML configuration structure with provider-specific fields at the top level instead of nested under spec
Summary by CodeRabbit
- Documentation
- Updated Azure authentication configuration examples to reflect a restructured format where authentication provider parameters (tenant_id, subscription_id, location, etc.) are now organized under a nested spec object across all Azure authentication methods.
✏️ Tip: You can customize this high-level summary in your review settings.
Add version metadata to shipped roadmap milestones @osterman (#1927)
what
Added an optional version field to all 93 shipped milestones in the roadmap, indicating which release each feature was shipped in. Versions are sourced from blog post release: fields and git history research using git tags.
why
Version metadata enables better tracking of feature releases, supports release notes generation, and provides users with a clear version reference for each shipped feature on the roadmap.
references
- Versions derived from blog post frontmatter (
release:field) - Git history research using
git describe --tagsfor features without blog post references - Version range: v1.100.0 (Changelog introduction) to v1.203.0 (RC features)
Summary by CodeRabbit
- Chores
- Roadmap milestones now include optional version identifiers so items map directly to releases across multiple quarters.
- New Features
- Roadmap UI displays a release link when a milestone has a version, enabling quick access to the corresponding release.
- Style
- Added a compact version badge/visual treatment in roadmap drawers for clearer discoverability.
✏️ Tip: You can customize this high-level summary in your review settings.
feat: Add ECR authentication @Benbentwo (#1859)
what
Implements ECR authentication integration for Atmos, allowing automatic Docker login to AWS ECR registries using Atmos-managed identities.
New auth.integrations Section
Integrations specify which identity they use via via.identity, and can auto-trigger on identity login via spec.auto_provision:
auth:
identities:
dev-admin:
kind: aws/permission-set
via:
provider: company-sso
principal:
name: AdministratorAccess
account: dev
# Integrations reference identities - not the other way around
integrations:
dev/ecr/primary:
kind: aws/ecr
via:
identity: dev-admin # Which identity provides AWS creds
spec:
auto_provision: true # Auto-trigger on identity login
registry:
account_id: "123456789012"
region: us-east-2
dev/ecr/secondary:
kind: aws/ecr
via:
identity: dev-admin
spec:
auto_provision: true
registry:
account_id: "987654321098"
region: us-west-2Design: One Registry Per Integration
Each integration defines a single registry rather than a list. This approach:
- Better Deep Merging: Works with Atmos stack inheritance and merging
- Clearer Naming: Integration name reflects its purpose (e.g.,
dev/ecr/main) - Consistent Pattern: Matches how identities and providers are defined
- Easier Override: Individual registries can be overridden in stack configs
New atmos auth ecr-login Command
# Using a named integration
atmos auth ecr-login dev/ecr/primary
# Using an identity (triggers all integrations referencing that identity)
atmos auth ecr-login --identity dev-admin
# Explicit registries (ad-hoc)
atmos auth ecr-login --registry 123456789012.dkr.ecr.us-east-1.amazonaws.comAuto-Provision on Identity Login
When you login with an identity, all integrations with auto_provision: true that reference that identity are triggered:
$ atmos auth login dev-admin
✓ Authenticated as arn:aws:sts::123456789012:assumed-role/DevRole/user
✓ ECR login: 123456789012.dkr.ecr.us-east-2.amazonaws.com (expires in 12h)
✓ ECR login: 987654321098.dkr.ecr.us-west-2.amazonaws.com (expires in 12h)Implementation
| Component | File | Description |
|---|---|---|
| Schema | pkg/schema/schema_auth.go
| Integration, IntegrationVia, IntegrationSpec, ECRRegistry structs
|
| Integration System | pkg/auth/integrations/
| Type system, registry pattern, factory functions |
| ECR Integration | pkg/auth/integrations/aws/ecr.go
| aws/ecr kind implementation
|
| ECR Token Fetcher | pkg/auth/cloud/aws/ecr.go
| AWS SDK GetAuthorizationToken wrapper |
| Docker Config | pkg/auth/cloud/docker/config.go
| XDG-based config manager with file locking |
| Manager | pkg/auth/manager.go
| findIntegrationsForIdentity(), triggerIntegrations(), ExecuteIntegration()
|
| CLI Command | cmd/auth_ecr_login.go
| Standalone ECR login command |
| Errors | errors/errors.go
| Sentinel errors for ECR/integration failures |
why
- Eliminates manual ECR authentication - No more
aws ecr get-login-password | docker loginincantations - Configuration as code - ECR registries defined in
atmos.yamlalongside identities - Automatic login - Integrations with
auto_provision: truetrigger on identity login - Multi-registry support - Multiple integrations can reference the same identity
- Isolated credentials - Docker config at
~/.config/atmos/docker/config.json(XDG) - Non-blocking failures - Integration errors during
atmos auth logindon't block authentication - Deep merge friendly - Single registry per integration works with stack inheritance
Design Decisions
Why integrations not identities?
ECR login and EKS kubeconfig are client-only credential materializations, not identities:
| Concept | IAM User | ECR Login | EKS kubeconfig |
|---|---|---|---|
| Stored identity object | ✅ | ❌ | ❌ |
| Policy attachment | ✅ | ❌ | ❌ |
| Server-side lifecycle | ✅ | ❌ | ❌ |
| Client-only materialization | ❌ | ✅ | ✅ |
Integrations use an identity to derive credentials for specific services.
Why integrations reference identities (not vice versa)?
Integrations specify their required identity via via.identity instead of identities listing their integrations. This:
- Keeps identities focused on "who you are"
- Allows multiple integrations to reference the same identity
- Enables stack-level integration overrides without touching identity config
- Follows the same pattern as
via.provideron identities
references
- PRD:
docs/prd/ecr-authentication.md - Blog post:
website/blog/2025-12-15-ecr-authentication-integration.mdx - Future: EKS integration (
aws/ekskind) follows same pattern
Summary by CodeRabbit
-
New Features
- atmos auth ecr-login: explicit registry, named-integration, and identity-driven modes; automatic, non-blocking AWS ECR Docker login with multi‑registry support and managed Docker config.
-
Integrations
- New integration framework and registry for auth plugins (ECR, EKS); per-identity auto-triggering with explicit retry/standalone command; schema and manifest support for integrations/identities.
-
Documentation
- PRD, tutorial, CLI docs, and blog post with examples, CI/CD guidance, rollout and security notes.
-
Tests
- Extensive unit tests covering ECR, Docker config manager, integrations and CLI behavior.
-
Chores
- Dependency and license/version updates; roadmap milestone marked shipped.
✏️ Tip: You can customize this high-level summary in your review settings.
feat: Improve slide deck mobile responsiveness and speaker notes customization @osterman (#1925)
what
Mobile Responsiveness
- Auto-enters fullscreen mode on mobile and tablet devices
- Fullscreen respects current light/dark theme instead of forcing dark mode
- Content scales responsively on mobile using viewport units (vw) and clamp()
- Maintains 2-column split layouts on mobile with proportionally scaled content
- Adds responsive breakpoints for tablet (996px) and mobile (768px)
- Fixes navbar overlap by increasing z-index to 99999
Speaker Notes Customization
- Position toggle: Move notes panel to right (default) or bottom (Google Slides style)
- Display mode toggle: Overlay on slides (default) or shrink slides to make room
- Popout window: Pop out notes to separate window for multi-monitor setups (desktop only)
- All preferences persist in localStorage
- Notes content is scrollable
- Navigation buttons work when notes overlay is present (z-index fix)
- Controls moved to notes panel header for cleaner toolbar
Technical Improvements
- Fixed React hydration mismatch by initializing fullscreen/mobile state after mount
- Fixed stale closure in resize handler using useRef
- Fixed XSS vulnerability in popout window by using textContent instead of innerHTML
- Optimized popout window effect to not recreate on every slide change
- Added immediate slide state sync when popout opens (fixes "Loading..." flash)
- Added
popup=yesto window.open() for better browser compatibility - Progress bar extends to full viewport width in page mode
why
Mobile users need fullscreen viewing by default without manual toggling. Content should remain readable at all viewport sizes while preserving intended layout structure (2-column splits don't stack vertically). Theme consistency improves visual experience across devices.
Speaker notes customization addresses different presenter preferences:
- Some prefer notes overlaying slides, others prefer shrinking the slide area
- Bottom position mimics Google Slides for familiarity
- Popout window supports presenters with dual monitors
- Persistent preferences mean settings survive page refreshes
references
Addresses mobile responsiveness for slide deck presentations with improved handling of landscape phones and split layouts.
Summary by CodeRabbit
-
New Features
- Speaker notes: right/bottom positions, overlay/shrink modes, detachable popout window, persistent notes preferences.
- Text-to-speech: integrated player with play/pause, mute, voice & speed selection, progress/seek, auto-advance, toolbar controls, and keyboard shortcuts (P/M/N).
-
Style
- Extensive responsive and fullscreen refinements: typography, sizing, overflow/scrolling, controls, and mobile layout tweaks.
-
Other
- Build step: generates per-slide speaker-note files post-build.
- Slide visual: one slide image scaled wider.
✏️ Tip: You can customize this high-level summary in your review settings.
Support Atmos Toolchain for 3rd Party Tools @osterman (#1686)
Summary
This PR introduces comprehensive toolchain management for Atmos, enabling users to manage third-party tools alongside Atmos version management. It also refactors the terraform commands to use the registry pattern for better code organization.
Key Features
🔧 Atmos Toolchain for 3rd Party Tools
- Tool Management: Install, uninstall, list, and execute versioned tools from configurable registries
- Multi-Registry Support: Configure multiple tool registries (Atmos, Aqua) with search and listing capabilities
- Lock File Support:
atmos.lock.hclfor reproducible, multi-platform dependency locking - Tool Dependencies: Workflows and commands can declare tool dependencies with automatic installation
- Aliases: Configure tool aliases for convenient command execution
- Version Constraints: Support for semantic versioning constraints
📦 Atmos Version Management
atmos version list: List available Atmos versions with active/installed indicatorsatmos version install/uninstall: Install and manage multiple Atmos versions--use-versionFlag: Run any command with a specific Atmos version via re-exec mechanism
🏗️ Terraform Command Registry Migration
- Migrated all terraform commands to the registry pattern (
cmd/terraform/) - Implemented
CommandProviderinterface for consistent command registration - Added comprehensive compatibility flag support for terraform/tofu pass-through
- Interactive prompts for component and stack selection
- Better flag handling with
pkg/flags/StandardParser
🌍 Global Environment Configuration
atmos envCommand: Output environment variables in bash, JSON, dotenv, or GitHub Actions formatenvSection inatmos.yaml: Configure global environment variables with template support
📝 Stack Configuration Enhancements
- File-Scoped Locals: Define
locals:at the top level of stack files for file-specific templating !literalYAML Function: Preserve template syntax for deferred evaluation
📚 Documentation
- Comprehensive documentation for toolchain features, registries, and lock file management
- Updated configuration docs for new features
- New how-to guides for version management
Changes
New Commands
atmos toolchain(add, clean, du, env, exec, get, info, install, list, path, remove, search, set, uninstall, versions, which)atmos version list,atmos version install,atmos version uninstallatmos env
New Packages
toolchain/- Core toolchain business logic (install, registry, progress, etc.)pkg/toolchain/filemanager/- Lock file and .tool-versions managementpkg/toolchain/lockfile/- Lock file parsing and generationcmd/toolchain/- Toolchain CLI commands using registry patterncmd/terraform/- Terraform commands migrated to registry patterncmd/env/- Environment variable output command
Architectural Improvements
- Command registry pattern for all new commands
- Unified flag parsing infrastructure in
pkg/flags/ - Static error wrapping with sentinel errors from
errors/errors.go - Test improvements using
t.Setenvandt.TempDir
Testing
- Comprehensive unit tests for all toolchain packages
- Golden snapshot tests for CLI output
- Mock-based testing for external dependencies
Breaking Changes
None - all new features are additive.
🤖 Generated with Claude Code
Co-Authored-By: Claude noreply@anthropic.com
Summary by CodeRabbit
-
New Features
- Built-in Toolchain CLI to manage tools (add/clean/du/env/install/uninstall/list/get/info/path/which/set/remove/exec) and registry search/list.
- Automatic tool dependency resolution with on-demand installs and per-command PATH injection.
- Version management: install/uninstall specific Atmos versions.
-
Documentation
- Many new user guides, PRDs, examples, and READMEs for toolchain, registries, lockfiles, and dependency workflows.
-
Other
- CLI help now lists Toolchain commands; telemetry notice removed.
✏️ Tip: You can customize this high-level summary in your review settings.
feat: Migrate slide deck to MDX with animated components @osterman (#1923)
what
- Migrated static slide image gallery to interactive MDX-based slide deck
- Created
AtmosLogocomponent with animated color gradient overlay matching navbar - Created
MetallicIconcomponent for logos with metallic gradient effect - Updated Cloud Posse introduction slide with new messaging and larger metallic logo
- Enhanced split slide layout with wider text column (2:1 ratio)
- Expanded drawer trigger zone to entire left navigation area
- Removed 27 static slide SVG files in favor of dynamic MDX content
why
- Interactive slide deck provides better user experience and maintainability
- Animated components create visual consistency with the navbar branding
- Metallic gradient effect gives professional appearance to logo imagery
- MDX approach allows for easier updates and customization
references
- Replaces old slide image gallery component with new SlideDeck component system
- Implements exact animation techniques from existing navbar logo component
- Uses mix-blend-mode color technique for gradient overlay effects
Summary by CodeRabbit
-
New Features
- Interactive slide deck system: fullscreen, keyboard navigation, speaker notes panel, thumbnail drawer, progress bar, tooltips, and slide index; added Atmos intro deck and Slide Decks browsing page; old reference now redirects.
-
Style
- Animated Atmos logo, metallic icon treatment, comprehensive slide visuals and responsive theming; watermark hidden when slide decks are active.
-
Documentation
- Reference page updated to redirect to the new Slide Decks location with an informational note.
✏️ Tip: You can customize this high-level summary in your review settings.
feat(auth): Add provider fallback for atmos auth login @osterman (#1918)
## what- When
atmos auth loginis run without a--providerflag and no identities are configured, it now falls back to provider authentication - Single providers are automatically selected without user input
- Multiple providers trigger an interactive selector (or error in non-interactive mode)
- Users no longer need to know about the
--providerflag for initial authentication - Fix #1915:
atmos auth console --identity {identity}now correctly uses the provided identity instead of ignoring it
why
- Improves user experience for first-time login with
auto_provision_identitiesenabled - Makes the system seamless after
atmos auth logout(no need to rerun with--providerflag) - Addresses feedback that
atmos auth loginshould work without requiring explicit provider specification when only one provider exists - #1915 Fix: The
--identityflag with space-separated value (e.g.,--identity myid) was being ignored due to Cobra'sNoOptDefValquirk. The fix usesGetIdentityFromFlagswhich parsesos.Argsdirectly to work around this issue.
references
- Closes #1915
- User feedback: When
auto_provision_identities: trueis configured, the firstatmos auth logincommand fails with "no identities available". User expects seamless fallback to provider auth when identities don't exist yet.
Summary by CodeRabbit
-
New Features
- Auth login now falls back to provider authentication when no identities exist: auto-selects a single provider, prompts interactive selection for multiple providers, or requires --provider (-p) in non-interactive/CI.
-
Bug Fixes
- Improved identity-flag resolution and interactive selection edge-case handling; clearer error paths for missing providers or non-interactive selection.
-
Documentation
- Added CLI docs and blog post explaining provider-fallback behavior and usage.
-
Tests
- Expanded coverage for fallback flows, prompts, formatting, and identity-resolution.
✏️ Tip: You can customize this high-level summary in your review settings.
feat: implement source provisioner for JIT component vendoring @osterman (#1877)
Summary
Implements a comprehensive source provisioner system for just-in-time (JIT) vendoring of component sources. This enables components to declare their source location inline using source configuration, supporting dynamic vendoring workflows for Terraform, Helmfile, and Packer components.
What Changed
Core Source Provisioner (pkg/provisioner/source/)
- Vendor Engine - go-getter integration supporting Git, GitHub, S3, HTTP, and OCI sources
- Path Filtering - Include/exclude patterns for selective file vendoring
- Retry Support - Configurable retry with exponential backoff for transient failures
- URI Resolution - Version tag injection and URI normalization for go-getter
CLI Commands
atmos terraform source pull- Vendor component source on demandatmos terraform source describe- Display source configuration detailsatmos terraform source delete- Remove vendored source (requires--force)atmos terraform source list- List components with source configuration- Extended to Helmfile and Packer with identical command structure
JIT Auto-Provisioning
- Automatic vendoring before
terraform plan/apply/deploy,helmfile sync/diff,packer build - Smart skipping - Only vendors if target directory doesn't exist
- Force re-vendor -
--forceflag to override existing sources
Workdir Provisioner (pkg/provisioner/workdir/)
- Stack isolation - Unique working directories per stack (
.workdir/<type>/<stack>-<component>) - Source + Workdir - Combines JIT vendoring with per-stack isolation
- Path resolution - Integrates with
construct*ComponentWorkingDirfunctions
Schema Updates
source- URI, version, included_paths, excluded_paths, retry configurationprovision.workdir- Enable per-stack working directoriessource_retry- max_retries, delay, max_delay for download resilience
Error Handling
- 10 new sentinel errors:
ErrSourceProvision,ErrSourceInvalidSpec,ErrSourceCopyFailed,ErrSourceMissing,ErrSourceTargetExists,ErrForceRequired,ErrCreateTempDir,ErrSourceWorkdirConflict,ErrFailedToInitConfig,ErrDescribeComponent - ErrorBuilder integration with hints and context
Testing
- Unit tests - Comprehensive coverage for extraction, targeting, URI handling, copying
- Mock interfaces - Testable design with dependency injection
- Integration fixtures -
tests/fixtures/scenarios/source-provisioner/andsource-provisioner-workdir/ - CLI snapshots - Updated golden files for new commands
Documentation
- CLI docs - Full documentation for all source commands
- Design patterns - Source-based versioning guide
- Blog post - Feature announcement with examples
- PRD - Product requirements document
Example Usage
# Stack configuration with inline source
components:
terraform:
vpc:
source:
uri: "github.com/cloudposse/terraform-aws-vpc//src?ref={{.version}}"
version: "2.0.0"
included_paths:
- "*.tf"
excluded_paths:
- "examples/**"
retry:
max_retries: 3
delay: "5s"
vars:
cidr_block: "10.0.0.0/16"# Manual source operations
atmos terraform source pull vpc -s dev-us-east-1
atmos terraform source describe vpc -s dev-us-east-1
atmos terraform source delete vpc -s dev-us-east-1 --force
# JIT auto-provisioning (source vendored automatically)
atmos terraform plan vpc -s dev-us-east-1Why
- Simplified workflows - No separate
vendor.yamlorcomponent.yamlfiles needed - Per-environment versioning - Different component versions per stack
- Dynamic vendoring - Sources fetched on-demand, not pre-vendored
- Stack isolation - Workdir support prevents cross-stack interference
References
- Closes #598 - Remote sources for components (requested by @Gowiem)
- See #1813 for terraform command registry refactoring pattern
- PRD:
docs/prd/source-provisioner.md
Summary by CodeRabbit
-
New Features
- Added a new "source" command suite (pull, list, describe, delete) for Terraform, Helmfile, and Packer to manage component sources and JIT vendoring.
- Introduced top-level source manifest support with uri/version, include/exclude paths, and per-source retry policies.
- Automatic on‑first‑use provisioning and optional workdir isolation (with force override).
-
Documentation
- Extensive CLI docs, design patterns, examples, and blog posts covering source-based versioning and retry behavior.
✏️ Tip: You can customize this high-level summary in your review settings.
fix: Correct Native CI/CD roadmap messaging @osterman (#1922)
what
- Removed misleading claims about cost estimates and approval buttons (not part of this feature)
- Updated tagline to "Local = CI. Same command, run everywhere" for clarity
- Refocused description and benefits on eliminating wrapper scripts and glue code
- Fixed PRD reference: terraform-registry-migration → native-ci-integration
why
The roadmap entry misrepresented the Native CI/CD feature. Per PR #1891's blog post, the core value is replacing separate github-action-atmos-* actions with a single CLI that auto-detects CI and behaves identically locally and in CI. Removed unrelated claims about cost estimates and approval buttons.
references
- PR #1891: Native CI Integration with Summary Templates and Terraform Command Registry
Summary by CodeRabbit
- Documentation
- Updated Public Roadmap to clarify Native CI/CD Support features, emphasizing environment auto-detection and streamlined CI workflows without wrapper scripts.
- Expanded GitHub Actions milestone details to highlight native mode capabilities, including enhanced job summaries, resource visualization, and planned multi-provider support.
✏️ Tip: You can customize this high-level summary in your review settings.
feat: Implement component workdir provisioning and CRUD commands @osterman (#1876)
what
- Implement isolated working directories for Terraform component execution via
WorkdirProvisioner - Add
atmos terraform workdirCLI commands: list, describe, show, clean - Prevent component instance conflicts by providing separate execution spaces with metadata tracking
- Integrate provisioner into terraform command pipeline with automatic workdir path override
- Support component workdir configuration in stack manifests with caching and content hashing
why
Multiple component instances targeting the same component caused conflicts due to shared working directories. Workdir provisioning isolates each component execution to a dedicated directory (.workdir/terraform/<stack>-<component>/), enabling parallel execution and preventing state/artifact interference.
references
- Related PRs: Component workdir provisioning implementation
- Feature scope: Local provisioning of component folders into isolated workdirs; remote sources deferred
Summary by CodeRabbit
-
New Features
- Component Workdir: opt-in isolated per-component working directories for Terraform; new CLI subcommands: workdir list/describe/show/clean (clean supports specific or --all). List supports table/json/yaml outputs; help updated.
-
Documentation
- PRD, CLI docs, and blog post added with usage, examples, and cleanup guidance.
-
Schema
- Manifest/schema extended to include provision.workdir.enabled.
-
Tests
- Extensive unit, integration, and end-to-end CLI tests added.
✏️ Tip: You can customize this high-level summary in your review settings.
Fix markdown code fence in Nerd Fonts installation instructions @osterman (#1917)
Summary
- Fixes markdown formatting issue where the opening code fence was accidentally deleted
Closes #1913
Details
PR #1913 simplified the Nerd Fonts installation instructions by removing deprecated Homebrew tap commands. However, the deletion also removed the opening ```shell code fence while keeping the closing ```, breaking the markdown formatting.
This PR incorporates the original change from @topperge and adds back the missing code fence.
Test plan
- Verify the code block renders correctly in the docs
Summary by CodeRabbit
- Documentation
- Simplified macOS installation instructions by removing unnecessary preliminary steps from the Homebrew setup process. The installation now requires fewer commands to complete.
✏️ Tip: You can customize this high-level summary in your review settings.
Add theme-aware CloudPosse embeds for Slack and Office Hours with UTM tracking @osterman (#1802)
what
- Created
CloudPosseSlackEmbedandCloudPosseOfficeHoursEmbedReact components that dynamically adapt to Docusaurus theme (light/dark) - Replaced HubSpot form with CloudPosse embed iframe for Office Hours page
- Added UTM tracking parameters to both embeds for analytics:
utm_source=atmos-docsutm_medium=embedutm_campaign=office-hours/slack-communityutm_content=community-page
- Updated embed styling: 380px height, left-justified, max-width 80rem
- Added
allow-popupsto sandbox attributes for proper link functionality - Added
hide_title: trueto Office Hours page to prevent duplicate headings
why
- Theme awareness: Embeds now automatically switch between light/dark themes when users toggle Docusaurus theme, providing a consistent user experience
- Better tracking: UTM parameters enable conversion rate and traffic analytics for both community engagement channels
- Improved UX: Standardized sizing across both embeds, left-justified layout, proper link support
- Cleaner interface: Office Hours embed heading eliminates duplicate page title
- Modern approach: React components with MutationObserver pattern (following existing codebase patterns like
Tooltip.tsx)
references
- Updated
website/docs/community/slack.mdx - Updated
website/docs/community/office-hours.mdx - Created
website/src/components/CloudPosseSlackEmbed/index.tsx - Created
website/src/components/CloudPosseOfficeHoursEmbed/index.tsx
Summary by CodeRabbit
-
New Features
- Added theme-aware embed components for Office Hours and Slack that automatically adapt to light and dark mode settings.
-
Documentation
- Updated Office Hours and Slack documentation pages to use the new custom embed components with improved styling and functionality.
✏️ Tip: You can customize this high-level summary in your review settings.
Improve mobile responsive design and navbar layout @osterman (#1914)
what
- Move hamburger menu to the right side of the mobile navbar (after search icon)
- Add mobile responsive fixes for roadmap and changelog pages
- Reduce vertical spacing between CTA buttons on mobile
- Simplify mobile hero title display using "IaC Framework" shorthand
- Reorder changelog filters (Tags above Years)
- Reduce mobile timeline left margin and adjust connector spacing
- Fix navbar search positioning on mobile to prevent overlap
why
These changes significantly improve the mobile user experience by providing better navbar organization, reducing visual clutter, and ensuring all interactive elements are properly visible and spaced on small screens.
The hamburger menu relocation to the right side follows modern mobile UI conventions and improves content discoverability.
references
Branch: osterman/roadmap-mobile-fix
feat: Add comprehensive roadmap page @osterman (#1912)
what
- Add interactive roadmap page with 10 initiatives and 50+ milestones
- Create Roadmap component with initiative cards, milestone lists, and quarter timeline
- Implement MilestoneDrawer for detailed milestone information with descriptions, screenshots, and code examples
- Add Tooltip component for PR/issue title hover tooltips with theme-aware styling
- Include extensive roadmap data with changelog and documentation links
- Add Roadmap navigation link to Docusaurus navbar
- Fix milestone/bullet alignment with proper flexbox and margin adjustments
why
- Provides users with transparent view of product roadmap and upcoming features
- Helps users understand what's shipped, in progress, and planned
- Links to relevant documentation and announcements for each milestone
- Improves project visibility and community engagement with detailed progress tracking
references
- Implements planned Roadmap feature from project PRD
- Related discussions: Strategic product planning and user visibility
Summary by CodeRabbit
- New Features
- Full interactive Roadmap page: navbar link, hero, quarter timeline, highlights, featured improvements, initiative cards, milestone lists with slide-in drawers, progress bars, tooltips, animations, and keyboard accessibility.
- Documentation
- Roadmap Maintainer guide and contributor instructions added; CLAUDE.md updated; new blog post announcing the product roadmap.
- Style
- Comprehensive responsive, theme- and dark-mode-aware styling for the Roadmap UI.
- Chores
- CI workflow updated to enforce release documentation checks (blog + roadmap).
✏️ Tip: You can customize this high-level summary in your review settings.
feat(auth): Add Azure OIDC/Workload Identity Federation provider @jamengual (#1894)
what
- Implement the
azure/oidcprovider for CI/CD environments (GitHub Actions, Azure DevOps, etc.) - Exchange federated identity tokens for Azure credentials without storing long-lived secrets
- Add comprehensive unit tests with >90% coverage
why
- Enable secure, secretless authentication in CI/CD pipelines
- Support Azure Workload Identity Federation for GitHub Actions workflows
- Complete the Azure authentication story alongside existing
azure/cliandazure/device-codeproviders
Key Features
- Federated token exchange with Azure AD using OAuth 2.0 client credentials flow
- Automatic GitHub Actions OIDC token retrieval when running in GitHub Actions
- Support for
AZURE_FEDERATED_TOKEN_FILEenvironment variable - Token file path configuration via
token_file_pathin spec - Sets
ARM_USE_OIDC=truefor Terraform azurerm/azapi/azuread providers
Configuration Example
auth:
providers:
azure-oidc:
kind: azure/oidc
spec:
tenant_id: "your-tenant-id"
client_id: "your-client-id"
subscription_id: "your-subscription-id"
# Optional: audience for OIDC token
audience: "api://AzureADTokenExchange"
# Optional: path to federated token file
token_file_path: "/path/to/token"references
- Closes gap in Azure auth provider support
- Follows existing patterns from
azure/cliandazure/device-codeproviders
Summary by CodeRabbit
-
New Features
- Azure OIDC provider: workload identity federation with GitHub Actions OIDC support, federated token file/env discovery, multi-scope token exchange, and Terraform/ARM OIDC compatibility.
-
Documentation
- New blog and expanded CLI docs with configuration examples and GitHub Actions workflow snippets.
-
Tests
- Extensive unit tests covering provider flows, token sources, exchanges, CI integration, and environment preparation.
-
Bug Fixes
- Use single management scope to improve token caching and lookup.
-
Refactor
- Auth cache and credential model extended to support service-principal and OIDC flows.
-
Chores
- Auth exec command adjusted to skip stack validation.
✏️ Tip: You can customize this high-level summary in your review settings.
refactor: Create pkg/function and pkg/yaml packages @osterman (#1886)
What
Create new packages for modularized function handling and YAML utilities:
- pkg/function/: Format-agnostic function registry and handlers (env, exec, random, include, template, store, terraform, aws, repo-root)
- pkg/yaml/: YAML-specific utilities (position tracking, error handling, types)
- pkg/aws/identity/: Consolidated AWS identity caching (from internal/aws_utils)
Why
- Separation of Concerns: Function handlers work across all formats (YAML, HCL, JSON); only parsing differs
- Code Reuse: Registry pattern eliminates duplication across formats
- Extensibility: New functions without modifying core logic
- Testing: Interface-driven design with dependency injection
- AWS Consolidation: Eliminate duplicate identity caching logic
References
Foundation for PR #1842 which refactors YAML processing.
Consolidates AWS identity handling per request.
Summary by CodeRabbit
-
New Features
- New AWS functions: aws.account_id, aws.caller_identity_arn, aws.caller_identity_user_id, aws.region.
- Format-agnostic function registry added with built-in handlers: env, exec, store, store.get, template, terraform.output, terraform.state, random, literal, include, repo-root.
- Store interface now supports direct key retrieval (GetKey).
-
Refactor
- Centralized AWS identity handling with per-context caching and Atmos auth support.
- YAML utilities improved with position tracking and clearer error signals.
✏️ Tip: You can customize this high-level summary in your review settings.
feat(auth): add aws/assume-root identity for centralized root access @milldr (#1828)
what
- Add
aws/assume-rootidentity kind for centralized root access to AWS member accounts - Implement STS AssumeRoot API integration with AWS-managed task policies
- Add shared STS client helper for assume-role and assume-root identities
- Include comprehensive test coverage (1000+ lines)
why
- Enables secure, centralized management of root access across AWS Organizations
- Provides audit trail for root operations through AWS-managed task policies
- Reduces risk of credentials scattered across multiple accounts
- Follows AWS best practices for delegated root access via IAM Identity Center
references
- AWS Centralized Root Access Documentation
- PRD:
docs/prd/aws-assume-root-identity.md
Validated locally. Here's an example
auth:
providers:
sso:
kind: aws/iam-identity-center
region: us-east-2
start_url: https://acme.awsapps.com/start
auto_provision_identities: true
identities:
# ==========================================================================
# Centralized Root Access
# ==========================================================================
# AWS Centralized Root Access allows management account administrators to
# assume root in member accounts using short-lived STS credentials.
# See: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-enable-root-access.html
#
# Prerequisites:
# 1. Centralized root access enabled in AWS Organizations
# 2. Permission set with sts:AssumeRoot in management account
#
# Supported task policies (limit root operations to specific tasks):
# - IAMAuditRootUserCredentials - Audit root MFA and access keys
# - IAMCreateRootUserPassword - Create/reset root password
# - IAMDeleteRootUserCredentials - Remove root access keys and MFA
# - S3UnlockBucketPolicy - Unlock S3 buckets with restrictive policies
# - SQSUnlockQueuePolicy - Unlock SQS queues with restrictive policies
# ==========================================================================
# Step 1: Authenticate to permission set with sts:AssumeRoot in management account
organizational-root-access:
kind: aws/permission-set
via:
provider: sso
principal:
name: RootAccess
account:
name: Root
# Step 2: Chain to assume root in target member account
#
# Usage:
# atmos auth login --identity core-audit/iam-audit-root
# atmos auth exec --identity core-audit/iam-audit-root -- aws iam list-mfa-devices
#
core-audit/iam-audit-root:
kind: aws/assume-root
via:
identity: organizational-root-access
principal:
target_principal: "1234567890" # core-audit
task_policy_arn: arn:aws:iam::aws:policy/root-task/IAMAuditRootUserCredentialsatmos auth exec --identity core-audit/iam-audit-root -- aws sts get-caller-identity
{
"UserId": "1234567890",
"Account": "1234567890",
"Arn": "arn:aws:iam::1234567890:root"
}Summary by CodeRabbit
-
New Features
- Added AWS "assume-root" identity for task-scoped, short-lived root access via AWS STS.
-
Documentation
- New PRD and blog post with examples, supported policies, prerequisites, and getting-started guidance.
- Added blog author metadata for the new guide.
-
Tests
- Extensive tests covering identity flows, STS client behavior, environment setup, credential handling, and lifecycle operations.
-
Chores
- Provider registration and STS client support enhancements.
✏️ Tip: You can customize this high-level summary in your review settings.
Add list affected command with spinner UI improvements @osterman (#1874)
what
- Implement new
atmos list affectedcommand to compare affected components between branches - Fix false positive affected components when using the
-Cflag by correctly computing relative paths from git root - Generalize spinner implementation from internal/exec to pkg/ui/spinner for better reusability across the codebase
- Add FormatSuccess/FormatError functions to properly render markdown in toast messages, fixing backtick formatting
why
The original describe affected implementation had a bug where components appeared affected with reason stack.metadata even when there were zero differences between branches when using the -C flag. This was caused by incorrect path calculation and cache contamination. The new list affected command provides a cleaner interface while fixing these issues. Additionally, the spinner implementation was duplicated across multiple files with formatting issues, so we centralized it in pkg/ui/spinner for better maintainability and proper markdown rendering support.
references
- Fixes false positive issue in describe affected when using
-Cflag - Consolidates duplicate spinner implementations
- Improves CLI output formatting and markdown rendering
Summary by CodeRabbit
-
New Features
- Added the new atmos list affected command with filtering, sorting, custom columns and multiple output formats.
- Enhanced CLI spinner UI with dynamic completion messages and improved success/error formatting.
-
Bug Fixes
- Fixed false positives when listing affected components in subdirectories by improving path handling and cache isolation.
- Clearer error when a Git reference is not found.
-
Documentation
- New docs and blog post describing the list affected command and usage.
-
Tests
- Expanded test coverage and updated snapshots.
✏️ Tip: You can customize this high-level summary in your review settings.
🚀 Enhancements
fix: Seamless AWS IAM User credential recovery with generic prompting interface @aknysh (#1910)
what
- Implement generic credential prompting interface (
CredentialPromptSpec,CredentialField) for multi-cloud extensibility - Add AWS IAM User implementation that uses the generic interface
- Automatically detect
InvalidClientTokenIderror when AWS access keys are rotated or revoked - Clear stale credentials from keyring and prompt for new ones inline during
atmos auth login - Fix session duration bug where configured 36h MFA sessions expired after 12h
- Add comprehensive error detection for
ExpiredTokenExceptionandAccessDeniedwith proper explanations and hints - Add MFA-only re-prompt flow - when MFA token is invalid but long-lived credentials are still valid, only re-prompt for MFA token (not all credentials)
- Detect session credentials accidentally stored in keyring and prompt for new long-lived credentials
- Add warning message to
auth whoamiwhen credentials are invalid or expired with recovery instructions - Add helpful tip to
auth execwhen subprocess fails, guiding users to refresh credentials - Fix
auth whoamito display proper session token expiration by preferring session credentials from files over long-lived keyring credentials - Comprehensive test coverage (81.1% for
pkg/auth/identities/aws)
why
- Users experienced persistent authentication failures after AWS credential rotation
atmos auth logout+atmos auth logindidn't resolve the issue because stale credentials remained in keyring- Session duration from
atmos auth user configurewas not being preserved - When MFA token expired, users had to re-enter ALL credentials instead of just the MFA token
- Session credentials accidentally stored in keyring would cause
InvalidClientTokenIderrors onGetSessionTokencalls auth whoamishowed incorrect authentication status without guidance on how to fix itauth execfailures left users guessing about the cause when credentials were expiredauth whoamiwas not showing "Expires" field because it loaded long-lived credentials from keyring instead of session credentials from files- Need extensible architecture for future Azure/GCP credential prompting support
User Experience
Single Command Recovery
$ atmos auth login dev-admin
⚠ AWS credentials are required for identity: dev-admin
AWS Access Key ID: AKIAXXXXXXXXXX
AWS Secret Access Key: ********
MFA ARN (optional): arn:aws:iam::123456789012:mfa/user
Session Duration (optional, default: 12h): 36h
✓ Credentials saved to keyring: dev-admin
Enter MFA Token: 123456
✓ Authentication successful!MFA-Only Re-prompt (Session Expired)
When session expires but long-lived credentials are still valid:
$ atmos auth login dev-admin
Enter MFA Token: 123456 # Invalid/expired token
⚠ MFA token was invalid, prompting for new token
Enter MFA Token: 789012 # User enters new token
✓ Authentication successful!Improved Whoami Status
The auth whoami command now shows session token expiration and displays a warning with recovery instructions when credentials are invalid:
$ atmos auth whoami dev-admin
✗ Current Authentication Status
Provider aws-user
Identity dev-admin
Expires 2025-12-30 10:11:05 EST (expired)
Last Updated 2025-12-30 09:55:34 EST
⚠ Credentials may be expired or invalid.
Run 'atmos auth login --identity dev-admin' to refresh.Auth Exec Guidance
When auth exec runs a command that fails due to expired credentials, it now provides a helpful tip:
$ atmos auth exec --identity dev-admin -- aws sts get-caller-identity
An error occurred (ExpiredToken) when calling the GetCallerIdentity operation: The security token included in the request is expired
Tip If credentials are expired, refresh with:
atmos auth login --identity dev-adminError Detection and Response
| Error Code | Meaning | Action |
|---|---|---|
InvalidClientTokenId
| Access keys rotated/revoked | Clear stale credentials, prompt for new ones, retry |
ExpiredTokenException
| Session token expired | Guide user to re-login |
AccessDenied (MFA-related)
| Invalid/expired MFA token | Re-prompt for MFA token only, retry |
AccessDenied (permission)
| Missing IAM permissions | Guide user to check IAM policies |
Architecture
Introduces a generic credential prompting interface:
// pkg/auth/types/credential_prompt.go
type CredentialField struct {
Name, Title, Description string
Required, Secret bool
Default string
Validator func(string) error
}
type CredentialPromptSpec struct {
IdentityName string
CloudType string // "aws", "azure", "gcp"
Fields []CredentialField
}
type CredentialPromptFunc func(spec CredentialPromptSpec) (map[string]string, error)Each identity type (AWS IAM User, Azure, GCP) can define its own credential fields, and the prompting UI is generic.
Session Credential Loading
The auth manager intelligently loads credentials:
- First checks keyring for cached credentials
- If keyring has long-lived credentials (no session token), also checks files for session credentials
- Prefers session credentials from files when available (they have proper expiration info)
- Falls back to keyring credentials if no session credentials exist in files
This ensures auth whoami displays accurate expiration times for session tokens.
Applies To
This enhancement applies to AWS IAM User identities (aws/user kind). Other identity types like AWS SSO, assume-role, and permission-set are not affected.
Test Coverage
pkg/auth/identities/aws: 81.1% statement coverage- All error scenarios have unit test coverage
- Integration tests with mock auth provider
- Tests for
loadCredentialsWithFallbacksession credential preference - Tests for
loadSessionCredsFromFilesedge cases - Tests for
printWhoamiHumanwarning message - Tests for
printAuthExecTipguidance message
Files Modified
| File | Changes |
|---|---|
cmd/auth_whoami.go
| Added warning message when credentials are invalid |
cmd/auth_exec.go
| Added tip message when subprocess fails |
pkg/auth/manager.go
| Added loadCredentialsWithFallback and loadSessionCredsFromFiles for session credential preference
|
pkg/auth/manager_extended_test.go
| Added 6 tests for session credential loading |
cmd/auth_whoami_test.go
| Added 2 tests for warning message |
cmd/auth_exec_test.go
| Added 1 test (2 subtests) for tip message |
docs/prd/auth-credential-invalidation-handling.md
| Updated PRD with new features |
website/blog/2025-12-22-auth-credential-invalidation-recovery.mdx
| Updated blog post with new features |
Summary by CodeRabbit
-
New Features
- Inline credential prompting and single-command recovery for invalid/rotated AWS credentials, with MFA re-prompting and session-duration controls
- Non-interactive contexts suppress prompts; session tokens preserved without overwriting long-lived credentials
-
Bug Fixes
- Better detection and user guidance for common AWS auth errors; tips shown on auth-exec failures
-
Documentation
- New PRD and blog post explaining recovery flows and UX
-
Tests
- Extensive test coverage for auth flows, STS errors, prompting, and caching behavior
✏️ Tip: You can customize this high-level summary in your review settings.