Automatic CC and BCC for Gmail, driven by simple rules.
  • TypeScript 77%
  • Shell 9.8%
  • CSS 8%
  • HTML 4.7%
  • JavaScript 0.5%
Find a file
2026-11-05 17:53:21 +01:00
.gitea/workflows ci: guard de tag en cada paso del release (un push a main ya no pone el job en rojo) 2026-11-04 14:14:14 +01:00
docs feat: carbon copy, reglas de Cc y Cco para Gmail 2026-11-04 14:07:47 +01:00
protocols feat: carbon copy, reglas de Cc y Cco para Gmail 2026-11-04 14:07:47 +01:00
public fix: no hacer clic en Cc/Cco; rellenar solo la fila que el usuario abre (0.1.6) 2026-11-05 10:59:05 +01:00
scripts feat: carbon copy, reglas de Cc y Cco para Gmail 2026-11-04 14:07:47 +01:00
src fix: leer solo lo confirmado (chips de div[name] + input visible) y pegar las direcciones en vez de Enter; se acaban los 0 pendientes con fila vacia (0.2.2) 2026-11-05 17:53:21 +01:00
tests fix: leer solo lo confirmado (chips de div[name] + input visible) y pegar las direcciones en vez de Enter; se acaban los 0 pendientes con fila vacia (0.2.2) 2026-11-05 17:53:21 +01:00
.gitignore feat: carbon copy, reglas de Cc y Cco para Gmail 2026-11-04 14:07:47 +01:00
biome.json feat: carbon copy, reglas de Cc y Cco para Gmail 2026-11-04 14:07:47 +01:00
commitlint.config.cjs feat: carbon copy, reglas de Cc y Cco para Gmail 2026-11-04 14:07:47 +01:00
DESIGN.md feat: carbon copy, reglas de Cc y Cco para Gmail 2026-11-04 14:07:47 +01:00
lefthook.yml feat: carbon copy, reglas de Cc y Cco para Gmail 2026-11-04 14:07:47 +01:00
LICENSE feat: carbon copy, reglas de Cc y Cco para Gmail 2026-11-04 14:07:47 +01:00
package.json fix: leer solo lo confirmado (chips de div[name] + input visible) y pegar las direcciones en vez de Enter; se acaban los 0 pendientes con fila vacia (0.2.2) 2026-11-05 17:53:21 +01:00
pnpm-lock.yaml feat: carbon copy, reglas de Cc y Cco para Gmail 2026-11-04 14:07:47 +01:00
pnpm-workspace.yaml feat: carbon copy, reglas de Cc y Cco para Gmail 2026-11-04 14:07:47 +01:00
README.md feat: carbon copy, reglas de Cc y Cco para Gmail 2026-11-04 14:07:47 +01:00
tsconfig.json feat: carbon copy, reglas de Cc y Cco para Gmail 2026-11-04 14:07:47 +01:00
wxt.config.ts feat: carbon copy, reglas de Cc y Cco para Gmail 2026-11-04 14:07:47 +01:00

Carbon Copy

Extensión de Greasy Sprocket para Gmail: reglas que añaden destinatarios en Cc y Cco mientras escribes. Sin cuenta, sin servidor, sin telemetría y sin premium.

La alternativa comercial habitual cobra por esto y, cuando caduca la prueba, deja las reglas guardadas pero inertes. Aquí las reglas son tuyas, viven en chrome.storage y la extensión hace una sola cosa.

Qué hace

Creas reglas del tipo:

  • cuando el dominio del destinatario es cliente.com
  • cuando un destinatario exacto es ana@cliente.com
  • cuando el asunto contiene factura

y cada regla añade una o más direcciones a Cc y/o a Cco. Todas las reglas activas que casan se acumulan, sin duplicados.

Tres detalles de comportamiento que son deliberados:

  1. Solo añade, nunca quita. Si ya has puesto una dirección a mano, no se toca.
  2. Si borras un chip que puso la extensión, no vuelve. Ese compositor recuerda la dirección como eliminada mientras siga abierto.
  3. Nunca envía. Rellena la ventana de redacción y tú pulsas Enviar.

Cómo funciona

src/lib/rules.ts es el modelo puro (condiciones, validación, acumulación). src/lib/gmail-compose.ts traduce eso al DOM de Gmail: localiza ventanas de redacción por [contenteditable][role="textbox"] + input[name="subjectbox"], clasifica los campos de destinatarios por su aria-label (inglés y español) y escribe la dirección con el setter nativo de HTMLInputElement seguido de Enter, que es como Gmail convierte el texto en chip.

El content script corre solo en https://mail.google.com/*, observa mutaciones con debounce y añade una dirección por campo y pasada: Gmail crea el chip de forma asíncrona y escribir la siguiente dirección antes de tiempo produce un único chip con texto separado por comas.

Limitaciones conocidas (honestas)

  • Depende del DOM de Gmail. No hay API que permita inyectar Cc/Cco al enviar desde la web; esto es lo mismo que hacen las extensiones de esta categoría. Si Google cambia los aria-label o el botón Cc/Bcc, hay que actualizar los selectores. El código degrada a "no hacer nada" en vez de escribir en el campo equivocado.
  • Los campos Cc/Cco tienen que poder revelarse. Si Gmail cambia el enlace "Cc"/"Cco" por otro control, openField no lo encuentra y no se añade nada.
  • Gmail en otros idiomas: los aria-label se reconocen en inglés y español. Añadir un idioma es añadir sus etiquetas a classifyLabel y a la lista de disparadores.
  • Sin verificación contra una cuenta real en este repo. Los tests cubren el modelo y el DOM con jsdom; la prueba end-to-end en Gmail la hace una persona antes de publicar.

Permisos

  • storage — guardar las reglas (con sync, fallback a local).
  • sidePanel — la interfaz.
  • https://mail.google.com/* — el content script; la extensión no lee ni envía el correo, solo la ventana de redacción.

Desarrollo

pnpm install
pnpm wxt prepare
pnpm run validate     # typecheck + lint + tests + gates de diseño y sidepanel
pnpm build
bash scripts/build-zip.sh

En este host no hay node: se construye en docker run node:24-bookworm con el store en un volumen (-v gs-pnpm-store:/store).

Release

  1. Subir version en package.json (una sola fuente; no hay literal en wxt.config.ts).
  2. pnpm run validate y bash scripts/build-zip.sh.
  3. Publicar el ZIP y verificar el manifest dentro del ZIP contra el tag.
  4. Añadir update_url en wxt.config.ts cuando la Chrome Web Store asigne el id.

Sin bump no hay release: Chrome ignora una versión que ya ha visto.