Important
LibrecourseUY es un proyecto de software open source, independiente y comunitario. Las herramientas, funcionalidades y recursos disponibles en esta plataforma incluyendo "MoodleTweaks" fueron creados y mantenidos por miembros, contribuidores y colaboradores de LibrecourseUY.
La herramienta "MoodleTweaks" no está afiliada, asociada, patrocinada, avalada, autorizada ni respaldada por ninguna institución educativa u organización, incluyendo sin limitarse a la Universidad de la República (UdelaR) y la Facultad de Ingeniería (FING), ni por cátedras, docentes, unidades académicas o dependencias administrativas.
Cualquier referencia a nombres, siglas, materias, planes de estudio, marcas o instituciones se utiliza únicamente con fines descriptivos e informativos, y no implica relación institucional, aprobación ni carácter oficial.
El software y el contenido asociado se proporcionan "tal cual" (AS IS), sin garantías de ningún tipo. El uso del proyecto es bajo su propia responsabilidad.
Al continuar, usted reconoce y acepta estos términos, y que cualquier interpretación de oficialidad es incorrecta.
Extensión de navegador (Manifest V3 para Chrome y Firefox) que mejora la navegación y unifica el estilo visual de EVA, el entorno virtual de ingeniería (Moodle 4.x).
Aplica una estética consistente, agrega modo oscuro (manual, automático y con variantes AMOLED/dim), escala tipográfica y densidad ajustables, y pule componentes clave como la barra de navegación, los foros, el calendario y el panel principal. Incluye además una barra de próximas entregas, un contador en el ícono, una caja de CSS personalizado y estilos de impresión.
Cada módulo se activa o desactiva desde el popup. Los módulos basados en CSS
se controlan con una clase en <html>; los demás se implementan en el content
script o en el service worker.
| Módulo | Clave | Clase / implementación | Descripción |
|---|---|---|---|
| Tema consistente | theme |
html.moodle-tweaks-theme |
Paleta, tipografía y componentes uniformes (base). |
| Modo oscuro | dark |
html.moodle-tweaks-dark |
Superficies y texto oscuros. |
| Oscuro automático | darkAuto |
prefers-color-scheme |
Sigue la preferencia del sistema. |
| Variante de oscuro | darkVariant |
html.moodle-tweaks-dark-dim · html.moodle-tweaks-dark-amoled |
Estándar, tenue (dim) o negro puro (AMOLED). |
| Escala de fuente | fontScale |
--moodle-tweaks-font-scale |
Escala todo el texto entre 85 % y 130 %. |
| Densidad | density |
html.moodle-tweaks-compact |
Vista cómoda o compacta. |
| Navegación mejorada | navigation |
html.moodle-tweaks-navigation |
Barra, migas, submenús e índice del curso. |
| Resaltar elementos | highlight |
html.moodle-tweaks-highlight |
Activos, no leídos y tus publicaciones. |
| Botón "volver arriba" | backToTop |
JS (moodle-tweaks.js) |
Botón flotante que aparece al hacer scroll. |
| Contenido de cursos | activities |
html.moodle-tweaks-activities |
Secciones, actividades y listados. |
| Foros | forum |
html.moodle-tweaks-forum |
Debates y publicaciones más legibles. |
| Calendario | calendar |
html.moodle-tweaks-calendar |
Vista mensual clara y ordenada. |
| Panel limpio | cleanDashboard |
html.moodle-tweaks-dashboard + JS |
Oculta el banner gigante y colapsa el índice del curso. |
| Imágenes de portada | homeImages |
JS (theme-images.js) |
Cambia de color el banner y los cursos de la página principal en dos tonos. |
| Próximas entregas | upcoming |
JS + html.moodle-tweaks-upcoming |
Barra con tareas y eventos próximos (web service del calendario). |
| Contador en el ícono | toolbarBadge |
JS + service worker | Badge con avisos, mensajes y entregas próximas. |
| CSS personalizado | customCss |
<style> inyectado |
Override para usuarios avanzados. |
La extensión no está publicada en las tiendas; se instala en modo desarrollo.
- Abrí
chrome://extensions(oedge://extensions). - Activá el Modo de desarrollador (arriba a la derecha).
- Elegí Cargar descomprimida y seleccioná la raíz de este repositorio
(donde está
manifest.json). - Fijá MoodleTweaks a la barra de herramientas y abrilo en EVA.
- Abrí
about:debugging#/runtime/this-firefox. - Elegí Cargar complemento temporal.
- Seleccioná el archivo
manifest.json.
Requiere Firefox 140+ (142+ en Android). Para desarrollo con recarga
automática se puede usar web-ext:
web-ext run.
Hacé clic en el ícono de la extensión para abrir el popup. Ahí podés:
- Activar o desactivar todo con el interruptor maestro (
enabled). - Prender o apagar cada módulo por separado, con restablecer por fila.
- Buscar ajustes por nombre y ver si la extensión está activa en el sitio que tenés abierto.
- Ajustar el modo oscuro (manual/automático y variante), la escala de fuente y la densidad, y escribir tu propio CSS en Avanzado.
- Restablecer todos los valores por defecto.
La primera vez que se instala se abre una página de bienvenida con el resumen de las funciones y la versión. El enlace Bienvenida del pie vuelve a abrirla.
Los cambios se guardan en chrome.storage (sincronizado si está disponible) y
se aplican al instante en las pestañas abiertas de EVA.
manifest.json Configuración MV3 y puntos de entrada.
package.json Metadatos y scripts de tests/build.
scripts/
manifest-targets.mjs Derivación del manifest por navegador (chrome/firefox).
build.mjs Empaquetado de dist/ y zips versionados.
src/
shared/settings.js Defaults, normalización y clave compartidos.
background/
service-worker.js Badge del ícono y apertura de la bienvenida.
content/
theme-images.js Motor de cambio de color (dos tonos) de la portada.
moodle-tweaks.js Content script: clases, barra, badge y observador.
css/
base.css Tokens de diseño, escala de fuente y accesibilidad.
navigation.css Barra, migas, submenús, índice del curso.
course.css Contenido de cursos y listados.
forum.css Listado de debates y publicaciones.
calendar.css Vista mensual.
highlight.css Resaltados de activos/no leídos/propios.
dashboard.css Panel limpio (banner y cursos compactos).
compact.css Densidad compacta (se carga al final).
back-to-top.css Botón flotante (lo inyecta el content script).
upcoming.css Barra de próximas entregas.
dark.css Modo oscuro y variantes (se carga al final).
print.css Estilos de impresión.
popup/
popup.html / popup.css / popup.js
welcome/
welcome.html / welcome.css / welcome.js
icons/ Íconos (SVG + PNG en varios tamaños).
test/ Tests con node:test + jsdom.
TODO.md Backlog de próximas features.
No hay paso de build para desarrollo: los archivos de src/ se cargan tal
cual. Alcanza con recargar la extensión y la página. El paso de build en
package.json es solo para empaquetar releases (ver más abajo).
- CSS: se usa native nesting (Chrome 112+ / Firefox 117+), sin
preprocesador. Cada módulo se anida bajo
html.moodle-tweaks-<modulo>. - Orden de carga:
dark.cssva al final para ganar los empates de especificidad e overridear a los demás módulos. - Sin
evalni scripts inline, compatible con la CSP de las tiendas.
Instalá las dependencias una sola vez:
npm ci # o npm installComandos disponibles:
| Comando | Qué hace |
|---|---|
npm test |
Corre la suite (node --test + jsdom). |
npm run build |
Empaqueta dist/chrome y dist/firefox y genera los zips versionados. Falla si la versión de manifest.json y package.json no coinciden. |
npm run lint:firefox |
Valida el paquete de Firefox con el linter de AMO (web-ext lint). Correr después del build. |
Para correr todo como en CI: npm test && npm run build && npm run lint:firefox
(es lo que hace .github/workflows/ci.yml en cada push/PR).
Los tests corren con el runner nativo de Node (node --test) y jsdom, y
cubren la normalización/migración de settings, la lógica del content script
(clases desde cache, reconciliación con storage, botón volver arriba, modo
oscuro automático y variantes, escala de fuente, CSS personalizado, densidad,
panel limpio, barra de entregas y badge), el popup (búsqueda, reset por fila,
sitio activo, versión), la validez del manifest.json y la derivación del
manifest por navegador en scripts/manifest-targets.mjs.
El desarrollo no requiere build, pero para publicar se genera un paquete por
navegador. El único lugar donde difieren es el manifest.json; el código en
src/ es idéntico:
- Chrome / Edge / Brave:
background.service_worker, sinbackground.scripts(los reviewers de la tienda rechazan ese key). - Firefox:
background.scripts(event page), conbrowser_specific_settings.
Los comandos están en Checks y build: npm run build arma
dist/chrome y dist/firefox, y npm run lint:firefox valida el paquete de
Firefox.
Los artefactos quedan en dist/: MoodleTweaks-<versión>-chrome.zip (sirve
también para Edge/Brave/Opera) y MoodleTweaks-<versión>-firefox.zip. El build
falla si la versión de manifest.json no coincide con la de package.json.
Un tag v<versión> (ej. v1.1.0) dispara el workflow Release en CI: corre
los tests, empaqueta, lintea el paquete de Firefox y crea un GitHub Release
en borrador con ambos zips adjuntos. El CI también empaqueta en cada push/PR.
En document_start, el content script lee una cache del propio localStorage
del sitio (clave moodleTweaksSettingsCache) y aplica las clases moodle-tweaks-* antes
del primer pintado, para evitar el parpadeo al navegar entre páginas.
Inmediatamente después lee la configuración real de chrome.storage, la
reconcilia y reescribe la cache. También escucha storage.onChanged para
reflejar cambios en vivo.
El popup escribe en chrome.storage.sync (con fallback a local). El content
script envía al service worker el contador de avisos/mensajes/entregas, que lo
pinta como badge sobre el ícono, y la página de bienvenida usa el mismo
shared/settings.js para mostrar la versión.
En dark.css los overrides se comparan contra la especificidad del tema default
(que se carga después que este content script); para no perder los empates se
usan selectores html.moodle-tweaks-dark ... más específicos y !important puntuales.
| Permiso | Motivo |
|---|---|
storage |
Guardar y sincronizar las preferencias. |
https://eva.fing.edu.uy/* |
Inyectar CSS/JS únicamente en EVA. |
La extensión no recolecta datos ni se comunica con servidores externos.
Ver TODO.md para la lista de features e ideas pendientes.
MIT © 2026