A-05
Madernoa
Materiales para arquitectura y construcción del NOA. Landing en Astro, bot de WhatsApp y un servidor MCP que le da el catálogo al bot.
This sheet is not translated yet. Shown in Spanish.
| Client | Madernoa · Tucumán |
|---|---|
| Type | freelance |
| Platform | Astro · Cloudflare |
| Year | 2026 |
| Role | Full-stack, end to end |
| Stack | Astro 5 · CSS nativo (oklch) · Cloudflare Workers · Supabase Postgres · Hyperdrive · pg_trgm · Zod |
| Commits landing | 32 commits |
| Commits MCP | 46 commits |

Contexto
Madernoa vende materiales de construcción en el norte argentino. Necesitaba dos cosas que suelen tratarse por separado: presencia web propia y un bot de WhatsApp que sepa responder por precio y stock sin que alguien copie y pegue de una planilla.
Opciones
Para el bot, lo habitual es cargarle un PDF del catálogo o pegarle el listado en el prompt. Funciona el primer día y envejece mal: el precio cambia y el bot sigue afirmando el viejo, con la misma seguridad.
Decisión
Separar la landing del dato. La landing es Astro 5 con CSS nativo y oklch, sin framework
de estilos: es una landing, no necesita 40 KB de utilidades.
El catálogo va aparte, en Postgres sobre Supabase, y se expone al bot como un servidor MCP corriendo en un Cloudflare Worker. El bot no tiene el catálogo adentro: lo consulta. Cuando cambia un precio en la planilla, el bot responde el precio nuevo sin que nadie toque el bot.
Dos detalles de base de datos que hacen la diferencia en búsqueda en español:
unaccent para que «cemento» encuentre «Cemento», y pg_trgm para que un nombre mal
escrito igual encuentre el producto. Entre el Worker y Postgres va Hyperdrive, porque abrir
una conexión nueva por consulta desde el edge es caro.
Verificación
madernoa.com responde 200. La ingesta es un script de Node que lee el Excel del cliente y lo normaliza; los tipos y los esquemas Zod son compartidos entre los paquetes del monorepo.
Consecuencias
Son tres piezas en vez de una, y hay que saber cuál falló cuando algo no responde. A cambio, el dato tiene un solo dueño y el bot no puede mentir por estar desactualizado.