Suite 101 · arquitectura

Las licencias, ligadas al correo

draw101 y nest101 se abren entrando con la cuenta de la suite: correo y contraseña, o Google. La clave tecleada se queda como segunda forma, pero deja de ser la principal. Y en master101 hay un visor que dice qué correos tienen licencia vigente, de qué tipo, en cuántos equipos y hasta cuándo. El tipo —de dónde salió la licencia— y la vigencia —si vence o no— son dos columnas distintas, a propósito.

Al 19 de septiembre de 2026Contrato de la API 0.20.1Decisiones de Mike: el tipo y lo perpetuo, aparte · la clave se queda como respaldo

Las dos formas de activar

Hasta hoy sólo había una: la persona tecleaba una clave T101-XXXX-XXXX-XXXX y la app la cambiaba por un token firmado, amarrado a esa máquina. Sigue existiendo, pero ya no es por donde se entra normalmente.

draw101 / nest101 abre una ventana con la huella del equipo GET /licencias/entrar la pantalla la sirve la suite, no cada app POST /licencias/mia con la sesión de la suite la encuentra por el CORREO POST /licencias/activar sin cuenta y sin sesión la encuentra por la CLAVE el mismo token firmado (Ed25519) y el mismo latido con tu cuenta con una clave tecleada (respaldo)
Los dos caminos terminan en el mismo token firmado. Eso no es un detalle de implementación: es lo que hace que la regla de quién entra —vigencia, lugares, suspensión— exista una sola vez y no pueda decir dos cosas distintas según por dónde entró la persona.

Por qué el token no viaja en la dirección

La pantalla vive en el mismo origen que la API, así que la galleta de sesión es de primera parte y el regreso de Google es una ruta de ahí mismo. Cuando la licencia queda activada, la pantalla deja el resultado en window.__t101_licencia y cambia el fragmento de la dirección a #listo. La app escucha ese cambio y lee el objeto.

Una dirección se copia, se pega, se manda por chat y se queda en los registros de quien sea que la vea pasar. El fragmento sólo dice «listo»; el token se queda en la memoria de la ventana.

La huella del equipo

Un «lugar» de la licencia es una máquina, y para contar máquinas hace falta poder distinguirlas. La huella es un azar de 32 bytes que la app se inventa la primera vez que arranca y guarda en su carpeta de datos; lo que viaja es el resumen, no el azar.

El tipo y la vigencia son dos columnas

El tipo dice de dónde salió la licencia; la vigencia dice si vence. Meterlos en una sola lista se ve más simple y cuesta caro: una perpetua comprada en la App Store dejaría de contar como de App Store, y no habría forma de saber cuántas se vendieron ahí.

TipoQué quiere decirQuién lo pone
cortesiaRegalada; no la pagó nadie.Mike, al dar de alta a mano. Es lo que se pone por omisión: nadie cobra desde ahí.
suite101Va incluida en lo que la empresa ya paga por la suite.Mike.
stripeLa cobró la pasarela.Se pone solo: un pago marcado con origen: 'stripe' cambia el tipo. Un pago marcado a mano no lo toca.
appstoreLa cobró la tienda de Apple.Mike, mientras no haya versión de Mac.

Y aparte, perpetua: la columna que antes se llamaba cortesia y que siempre quiso decir «sin fecha de corte», no «regalada». Una perpetua puede estar pagada. La cortesía de las empresas (orgs.cortesia) es otra cosa y no cambió.

Sin internet

El token trae su propio hasta firmado. Mientras ese día no pase, la app abre sin preguntarle a nadie y manda el latido sin detener el arranque: un taller no tiene por qué esperar a un servidor para abrir un plano. Cuando el token vence y no hay forma de llegar a la suite, la app no abre y lo dice con esas palabras.

«La suite dice que no» y «no se pudo llegar a la suite» no son lo mismo. Un 503 o una falta de señal no borran la licencia guardada de nadie. Confundirlas dejaría a un taller sin su programa por un mal rato del servidor, y es de las cosas que no se notan probando a mano con buen internet: por eso está medido, y por eso el núcleo de la puerta vive en un archivo que no importa Electron y se puede correr con node a secas.

Lo que ve Mike

En master101 → Licencias: una fila por licencia que abre con el correo —que es por donde se buscan— y trae el tipo, los equipos (activos de los permitidos) y cuándo vence, o «No vence». Arriba, filtros por tipo (con cuántas hay de cada uno), por programa, por correo, y una casilla para ver sólo las que hoy dejan entrar.

Los filtros los resuelve la API, no el navegador: «vigente» se decide con la fecha del servidor y no con la del teléfono de quien mira, y el día que haya cientos de licencias no tiene caso traerlas todas para esconder la mayoría. Los conteos por tipo vienen sin el filtro de tipo puesto, para que escoger uno no deje a los demás en cero y el filtro no se vuelva un callejón sin salida.

Cómo se probó