Portal centralizado de documentación técnica del equipo OPRobots, construido con MkDocs + Material for MkDocs y publicado en GitHub Pages.
flowchart TB
subgraph central["oprobots/docs — repositorio central"]
direction TB
mkdocs["mkdocs.yml<br/>config central"]
docsdir["docs/<br/>páginas del portal"]
index["index.md<br/>landing page"]
robots["robots/ZoroBot3/<br/>git submodule"]
robodocs["docs/<br/>documentación del robot"]
robocfg["mkdocs.yml<br/>nav del robot"]
mkdocs --> docsdir
docsdir --> index
docsdir --> robots
robots --> robodocs
robots --> robocfg
end
subgraph zorobot["oprobots/ZoroBot3"]
zdocs["docs/"]
zconfig["mkdocs.yml"]
zserve["mkdocs serve (local)"]
zdocs --> zserve
zconfig --> zserve
end
subgraph futuro["oprobots/<futuro robot>"]
fdocs["docs/"]
fconfig["mkdocs.yml"]
fserve["mkdocs serve (local)"]
fdocs --> fserve
fconfig --> fserve
end
central -->|"mkdocs build"| pages["GitHub Pages<br/>docs.oprobots.org"]
robots <-.->|"git submodule"| zorobot
robots <-.->|"git submodule (futuro)"| futuro
Principio clave: cada robot mantiene su documentación junto a su código. El repositorio central las agrega con git submodules y el plugin mkdocs-monorepo-plugin. Los robots no necesitan GitHub Actions propias.
oprobots/docs/
├── mkdocs.yml # Configuración central de MkDocs
├── requirements.txt # Dependencias Python
├── .gitmodules # Definición de submodules
├── .github/workflows/deploy.yml # CI/CD → GitHub Pages
├── docs/ # Directorio de documentación (docs_dir)
│ ├── index.md # Landing page del portal
│ ├── assets/ # Assets centralizados (tema compartido)
│ │ ├── css/
│ │ │ ├── custom.css # Estilos OPRobots (colores, tipografía)
│ │ │ └── mermaid-zoom.css # Lightbox para diagramas Mermaid
│ │ ├── js/
│ │ │ └── mermaid-zoom.js # Zoom/pan interactivo en diagramas
│ │ ├── templates/
│ │ │ └── main.html # Template HTML (banner, footer, favicons)
│ │ ├── opr_logo.png # Logo del equipo
│ │ └── imgs/favicon/ # Favicons multidispositivo
│ ├── robots/
│ │ └── ZoroBot3/ # ← git submodule (repo completo)
│ │ ├── docs/ # Documentación técnica (15 capítulos)
│ │ ├── README.md # Ficha técnica del robot
│ │ └── mkdocs.yml # Nav del robot (solo usado en local)
└── site/ # Output del build (gitignored)
- Python 3.x
- Git (con soporte para submodules)
# Clonar con submodules
git clone --recurse-submodules git@github.com:OPRobots/docs.git
cd docs
# Instalar dependencias
pip install -r requirements.txt
# Servir el portal completo (incluye docs de ZoroBot3)
mkdocs serveAbre http://127.0.0.1:8000 en el navegador.
# Traer la última versión de la documentación de todos los robots
git submodule update --remote --recursive
# Reconstruir
mkdocs buildCada robot tiene su propio mkdocs.yml y puede servirse de forma independiente:
cd docs/robots/ZoroBot3
mkdocs serve # Solo la documentación de ZoroBot3Esto permite a los desarrolladores de cada robot probar sus cambios localmente sin necesidad del portal completo.
# Desde la raíz del repositorio docs
git submodule add -b main https://github.com/OPRobots/NuevoRobot.git docs/robots/NuevoRobotEl robot debe tener una carpeta docs/ con su documentación y un mkdocs.yml propio.
Editar mkdocs.yml y añadir al nav:
nav:
- Inicio: index.md
- Robots:
- ZoroBot3: '!include docs/robots/ZoroBot3/mkdocs.yml'
- NuevoRobot: '!include docs/robots/NuevoRobot/mkdocs.yml' # ← añadirLa ruta es relativa al
mkdocs.ymlcentral (la raíz del repositorio).
El!includeva como valor directo (no como elemento de lista) para evitar un nivel extra en la navegación.
Editar docs/robots/index.md y añadir una entrada para el nuevo robot:
- **[NuevoRobot](NuevoRobot/)** — Descripción breve del robot y sus características.git submodule update --remote --recursive
mkdocs buildgit add .gitmodules docs/robots/NuevoRobot mkdocs.yml docs/robots/index.md
git commit -m "Añade submodule NuevoRobot"
git pushEl deploy se ejecutará automáticamente en el siguiente push a main.
El deploy se realiza mediante GitHub Actions (.github/workflows/deploy.yml).
| Evento | Descripción |
|---|---|
Push a main |
Cada cambio en el portal se publica automáticamente |
Pull Request a main |
Se ejecuta el build (sin deploy) para validar |
Cron diario (0 0 * * *) |
Reconstruye cada día para reflejar cambios en los robots upstream |
workflow_dispatch |
Ejecución manual desde la pestaña Actions de GitHub |
- Checkout del repositorio con submodules recursivos
- Update submodules (
git submodule update --remote --recursive) para traer la última versión de las docs de cada robot - Setup Python 3.x
- Instalar dependencias (
pip install -r requirements.txt) - Build (
mkdocs build) — generasite/ - Upload artifact (
actions/upload-pages-artifact@v3) — subesite/como artefacto de Pages - Deploy (
actions/deploy-pages@v4) — publica en GitHub Pages (solo enmain)
En el repositorio OPRobots/docs, ir a:
Settings → Pages → Source: GitHub Actions
El dominio docs.oprobots.org se configura en el mismo apartado (Custom domain).
Para que docs.oprobots.org funcione, añadir en el proveedor de DNS:
docs CNAME oprobots.github.io
GitHub Pages se encarga de servir el contenido en ese dominio una vez configurado el custom domain en Settings → Pages.
| Paquete | Versión mínima | Uso |
|---|---|---|
mkdocs |
≥1.6 | Framework de documentación |
mkdocs-material |
≥9.5 | Tema visual (Material Design) |
mkdocs-monorepo-plugin |
≥1.1 | Fusión de navegación desde múltiples proyectos MkDocs |
Instalación: pip install -r requirements.txt
El mkdocs-monorepo-plugin usa la sintaxis !include para incluir proyectos MkDocs externos:
# En el nav del mkdocs.yml central:
- ZoroBot3: '!include docs/robots/ZoroBot3/mkdocs.yml'La ruta es relativa al mkdocs.yml central (la raíz del repositorio).
El plugin:
- Lee el
mkdocs.ymldel robot hijo y extrae sunav - Fusiona solo el
naven la navegación central, sin modificar el robot original - No fusiona:
theme,extra_css,extra_javascript,markdown_extensions,custom_dir, nipluginsdel hijo
Por eso todos los assets visuales (CSS, JS, favicons, template) están centralizados en docs/assets/ y configurados en el mkdocs.yml raíz.
Los assets se migraron desde ZoroBot3 al portal central:
custom.css— paleta de colores OPRobots (modo claro/oscuro), tipografía Roboto Slabmermaid-zoom.css+mermaid-zoom.js— lightbox interactivo para diagramas (zoom, pan, overlay)main.html— template Jinja2 con banner "Volver a OPRobots.org", footer personalizado, favicons, y el parcheattachShadownecesario para el zoom de Mermaid
validation:
links:
not_found: ignoreLa validación de enlaces rotos está en ignore porque el monorepo plugin puede generar falsos positivos al resolver rutas entre documentos de distintos proyectos. Los enlaces realmente rotos se detectan navegando el sitio.
Actualmente se usan git submodules por simplicidad. En el futuro, cuando haya más robots, se puede migrar a un enfoque de clone-in-CI donde el workflow clona solo las carpetas docs/ de cada repositorio, evitando descargar código fuente, PCBs y modelos 3D innecesarios para la documentación.
| Proyecto | Repositorio | Documentación |
|---|---|---|
| CRSF-demo | OPRobots/CRSF-demo | 5 capítulos: hardware, software, comunicaciones, debug, problemas conocidos |
| H3LIS331-demo | OPRobots/H3LIS-demo | 5 capítulos: hardware, software, sensores, cinemática, problemas conocidos |
| SRAM-demo | OPRobots/SRAM-demo | 4 capítulos: hardware, software, protocolos/API, problemas conocidos |
| Proyecto | Repositorio | Documentación |
|---|---|---|
| IRStart | OPRobots/IRStart | 7 capítulos: hardware, software, protocolos IR, menú, debug, EEPROM, problemas conocidos |
| IRTimer | OPRobots/IRTimer | 8 capítulos: hardware, arquitectura software, comunicaciones, sensores, menú, debug, batería y LEDs, problemas conocidos |
| Robot | Repositorio | Documentación |
|---|---|---|
| FujitoraBot2 | OPRobots/FujitoraBot2 | 13 capítulos: hardware, software, sensores, movimiento, PID, menú, debug, calibración, EEPROM, encoders, batería, cinemática, problemas conocidos |
| ZoroBot3 | OPRobots/ZoroBot3 | 15 capítulos: hardware, software, sensores, movimiento, floodfill, PID, menú, debug, calibración, EEPROM, encoders, batería, simulador, cinemática, problemas conocidos |
Visita la web del equipo: oprobots.org