Sitio estático de N2N (https://n2n.com.ar) — infraestructura digital B2B para operaciones industriales.
Sitio corporativo estático servido por GitHub Pages detrás de Cloudflare. Documenta el framework de trabajo, servicios, casos, industrias atendidas y base de conocimiento de N2N.
index.html # Home
framework/ # Framework de arquitectura comercial digital
industrias/ # Páginas por industria atendida
servicios/ # Capas de servicio
casos/ # Casos de estudio
conocimiento/ # Base de conocimiento y guías
comparar/ # Comparativas de enfoque
glosario/ # Glosario de términos
contacto/ # Contacto
mvp-start/ # Producto de entrada — diagnóstico pago (standalone, sin nav ni footer)
control/ # Eje Control Operativo — Protocolo CERO (standalone, fuera del nav)
descargas/ # PDFs descargables (n2n-mvp-start.pdf, n2n-protocolo-cero.pdf)
legal/ # Páginas legales
css/ js/ fonts/ img/ # Assets estáticos
404.html # Página de error
CNAME # Dominio custom (n2n.com.ar)
| Capa | Tecnología |
|---|---|
| Sitio | HTML/CSS/JS estático |
| Hosting | GitHub Pages |
| CDN / DNS | Cloudflare |
| Analytics | Google Analytics 4 (G-07T9PCBG7P) |
| Formularios | Web3Forms |
Push a main → publicación automática vía GitHub Pages (~2 minutos). El repo público ES producción.
git add .
git commit -m "contenido: descripcion"
git push origin main- Fuente de verdad única — no hay copia en servidor Hetzner
- Sin Hugo, sin generador — HTML directo editado a mano
- Analytics: Google Analytics 4 — G-07T9PCBG7P
- AI crawlers permitidos (robots.txt + llms.txt)
- main = producción
- PDFs generados con WeasyPrint mediante scripts versionados en la raiz del repo
<title>de maximo 62 caracteres. Google trunca alrededor de los 60 y un title cortado rompe la linea clickeable del resultado.- Sin sufijo de marca en el title. Agregar
— N2Nconsume 7 de los 60 caracteres disponibles y no aporta diferenciacion entre resultados propios. - Sin capitalizacion tipo titulo: el espanol no la usa y ocupa mas ancho visual en el SERP.
og:titleytwitter:titlesiempre sincronizados con<title>. Si divergen, el sitio dice cosas distintas segun el canal.- El
headlinedel JSON-LD NO sigue al<title>: se alinea con el<h1>de la pagina, que es el titulo real del articulo. - Las
meta descriptionlargas quedan como aviso aceptado del diagnostico. El rango 120-158 es una referencia, no un fallo: Google reescribe la description en la mayoria de los resultados.
Los scripts viven en _scripts/. El guion bajo hace que GitHub Pages
no los publique: en la raiz quedaban servidos por HTTP con rutas del
filesystem local adentro. Ejecutarlos desde la raiz del repo:
python3 _scripts/nombre.py.
Auditores read-only, correr antes de cada commit:
diagnostico_sitio_v3.py (metadatos y SEO) y
diagnostico_estructural_v4.py (sintaxis, JSON-LD, semantica, deuda).
| Script | Funcion |
|---|---|
diagnostico_sitio_v3.py |
Auditor read-only vigente. Umbrales alineados al criterio editorial (title <= 62, description 120-158), auditoria de sincronizacion de og y twitter, robots.txt completo. |
diagnostico_sitio_v2.py |
Auditor anterior. Se conserva para comparar salidas. Umbrales 60 / 100-160 y sin chequeo de sincronizacion. |
acortar_titles_v1.py |
Acorto 25 titles que se truncaban en SERP y sincronizo og:title / twitter:title. |
reescribir_descriptions_hubs_v1.py |
Reescribio las 7 descriptions cortas de las hub pages al rango 120-158. |
exportar_descriptions_largas_v1.py |
Read-only. Vuelca a Markdown las descriptions que superan el maximo, para trabajarlas fuera del repo. |
aplicar_descriptions_largas_v1.py |
Reescribio 28 descriptions largas al rango y sincronizo og y twitter. |
insertar_diagnosticos_precios_v1.py |
Inserto en /precios/ el bloque con las dos entradas de precio fijo. Saco a /mvp-start/ y /control/protocolo-cero/ de huerfanas. |
agregar_twitter_nosotros_v1.py |
Agrego twitter:title y twitter:description a /nosotros/, la unica pagina que no los tenia. |
reescribir_caso01_control_v1.py |
Reescribio /casos/caso-01/ desde el eje Control: contenido, metadatos en los tres canales y headline JSON-LD. Caso anonimizado a 'un distribuidor de cadena de frio'. |
sincronizar_refs_caso01_v1.py |
Sincronizo las referencias externas a caso-01: card e ItemList de /casos/, linea de llms.txt y lastmod del sitemap. |
anonimizar_casos_a2_v1.py |
Anonimizo caso-03 (razon social y rubro) para que caso-01 no sea reconstruible por cruce. Reescribio title y description de caso-02 y caso-03, que describian casos distintos. Saco la enumeracion de sistemas de la bio en llms.txt. |
diagnostico_estructural_v4.py |
Auditor read-only complementario. Parseo real de HTML, validacion de JSON-LD, jerarquia de headings y accesibilidad, deuda tecnica, y volcado del contenido a TXT para revision semantica. |
corregir_semantica_hubs_v1.py |
Elimino la contradiccion de /casos/ (declaraba casos modelados y a la vez sistemas reales), unifico el h1 de caso-01 al criterio descriptivo de caso-02 y caso-03, y acorto el h1 de /nosotros/ que era una oracion de 113 caracteres. |
diferenciar_h1_intencion_v1.py |
Reescribio 12 h1 que abrian con la misma keyword y competian entre si. Solo la pagina definicional conserva el termino; el resto abre con su propio diferenciador. |
cerrar_promesas_control_v1.py |
Sumo al glosario los 5 pilares de Protocolo CERO (cuerpo y JSON-LD), corrigio la description que declaraba 13 terminos en EN/ES/PT-BR sin soporte multilingue, y revirtio el h1 de /conocimiento/ que anunciaba control sin articulos del eje. |
dimensionar_logos_techstrip_v1.py |
Agrego width y height a los 8 logos de la franja de infraestructura de la home, que provocaban salto de layout al cargar. 40x40, el mismo valor que ya fija el CSS. |
reescribir_titles_intencion_v1.py |
Reescribio 19 titles en los tres canales: 8 hubs que no decian nada, 8 que canibalizaban la keyword principal, y 3 con sufijo de marca inconsistente. |
crear_articulo_faltante_no_atribuible_v2.py |
Publico /conocimiento/faltante-no-atribuible/, primer articulo del eje Control en el hub de conocimiento. Ancla el pilar 05 (integracion con sistemas operativos) y enlaza a protocolo-cero, caso-01 y glosario, que tenian un solo enlace entrante. Alta en el indice y en el sitemap. |
corregir_head_faltante_no_atribuible_v1.py |
Cerro los 3 fallos del articulo nuevo mas el alta en llms.txt: bloque GA4 ausente y rutas og-n2n.png y carlos-petit.png que en el repo son .jpg. Origen del defecto: la plantilla del skill de publicacion esta desactualizada. |
Todos los scripts de escritura siguen el mismo patron: backup verificable, validacion sin escribir, escritura, verificacion posterior. Son idempotentes y abortan ante cualquier estado inesperado.
N2N — https://n2n.com.ar