| title | Atmos Roadmap 2025-2026 |
|---|---|
| sidebar_label | Roadmap |
| sidebar_position | 2 |
| description | Atmos product roadmap - from fragmented infrastructure tooling to unified orchestration. |
| hide_table_of_contents | true |
| hide_title | true |
import { SlideDeck, Slide, SlideTitle, SlideSubtitle, SlideContent, SlideNotes, } from '@site/src/components/SlideDeck'; import Link from '@docusaurus/Link'; import { useState, useEffect, useRef } from 'react'; import { roadmapConfig } from '@site/src/data/roadmap';
export const renderInlineCode = (text) => {
const parts = text.split(/([^]+)/g); return parts.map((part, i) => { if (part.startsWith('') && part.endsWith('`')) {
return {part.slice(1, -1)};
}
return part;
});
};
export const StatusBadge = ({ status }) => {
const badgeClass = status === 'shipped' ? 'slide-badge--shipped' :
status === 'in-progress' ? 'slide-badge--in-progress' : 'slide-badge--planned';
const label = status === 'shipped' ? 'Shipped' :
status === 'in-progress' ? 'In Progress' : 'Planned';
return <span className={slide-badge ${badgeClass}}>{label};
};
export const StatusIcon = ({ status }) => {
const iconClass = status === 'shipped' ? 'slide-status-icon--shipped' :
status === 'in-progress' ? 'slide-status-icon--in-progress' : 'slide-status-icon--planned';
const icon = status === 'shipped' ? '✓' :
status === 'in-progress' ? '→' : '○';
return <span className={slide-status-icon ${iconClass}}>{icon};
};
export const MilestoneLinks = ({ milestone }) => {
if (!milestone.changelog && !milestone.docs && !milestone.pr) return null;
return (
<span style={{marginLeft: '0.5rem'}}>
{milestone.changelog && (
<Link to={/changelog/${milestone.changelog}} className="slide-link-badge">
Announcement
)}
{milestone.docs && (
Docs
)}
{milestone.pr && (
<Link
to={https://github.com/cloudposse/atmos/pull/${milestone.pr}}
className="slide-link-badge"
target="_blank"
rel="noopener noreferrer"
>
PR #{milestone.pr}
)}
);
};
export const ProgressBar = ({ progress }) => (
export const MilestoneList = ({ milestones }) => (
-
{milestones.map((milestone) => (
- {renderInlineCode(milestone.label)} ))}
export const PaginatedMilestones = ({ milestones, itemsPerPage = 4 }) => { const [currentPage, setCurrentPage] = useState(0); const containerRef = useRef(null);
// Sort: featured first, then shipped, then in-progress, then planned const sorted = [ ...milestones.filter(m => m.category === 'featured'), ...milestones.filter(m => m.category !== 'featured' && m.status === 'shipped'), ...milestones.filter(m => m.status === 'in-progress' && m.category !== 'featured'), ...milestones.filter(m => m.status === 'planned' && m.category !== 'featured'), ].filter((m, i, arr) => arr.findIndex(x => x.label === m.label) === i); // dedupe
// Chunk into pages const pages = []; for (let i = 0; i < sorted.length; i += itemsPerPage) { pages.push(sorted.slice(i, i + itemsPerPage)); } const totalPages = pages.length;
// Keyboard navigation: Shift+Left/Right when this component is visible useEffect(() => { if (totalPages <= 1) return; const handleKeyDown = (e) => { if (!e.shiftKey) return; if (e.key !== 'ArrowLeft' && e.key !== 'ArrowRight') return; // Only respond if this component is visible (current slide) const el = containerRef.current; if (!el || el.offsetParent === null) return; const rect = el.getBoundingClientRect(); if (rect.width === 0 || rect.height === 0) return; // Check if element is in viewport if (rect.top >= window.innerHeight || rect.bottom <= 0) return; if (e.key === 'ArrowLeft') { setCurrentPage(p => Math.max(0, p - 1)); } else { setCurrentPage(p => Math.min(totalPages - 1, p + 1)); } }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); }, [totalPages]);
if (totalPages === 0) return null;
return (
slide-dot ${i === currentPage ? 'slide-dot--active' : ''}}
onClick={() => setCurrentPage(i)}
aria-label={Page ${i + 1}}
/>
))}
{/* Slide 1: Title */} Atmos Roadmap 2025-2026 Reducing Tool Fatigue Welcome to the Atmos roadmap presentation. This deck covers our vision, current initiatives, and where we're headed in 2025 and 2026.
{/* Slide 2: Vision */} Vision <p style={{fontSize: '1.4em', lineHeight: '1.6'}}>{roadmapConfig.vision}
Our vision is to provide one tool that orchestrates your entire infrastructure lifecycle. As convenient as a PaaS, but as flexible as Terraform, sitting on top of the tools you already know and love.{/* Slide 3: Theme */} {roadmapConfig.theme.title} <p style={{fontSize: '1.2em', lineHeight: '1.6'}}>{roadmapConfig.theme.description}
The theme for this roadmap period is reducing tool fatigue. We're taking the sprawl of infrastructure tooling and bringing it into a cohesive, discoverable, zero-config experience that works identically whether you're running locally or in CI.{/* Slide 4: Highlights */} Key Achievements
-
{roadmapConfig.highlights.map((highlight) => (
- {highlight.label}: {highlight.before} → {highlight.after} — {highlight.description} ))}
{/* Featured Initiatives Slides */} {roadmapConfig.featured.map((feature) => { const initiative = roadmapConfig.initiatives.find(i => i.id === feature.id); const milestones = initiative?.milestones || [];
return ( {feature.title} {feature.tagline}
{feature.description}
{milestones.length > 0 && } {feature.title}: {feature.description} {'\n\n'} Benefits: {feature.benefits} ); })}{/* Remaining Initiative Slides (not in featured) */} {roadmapConfig.initiatives .filter(initiative => !roadmapConfig.featured.some(f => f.id === initiative.id)) .map((initiative) => { return ( {initiative.title} {initiative.tagline}
{initiative.description}
{initiative.title}: {initiative.description} ); })}{/* Closing Slide */} Get Started with Atmos atmos.tools <div style={{textAlign: 'left', display: 'inline-block'}}>
Documentation: atmos.tools
Roadmap: atmos.tools/roadmap
GitHub: github.com/cloudposse/atmos
Community: cloudposse.com/slack