Skip to content

feat: Add data-driven roadmap slide deck with pagination#1953

Merged
aknysh merged 6 commits intomainfrom
osterman/roadmap-slides
Jan 13, 2026
Merged

feat: Add data-driven roadmap slide deck with pagination#1953
aknysh merged 6 commits intomainfrom
osterman/roadmap-slides

Conversation

@osterman
Copy link
Copy Markdown
Member

@osterman osterman commented Jan 12, 2026

what

  • Created a new data-driven slide deck at /slides/roadmap that visualizes the Atmos product roadmap
  • Featured initiatives appear first, followed by other initiatives with progress bars
  • Paginated milestone viewer with clickable dots and Shift+Left/Right keyboard navigation
  • Styled milestones with status icons, badges for releases/docs, inline code formatting
  • Progress bar visualization for initiative completion percentages

why

  • Provides a modern, interactive way to present the Atmos roadmap to stakeholders and the community
  • Data-driven from roadmapConfig ensures the slides stay in sync with product planning
  • Paginated milestones allow initiatives to showcase multiple achievements without cluttering slides
  • Keyboard navigation provides power-user experience alongside mouse interaction

references

  • Roadmap data source: website/src/data/roadmap.js
  • Slide deck system: website/src/components/SlideDeck/

Summary by CodeRabbit

  • New Features

    • Added "Atmos Roadmap 2025-2026" interactive slide deck with paginated milestone lists, status badges, progress bars, links, and presenter notes.
    • Milestone pagination supports Shift+ArrowLeft/Right; holding Shift while paging no longer advances slides.
  • Style

    • Extensive visual and responsive styling for slides: badges, icons, progress bars, pagination dots, typography, and layout refinements.
  • Other

    • Updated roadmap theme title to "Reducing Tool Fatigue".

✏️ Tip: You can customize this high-level summary in your review settings.

Create a new slide deck at /slides/roadmap that visualizes the Atmos roadmap
as a series of data-driven slides. Includes paginated milestones with keyboard
navigation (Shift+Left/Right), progress bars, styled badges, and inline code
formatting. Featured initiatives appear first with collapsible milestone pages.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
@osterman osterman requested a review from a team as a code owner January 12, 2026 21:31
@github-actions github-actions bot added the size/l Large size PR label Jan 12, 2026
@osterman osterman added the no-release Do not create a new release (wait for additional code changes) label Jan 12, 2026
@github-actions
Copy link
Copy Markdown

github-actions bot commented Jan 12, 2026

Dependency Review

✅ No vulnerabilities or license issues found.

Scanned Files

None

@codecov
Copy link
Copy Markdown

codecov bot commented Jan 12, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 74.13%. Comparing base (6ae0a27) to head (c8b2bfd).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files

Impacted file tree graph

@@           Coverage Diff           @@
##             main    #1953   +/-   ##
=======================================
  Coverage   74.12%   74.13%           
=======================================
  Files         772      772           
  Lines       69744    69744           
=======================================
+ Hits        51697    51703    +6     
+ Misses      14618    14615    -3     
+ Partials     3429     3426    -3     
Flag Coverage Δ
unittests 74.13% <ø> (+<0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.
see 3 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Jan 12, 2026

📝 Walkthrough

Walkthrough

Adds a new "Atmos Roadmap 2025-2026" MDX slide deck with data-driven slides and presentation components, client-side paginated milestones with Shift+Arrow keyboard handling, accompanying CSS and SlideIndex registration, a small roadmap theme title change, and a minor SlideDeck keyboard guard and styling tweaks.

Changes

Cohort / File(s) Summary
Slide Deck Registration
website/docs/slides/index.mdx
Adds new deck entry "Atmos Roadmap 2025-2026" (title, description, slideCount, slug, tags).
Roadmap Slide Deck & Components
website/docs/slides/roadmap.mdx
New MDX deck introducing presentation helpers and components (renderInlineCode, StatusBadge, StatusIcon, MilestoneLinks, ProgressBar, MilestoneList, PaginatedMilestones), slides driven by roadmapConfig, presenter notes, client-side paging, sorting/dedup, and Shift+Arrow inner-pagination handlers.
Slide Component Styling
website/src/components/SlideDeck/SlideContent.css, website/src/components/SlideDeck/SlideIndex.css
Adds extensive CSS for inline code, badges, icons, milestone lists, progress bars, pagination dots, responsive typography, layout, and SlideIndex flex/layout adjustments.
Keyboard Navigation Guards
website/src/components/SlideDeck/SlideDeck.tsx
Adds guards to ignore ArrowRight/Space and ArrowLeft when Shift is held so inner pagination shortcuts don't advance slides.
Roadmap Configuration
website/src/data/roadmap.js
Updates roadmapConfig.theme.title from "From Fragmented to Unified" to "Reducing Tool Fatigue".

Sequence Diagram(s)

sequenceDiagram
  actor User
  participant SlideDeck
  participant PaginatedMilestones
  participant RoadmapConfig
  User->>SlideDeck: Key press (Shift+ArrowLeft/Right)
  SlideDeck->>SlideDeck: Detect Shift\nsuppress global navigation
  SlideDeck->>PaginatedMilestones: Forward inner-pagination key
  PaginatedMilestones->>RoadmapConfig: Read/sort/paginate milestones
  PaginatedMilestones-->>User: Render updated milestone page
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested labels

minor

Suggested reviewers

  • aknysh
🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the primary change: adding a new data-driven roadmap slide deck with pagination support across multiple files.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch osterman/roadmap-slides

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In @website/docs/slides/roadmap.mdx:
- Around line 103-107: The current sorted array (const sorted) only spreads
featured, shipped, and in-progress milestones and thus omits non-featured
planned milestones; add another spread such as ...milestones.filter(m =>
m.status === 'planned' && m.category !== 'featured') (place it where you want
planned items to appear, e.g., after the in-progress spread) and keep the final
dedupe filter (arr.findIndex...) unchanged so planned milestones are included
and still deduplicated.
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 1527ee8 and e27dfed.

📒 Files selected for processing (5)
  • website/docs/slides/index.mdx
  • website/docs/slides/roadmap.mdx
  • website/src/components/SlideDeck/SlideContent.css
  • website/src/components/SlideDeck/SlideDeck.tsx
  • website/src/data/roadmap.js
🧰 Additional context used
📓 Path-based instructions (1)
website/**

📄 CodeRabbit inference engine (.cursor/rules/atmos-rules.mdc)

website/**: Update website documentation in the website/ directory when adding new features, ensure consistency between CLI help text and website documentation, and follow the website's documentation structure and style
Keep website code in the website/ directory, follow the existing website architecture and style, and test website changes locally before committing
Keep CLI documentation and website documentation in sync and document new features on the website with examples and use cases

Files:

  • website/src/components/SlideDeck/SlideDeck.tsx
  • website/docs/slides/index.mdx
  • website/src/data/roadmap.js
  • website/src/components/SlideDeck/SlideContent.css
  • website/docs/slides/roadmap.mdx
🧠 Learnings (2)
📓 Common learnings
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T00:55:21.720Z
Learning: PRs labeled `minor` or `major` MUST update `website/src/data/roadmap.js` with shipped milestones, status, changelog link, PR number, and initiative progress percentage
Learnt from: osterman
Repo: cloudposse/atmos PR: 1686
File: docs/prd/tool-dependencies-integration.md:58-64
Timestamp: 2025-12-13T06:07:37.766Z
Learning: cloudposse/atmos: For PRD docs (docs/prd/*.md), markdownlint issues like MD040/MD010/MD034 can be handled in a separate documentation cleanup commit and should not block the current PR.
📚 Learning: 2026-01-04T00:55:21.720Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T00:55:21.720Z
Learning: PRs labeled `minor` or `major` MUST update `website/src/data/roadmap.js` with shipped milestones, status, changelog link, PR number, and initiative progress percentage

Applied to files:

  • website/src/data/roadmap.js
  • website/docs/slides/roadmap.mdx
🪛 LanguageTool
website/docs/slides/index.mdx

[typographical] ~19-~19: Consider using a typographic opening quote here.
Context: ... Roadmap 2025-2026", description: "Product roadmap showcasing current initi...

(EN_QUOTES)


[typographical] ~19-~19: Consider using a typographic close quote here.
Context: ...gh unified infrastructure orchestration.", slideCount: 15, slug: "/sl...

(EN_QUOTES)


[typographical] ~21-~21: Consider using a typographic opening quote here.
Context: ...on.", slideCount: 15, slug: "/slides/roadmap", tags: ["roadmap"...

(EN_QUOTES)


[typographical] ~21-~21: Consider using a typographic close quote here.
Context: ...eCount: 15, slug: "/slides/roadmap", tags: ["roadmap", "features", "p...

(EN_QUOTES)


[typographical] ~22-~22: Consider using typographic quotation marks here.
Context: ... slug: "/slides/roadmap", tags: ["roadmap", "features", "planning"], }, { ...

(EN_QUOTES)


[typographical] ~22-~22: Consider using typographic quotation marks here.
Context: ...lides/roadmap", tags: ["roadmap", "features", "planning"], }, { title:...

(EN_QUOTES)


[typographical] ~22-~22: Consider using typographic quotation marks here.
Context: ...p", tags: ["roadmap", "features", "planning"], }, { title: "Scale Terr...

(EN_QUOTES)

website/docs/slides/roadmap.mdx

[style] ~104-~104: Consider using the typographical ellipsis character here instead.
Context: ...then in-progress const sorted = [ ...milestones.filter(m => m.category === 'f...

(ELLIPSIS)


[style] ~105-~105: Consider using the typographical ellipsis character here instead.
Context: ...er(m => m.category === 'featured'), ...milestones.filter(m => m.category !== 'f...

(ELLIPSIS)


[style] ~106-~106: Consider using the typographical ellipsis character here instead.
Context: ...atured' && m.status === 'shipped'), ...milestones.filter(m => m.status === 'in-...

(ELLIPSIS)


[typographical] ~132-~132: To join two clauses or introduce examples, consider using an em dash.
Context: ... setCurrentPage(p => Math.min(totalPages - 1, p + 1)); } }; window.ad...

(DASH_RULE)


[style] ~282-~282: The verb “check out” can sound colloquial in this context. Consider using a more formal alternative.
Context: ...isit atmos.tools for documentation, check out the roadmap to see what's coming, explo...

(CHECK_OUT_OUR)

⏰ Context from checks skipped due to timeout of 900000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: Acceptance Tests (windows)
  • GitHub Check: Acceptance Tests (linux)
  • GitHub Check: Acceptance Tests (macos)
  • GitHub Check: Summary
🔇 Additional comments (8)
website/src/components/SlideDeck/SlideContent.css (2)

1-200: Clean, well-structured CSS with comprehensive theme support.

The styling for inline code, badges, milestone lists, status icons, and progress bars follows consistent patterns. Light/dark theme variants are properly handled throughout.


439-506: Pagination styling is solid.

Pagination dots and container styles are clean. The keyboard hint styling respects theme context. Good use of subtle transitions for hover states.

website/src/components/SlideDeck/SlideDeck.tsx (1)

259-265: Good coordination with inner pagination.

The guards correctly let Shift+Arrow events pass through to PaginatedMilestones. Clean solution for nested keyboard navigation.

website/src/data/roadmap.js (1)

24-28: Theme title update aligns with the new deck.

The title change is consistent with the deck's subtitle and index description.

website/docs/slides/roadmap.mdx (3)

22-30: Simple and effective inline code renderer.

Clean regex-based parsing for backtick code spans.


117-137: Keyboard navigation implementation looks solid.

Visibility check via offsetParent and getBoundingClientRect is reasonable for this use case. Effect correctly depends on totalPages.


160-170: Deck structure is clean and data-driven.

Good use of roadmapConfig for dynamic content. Slides are well-organized with appropriate notes.

website/docs/slides/index.mdx (1)

17-23: slideCount is accurate. The roadmap deck contains exactly 15 slides: 4 static slides (title, vision, theme, highlights), 6 featured initiatives, 4 non-featured initiatives, and 1 closing slide. The value matches the actual deck structure.

- Remove justify-content: space-between to keep meta items left-aligned
- Add presentation icon before slide count
- Use neutral gray colors for tags instead of primary colors
- Add margin-top: auto to push meta to bottom for consistent card heights

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The sorting logic was excluding milestones with status 'planned' (that
weren't featured). Now planned milestones appear after in-progress items.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In @website/docs/slides/roadmap.mdx:
- Around line 62-70: The external GitHub link rendering block (the JSX Link
element that conditionally renders when milestone.pr is present) uses
target="_blank" but lacks a rel attribute; update that Link (the JSX element
with className "slide-link-badge" and
to={`https://github.com/cloudposse/atmos/pull/${milestone.pr}`}) to include
rel="noopener noreferrer" to prevent window.opener vulnerabilities and ensure
secure external linking.
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between e27dfed and cdf6313.

📒 Files selected for processing (2)
  • website/docs/slides/roadmap.mdx
  • website/src/components/SlideDeck/SlideIndex.css
🧰 Additional context used
📓 Path-based instructions (1)
website/**

📄 CodeRabbit inference engine (.cursor/rules/atmos-rules.mdc)

website/**: Update website documentation in the website/ directory when adding new features, ensure consistency between CLI help text and website documentation, and follow the website's documentation structure and style
Keep website code in the website/ directory, follow the existing website architecture and style, and test website changes locally before committing
Keep CLI documentation and website documentation in sync and document new features on the website with examples and use cases

Files:

  • website/docs/slides/roadmap.mdx
  • website/src/components/SlideDeck/SlideIndex.css
🧠 Learnings (4)
📓 Common learnings
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T00:55:21.720Z
Learning: PRs labeled `minor` or `major` MUST update `website/src/data/roadmap.js` with shipped milestones, status, changelog link, PR number, and initiative progress percentage
Learnt from: osterman
Repo: cloudposse/atmos PR: 1686
File: docs/prd/tool-dependencies-integration.md:58-64
Timestamp: 2025-12-13T06:07:37.766Z
Learning: cloudposse/atmos: For PRD docs (docs/prd/*.md), markdownlint issues like MD040/MD010/MD034 can be handled in a separate documentation cleanup commit and should not block the current PR.
📚 Learning: 2026-01-04T00:55:21.720Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T00:55:21.720Z
Learning: PRs labeled `minor` or `major` MUST update `website/src/data/roadmap.js` with shipped milestones, status, changelog link, PR number, and initiative progress percentage

Applied to files:

  • website/docs/slides/roadmap.mdx
📚 Learning: 2025-12-13T06:07:37.766Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1686
File: docs/prd/tool-dependencies-integration.md:58-64
Timestamp: 2025-12-13T06:07:37.766Z
Learning: cloudposse/atmos: For PRD docs (docs/prd/*.md), markdownlint issues like MD040/MD010/MD034 can be handled in a separate documentation cleanup commit and should not block the current PR.

Applied to files:

  • website/docs/slides/roadmap.mdx
📚 Learning: 2026-01-04T00:55:21.720Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T00:55:21.720Z
Learning: Applies to website/blog/*.mdx : PRs labeled `minor` or `major` MUST include a blog post at `website/blog/YYYY-MM-DD-feature-name.mdx` with YAML frontmatter, using only tags defined in `website/blog/tags.yml`

Applied to files:

  • website/docs/slides/roadmap.mdx
🪛 LanguageTool
website/docs/slides/roadmap.mdx

[style] ~104-~104: Consider using the typographical ellipsis character here instead.
Context: ...ss, then planned const sorted = [ ...milestones.filter(m => m.category === 'f...

(ELLIPSIS)


[style] ~105-~105: Consider using the typographical ellipsis character here instead.
Context: ...er(m => m.category === 'featured'), ...milestones.filter(m => m.category !== 'f...

(ELLIPSIS)


[style] ~106-~106: Consider using the typographical ellipsis character here instead.
Context: ...atured' && m.status === 'shipped'), ...milestones.filter(m => m.status === 'in-...

(ELLIPSIS)


[style] ~107-~107: Consider using the typographical ellipsis character here instead.
Context: ...ess' && m.category !== 'featured'), ...milestones.filter(m => m.status === 'pla...

(ELLIPSIS)


[typographical] ~133-~133: To join two clauses or introduce examples, consider using an em dash.
Context: ... setCurrentPage(p => Math.min(totalPages - 1, p + 1)); } }; window.ad...

(DASH_RULE)


[style] ~282-~282: Using many exclamation marks might seem excessive (in this case: 12 exclamation marks for a text that’s 8380 characters long)
Context: ... Thank you for your interest in Atmos! Visit atmos.tools for documentation, ...

(EN_EXCESSIVE_EXCLAMATION)


[style] ~283-~283: The verb “check out” can sound colloquial in this context. Consider using a more formal alternative.
Context: ...isit atmos.tools for documentation, check out the roadmap to see what's coming, explo...

(CHECK_OUT_OUR)

⏰ Context from checks skipped due to timeout of 900000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: Acceptance Tests (windows)
  • GitHub Check: Acceptance Tests (macos)
  • GitHub Check: Acceptance Tests (linux)
  • GitHub Check: Summary
🔇 Additional comments (11)
website/src/components/SlideDeck/SlideIndex.css (3)

71-71: Nice layout pattern for consistent card heights.

Using flex: 1 on card content combined with margin-top: auto on the meta section is a clean approach for keeping cards uniform. Solid work.

Also applies to: 96-98


106-120: Decorative icon via mask-image looks good.

Using mask-image with currentColor allows the icon to inherit text color automatically, which works well for theming. The approach is lightweight and avoids extra assets.


129-141: Neutral tag colors are a good choice.

Switching from primary colors to emphasis tokens gives tags a more subtle, consistent appearance across themes.

website/docs/slides/roadmap.mdx (8)

22-30: Simple inline code parser.

Clean regex-based split for backtick-wrapped text. Works well for the milestone labels.


32-46: Status components are straightforward.

Clear mapping from status to visual representation. Good separation between badge (text label) and icon (symbol).


75-82: Progress bar is clean.

Straightforward implementation. If progress values from roadmapConfig are always valid (0-100), this works well.


84-96: LGTM.

Using milestone.label as key works since labels are unique within each list.


98-138: Pagination logic is well-structured.

Good approach with:

  • Sorting by priority (featured → shipped → in-progress → planned)
  • Deduplication by label
  • Functional setState to avoid stale closures in the keyboard handler
  • Thorough visibility checks before responding to keyboard events

The totalPages dependency is correct since it's recalculated each render.


142-158: Pagination dots have accessible labels.

The aria-label on each dot is good for screen reader support. The empty array fallback is defensive.


161-244: Data-driven slide structure looks solid.

Pulling content from roadmapConfig keeps the deck in sync with the roadmap data. The featured/remaining split ensures no duplication.


269-286: Closing slide wraps things up well.

Clear CTAs with links to docs, roadmap, GitHub, and community. Good resources for stakeholders.

Security best practice for target="_blank" links to prevent
window.opener vulnerabilities.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In @website/docs/slides/roadmap.mdx:
- Around line 275-280: The external anchor tags for GitHub and Community in the
inline div (the <a> elements on the "GitHub: github.com/cloudposse/atmos" and
"Community: cloudposse.com/slack" lines) are missing target and rel attributes;
update those <a> elements to include target="_blank" and rel="noopener
noreferrer" (matching MilestoneLinks behavior) so the external links open in a
new tab safely and consistently.
🧹 Nitpick comments (2)
website/docs/slides/roadmap.mdx (2)

76-83: Consider clamping the progress value.

If progress ever comes in outside 0-100 range, the bar could render unexpectedly. Likely fine since roadmapConfig controls the data, but a simple clamp adds resilience.

Optional defensive clamping
 export const ProgressBar = ({ progress }) => (
+  const clampedProgress = Math.max(0, Math.min(100, progress));
   <div className="slide-progress-bar">
     <div className="slide-progress-bar__track">
-      <div className="slide-progress-bar__fill" style={{width: `${progress}%`}} />
+      <div className="slide-progress-bar__fill" style={{width: `${clampedProgress}%`}} />
     </div>
-    <span className="slide-progress-bar__label">{progress}%</span>
+    <span className="slide-progress-bar__label">{clampedProgress}%</span>
   </div>
 );

85-97: Potential duplicate key if labels aren't unique.

Using milestone.label as the React key works if labels are guaranteed unique. If duplicates exist in roadmapConfig, React will warn. Consider a more robust key if needed.

Optional: Use index as fallback
-    {milestones.map((milestone) => (
-      <li key={milestone.label}>
+    {milestones.map((milestone, index) => (
+      <li key={milestone.id || `${milestone.label}-${index}`}>
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between cdf6313 and 3b5afbf.

📒 Files selected for processing (1)
  • website/docs/slides/roadmap.mdx
🧰 Additional context used
📓 Path-based instructions (1)
website/**

📄 CodeRabbit inference engine (.cursor/rules/atmos-rules.mdc)

website/**: Update website documentation in the website/ directory when adding new features, ensure consistency between CLI help text and website documentation, and follow the website's documentation structure and style
Keep website code in the website/ directory, follow the existing website architecture and style, and test website changes locally before committing
Keep CLI documentation and website documentation in sync and document new features on the website with examples and use cases

Files:

  • website/docs/slides/roadmap.mdx
🧠 Learnings (3)
📓 Common learnings
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T00:55:21.720Z
Learning: PRs labeled `minor` or `major` MUST update `website/src/data/roadmap.js` with shipped milestones, status, changelog link, PR number, and initiative progress percentage
📚 Learning: 2026-01-04T00:55:21.720Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T00:55:21.720Z
Learning: PRs labeled `minor` or `major` MUST update `website/src/data/roadmap.js` with shipped milestones, status, changelog link, PR number, and initiative progress percentage

Applied to files:

  • website/docs/slides/roadmap.mdx
📚 Learning: 2025-12-13T06:07:37.766Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1686
File: docs/prd/tool-dependencies-integration.md:58-64
Timestamp: 2025-12-13T06:07:37.766Z
Learning: cloudposse/atmos: For PRD docs (docs/prd/*.md), markdownlint issues like MD040/MD010/MD034 can be handled in a separate documentation cleanup commit and should not block the current PR.

Applied to files:

  • website/docs/slides/roadmap.mdx
🪛 LanguageTool
website/docs/slides/roadmap.mdx

[style] ~105-~105: Consider using the typographical ellipsis character here instead.
Context: ...ss, then planned const sorted = [ ...milestones.filter(m => m.category === 'f...

(ELLIPSIS)


[style] ~106-~106: Consider using the typographical ellipsis character here instead.
Context: ...er(m => m.category === 'featured'), ...milestones.filter(m => m.category !== 'f...

(ELLIPSIS)


[style] ~107-~107: Consider using the typographical ellipsis character here instead.
Context: ...atured' && m.status === 'shipped'), ...milestones.filter(m => m.status === 'in-...

(ELLIPSIS)


[style] ~108-~108: Consider using the typographical ellipsis character here instead.
Context: ...ess' && m.category !== 'featured'), ...milestones.filter(m => m.status === 'pla...

(ELLIPSIS)


[typographical] ~134-~134: To join two clauses or introduce examples, consider using an em dash.
Context: ... setCurrentPage(p => Math.min(totalPages - 1, p + 1)); } }; window.ad...

(DASH_RULE)


[style] ~283-~283: Using many exclamation marks might seem excessive (in this case: 12 exclamation marks for a text that’s 8416 characters long)
Context: ... Thank you for your interest in Atmos! Visit atmos.tools for documentation, ...

(EN_EXCESSIVE_EXCLAMATION)


[style] ~284-~284: The verb “check out” can sound colloquial in this context. Consider using a more formal alternative.
Context: ...isit atmos.tools for documentation, check out the roadmap to see what's coming, explo...

(CHECK_OUT_OUR)

⏰ Context from checks skipped due to timeout of 900000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: Acceptance Tests (macos)
  • GitHub Check: Acceptance Tests (windows)
  • GitHub Check: Acceptance Tests (linux)
  • GitHub Check: Summary
🔇 Additional comments (9)
website/docs/slides/roadmap.mdx (9)

1-8: Frontmatter looks good.

Clean configuration for a slide deck page. Hiding TOC and title makes sense for this presentation format.


10-20: Imports are appropriate.

All imports are used by the components and slide content below.


22-30: Inline code rendering is solid.

The regex split and mapping approach handles backtick-wrapped code segments well.


32-38: StatusBadge component is clean.

Simple mapping from status to class and label. Works as expected.


40-46: StatusIcon is straightforward.

Unicode characters provide visual cues and remain accessible.


48-74: MilestoneLinks handles external links correctly.

Good use of target="_blank" with rel="noopener noreferrer" on the GitHub PR link.


99-160: PaginatedMilestones is well-structured.

Sorting logic correctly prioritizes featured items, then status. Deduplication handles edge cases. Keyboard navigation guards against responding when not visible. Good accessibility with aria-label on pagination dots.

The static analysis warnings about "ellipsis" are false positives — those are JavaScript spread operators, not typographical ellipses.


222-245: Featured initiatives mapping is solid.

Good use of optional chaining on initiative?.milestones. The .find() returning undefined is handled gracefully.


247-268: Remaining initiatives slides are well-filtered.

Correctly excludes featured initiatives and renders progress bars with pagination.

All external links on the closing slide now include target="_blank"
and rel="noopener noreferrer" for consistency and security.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In @website/docs/slides/roadmap.mdx:
- Around line 247-268: The remaining-initiatives loop can pass undefined
initiative.milestones to PaginatedMilestones causing a runtime error; update the
mapping so you guard or normalize milestones before rendering by checking
initiative.milestones (from roadmapConfig.initiatives) and passing an empty
array (or conditionally rendering PaginatedMilestones) when it’s
falsy/undefined; locate the map that returns <Slide> and adjust the
PaginatedMilestones usage (or add a conditional similar to the featured block’s
milestones.length > 0) to avoid calling it with undefined.
🧹 Nitpick comments (2)
website/docs/slides/roadmap.mdx (2)

118-139: Potential keyboard event collision with multiple instances.

Each PaginatedMilestones instance attaches its own keydown listener to window. The visibility checks help, but during slide transitions or if multiple slides are partially visible, multiple instances could respond to the same keypress.

Consider adding e.stopPropagation() after handling, or tracking which component "owns" focus.

Suggested improvement
       if (e.key === 'ArrowLeft') {
         setCurrentPage(p => Math.max(0, p - 1));
+        e.stopPropagation();
       } else {
         setCurrentPage(p => Math.min(totalPages - 1, p + 1));
+        e.stopPropagation();
       }

103-109: Sorting logic is correct but could be clearer.

The current approach works because dedupe keeps the first occurrence, but the intent isn't immediately obvious. A comment explaining that featured items may also match status filters (and dedupe handles it) would help future maintainers.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 3b5afbf and 78dbe6b.

📒 Files selected for processing (1)
  • website/docs/slides/roadmap.mdx
🧰 Additional context used
📓 Path-based instructions (1)
website/**

📄 CodeRabbit inference engine (.cursor/rules/atmos-rules.mdc)

website/**: Update website documentation in the website/ directory when adding new features, ensure consistency between CLI help text and website documentation, and follow the website's documentation structure and style
Keep website code in the website/ directory, follow the existing website architecture and style, and test website changes locally before committing
Keep CLI documentation and website documentation in sync and document new features on the website with examples and use cases

Files:

  • website/docs/slides/roadmap.mdx
🧠 Learnings (6)
📓 Common learnings
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T00:55:21.720Z
Learning: PRs labeled `minor` or `major` MUST update `website/src/data/roadmap.js` with shipped milestones, status, changelog link, PR number, and initiative progress percentage
📚 Learning: 2026-01-04T00:55:21.720Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T00:55:21.720Z
Learning: PRs labeled `minor` or `major` MUST update `website/src/data/roadmap.js` with shipped milestones, status, changelog link, PR number, and initiative progress percentage

Applied to files:

  • website/docs/slides/roadmap.mdx
📚 Learning: 2025-12-13T06:07:37.766Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1686
File: docs/prd/tool-dependencies-integration.md:58-64
Timestamp: 2025-12-13T06:07:37.766Z
Learning: cloudposse/atmos: For PRD docs (docs/prd/*.md), markdownlint issues like MD040/MD010/MD034 can be handled in a separate documentation cleanup commit and should not block the current PR.

Applied to files:

  • website/docs/slides/roadmap.mdx
📚 Learning: 2025-01-17T00:18:57.769Z
Learnt from: aknysh
Repo: cloudposse/atmos PR: 944
File: go.mod:206-206
Timestamp: 2025-01-17T00:18:57.769Z
Learning: For indirect dependencies with license compliance issues in the cloudposse/atmos repository, the team prefers to handle them in follow-up PRs rather than blocking the current changes, as these issues often require deeper investigation of the dependency tree.

Applied to files:

  • website/docs/slides/roadmap.mdx
📚 Learning: 2024-11-22T12:38:33.132Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 768
File: internal/exec/vendor_utils.go:496-513
Timestamp: 2024-11-22T12:38:33.132Z
Learning: In the Atmos project, continue to flag path traversal issues in code reviews but acknowledge when they are expected and acceptable in specific cases.

Applied to files:

  • website/docs/slides/roadmap.mdx
📚 Learning: 2025-01-25T03:51:57.689Z
Learnt from: Listener430
Repo: cloudposse/atmos PR: 934
File: tests/fixtures/scenarios/docs-generate/README.md.gotmpl:99-118
Timestamp: 2025-01-25T03:51:57.689Z
Learning: For the cloudposse/atmos repository, changes to template contents should be handled in dedicated PRs and are typically considered out of scope for PRs focused on other objectives.

Applied to files:

  • website/docs/slides/roadmap.mdx
🪛 LanguageTool
website/docs/slides/roadmap.mdx

[style] ~105-~105: Consider using the typographical ellipsis character here instead.
Context: ...ss, then planned const sorted = [ ...milestones.filter(m => m.category === 'f...

(ELLIPSIS)


[style] ~106-~106: Consider using the typographical ellipsis character here instead.
Context: ...er(m => m.category === 'featured'), ...milestones.filter(m => m.category !== 'f...

(ELLIPSIS)


[style] ~107-~107: Consider using the typographical ellipsis character here instead.
Context: ...atured' && m.status === 'shipped'), ...milestones.filter(m => m.status === 'in-...

(ELLIPSIS)


[style] ~108-~108: Consider using the typographical ellipsis character here instead.
Context: ...ess' && m.category !== 'featured'), ...milestones.filter(m => m.status === 'pla...

(ELLIPSIS)


[typographical] ~134-~134: To join two clauses or introduce examples, consider using an em dash.
Context: ... setCurrentPage(p => Math.min(totalPages - 1, p + 1)); } }; window.ad...

(DASH_RULE)


[style] ~283-~283: Using many exclamation marks might seem excessive (in this case: 12 exclamation marks for a text that’s 8584 characters long)
Context: ... Thank you for your interest in Atmos! Visit atmos.tools for documentation, ...

(EN_EXCESSIVE_EXCLAMATION)


[style] ~284-~284: The verb “check out” can sound colloquial in this context. Consider using a more formal alternative.
Context: ...isit atmos.tools for documentation, check out the roadmap to see what's coming, explo...

(CHECK_OUT_OUR)

⏰ Context from checks skipped due to timeout of 900000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: Acceptance Tests (linux)
  • GitHub Check: Acceptance Tests (windows)
  • GitHub Check: Summary
🔇 Additional comments (5)
website/docs/slides/roadmap.mdx (5)

22-30: Clean inline code renderer.

Logic is solid. The regex split and map pattern works well for this use case.


32-46: Status components look good.

Clean, consistent pattern for mapping status values to visual representations.


48-74: Good security posture on external links.

The PR link correctly includes target="_blank" and rel="noopener noreferrer". Internal links appropriately use the Docusaurus Link component for client-side navigation.


270-287: Closing slide external links are secure.

All four external links correctly include target="_blank" and rel="noopener noreferrer", consistent with the commit message fix.


85-97: Use a unique identifier for milestone keys instead of labels.

The milestone label "Seamless first login with provider fallback" is duplicated across the auth and dx initiatives in the roadmap data. While the component works today (labels are unique within each initiative), the data itself shows redundancy. Adding an id field to each milestone would prevent accidental collisions if the same initiative ever contains duplicate labels, and it provides a more robust key choice that's independent of content changes.

@aknysh aknysh merged commit 0495d26 into main Jan 13, 2026
57 checks passed
@aknysh aknysh deleted the osterman/roadmap-slides branch January 13, 2026 03:24
@github-actions
Copy link
Copy Markdown

These changes were released in v1.204.0-rc.4.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

no-release Do not create a new release (wait for additional code changes) size/l Large size PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants