Saltar al contenido
Caso · 01 / 09← Todos los trabajos

Vimo

Un sitio, un portal y un login para una suite de productos SaaS para pymes de Argentina.

Rol
Implementación del diseño, arquitectura y frontend
Stack
Next.js 16, React 19, TypeScript, Clerk, Turborepo, Playwright
Sitio público
Sitio públicoUn login para todos los subdominios
(01) El problema

Vimo agrupa siete productos, y cada uno vivía en su propio repo. No había un sitio que los vendiera juntos, ni un portal después del login, ni una marca común. El diseño repetía el precio y el color de cada producto en cuatro pantallas distintas.

Mi rolConvertí un handoff de diseño en un monorepo que anda, y logré que los productos compartan un solo login.
(02) ResultadosContados en el código
7productos definidos una sola vez, en un catálogo compartido
5paquetes compartidos entre las apps
59tests de Playwright, en escritorio y a 375px
(03) Arquitectura

Tres decisiones que lo definieron.

  1. 01

    Un login para todos los subdominios

    Por qué. Cada producto se despliega en su propio subdominio. Una sola instancia de Clerk comparte la sesión por el dominio padre. Los módulos contratados viajan en el token, así cada app chequea el acceso sin ir a la base.

    El costo. El token tiene un límite de tamaño, así que sólo van los ids de los módulos. Un producto con dominio propio queda afuera del login compartido.

  2. 02

    Marca y precios como código, no como texto

    Por qué. Colores, nombres y precios viven una sola vez en paquetes de TypeScript. La calculadora de precios y el recomendador de plan usan las mismas funciones puras. Los tokens se compilan a CSS, así una app de React Native puede importar los mismos valores.

    El costo. Los tokens necesitan un paso de generación. Si alguien cambia el TypeScript y no lo corre, el CSS queda viejo.

  3. 03

    Desarrollo local en subdominios, no en puertos

    Por qué. Los navegadores comparten cookies entre puertos, así que un test de login en localhost pasa por la razón equivocada. Un proxy Caddy sirve cada app en un subdominio de vimo.localhost. Los tests ven las mismas reglas de cookies que producción.

    El costo. Correrlo en local pide Docker y algunos pasos más. La suite E2E además levanta cuatro repos hermanos.

(04) GaleríaSeguí scrolleando →
Sitio público
Sitio público · La home que vende la suite. Los datos de cada producto salen del catálogo compartido.
Calculadora de precios
Calculadora de precios · Los precios los calculan las mismas funciones que usa el recomendador de plan.
Portal después del login
Portal después del login · Los productos contratados llevan a su app. El resto lleva a una página que cotiza sumarlo.
Nivel, adentro de la suite
Nivel, adentro de la suite · El producto de stock y punto de venta mantiene su interfaz y suma el selector de productos compartido.
(05) Qué haría después
01Sumar CI. El repo no tiene workflows, así que typecheck, lint, tests y los 59 E2E se corren a mano.
02Sincronizar los módulos contratados desde la facturación a Clerk con un webhook. Hoy se cargan a mano por API.
03Pasar NEXORA a los paquetes compartidos de auth y shell. Entró al workspace, pero sigue con su propio login.
Próximo proyecto · 02 / 09
Reality Graph →Un grafo de conocimiento interactivo en 3D, en inglés y español
Caso · 01 / 09

Vimo

Un sitio, un portal y un login para una suite de productos SaaS para pymes de Argentina.

Rol
Implementación del diseño, arquitectura y frontend
Stack
Next.js 16, React 19, TypeScript, Clerk, Turborepo, Playwright
Vimo
(01) El problema

Vimo agrupa siete productos, y cada uno vivía en su propio repo. No había un sitio que los vendiera juntos, ni un portal después del login, ni una marca común. El diseño repetía el precio y el color de cada producto en cuatro pantallas distintas.

Mi rolConvertí un handoff de diseño en un monorepo que anda, y logré que los productos compartan un solo login.
(02) Resultados
7productos definidos una sola vez, en un catálogo compartido
5paquetes compartidos entre las apps
59tests de Playwright, en escritorio y a 375px
(03) Arquitectura

Tres decisiones que lo definieron.

01

Un login para todos los subdominios

Por qué. Cada producto se despliega en su propio subdominio. Una sola instancia de Clerk comparte la sesión por el dominio padre. Los módulos contratados viajan en el token, así cada app chequea el acceso sin ir a la base.

El costo. El token tiene un límite de tamaño, así que sólo van los ids de los módulos. Un producto con dominio propio queda afuera del login compartido.

02

Marca y precios como código, no como texto

Por qué. Colores, nombres y precios viven una sola vez en paquetes de TypeScript. La calculadora de precios y el recomendador de plan usan las mismas funciones puras. Los tokens se compilan a CSS, así una app de React Native puede importar los mismos valores.

El costo. Los tokens necesitan un paso de generación. Si alguien cambia el TypeScript y no lo corre, el CSS queda viejo.

03

Desarrollo local en subdominios, no en puertos

Por qué. Los navegadores comparten cookies entre puertos, así que un test de login en localhost pasa por la razón equivocada. Un proxy Caddy sirve cada app en un subdominio de vimo.localhost. Los tests ven las mismas reglas de cookies que producción.

El costo. Correrlo en local pide Docker y algunos pasos más. La suite E2E además levanta cuatro repos hermanos.

(04) Galería
Sitio público
Sitio público · La home que vende la suite. Los datos de cada producto salen del catálogo compartido.
Calculadora de precios
Calculadora de precios · Los precios los calculan las mismas funciones que usa el recomendador de plan.
Portal después del login
Portal después del login · Los productos contratados llevan a su app. El resto lleva a una página que cotiza sumarlo.
Nivel, adentro de la suite
Nivel, adentro de la suite · El producto de stock y punto de venta mantiene su interfaz y suma el selector de productos compartido.
(05) Qué haría después
01Sumar CI. El repo no tiene workflows, así que typecheck, lint, tests y los 59 E2E se corren a mano.
02Sincronizar los módulos contratados desde la facturación a Clerk con un webhook. Hoy se cargan a mano por API.
03Pasar NEXORA a los paquetes compartidos de auth y shell. Entró al workspace, pero sigue con su propio login.
Próximo proyectoReality Graph →
Nahuel SantillánES