OSS · Extensión de Chrome + Web UI + Escritorio · Node.js
claude-shift
Una máquina, varias cuentas de Claude Code.
Gestiona varias cuentas de Claude Code en la misma máquina. shift use cambia la cuenta activa sincronizando los dos archivos que Claude Code realmente lee (~/.claude/.credentials.json para los tokens, ~/.claude.json para el oauthAccount que muestra /status). Un servidor local consulta api.anthropic.com/api/oauth/usage en intervalo configurable y guarda la utilización de 5 horas y semanal en SQLite. El popup del Chrome muestra cada cuenta con un gráfico SVG cruzado y permite cambiar la activa desde el popup. La misma UI del popup también corre en el navegador (127.0.0.1:19867) y como app de escritorio Tauri v2: un archivo de UI, cuatro entradas.
Ver en GitHub Internals de la autenticación en dos archivos →
Comandos CLI
Un shell script sobre helpers en Node. Todos los comandos funcionan solos; server y popup son opcionales.
| Comando | Qué hace |
|---|---|
shift list | Lista todas las cuentas registradas con la activa marcada. |
shift use <name> | Cambia la activa. Hace sync back del token refresh y actualiza el oauthAccount en ~/.claude.json. |
shift usage | Muestra 5 horas y semanal con horas de reset por cuenta. |
shift seed <name> | Hace una petición mínima para iniciar la ventana de 5 horas ahora. Útil antes de una sesión larga. |
shift add <name> | Registra el credentials.json actual como <name>. Token duplicado emite aviso (-f para forzar). |
shift rm <name> | Elimina el registro. Eliminar la activa requiere -f. |
shift server | Levanta el servidor local (127.0.0.1:19867). Hace polling de usage y guarda en SQLite. |
Una UI, cuatro entradas
El popup habla con un servidor local en 127.0.0.1:19867 que consulta la API de usage en intervalo configurable y graba snapshots en SQLite. Cada cuenta recibe una barra de 5 horas y una semanal; el modal de análisis dibuja un gráfico SVG cruzado en 6h / 24h / 7d. La card activa lleva el badge 使用中; las demás muestran el botón 切替 que dispara la misma pipeline de shift use por detrás. El servidor también sirve el mismo popup.html de forma estática, así que la UI idéntica se abre en una pestaña del navegador en 127.0.0.1:19867 y en una ventana de escritorio Tauri v2 (residente en la bandeja; msi / dmg / deb salen del CI). Un bug corregido una vez actualiza todas las entradas.
Instalación
Cloná el repo y registrá las cuentas una por una. Cada cuenta se captura justo después del /login dentro de Claude Code.
# 1. Clone and install
git clone https://github.com/kenimo49/claude-shift
cd claude-shift
npm install
chmod +x shift.sh
# 2. Register accounts, one at a time
# Inside Claude Code, run /login for the account you want to register.
# Immediately after, register it:
./shift.sh add my-account-a
# Repeat /login + add for every account you want to manage.
# 3. Start the usage server (optional, needed for popup)
./shift.sh server --interval 5
# 4. Load the Chrome extension
# chrome://extensions → Developer mode → Load unpacked → extension/ Cinco cosas que vale conocer
Cada una costó un incidente real. Las dejo documentadas para que el próximo lector las salte directo.
-
La vista de la cuenta vive en ~/.claude.json, no en el archivo de credenciales
Cambiar solo ~/.claude/.credentials.json hace que /status siga mostrando la cuenta anterior mientras el nuevo token autentica cada request. El desajuste es silencioso y confuso. shift use trae el profile de api.anthropic.com/api/oauth/profile con el nuevo token y escribe ambos archivos de forma consistente.
-
Los tokens refresh deben sincronizarse antes de sobrescribir
El archivo de token en disco es actualizado por Claude Code durante la sesión. Sobrescribir con la cuenta destino sin sincronizar el archivo actual de vuelta al slot de la cuenta original descarta ese refresh y puede requerir un nuevo login. shift use graba las credenciales actuales en el slot de la cuenta anteriormente activa antes de reemplazar.
-
La ventana de 5 horas empieza en el primer uso, no en el reloj
Dos cuentas Max/Team iniciadas a las 10:00 y a las 15:00 dan dos ventanas de 5 horas independientes que se pueden encadenar. shift seed hace una petición mínima para iniciar la ventana bajo demanda, útil para posicionar una ventana nueva justo antes de una sesión larga.
-
El intervalo de polling del popup es configurable y persiste
El servidor acepta --interval N (minutos) al arrancar y un POST /config desde el popup. El valor se guarda en ~/.claude-shift/config.json y se recarga en el siguiente tick. Por defecto 10 minutos; el ícono de engranaje del popup lo cambia sin reiniciar el servidor.
-
La app de escritorio es una cáscara Tauri sin assets de UI
El ejecutable (~8 MB) solo abre un WebView en 127.0.0.1:19867 y gestiona el ciclo de vida del servidor: reutiliza un servidor vivo, hace spawn de node cli/server.js si no hay, y muestra una página de error en caso contrario. Distribuir a otra máquina requiere Node 20+, el repositorio y la variable CLAUDE_SHIFT_REPO (ver docs/desktop-setup.md). Con WSL2 mirrored networking, el exe de Windows alcanza directo un servidor corriendo dentro de WSL.
Artículos relacionados
Herramientas relacionadas para devs
- hook-chain-lens A read-only CLI that reads every Claude Code hook scope (user, project, local, plugin) and prints what will actually fire in this cwd, in what order, from where.
- private-lint Git-hook gate that blocks personal and private names (family names, personal emails, client domains) before commit and push. Pure Bash; detection patterns stay machine-local, never in any repo, and a full-history audit covers the moment before you flip a repository public.
- quake-lens Earthquake statistics CLI + MCP server in pure-stdlib Python: Gutenberg-Richter b-value (Aki MLE) and Omori-Utsu aftershock decay (Ogata MLE) from public catalogs.
- rhythm-lens Measures the rhythm of Japanese, English and Portuguese Markdown (sentence-length burstiness, paragraph structure) against measured human/AI distributions from two published papers. A writing feedback instrument, not an AI detector.