Extensión de Chromium que muestra el consumo de Compute Units de Google Colab directamente en el navegador. Soporta múltiples cuentas de Google con detección automática de la cuenta activa en la página de Colab.
- Qué hace
- Requisitos
- Instalación
- Uso
- Multi-cuenta
- Arquitectura
- Estructura del proyecto
- Permisos
- Privacidad
- Notas técnicas
- Limitaciones
- Licencia
La extensión consulta periódicamente el endpoint de Google Colab para obtener información de consumo de Compute Units (CU) y la presenta en dos lugares:
- Popup: al hacer click en el icono de la extensión, muestra el saldo total, tasa de consumo, tiempo estimado restante, sesiones activas (CPU/GPU) y plan. Incluye countdown de refill cuando el saldo se agota, y tooltip con GPUs disponibles al pasar sobre el badge del plan. Permite agregar múltiples cuentas y cambiar entre ellas.
- Overlay en Colab: un chip flotante en la esquina inferior izquierda de
colab.research.google.comque indica el saldo y consumo en tiempo real. Cambia de color según el nivel de saldo (verde, ámbar, rojo) y muestra una cuenta regresiva cuando las unidades se agotan. Detecta automáticamente qué cuenta de Google está activa en la página y muestra su cuota correspondiente.
Los datos se actualizan cada minuto mediante chrome.alarms. No hay servidor intermedio: la extensión habla directamente con las APIs de Google.
- Google Chrome o navegador Chromium >= 120
- Una cuenta de Google con acceso a Colab
No hay build, bundler ni dependencias npm. La extensión se carga directamente.
git clone https://github.com/mitgar14/Colab-Quota.git- Abrir
chrome://extensions/o pestaña de "Administrar extensiones" dentro del desplegable de Extensiones (pieza de rompecabezas) - Activar Modo desarrollador (esquina superior derecha)
- Click en Cargar extensión sin empaquetar
- Seleccionar la carpeta raíz del proyecto (la que resultó del
git clone)
La extensión aparece en la barra de herramientas. Las credenciales OAuth2 vienen incluidas (son las del SDK de Google Cloud, públicas).
- Hacer click en el icono de la extensión y pulsar Conectar con Google (o click en el chip flotante dentro de Colab)
- Autorizar los permisos en la ventana de Google que se abre
- El popup muestra el saldo de CU, tasa de consumo y tiempo estimado
- En cualquier pestaña de
colab.research.google.com, aparece un chip flotante con el saldo
| Color | Significado |
|---|---|
| Verde | Saldo por encima del 60% |
| Ámbar | Saldo entre 30% y 60% |
| Rojo | Saldo por debajo del 30% |
| Rojo pulsante | Saldo agotado (muestra cuenta regresiva si hay refill pendiente) |
| Gris | Sin autenticar o cargando |
El tooltip (hover sobre el chip) muestra el desglose: consumo por hora, tiempo estimado, sesiones activas y errores recientes.
La extensión soporta múltiples cuentas de Google simultáneamente.
Click en el botón + junto al selector de cuentas en el popup. Se abre una ventana de autenticación de Google. La nueva cuenta se agrega y se establece como activa.
- Desde el popup: seleccionar otra cuenta en el dropdown. La extensión cambia inmediatamente y muestra los datos de la cuenta seleccionada.
- Automáticamente: al cambiar de cuenta de Google en una página de Colab, la extensión detecta el cambio y actualiza el chip flotante y la cuenta activa automáticamente. La detección se basa en un
MutationObserverque lee el botón de perfil de Google en el DOM — no hace llamadas de red.
Click en Eliminar cuenta en el popup. Se revoca el token y se eliminan los datos de esa cuenta. Si hay otras cuentas almacenadas, la extensión cambia a la siguiente automáticamente.
Si la extensión se actualiza desde una versión anterior (single-account), los datos existentes se migran automáticamente al formato multi-cuenta en el primer inicio.
┌──────────────────────────────────────┐
│ Google OAuth2 / API │
└──────────────┬───────────────────────┘
│
┌───────▼───────┐
│ Service Worker │ background/service-worker.js
│ (stateless) │ OAuth2 PKCE, polling, token refresh
└───────┬───────┘
│
chrome.storage.local
{accounts: {email: {...}}, activeAccount}
│
┌───────┴────────┐
│ │
┌────▼────┐ ┌─────▼──────┐
│ Popup │ │ Content │
│ │ │ Script │
└─────────┘ └────────────┘
popup/* content/overlay.js
selector + chip + auto-detección
métricas de cuenta en página
- Service Worker (
background/service-worker.js): gestiona autenticación OAuth2 con PKCE, refresca tokens, consulta el endpoint de cuota cada minuto y persiste todo enchrome.storage.local. Almacena múltiples cuentas enaccounts[email]con una claveactiveAccountque indica cuál es la cuenta activa. No mantiene estado mutable en memoria (requisito de Manifest V3). - Popup (
popup/*): leechrome.storage.localy renderiza tres estados posibles (sin autenticar, autenticado, error). Incluye un selector de cuenta (dropdown + botón "+") y envía mensajes al Service Worker para login, logout y refresh manual. - Content Script (
content/overlay.js): se inyecta en páginas de Colab. Crea un Shadow DOM para aislar estilos y renderiza un chip flotante que refleja el estado de la cuenta activa. Incluye auto-detección de la cuenta de Google activa en la página medianteMutationObserver.
Los tres componentes se sincronizan mediante chrome.storage.onChanged.
colab-quota/
├── manifest.json Manifiesto MV3
├── background/
│ └── service-worker.js Lógica principal (OAuth, polling, API, multi-cuenta)
├── popup/
│ ├── popup.html Estructura del popup (selector de cuenta, métricas)
│ ├── popup.js Renderizado y event handlers
│ └── popup.css Estilos dark/industrial
├── content/
│ ├── overlay.js Chip, tooltip, Shadow DOM, auto-detección de cuenta
│ └── overlay.css (vacío — estilos dentro del Shadow DOM)
└── icons/
├── icon.svg Icono fuente (SVG)
├── icon-16.png
├── icon-48.png
└── icon-128.png
| Permiso | Tipo | Justificación |
|---|---|---|
storage |
API | Persistir tokens OAuth, información de usuario y datos de cuota (multi-cuenta) |
alarms |
API | Programar polling cada minuto (necesario porque el Service Worker se suspende entre eventos) |
tabs |
API | Detectar la redirección OAuth a http://localhost durante la autenticación |
https://colab.research.google.com/* |
Host | Inyectar el content script (chip flotante) en páginas de Colab |
https://colab.pa.googleapis.com/* |
Host | Consultar el endpoint de cuota de Compute Units |
https://oauth2.googleapis.com/* |
Host | Intercambiar y refrescar tokens OAuth2 |
http://localhost/* |
Host | Capturar el código de autorización OAuth (redirect URI) |
La extensión no ejecuta código remoto.
- Almacenamiento: tokens y datos de cuota se guardan exclusivamente en
chrome.storage.local, que reside en el perfil del navegador. No se envían a servidores de terceros. - Comunicación: la extensión solo se comunica con dominios de Google (
accounts.google.com,oauth2.googleapis.com,googleapis.com). - Revocación: al eliminar una cuenta, se intenta revocar el token con Google y se eliminan los datos de esa cuenta del storage local.
- Sin telemetría: no hay analytics, tracking ni envío de datos a servicios externos.
- Detección de cuenta: el content script lee el
aria-labeldel botón de perfil de Google en el DOM de Colab para detectar la cuenta activa. Es una lectura local del DOM, no implica llamadas de red.
OAuth2 PKCE: la extensión usa Proof Key for Code Exchange (S256) para el flujo de autorización, con crypto.subtle para generar el challenge. El flujo abre una ventana popup de Chrome (chrome.windows.create) en lugar de launchWebAuthFlow porque el redirect URI es http://localhost, no https://<id>.chromiumapp.org.
Multi-cuenta: los datos se almacenan en chrome.storage.local como { accounts: { "email": { tokens, userInfo, ccuInfo, ... } }, activeAccount: "email" }. Cada cuenta tiene sus propios tokens, información de usuario y datos de cuota. El polling solo consulta la cuenta activa.
Auto-detección: el content script observa el DOM de Colab con un MutationObserver que detecta cambios en el aria-label del botón de perfil de Google. El formato "Google Account: Name (email@domain)" es consistente en todos los idiomas. Cuando el email detectado coincide con una cuenta almacenada diferente a la activa, se cambia automáticamente.
XSSI prefix: el endpoint de Colab antepone )]}'\n a las respuestas JSON como protección contra Cross-Site Script Inclusion. La extensión lo descarta antes de parsear.
Milli-CCU: el campo remainingTokens de la API devuelve milésimas de CU. Se divide entre 1000 para obtener el valor en CU.
Shadow DOM: el overlay usa Shadow DOM (mode: open) para que los estilos de Colab no afecten al chip ni al tooltip. Un MutationObserver lo re-inyecta si Colab lo elimina del DOM.
Token refresh: se refresca de forma proactiva 5 minutos antes de expirar. Si el refresh devuelve invalid_grant, se elimina la cuenta afectada (sin tocar las demás) y se limpia el alarm si no quedan cuentas.
- La API de cuota de Colab (
colab.pa.googleapis.com) no es pública ni está documentada oficialmente. Puede cambiar o dejar de funcionar sin aviso. - Las credenciales OAuth incluidas son las del SDK de Google Cloud (públicas). Si Google las revoca, la extensión dejará de funcionar hasta reemplazarlas.
- La extensión no funciona en Firefox (depende de APIs específicas de Chromium:
chrome.alarms,chrome.windows.create, Manifest V3). - La auto-detección de cuenta depende del
aria-labeldel botón de perfil de Google en el DOM. Si Google cambia esta estructura, la detección dejaría de funcionar (el selector manual del popup seguiría disponible como fallback). - Los PNGs se generaron proceduralmente a partir de un SVG fuente (
icons/icon.svg).
MIT