Monitoriza tu consumo de Claude Code en GNOME con Python y AppIndicator

Si trabajas a diario con Claude Code, seguramente te haya pasado: estás a mitad de una tarea larga y de pronto te quedas sin cuota. Existe el comando /usage dentro de Claude Code, pero hay que pararse a escribirlo. Lo cómodo sería tener el dato siempre delante, en la barra superior de Ubuntu.

En este artículo montamos justo eso: un indicador que muestra de forma permanente el porcentaje consumido de la sesión de 5 horas y el de la cuota semanal, con el tiempo que falta para cada reset. Se refresca solo cada minuto y arranca automáticamente al iniciar sesión.

De dónde salen los datos

Claude Code guarda sus credenciales OAuth en ~/.claude/.credentials.json. Dentro hay un accessToken que sirve para consultar el mismo endpoint que usa internamente el comando /usage:

TOKEN=$(python3 -c "import json;print(json.load(open('$HOME/.claude/.credentials.json'))['claudeAiOauth']['accessToken'])")

curl -s https://api.anthropic.com/api/oauth/usage \
  -H "Authorization: Bearer $TOKEN" \
  -H "anthropic-beta: oauth-2025-04-20"

La respuesta trae bastantes campos, pero los dos que nos interesan son estos:

{
  "five_hour": {
    "utilization": 56.0,
    "resets_at": "2026-08-08T11:30:00+00:00"
  },
  "seven_day": {
    "utilization": 14.0,
    "resets_at": "2026-08-13T20:00:00+00:00"
  }
}

utilization es el porcentaje consumido y resets_at la marca temporal en UTC en la que ese contador vuelve a cero. Con eso ya tenemos todo lo necesario.

Un aviso antes de seguir: ese token da acceso a tu cuenta. Úsalo solo en local y no lo pegues en ningún sitio público, ni en capturas de pantalla ni en pastebins.

Por qué una app de bandeja y no una extensión de GNOME

El primer impulso es escribir una extensión de GNOME Shell, que es lo que pinta texto nativo en la barra. Y funciona, pero tiene un inconveniente serio en Ubuntu moderno: bajo Wayland, una extensión recién instalada no se carga hasta que reinicias GNOME Shell, y eso significa cerrar sesión. El clásico Alt+F2 seguido de r solo funciona en X11.

La alternativa que evita el cierre de sesión es una aplicación de bandeja con AyatanaAppIndicator3. Se apoya en la extensión ubuntu-appindicators, que Ubuntu trae activada de serie, y se registra en caliente: la lanzas y aparece al instante.

El script del indicador

Guarda esto en ~/.local/bin/claude-usage-indicator.py:

#!/usr/bin/env python3 import fcntl import json import sys import urllib.request from datetime import datetime, timezone from pathlib import Path import gi gi.require_version("Gtk", "3.0") gi.require_version("AyatanaAppIndicator3", "0.1") from gi.repository import AyatanaAppIndicator3 as AppIndicator from gi.repository import GLib, Gtk CRED = Path.home() / ".claude" / ".credentials.json" URL = "https://api.anthropic.com/api/oauth/usage" REFRESH_SECONDS = 60 def eta(iso): if not iso: return "" try: t = datetime.fromisoformat(iso) except ValueError: return "" secs = (t - datetime.now(timezone.utc)).total_seconds() if secs <= 0: return "0m" d, rem = divmod(int(secs), 86400) h, m = divmod(rem // 60, 60) if d: return f"{d}d{h}h" if h: return f"{h}h{m:02d}m" return f"{m}m" def reset_clock(iso): if not iso: return "" try: t = datetime.fromisoformat(iso).astimezone() except ValueError: return "" return t.strftime("%a %d %H:%M") def fetch(): token = json.loads(CRED.read_text())["claudeAiOauth"]["accessToken"] req = urllib.request.Request( URL, headers={ "Authorization": f"Bearer {token}", "anthropic-beta": "oauth-2025-04-20", }, ) with urllib.request.urlopen(req, timeout=8) as r: return json.load(r) class Indicator: def __init__(self): self.ind = AppIndicator.Indicator.new( "claude-usage", "utilities-system-monitor-symbolic", AppIndicator.IndicatorCategory.SYSTEM_SERVICES, ) self.ind.set_status(AppIndicator.IndicatorStatus.ACTIVE) self.menu = Gtk.Menu() self.detail = Gtk.MenuItem(label="Cargando...") self.detail.set_sensitive(False) self.menu.append(self.detail) self.menu.append(Gtk.SeparatorMenuItem()) refresh = Gtk.MenuItem(label="Actualizar ahora") refresh.connect("activate", lambda _w: self.refresh()) self.menu.append(refresh) quit_item = Gtk.MenuItem(label="Salir") quit_item.connect("activate", lambda _w: Gtk.main_quit()) self.menu.append(quit_item) self.menu.show_all() self.ind.set_menu(self.menu) self.refresh() GLib.timeout_add_seconds(REFRESH_SECONDS, self.refresh) def refresh(self): try: d = fetch() s, w = d["five_hour"], d["seven_day"] sp, wp = int(round(s["utilization"])), int(round(w["utilization"])) label = f"S {sp}% ({eta(s['resets_at'])}) · W {wp}% ({eta(w['resets_at'])})" detail = ( f"Sesion 5h: {sp}% -> resetea {reset_clock(s['resets_at'])}\n" f"Semanal: {wp}% -> resetea {reset_clock(w['resets_at'])}" ) except Exception as e: label = "Claude: --" detail = f"Sin datos: {e}" self.ind.set_label(label, "S 100% (0h00m) · W 100% (0d0h)") self.detail.set_label(detail) return GLib.SOURCE_CONTINUE if __name__ == "__main__": _lock = open("/tmp/claude-usage-indicator.lock", "w") try: fcntl.flock(_lock, fcntl.LOCK_EX | fcntl.LOCK_NB) except BlockingIOError: print("Ya hay una instancia en ejecucion.", file=sys.stderr) sys.exit(0) Indicator() Gtk.main() read more

Leer más » Comentar

Cómo usar mysql_result en PHP 7 o PHP 8

Esta mañana un cliente me avisó de un error cuando intentaba descargar unas facturas. Esas facturas están guardas en un BLOB en una base de datos a las que se accede para luego mostrarlas al usuario.

¿Qué ha pasado? Pues que hace tiempo actualizaron en su servidor PHP de 5.6 a 7.x o diría que ya a 8.x y claro, mirando el código se usaba la función mysql_result que básicamente lo que hace es leer el dato de una celda en concreto de una consulta SQL. read more

Leer más » Comentar

Instalar y configurar una tienda online con WooCommerce usando Clouding

El comercio electrónico desde su nacimiento ha sido una tecnología de gran éxito. Poder comprar sin moverte de casa tiene muchas ventajas para las dos partes, vendedor y comprado. Y por supuesto algunos inconvenientes. Muchas de las ventajas se han puesto de relieve con la pandemia. Por eso hoy os traemos este manual, para que podáis ver cómo montar una tienda electrónica con WooCommerce en Clouding. Recordad que WooCommerce es un plugin para WordPress y por supuesto, los dos son proyectos con licencia GPL.

Las ventajas más obvias son, para el comprador:

  • Poder comprar a cualquier hora desde cualquier lugar, lo primero te permite compatibilizar el proceso de compra con otras tareas (estar en la oficina, de viaje o viendo la TV) y lo segundo, es muy importante para no tener que desplazarte. No digamos ya a un centro comercial, si no si vives en una población sin tanta oferta comercial, sin tener que hacer kilómetros para ir a una tienda física con la mercancía que buscar.
  • Poder leer mucho sobre lo que vas a comprar. A diferencia del comercio físico, cuando compras online, verás una ficha rellena con mucha más información del producto de la que pueda ofrecerte cualquier ficha en una tienda. Además será una información objetiva y contrastable, a diferencia de lo que puede ser la opinión del vendedor.
  • Sanitariamente es una compra segura, no hay contacto físico con otras personas y por lo tanto, no hay riesgo de contagio.
  • read more

    Leer más » Comentar

    Ángulo entre dos vectores 3D en C

    https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js
    hljs.initHighlightingOnLoad();

    El ángulo entre dos vectores A = (Ax, Ay, Az) y B = (Bx, By, Bz) se calcula mediante el arcocoseno de la relación que existe entre el producto escalar de dichos vectores y los módulos de cada vector. Su fórmula es la siguiente: read more

    Leer más » Comentar

    Importar usuarios en WordPress

    Nada más instalar WordPress, que por cierto, es el sistema presente en uno de cada tres sitios webs a nivel mundial, tendremos disponibles unas herramientas para poder importar contenido. Concretamente con el importador que incluye WordPress podremos importar: páginas, adjuntos, entradas, widgets, etiquetas, categorías, menús y algún otro tipo de datos.

    Aparte de contenidos, WordPress también maneja usuarios y en algunos sitios son la base (imaginemos una red social con su miembros o incluso una tienda online con sus clientes), así que vamos a ver brevemente cómo importar usuarios en WordPress.

    Importar usuarios en WordPress con Import Users From CSV With Meta

    Podemos importar usuarios en WordPress usando algunos plugins. Hace un tiempo creé uno y poco a poco, como tantos otros proyectos de software libre, ha ido creciendo y ampliando sus posibilidades. Su nombre es Import Users From CSV With Meta y soy el responsable de su desarrollo y mantenimiento, así que como imagináis os lo voy a recomendar. De hecho, este plugin a día de hoy es la base de una serie de servicios de importación, integración y sincronización de usuarios con WordPress que ofrecemos en Codection. Como podéis imaginar, los proyectos de software libre, como este, además de tener valor en sí mismos, derivan muchas veces en servicios de alto valor añadido para su creador.

    A día de hoy, de todos los plugins para importar usuarios para WordPress, podemos decir que este es el más usado con más de 30.000 instalaciones activas y con más de 700.000 descargas. Hay plugins de importación más populares, que también importan usuarios, pero son menos específicos.

    ¿Qué nos permite hacer este plugin?

    Así de forma esquemática y traduciendo lo que tenemos puesto en la portada del plugin en el repositorio de plugins de WordPress:

  • Importa un fichero CSV con datos de usuarios directamente a tu WordPress
  • Pueden ser miles, los que necesites y de una forma muy rápida
  • Se importan también sus metadatos (por ejemplo, los datos de facturación o envío de WooCommerce)
  • Además de asignar los roles que consideres a cada uno, o a toda la importación
  • Envía un correo a los nuevos usuarios (o a los que están siendo actualizados)
  • Este correo puede personlizarse
  • Y además puedes tener diferentes plantillas, para diferentes casos
  • Además de crear nuevo usuarios, puedes también editarlos de forma masiva, subiendo los mismos usuarios con diferentes datos
  • Puedes importar a través del frontend con un shortcode que genera el plugin
  • O con un proceso cron, para que se ejecute de forma periódica
  • read more

    Leer más » Comentar

    Calcula si un número es par o impar en Python

    Uno de los problemas que propongo a mis alumnos cuando están aprendiendo condicionales en un lenguaje de programación es calcular si un número entero es par o impar.

    Aquí os dejo el enunciado del problema y una propuesta de solución en Python. Espero que os sirva tanto si es para la enseñanza como para el aprendizaje.

    Problema:

    Imprime en pantalla si un número entero dado es par o impar.

    Solución propuesta (didáctico):

    La clave está en utilizar la operación módulo, que calcula el resto de una división entera: si un entero es divisible por dos, es par; si no, impar.

    import sys
    
    a = int(sys.argv[1])
    
    if a % 2 == 0:
        print('El número', a, 'es par.')
    else:
        print('El número', a, 'es impar.')
    

    Leer más » Comentar

    Calcula si un número es primo en Python

    Uno de los problemas que propongo a mis alumnos cuando están aprendiendo bucles en un lenguaje de programación es calcular si un número es primo o no.

    Aquí os dejo el enunciado del problema y una propuesta de solución en Python. Espero que os sirva tanto si es para la enseñanza como para el aprendizaje.

    Problema: read more

    Leer más » Comentar

    Instalar PowerShell en una distribución Linux

    PowerShell es un shell de Microsoft multiplataforma. Aunque me duela decirlo, es más potente que Bash a la hora de realizar scripts ya que soporta, por ejemplo, números en coma flotante. La buena noticia es que su licencia es MIT y, por tanto, compatible con la licencia GPL.

    Los pasos para su instalación son los siguientes:

    1. Entra en la página oficial del repositorio de PowerShell.
    2. Dirígete a la sección Obtener PowerShell.
    3. Descarga el instalador correspondiente a tu distribución GNU/Linux y sigue las instrucciones oficiales indicadas.

    La combinación de PowerShell junto con los comandos de GNU/Linux, hace del scripting una labor realmente apetecible.

    Y tú, ¿lo has instalado? ¿Lo has probado? ¡Coméntanos!

    Leer más » Comentar

    Comandos básicos de Git

    Aquí tenéis una breve tabla sobre los comandos más básicos para poder trabajar con Git:

    Comandos Explicación
    git clone uri.git Clona un repositorio en el directorio actual.
    git pull Incorpora los cambios de un repositorio remoto en la rama actual.
    git status Muestra el estado actual del árbol de trabajo.
    git add . Actualiza el índice con el contenido actual del árbol de trabajo.
    git commit -m 'mensaje' Registra los cambios en el repositorio.
    git push Actualizar referencias remotas junto con objetos asociados.

    Para instalar Git en distribuciones basadas en Debian, ejecuta sudo apt-get install git.

    Leer más » Comentar

    Linux Containers (LXC)

    Aquí tenéis una breve tabla sobre los comandos esenciales para poder virtualizar con LXC:

    Comando Explicación
    sudo lxc-create -n id -t download Crea un contenedor llamado id usando una plantilla.
    sudo lxc-ls --fancy Lista los contenedores creados en el sistema.
    sudo lxc-start -n id Inicia un contenedor.
    sudo lxc-info -n id Obtener información sobre un contenedor.
    sudo lxc-attach -n id Unirse a un contenedor e iniciar sesión.
    sudo lxc-stop -n id Detiene un contenedor.
    sudo lxc-destroy -n id Destruye un contenedor.

    Para instalar LXC en distribuciones basadas en Debian, ejecuta sudo apt-get install lxc.

    Leer más » Comentar