Skip to content

Create sections for navigation menu#662

Open
azeey wants to merge 19 commits intogazebosim:masterfrom
azeey:common_files_menu
Open

Create sections for navigation menu#662
azeey wants to merge 19 commits intogazebosim:masterfrom
azeey:common_files_menu

Conversation

@azeey
Copy link
Copy Markdown
Contributor

@azeey azeey commented Dec 20, 2025

🎉 New feature

Summary

Currently, the navigation menu on gazebosim.org/docs is a flat list and can be difficult to navigate. There also no clear organization between items that are tutorials vs how-to guildes vs reference, etc. This PR organizes the documents based on the diataxis framework.

To make all of this possible, the build script had to be modifed.

  1. Navigation menu is now only defined in the index.yaml files in the versioned directories (e.g. jetty/index.yaml). The top level index.yaml no longer contains pages. This allows for more control over the order of items and organizing them into different sections.
  2. Since the pages are now in the versioned directories, files that are common to all gazebo versions have been moved to the common directory. This is to make it explicit in the index.yaml files where these files are coming from. Otherwise, there it would be confusing since the common files are no longer peers of the index.yaml files that reference them. When referencing these files in index.yaml, the prefix common: has to be used now.
  3. The build script adds functionality to add sections.
  4. Pages without a file, but with children will be considered organizational elements and the appropriate file for sphinx is automatically generated.

TODO

  • Sections are only defined for jetty (so, only build_multiversion.py -r jetty works right now)
  • Define User and Developer personas
  • Update README

Preview

image

Checklist

  • Signed all commits for DCO
  • Updated documentation (as needed)
  • While waiting for a review on your PR, please help review another open pull request to support the maintainers
  • Was GenAI used to generate this PR? If so, make sure to add "Generated-by" to your commits. (See this policy for more info.)

Generated-by: Gemini 2.5

Note to maintainers: Remember to use Squash-Merge and edit the commit message to match the pull request summary while retaining Signed-off-by and Generated-by messages.

Addisu Z. Taddese added 6 commits December 19, 2025 21:47
This also moves the `pages` entries from the root `index.yaml`
to the `index.yaml` of the versioned directories. This allows more
control over the navigation menu (order of elements)

Generated-By: Gemini 2.5
Signed-off-by: Addisu Z. Taddese <addisu@openrobotics.org>
Signed-off-by: Addisu Z. Taddese <addisu@openrobotics.org>
Signed-off-by: Addisu Z. Taddese <addisu@openrobotics.org>
Signed-off-by: Addisu Z. Taddese <addisu@openrobotics.org>
Signed-off-by: Addisu Z. Taddese <addisu@openrobotics.org>
Signed-off-by: Addisu Z. Taddese <addisu@openrobotics.org>
@github-actions github-actions Bot added 🌱 garden Gazebo Garden 🎵 harmonic Gazebo Harmonic 🏛️ ionic 🏢 edifice Ignition Edifice 🏯 fortress Ignition Fortress 🏰 citadel Ignition Citadel 📜 blueprint Ignition Blueprint 🔮 dome Ignition Dome 🪵 jetty labels Dec 20, 2025
@scpeters
Copy link
Copy Markdown
Member

conflicts

azeey added 4 commits April 2, 2026 15:45
Signed-off-by: Addisu Z. Taddese <addisuzt@intrinsic.ai>
…to README

Generated-By: Gemini 3.0
Signed-off-by: Addisu Z. Taddese <addisuzt@intrinsic.ai>
Generated-By: Gemini 3.0
Signed-off-by: Addisu Z. Taddese <addisuzt@intrinsic.ai>
Generated-by: Gemini 3.0
Signed-off-by: Addisu Z. Taddese <addisuzt@intrinsic.ai>
@azeey
Copy link
Copy Markdown
Contributor Author

azeey commented Apr 3, 2026

This is ready for review

Copy link
Copy Markdown
Contributor

@caguero caguero left a comment

Choose a reason for hiding this comment

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

All looking good. I made a few inline comments.

My other suggestion is whether is worth to consolidate the "For Developers", "Reference" and "Migration Guides" sections in common or any other place that avoids repeating them over all yamls.

Comment thread dome/library_howtos.md
@@ -1,3 +1,5 @@
# Gazebo Library How-To Guides
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

There seems to be now two top-level H1s in one document: Gazebo Library How-To Guides and Ignition Tutorials. I think this is inconsistent with the other distributions, where there's only one top-level section (except edifice, which has the same issue).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Made all the library_howto files uinform and used a MyST substitution instead of hardcoding the version numbers in 27343d8

Comment thread edifice/library_howtos.md
@@ -1,3 +1,5 @@
# Gazebo Library How-To Guides
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

There seems to be now two top-level H1s in one document: Gazebo Library How-To Guides and Ignition Tutorials. I think this is inconsistent with the other distributions, where there's only one top-level section (except dome, which has the same issue).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Comment thread build_multiversion.py Outdated
Comment thread acropolis/index.yaml
Comment thread conf.py Outdated
Comment thread build_multiversion.py
Comment thread acropolis/index.yaml Outdated
title: Release process
file: common:release.md
description: Release process overview.
- name: releases-instructions
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Replace it with release_instructions? The generated URL looks more consistent with the other and clear in singular.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

This would break the current URL though https://gazebosim.org/docs/jetty/releases-instructions/

Comment thread build_multiversion.py
Comment thread citadel/index.yaml
- name: tutorials
title: Simulation Tutorials
children:
- name: spawn_urdf
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The order of this tutorial isn't consistent. Sometimes appear at the top and sometimes at the bottom. Should we move it to the bottom for consistency? Check other distributions too.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

The goal was to match the existing website. If you look at citadel/index.yaml in the main branch:

docs/citadel/index.yaml

Lines 54 to 92 in b696405

children:
- name: ros_integration
title: ROS Integration
file: ros_integration.md
description: This tutorial details how to interface with ROS, enabling the ability to use tools such as Rviz for robot or sensor visualization.
- name: ros2_integration
title: ROS 2 Integration
file: ros2_integration.md
- name: spawn_urdf
title: Spawn URDF
file: spawn_urdf.md
- name: gui
title: Understanding the GUI
file: GUI_tutorial.md
- name: manipulating_models
title: Manipulating Models
file: Manipulating_models.md
- name: fuel_insert
title: Model Insertion from Fuel
file: Model_insertion_fuel.md
- name: hotkeys
title: Keyboard Shortcuts
file: hotkeys.md
description: Ignition keyboard shortcuts
- name: building_robot
title: Building your own robot
file: building_robot.md
- name: moving_robot
title: Moving the robot
file: moving_robot.md
- name: sdf_worlds
title: SDF worlds
file: sdf_worlds.md
- name: sensors
title: Sensors
file: sensors.md
- name: actors
title: Actors
file: actors.md

spawn_urdf comes right after ros_integration and ros2_integration, which are now in the how-to. I opted to keep the order of the existing index.yaml wherever possible to keep changes to a minimum and to make it easier to review.

Comment thread common/get_started.md Outdated
azeey added 6 commits April 27, 2026 17:22
Signed-off-by: Addisu Z. Taddese <addisuzt@intrinsic.ai>
Use MyST substitutions populated from top-level index.yaml to ensure uniformity and correctness across releases.

Generated-By: Gemini 3.0 Pro
Signed-off-by: Addisu Z. Taddese <addisuzt@intrinsic.ai>
Signed-off-by: Addisu Z. Taddese <addisuzt@intrinsic.ai>
Added a comment pointing to README.md for more information about the documentation structure and build process.

Generated-By: Gemini 3.0 Pro
Signed-off-by: Addisu Z. Taddese <addisuzt@intrinsic.ai>
Signed-off-by: Addisu Z. Taddese <addisuzt@intrinsic.ai>
Extracted common navigation sections to shared files in common/ and supported !include in build script and conf.py. Made all versions uniform by creating library_howtos.md for older releases.

Generated-By: Gemini 3.0 Pro
Signed-off-by: Addisu Z. Taddese <addisuzt@intrinsic.ai>
@azeey
Copy link
Copy Markdown
Contributor Author

azeey commented Apr 28, 2026

All looking good. I made a few inline comments.

My other suggestion is whether is worth to consolidate the "For Developers", "Reference" and "Migration Guides" sections in common or any other place that avoids repeating them over all yamls.

Thanks for the suggestion. 2fe7ce3 extracts common navigation sections to shared files in common/ and uses !include directives in the index.yaml files. This still allows adding more items to a given section as is necessary in some cases (e.g. Fortress and earlier don't have a page for migrating from Ignition).

@azeey azeey requested a review from caguero April 30, 2026 20:18
Copy link
Copy Markdown
Contributor

@caguero caguero left a comment

Choose a reason for hiding this comment

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

Just a few minor comments.

Comment thread common/get_started.md
* **Users**: For those who primarily run Gazebo using standard tools (like `gz
sim`), edit SDFormat files, use existing plugins, and interact with running
simulations from the outside — typically by publishing and subscribing to
topics over Gazebo Transport or ROS."
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Nit: Remove the traling quote (")?

Comment thread build_multiversion.py
with open(version_tmp_dir / "index.yaml") as f:
version_nav_yaml = yaml.safe_load(f)
version_nav_yaml['pages'] = flatten_navigation(version_nav_yaml['pages'])
if not version_nav_yaml or not version_nav_yaml.get("pages"):
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Should this entire check appear before the previous line where we index with pages?

Comment thread conf.py
with open(map_path) as f:
source_manifest = json.load(f)

def yaml_include(loader, node):
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This function seems duplicated as it already appeared in build_multiversion.py:29-37. Consider to refactor it.

Comment thread conf.py

yaml.SafeLoader.add_constructor('!include', yaml_include)

def flatten_navigation(nav_items):
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This function seems duplicated as it already appeared in build_multiversion.py:40-54. Consider to refactor it.

Comment thread build_multiversion.py

# TODO(azeey) Document
if "file" in page:
file_path = page["file"].replace("common:", "")
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Consider using .removeprefix instead of replace. I think we only want to replace a potential prefix.

Comment thread conf.py
for page in nav_yaml_pages:
file_name_map[page["name"]] = f"{prefix}{page['file']}"
if "file" in page:
file_name_map[page["name"]] = page['file'].replace("common:", "")
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Consider using .removeprefix instead of replace. I think we only want to replace a potential prefix.

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

Labels

📜 blueprint Ignition Blueprint 🏰 citadel Ignition Citadel 🔮 dome Ignition Dome 🏢 edifice Ignition Edifice 🏯 fortress Ignition Fortress 🌱 garden Gazebo Garden 🎵 harmonic Gazebo Harmonic 🏛️ ionic 🪵 jetty

Projects

Status: Inbox

Development

Successfully merging this pull request may close these issues.

3 participants