Conqr: la evolución
de Wix a una plataforma viva con motor 3D

De Wix a un concepto en HTML, y de ahí a una plataforma viva, bilingüe y editable, con su propio motor 3D. Un año de aprendizaje dentro de Conqr convertido en producto.

Cliente
Conqr
Rol
Desarrollo, motor 3D, arquitectura WordPress, infraestructura y lanzamiento
Año
2026
Duración
9 días, 6 jornadas
Stack
WordPress · Elementor Pro · Polylang · Three.js · GSAP · Lenis · PHP-FPM · Redis
Resultado
De 3.99 a 766 req/s en la Home, CLS 0 y 151 URLs en dos idiomas

En Conqr, la agencia donde trabajo, llevé su sitio de un concepto en HTML cerrado a WordPress + Elementor Pro + Polylang, con un motor 3D propio, en 9 días. Lo lancé en conqr.mx el 30 de octubre de 2026: bilingüe, editable por el equipo y de 3.99 a 766 peticiones por segundo en la Home.

Tres momentos de un sitio

Home de Wix en abril de 2026, recuperada del Wayback Machine

01 · Wix

El sitio vivía en Wix. Cuando el dominio se movió, ya no respondía, y su mapa de URLs hubo que reconstruirlo desde el Wayback Machine.

El Wayback Machine guardó el texto y la maqueta, no las imágenes ni los vídeos de Wix: por eso salen como cuadros vacíos.

Comparativa de QA: concepto original a la izquierda y WordPress a la derecha

02 · Concepto HTML

Un prototipo precioso y cerrado: un solo archivo de lógica, una hoja de 57 KB y los medios en base64. Se veía como el sitio que Conqr quería ser, pero nadie del equipo podía cambiarle una coma.

Su peso real no se pudo medir: sus archivos de datos en base64 nunca llegaron. Los medios que sí llegaron suman ~1 MB en base64, sin contar el vídeo.

Primera pantalla de la Home de conqr.mx en producción

03 · Plataforma

WordPress + Elementor Pro + Polylang, con un motor 3D propio: bilingüe, editable con clic y en producción en conqr.mx.

151 URLs en dos idiomas, todas en 200 e indexables.

El mismo recorrido, antes y después

Intro → hero → manifiesto. A la izquierda, el concepto HTML (en la reconstrucción que usó la QA, sin el vídeo cromado que nunca llegó); a la derecha, conqr.mx.

«El original manda»

La primera regla del proyecto cabe en una línea: si hay duda, el original manda. No se trataba de «parecerse»: cada sección se midió contra el original servido en local, en 1440×900 y en 390×844, en inglés y en español.

  • Header: ∆ 0.00 px en 14 piezas × 8 combinaciones.
  • Menú abierto: ∆ 0.00 px en 40 piezas × 4 combinaciones, con los estilos calculados iguales.
  • Intro de la Home: con el reloj congelado y el azar con semilla fija, 0 px distintos en los frames de 0.5, 2, 3.5, 4.3 y 5 s.
  • Hero y manifiesto: ∆ 0.00 px y el mismo largo de pin (4 140 px en escritorio, 3 882 en móvil).

Medir así también destapó errores del propio original: un footer que desbordaba 7 px en español móvil y un pin que en móvil se alargaba porque la página se salía de lado. Esos errores no se copiaron. El original manda, pero se mide.

Las 8 hojas de QA

Original a la izquierda, WordPress a la derecha. Toca una para verla completa.

El motor 3D un vídeo convertido en objeto vivo

La figura cromada que respira y cambia de forma era un vídeo. Ahora es un objeto vivo: se abulta hacia el cursor, rebota si la tocas, gira si la arrastras, salta a su siguiente forma con doble clic y en el iPhone responde al dedo. Sigue el mismo ciclo del vídeo original, cada 10 segundos: esfera, toro, toro triangular, cruz, trébol, esfera ondulada y de vuelta a la esfera.

Bajo el capó
Diagrama del motor 3D: el ciclo de formas de 10 segundos y las capas, de la geometría y el ruido en el shader al material cromado y la copia a cada vista.

Un renderer compartido

Un solo WebGLRenderer para toda la página. Cada figura se dibuja en su recuadro y se copia a su propio canvas 2D: un único contexto WebGL sin importar cuántas figuras haya, y cada una conserva su lugar en el DOM.

Shaders con ruido

La forma vive en el vertex shader, con ruido simplex en dos octavas que hace «líquida» la superficie.

Material

Metal físico con un entorno de paneles azules generado en código, sin descargar ningún HDR.

Física amortiguada

Abultamiento al cursor, rebote al clic y giro al arrastrar, con física amortiguada.

Medir antes que imitar

El ciclo se midió en 40 frames reales del vídeo: IoU de silueta 40/40 con la meta de la QA en ≥ 0.90, media 0.960 y mínimo 0.932 (antes del ajuste: 29/40, media 0.919).

Rendimiento

JavaScript por frame: 1.75 ms en escritorio, 8.62 ms con la CPU 4× más lenta y 3.77 ms en un móvil emulado con CPU 4×. Todo cabe en los 16.7 ms de un frame a 60 fps. Los fps del servidor de pruebas no cuentan: no tiene GPU y dibuja el WebGL por software.

Respaldo sin WebGL

Un solo requestAnimationFrame que se detiene fuera de pantalla o con la pestaña oculta, calidad baja automática en equipos modestos y, sin WebGL, una imagen fija que renderizó el propio motor.

Experiencias que se sienten

Intro de la Home: cubos con la C → «conqr.» → hero con la figura 3D.
Zoom del hero: la figura crece con el scroll hasta llenar la pantalla y abre el manifiesto.
con·quer: la palabra con el cromo en vivo dentro de las letras y el cursor cromado encima.
Carrusel de Expertise 01→08 con scroll suave y salida hacia el footer.
Cortinilla entre páginas: muestra el título de destino de principio a fin.
Menú con vista previa 3D por sección y cambio EN → ES.
About: three reasons why en escenas 2.5D y el mapa con arcos desde CDMX.
Móvil 390×844: la figura responde al dedo con arrastre, lanzamiento y doble toque.

Editable por cualquiera

Un sitio bonito que nadie puede tocar envejece en semanas. La segunda regla fue: todo lo que pueda vivir en Elementor vive en Elementor. Cada pieza del original se clasificó en tres tipos:

NATIVO

Elementor puro.

NATIVO + BEHAVIOR

Contenedores normales con una clase cq-* que les da movimiento. Por ejemplo, cq-hscroll convierte una fila de contenedores en el carrusel horizontal pinneado.

WIDGET

Solo lo que Elementor no sabe hacer, siempre con sus controles en el panel.

23widgets propios
14behaviors
162secciones revisadas
0sin poder editarse

136 secciones se editan con clic directo y 26 desde el editor de WordPress o solas. El equipo recibió una guía de 6 páginas con capturas reales.

Dos idiomas, una sola plataforma

El inglés es la base, en /, y el español vive en /es/, con slugs propios: /about/ ↔ /es/nosotros/ y /work/ ↔ /es/portafolio/. Polylang gratis no permite el mismo slug en dos idiomas; el plugin propio lo resuelve con filtros y reglas de reescritura, y manda un 301 cuando se entra por el idioma equivocado. El botón EN/ES navega a la traducción y vuelve al mismo punto del scroll, sin repetir la intro.

151URLs en el sitemap
73en inglés
78en español

La ingeniería invisible lo que nadie ve, pero todos notan

Diagrama de arquitectura de conqr.mx: navegador, WordPress con Elementor Pro y el plugin propio, Polylang, servidor con caché y PHP, y correo con SPF, DKIM y DMARC.

Servidor y caché

PHP-FPM, OPcache de 256 MB, Redis propio y caché de página en la que Apache entrega el HTML sin pasar por PHP. La Home pasó de 3.99 a 766 peticiones por segundo con 10 usuarios.

Correo

Sale firmado con DKIM, con SPF, DKIM y DMARC en pass. Se envía solo desde un dominio que pasa las tres revisiones.

SEO

Una meta description única por URL, Open Graph, datos estructurados, hreflang y un sitemap con Yoast sin perder los títulos de antes.

Formularios

Formularios con el embed oficial de Jotform en Contact, vacantes y el portal interno.

Portal interno

4 páginas internas noindex, fuera del sitemap y de la caché.

301 desde Wix

341 redirecciones desde las URLs viejas de Wix, con el inventario reconstruido desde el Wayback Machine.

Línea del tiempo 22 → 30 de octubre de 2026

9 días naturales y 6 jornadas de trabajo. El 24 y el 25 no hay entradas en la bitácora; la jornada del 27 terminó en la madrugada del 28.

  1. 01

    Reconocimiento

    22 oct

    Inventario de cada sección del original y clasificación NATIVO / NATIVO + BEHAVIOR / WIDGET.

  2. 02

    Cimientos

    22 oct

    Tema hijo, Polylang, plugin propio, tipos de contenido y contenido sembrado en EN y ES.

  3. 03

    Motor 3D

    22 → 27 oct

    La figura en vivo reemplaza al vídeo; el 26 se midió contra 40 frames (IoU 40/40).

  4. 04

    Header, intro y menú

    22 → 23 oct

    ∆ 0.00 px en header y menú; 0 px distintos en la intro.

  5. 05

    Home completa

    26 → 27 oct

    Hero, manifiesto, con·quer, Expertise, footer, cortinilla y cursor cromado.

  6. 06

    Páginas interiores

    27 oct

    About, Expertise, Work, Careers, Blog, Contact y 404, de 01:00 a 01:50.

  7. 07

    Editable por cualquiera

    27 → 28 oct

    162 secciones revisadas, ninguna sin poder editarse, y la guía del equipo.

  8. 08

    Servicios y casos

    27 → 30 oct

    URLs finales por idioma con 301 y el nuevo servicio SEO & GEO (8 en total).

  9. 09

    About · escenas 3D

    29 oct

    Tres fotos convertidas en escenas por capas.

  10. 10

    Blog

    27 → 29 oct

    20 pares EN↔ES enlazados y 152 URLs viejas con 301.

  11. 11

    Portal interno de RH

    29 oct

    4 páginas internas noindex, fuera de la caché.

  12. 12

    Rendimiento

    26 → 30 oct

    PHP-FPM, OPcache, caché de página y Redis propio: de 3.99 a 766 req/s.

  13. 13

    SEO

    27 → 30 oct

    hreflang, meta descriptions únicas, OG, JSON-LD y Yoast con 151 URLs.

  14. 14

    Lanzamiento en conqr.mx

    30 oct, 00:24–00:40

    16 minutos, compuerta 503 de 00:30 a 00:39 y 341 reglas 301 desde Wix.

  15. 15

    Pulido final

    30 oct

    Scroll suave, cortinilla, SVG seguro, favicon adaptable, redes y Yoast.

Los 8 retos problema, por qué, solución y regla

01 Un vídeo cromado en base64 convertido en un motor 3D en vivo

+
-

Problema

El concepto mostraba su figura cromada como un vídeo de 10 s incrustado en base64, en el hero, en las letras de con·quer, en el menú, en el cursor y en los heroes interiores. Y la regla fue no cargar nunca los archivos en base64 del original.

Por qué pasó

El concepto se hizo como un prototipo autocontenido: el vídeo era la forma más rápida de mostrar la figura, pero no se podía editar, pesaba en el HTML y no reaccionaba al usuario.

Cómo se resolvió

El vídeo se reemplazó por una figura 3D en vivo (Three.js r160, local). El ciclo se midió en 40 frames reales, uno cada 0.25 s: de 29/40 frames con IoU ≥ 0.90 (media 0.919) a 40/40 (media 0.960, mínimo 0.932).

Qué regla quedó

El original manda, pero se mide: cada parecido se valida con números contra la referencia, y nada se carga en base64.

Matiz. La meta de la QA fue IoU ≥ 0.90. Que los 40 frames también pasen de 0.93 se desprende del mínimo, pero 0.93 no fue la meta declarada.

02 Un solo renderer WebGL compartido

+
-

Problema

La figura aparece a la vez en el cursor, el menú, el hero, flotantes, miniaturas y escenas de About, y cada aparición necesita su propio lugar en el DOM: encima del menú, detrás de las letras con multiply, con máscaras y flotación.

Por qué pasó

Un canvas WebGL por vista multiplica los contextos, y los navegadores limitan cuántos contextos activos puede tener una página. Un canvas fijo a pantalla completa obliga a que todo vaya encima o debajo del contenido.

Cómo se resolvió

Un solo WebGLRenderer fuera del DOM: cada vista se dibuja en su recuadro y se copia con drawImage a su canvas 2D. Un solo requestAnimationFrame, pausa fuera de pantalla o con la pestaña oculta, y una imagen fija si no hay WebGL.

Qué regla quedó

Los widgets consumen el motor y no lo duplican: una sola API y un solo contexto.

Matiz. La bitácora justifica la decisión con el contexto único y el orden de las capas; no cita un número concreto de límite de contextos.

03 Todo editable en Elementor sin perder las animaciones

+
-

Problema

El equipo tenía que cambiar textos, imágenes, colores y orden sin tocar código, y el sitio debía conservar pins de scroll, timelines de GSAP, cursor magnético, efectos líquidos y la figura 3D.

Por qué pasó

Elementor no hace de forma nativa canvas, WebGL, scroll pinneado ni efectos líquidos, y convertir cada sección en un widget cerrado mata la edición con clic.

Cómo se resolvió

Clasificar cada pieza en NATIVO, NATIVO + BEHAVIOR o WIDGET: 23 widgets y 14 behaviors. 162 secciones revisadas, 136 con clic directo, 26 desde el editor de WordPress o automáticas y 0 sin poder editarse.

Qué regla quedó

Todo lo que pueda vivir en Elementor vive en Elementor. Lo que no, es un widget con controles, nunca código suelto.

04 WP-CLI como root tiró el staging unos 5 minutos

+
-

Problema

El 26 de octubre, al activar la caché de página, el sitio de staging dio error 500 durante unos 5 minutos.

Por qué pasó

Con PHP-FPM, PHP corre como el usuario de la cuenta. WP-CLI se ejecutó como root y el plugin reescribió la configuración con root como dueño; PHP-FPM ya no pudo leerla.

Cómo se resolvió

Se devolvieron el dueño y los permisos correctos. Fue en staging, no en producción.

Qué regla quedó

WP-CLI siempre como el usuario de la cuenta, nunca como root. Es la primera regla del documento del sitio de producción.

05 Lanzamiento sin ventana de sitio roto

+
-

Problema

Había que pasar a conqr.mx sin que nadie viera un sitio a medias, con el DNS del dominio ya apuntando al servidor nuevo y el sitio de Wix sin responder.

Por qué pasó

No había un sitio viejo que conservar en paralelo: el dominio ya estaba en el servidor nuevo.

Cómo se resolvió

Respaldo completo, copia y cambio de URLs, caché armada de nuevo y una compuerta 503 de «próximamente» con Retry-After y noindex de 00:30 a 00:39. Se abrió con el OK del cliente y a las 00:54 ya estaban las 341 reglas 301 desde Wix.

Qué regla quedó

Publicar detrás de una compuerta y verificar desde fuera antes de abrir. Cada URL vieja tiene destino.

Matiz. «Cero caída» se sostiene como «sin ventana de sitio roto»: durante 9 minutos los visitantes vieron un 503 de «próximamente», que es lo correcto para buscadores.

06 DNS sin MX ni SPF: el correo se cayó

+
-

Problema

Al publicar, el DNS de conqr.mx quedó sin registros MX ni SPF, y los buzones de Google Workspace dejaron de recibir.

Por qué pasó

Al mover el DNS hacia el servidor nuevo desaparecieron los registros de correo, y el servidor tenía en caché el DNS viejo, que lo escondía.

Cómo se resolvió

Se avisó al momento y el cliente repuso MX, SPF, DKIM y DMARC cerca de las 02:00. Una prueba de entrega a las 01:59 quedó completada.

Qué regla quedó

Revisar los MX contra un DNS público, nunca contra el resolver local, y enviar solo desde un dominio con SPF, DKIM y DMARC en pass.

Matiz. No hubo correos en spam por DMARC: se documentaron el riesgo y la regla que lo evita. El «spam» real fue el relay que rechazó 3 reportes por su contenido; se reescribió el texto y pasó.

07 El panel 8 del carrusel y el scroll brusco

+
-

Problema

En el carrusel de Expertise, el último panel quedaba corrido, la luz del fondo se apagaba al regresar y la salida al footer se sentía como un golpe.

Por qué pasó

El pin terminaba justo donde terminaba la pista, el script del footer guardaba la opacidad «de la carga» y la rueda movía el scroll a saltos.

Cómo se resolvió

Un tramo final de reposo del 30 % en el pin, la luz guarda su opacidad al llegar al footer y scroll suave con Lenis sincronizado con ScrollTrigger. Sin Lenis con reduced-motion ni en el editor.

Qué regla quedó

Ninguna animación ligada al scroll guarda estado «de la carga».

08 Un favicon SVG bloqueado y la versión adaptable

+
-

Problema

El logo en SVG no se pudo subir a la Biblioteca y, después, el logo negro casi desaparecía en las pestañas oscuras.

Por qué pasó

WordPress no admite SVG por defecto, y un ícono de un solo color no se ve bien a la vez sobre pestañas claras y oscuras.

Cómo se resolvió

SVG con limpieza al subir y solo para administradores. El favicon final es adaptable: negro en pestañas claras y blanco en oscuras.

Qué regla quedó

SVG solo con limpieza y solo para administradores; el ícono del sitio lo imprime un solo lugar del código.

Matiz. WebKit de pruebas no cambia el SVG a blanco en modo oscuro (Chromium sí). Falta revisarlo en Safari real.

Cómo trabajo mi diferenciador

  1. 1

    Planeación con Claude

    Fases, reglas y qué decide el cliente, antes de tocar el servidor.

  2. 2

    Prompts cortos por fase

    Al terminar cada una: parar, reportar, esperar.

  3. 3

    Ejecución con Claude Code

    En el servidor, con WP-CLI como el usuario de la cuenta, scripts que se pueden repetir y nada en el núcleo de WordPress ni de Elementor.

  4. 4

    Respaldo antes de cada cambio

    135 momentos de respaldo en 6 jornadas.

  5. 5

    QA medida

    Chrome, Safari y móvil, en inglés y en español. Medidas, no impresiones.

  6. 6

    Reporte por paso

    122 reportes de trabajo en 9 días: qué se hizo, qué cambió, el respaldo y lo pendiente.

  7. 7

    El documento del proyecto como memoria

    Reglas, decisiones y comandos exactos, para que cada sesión empiece donde terminó la anterior.

La IA acelera; yo dirijo, decido y verifico. La IA escribió mucho código. El criterio, las reglas y la decisión de qué no hacer fueron humanos.

Resultados antes y después

3.99766req/s

Peticiones por segundo en la Home con 10 usuarios

2.6 s20 ms

p95 de respuesta de la Home

0.940

CLS (desplazamiento de diseño) frente al concepto

91100

SEO de la Home en Lighthouse

341redirecciones 301 desde Wix
~20 000líneas de código propio
9días de proyecto
16minutos de lanzamiento

Lighthouse en producción, mediana de 3 corridas: SEO 100 y CLS 0 en las cinco páginas medidas. El rendimiento queda entre 54 y 66 en móvil porque el servidor de pruebas no tiene GPU y dibuja la figura 3D por CPU; el concepto puntúa más alto ahí porque no dibuja ninguna figura. Los datos del concepto vienen de la reconstrucción que usó la QA.

Lo que aprendí

  • Medir es la forma de respetar un diseño. «Se ve igual» no es un criterio; «∆ 0.00 px» sí.
  • La arquitectura gana antes que la optimización. Un solo contexto WebGL resolvió de una vez el rendimiento, las capas y los límites del navegador.
  • Editable no es un extra. Es lo que decide si un sitio sigue vivo dentro de seis meses.
  • La IA acelera, el método protege. Respaldos, reportes y un documento vivo convirtieron la velocidad en algo confiable.
  • Los lanzamientos fallan por lo que no es código. El sitio salió a tiempo; lo que se cayó fue el DNS del correo.

Créditos

Diseño visual: equipo de diseño de Conqr.

Desarrollo, motor 3D, arquitectura en WordPress, infraestructura, migración y lanzamiento: Samuel Torres, con Claude y Claude Code como copilotos de IA.

¿Quieres algo así en tu sitio? Agenda 20 minutos y lo revisamos juntos.

Agendar 20 min

Contacto profesional:

Ciudad de México

Ciudad de México, México Disponible inmediatamente

Disponibilidad

Proyectos remotos y presenciales MXN · USD

© 2026 Ing. Samuel Torres. Ingeniería aplicada.

English version