Herramientas claras para consultar tu información académica y preparar un horario sin empalmes dentro del SAES del IPN.
Important
MI SAES 2.0 es un proyecto independiente. No está afiliado, respaldado ni publicado oficialmente por el Instituto Politécnico Nacional.
Para estudiantes · Para desarrollo · Privacidad · Contribuir · Instalación
MI SAES 2.0 nace de una situación muy común. El SAES contiene la información que necesitas, pero comparar grupos, horarios y lugares puede tomar demasiado tiempo. La extensión organiza esos datos para que puedas decidir con calma y seguir teniendo el control.
MI SAES 2.0 es una extensión para Chrome que añade una capa de herramientas sobre las páginas existentes del Sistema de Administración Escolar (SAES). Usa tu sesión activa, interpreta únicamente la información que el sistema ya muestra y mantiene sus datos en chrome.storage.local.
No sustituye al SAES, no modifica sus registros y no delega decisiones académicas sensibles.
| Herramienta | ¿Qué permite hacer? |
|---|---|
| 🗓️ Arma tu Horario | Comparar grupos, mezclar periodos y turnos, detectar empalmes y generar hasta 30 horarios compatibles. |
| 📚 Mi trayectoria | Reunir y presentar de manera clara el avance académico que reportan las páginas oficiales del SAES. |
| 🧩 Mapa curricular | Explorar todos los periodos disponibles, cruzar el plan con Kárdex y horario actual, y filtrar materias por estado. |
| 🔗 Mi Horario | Abrir el horario oficial en Mi Horario mediante una transferencia local incluida en la URL. |
| 🪑 Ocupabilidad | Consultar cupo, inscritos y lugares disponibles. Si un grupo está lleno, sugiere alternativas compatibles. |
| 📅 Exportación | Crear un calendario .ics con fecha de inicio y duración configurables. |
| 🧭 Horario preparado | Conservar una selección como guía durante la reinscripción, sin marcar ni enviar materias automáticamente. |
La herramienta recorre bajo demanda los turnos, planes y periodos disponibles para la carrera seleccionada. Después une las filas complementarias de cada materia, incluso cuando un grupo tiene varios profesores, y rechaza combinaciones con traslapes reales por día e intervalo.
Selección
├─ 6CM21 · Modulación Digital · 07:00–08:30
├─ 6CV13 · Sistemas Operativos · 09:00–10:30
└─ 7CV11 · Teoría de la Información · 18:30–20:00
Resultado
✓ 3 materias seleccionadas
✓ Turnos matutino y vespertino combinados
✓ 0 empalmes
✓ Listo para revisar o exportar como calendario
Los estados nunca dependen únicamente del color
- 🟢 Compatible se puede agregar sin interferir con la selección actual
- 🔴 Conflicto muestra materia, día e intervalo exacto del empalme
- 🟡 Sin lugares bloquea la generación y presenta alternativas cuando existen
En el inicio autenticado, MI SAES 2.0 puede presentar una lectura compacta del avance académico. La opción Mostrar Mi trayectoria permite activar u ocultar esta superficie sin eliminar los datos oficiales ni modificar el SAES.
La actualización puede conservar resultados parciales cuando alguna página no responde y siempre identifica qué fuente necesita reintentarse.
La vista Mapa curricular organiza todos los periodos que SAES publica para el plan seleccionado —incluido un noveno periodo cuando la carrera lo contempla— y los cruza con el Kárdex y el horario actual. Presenta el avance por créditos cuando el SAES lo reporta, agrupa correctamente los requisitos optativos y permite filtrar materias aprobadas, cursando, no aprobadas o pendientes.
Si alguna consulta falla, conserva la última lectura disponible y señala qué periodos necesitan actualizarse. La información permanece en el almacenamiento local de Chrome.
En el horario oficial del alumno aparece Abrir en Mi Horario cuando MI SAES reconoce una tabla utilizable. La extensión convierte grupos, materias, docentes y bloques semanales en un formato versionado y lo coloca en el fragmento de la URL de Mi Horario; ese fragmento no se envía como parte de la solicitud web.
flowchart LR
A[Sesión activa en SAES] --> B[MI SAES 2.0 lee la página visible]
B --> C{Herramienta elegida}
C --> D[Arma tu Horario]
C --> E[Mi trayectoria]
C --> F[Ocupabilidad]
C --> I[Mapa curricular]
C --> J[Mi Horario]
D --> G[Preferencias y selección local]
E --> G
F --> G
I --> G
J --> G
G --> H[Resultado dentro del navegador]
classDef wine fill:#750946,color:#ffffff,stroke:#570635,stroke-width:2px
classDef soft fill:#f7eaf1,color:#3a1028,stroke:#b85d8d
classDef safe fill:#e6f5ef,color:#174f3e,stroke:#147d64
class A,C wine
class B,D,E,F soft
class G,H safe
MI SAES 2.0 está construido con JavaScript, HTML y CSS nativos. No hay framework, bundler ni código remoto. Esto mantiene pequeño el paquete y hace que cada permiso y cada flujo puedan auditarse directamente desde el repositorio.
| Capa | Responsabilidad | Archivos principales |
|---|---|---|
| Ciclo de vida | Conserva ajustes durante instalaciones y actualizaciones. Registra el aviso de novedades de cada versión. | src/background.js |
| Núcleo funcional | Normaliza texto, interpreta horarios, detecta traslapes, genera combinaciones y exporta calendarios. | src/shared/core.js |
| Adaptadores SAES | Reconstruyen formularios ASP.NET Web Forms y hacen consultas secuenciales al mismo plantel. | scanner.js occupancy.js trajectory.js |
| Presentación | Inyecta una aplicación aislada mediante Shadow DOM sin rediseñar la página original. | src/content/content.js y archivos CSS |
| Superficies Chrome | Presentan el acceso rápido y los ajustes locales. | popup/ y options/ |
| Contratos automatizados | Cubren parsers, generación de horarios, estados parciales, privacidad y estructura del manifiesto. | tests/ y scripts/check.cjs |
flowchart TB
SW[Service worker MV3] --> ST[(chrome.storage.local)]
CS[Content scripts] --> CORE[Núcleo funcional puro]
CS --> SAES[Páginas del mismo plantel]
CORE --> UI[Shadow DOM de MI SAES 2.0]
ST --> CS
TEST[Node test runner] --> CORE
classDef wine fill:#750946,color:#ffffff,stroke:#570635,stroke-width:2px
classDef code fill:#eef2ff,color:#24275a,stroke:#7378c5
classDef data fill:#e6f5ef,color:#174f3e,stroke:#147d64
class SW,CS wine
class CORE,UI,TEST code
class ST,SAES data
El núcleo recibe alternativas ya normalizadas. Agrupa por materia y recorre una alternativa por grupo académico. Cada rama se descarta tan pronto aparece un traslape. El límite predeterminado es de 30 resultados y el límite defensivo interno es de 100.
const schedules = core.generateScheduleCombinations(offerings, 30)
for (const schedule of schedules) {
const conflicts = core.findScheduleConflicts(schedule.entries)
console.assert(conflicts.length === 0)
}El portal puede devolver una pantalla de acceso o un mensaje de error con estado HTTP 200. Por eso los adaptadores no confían únicamente en response.ok. También validan la estructura académica esperada antes de guardar resultados.
Las exploraciones de horarios usan pausas breves, un máximo de solicitudes y una señal AbortController. Así pueden detenerse sin dejar una operación larga ejecutándose en segundo plano.
Las claves se separan por origen y, cuando corresponde, por ruta. Esto evita mezclar catálogos de planteles o pantallas distintas.
const plannerKey = `planner:${location.origin}:${location.pathname}`
const catalogKey = `catalog:${location.origin}:schedule`
const trajectoryKey = `trajectory:${location.origin}`Note
Los ejemplos técnicos muestran contratos reales del proyecto. Para cambiar un parser conviene agregar primero una página mínima en tests/fixtures/ y convertir el caso observado en una prueba reproducible.
{
"permissions": ["storage"],
"host_permissions": ["*://*.ipn.mx/*"]
}storageconserva preferencias, catálogos y horarios únicamente en Chrome.- El acceso a
*.ipn.mxpermite funcionar en los distintos planteles y realizar consultas secuenciales de sólo lectura dentro de la sesión activa. - No existen servidores de MI SAES ni dependencias remotas para ejecutar la extensión.
No necesitas saber programar ni instalar Node.js.
- Abre la ficha oficial de MI SAES 2.0 en Chrome Web Store.
- Pulsa Agregar a Chrome.
- Confirma con Agregar extensión.
- Abre o recarga el SAES de tu plantel. Ya podrás usar MI SAES 2.0.
Chrome instalará automáticamente las actualizaciones publicadas.
Tip
Puedes fijar MI SAES 2.0 desde el botón de extensiones 🧩 de Chrome para tener su acceso rápido siempre visible.
Usa este método sólo si necesitas probar una versión descargada desde GitHub.
- Entra a la página de versiones publicadas.
- En Assets, descarga Source code (zip) de la versión más reciente.
- Descomprime el archivo en una carpeta que no vayas a borrar ni mover.
- Escribe
chrome://extensionsen la barra de direcciones y presiona Enter. - Activa Modo de desarrollador en la esquina superior derecha.
- Pulsa Cargar descomprimida.
- Selecciona la carpeta que acabas de descomprimir. Es la carpeta que contiene el archivo
manifest.json. - Abre o recarga el SAES de tu plantel. Ya podrás usar MI SAES 2.0.
Descarga y descomprime la nueva versión, reemplaza los archivos de la carpeta anterior y después pulsa Actualizar en chrome://extensions. Tus preferencias permanecen guardadas en el navegador.
Note
Si Chrome muestra No se pudo cargar el manifiesto, seleccionaste la carpeta equivocada. Vuelve a Cargar descomprimida y elige exactamente la que contiene manifest.json.
git clone https://github.com/LeonardSF/MI-SAES-2.0.git
cd MI-SAES-2.0- Abre
chrome://extensions. - Activa Modo de desarrollador.
- Pulsa Cargar descomprimida.
- Selecciona la carpeta
MI-SAES-2.0. - Abre el SAES de tu plantel y busca el acceso de MI SAES 2.0.
Chrome no instala directamente un archivo ZIP en modo de desarrollador. Para probar un paquete debes descomprimirlo y cargar la carpeta resultante.
El proyecto utiliza JavaScript, HTML y CSS nativos. No necesita instalar dependencias npm ni ejecutar un proceso de compilación.
# Ejecuta todas las pruebas automatizadas
npm test
# Verifica manifiesto, permisos, CSP y sintaxis
npm run check
# Genera el ZIP para Chrome Web Store dentro de dist/
npm run packageMI-SAES-2.0/
├── assets/ # Iconos y tipografías locales
├── options/ # Configuración y privacidad
├── popup/ # Acceso rápido de la extensión
├── scripts/ # Verificación y empaquetado
├── src/
│ ├── content/ # Panel, horario, ocupabilidad y trayectoria
│ ├── shared/ # Lógica reutilizable y notas de versión
│ └── background.js # Ciclo de vida y actualizaciones
├── tests/ # Pruebas y páginas de ejemplo
├── manifest.json
└── tokens.css # Colores, tipografía y espaciado
| MI SAES 2.0 sí hace | MI SAES 2.0 nunca hace |
|---|---|
| Procesa tablas y formularios visibles dentro del navegador. | Solicitar, leer o guardar tu contraseña o CAPTCHA. |
| Guarda preferencias y selecciones localmente. | Enviar información escolar a servidores propios. |
| Consulta secuencialmente páginas oficiales del mismo plantel. | Inscribir materias o enviar evaluaciones automáticamente. |
| Señala datos incompletos y sesiones terminadas. | Inventar calificaciones, cupos o estados académicos. |
Consulta la Política de privacidad para conocer el detalle del procesamiento local y los permisos declarados.
- La página pública de ESIME Culhuacán fue utilizada como referencia durante el desarrollo.
- Las pantallas autenticadas pueden variar entre planteles. Los lectores evitan depender de un único diseño, pero necesitan validación con sesiones reales.
- Un horario generado es una propuesta de planeación, no una inscripción confirmada.
- La ocupabilidad puede cambiar. Confirma siempre los lugares y grupos directamente en el SAES.
| Acción | Atajo |
|---|---|
| Abrir o cerrar MI SAES 2.0 | Alt + M |
Chrome instala las versiones publicadas automáticamente después de la revisión de Chrome Web Store. MI SAES 2.0 muestra una sola vez las novedades incluidas en cada actualización y enlaza al historial completo del repositorio.
Las contribuciones son bienvenidas cuando respetan la privacidad estudiantil y mantienen al usuario al mando de cualquier acción académica.
- Lee la guía para contribuir
- Reporta vulnerabilidades mediante el proceso descrito en Seguridad
- Consulta la licencia MIT
El guinda #750946 funciona como color principal y referencia visual de compatibilidad con el entorno académico del IPN. El icono y la marca MI SAES 2.0 son propios del proyecto y no reproducen el escudo ni el logotipo institucional.