Antes de escribir código, necesitas fontanería

Pero “construir” no empieza con la primera pantalla. Empieza con algo mucho menos glamuroso que va en paralelo: instalar cosas, conectar servicios, configurar credenciales.

Cosas que haces mientras empiezas a levantar las primeras pantallas, no antes. Es como reformar una casa. Antes de elegir los azulejos del baño, necesitas saber dónde van las tuberías. Nadie presume del desagüe en Instagram, pero sin él no funciona nada.

Este post va de eso. De las tuberías.


El stack como decisión de producto

Cuando montas un proyecto de software, una de las primeras cosas es elegir tu “stack”: las herramientas y tecnologías sobre las que vas a construir todo. Es una decisión que parece puramente técnica, pero es también de producto. Porque una vez que eliges, cambiar es carísimo.

Para Savía, yo no elegí las herramientas porque fueran “las mejores”. Las elegí porque Claude las conoce bien, tienen buena documentación, y me permiten mantener el control sin tener conocimientos de desarrollo.

Cuando tu equipo técnico es una IA, el criterio de selección cambia. No es “qué tecnología es superior”. Es “con qué puedo avanzar sin quedarme bloqueada cada dos horas”.

Estas son las siete piezas de Savia, en el orden en que las fui montando (aunque obviamente no fue un proceso 100% lineal).

  • Node.js — el motor. Es lo que permite ejecutar JavaScript fuera del navegador. Lo primero que instalas, como echar gasolina antes de arrancar el coche. Cinco minutos con Homebrew y listo.

  • Next.js — el framework. La estructura de la casa: paredes, techos, distribución de habitaciones. Viene con TypeScript, Tailwind CSS y un montón de convenciones que te ahorran decidir cosas. Un comando (npx create-next-app) y tienes un proyecto funcionando.

  • Shadcn/UI — los componentes prefabricados. Botones, formularios, tarjetas, menús. En vez de diseñar cada pieza desde cero, coges las que necesitas y las adaptas. El IKEA del diseño web.

  • Supabase — la base de datos en la nube. Donde viven los usuarios, los perfiles, las sesiones. También gestiona la autenticación: que la gente pueda registrarse y hacer login. Todo en un servicio. Disclaimer: es uno de los servicios que he tenido que invertir más tiempo en entender. Con futuras decisiones y cambios, tendré que pasar por aquí para ejecutar queries imprescindibles para aplicar esos cambios.

  • Resend — el servicio de emails. Que tu app pueda hablar con los usuarios: confirmación de registro, notificaciones de nuevas sesiones, recordatorios. Sin esto, tu producto es mudo. Disclaimer: este servicio que parecía relativamente sencillo es uno de los que más quebraderos de cabeza me acabó dando.

  • GitHub — donde vive el código. Cada cambio queda registrado, como un historial médico del proyecto. Si algo se rompe, puedes volver al estado anterior. Y tiene una cosa que no esperaba necesitar tan pronto: un pipeline automático que, cada vez que subes código, ejecuta verificaciones antes de que llegue a producción. Un vigilante que no duerme.

  • Vercel — donde vive el proyecto en internet. Conectas tu código, le das a un botón, y tu producto está online. Cada vez que haces un cambio, se despliega automáticamente. Disclaimer: un sitio amado y odiado a la vez. Si el deploy va bien, lo amas. Si el deploy falla y no entiendes por qué, lo odias.

Distintas piezas que forman un stack que una persona no técnica puede operar con ayuda de IA. Y eso, para mí, era el criterio que importaba.


Tu base de datos es tu producto

De todo lo anterior, hubo una parte que fue la que más “miedo” me daba: diseñar la base de datos. ¿Por qué? Porque cada tabla, cada columna, cada restricción es una decisión de negocio codificada.

Savia tiene cuatro tablas. Así las pensamos:

users — El directorio. Solo dos roles posibles: mentor o mentee. Nada de “admin”, “superusuario” ni “rol dual”. Decisión consciente de simplificar. Un usuario, un rol. Nada más. Disclaimer: se que habrá que cambiar esto en algún momento. Hay desde el inicio feedback de usuarios que quieren tener rol doble y poder mentorizar y ser mentorizados a la vez. Lo he dejado fuera por ahora para no complicar demasiado la estructura de partida. Es muy posible que más adelante vea que fue un error y que migrar todo sea complejo.

mentor_profiles — El perfil exigente. Bio obligatoria de 100 a 500 caracteres. Entre 3 y 5 tags de áreas de experiencia. Avatar obligatorio. Enlace a LinkedIn obligatorio. Cada restricción es una decisión de producto: si los perfiles de mentores están incompletos, no generarán interés.

mentee_profiles — El perfil más ligero. Nombre, avatar, sector, rol, bio y áreas de interés. Sin años de experiencia, sin disponibilidad. Menos barreras, pero lo suficiente para que el mentor sepa con quién habla.

sessions — El corazón. Esta tabla tiene 9 estados posibles. Nueve. Porque el flujo de coordinación entre mentor y mentee es complejo: solicitud pendiente, aceptada, propuesta de fecha, contrapropuesta (máximo una), confirmada, completada, cancelada, expirada… Cada estado es una regla de negocio. Que solo puedas hacer tres contrapropuestas es una decisión para evitar el ping-pong infinito. Que una sesión expire a los 7 días sin actividad es una decisión para mantener el sistema limpio.

Para que estas tablas existan en la base de datos de verdad, se usan “migraciones”: archivos SQL que describen exactamente qué crear, como un plano arquitectónico. No tocas la base de datos a mano. Escribes el plano, lo ejecutas, y queda registrado. Si mañana algo se rompe, tienes el historial completo de qué se cambió y cuándo.

Créeme, le di vueltas. Muchas vueltas. Y no fue un proceso limpio: mientras definíamos tablas, ya estábamos levantando las primeras pantallas de onboarding. Las cosas no van en orden perfecto. Pero todo el trabajo de discovery de los posts anteriores — los flujos, las prioridades, las reglas de negocio — iba cobrando sentido a medida que tomábamos estas decisiones. Sin esa base, estas tablas habrían sido un caos.


Lo que nadie ve pero sostiene todo

Hay una última categoría de cosas que tuve que configurar: las tuberías invisibles. Variables de entorno, credenciales, conexiones entre servicios.

Las variables de entorno son, básicamente, las llaves de tu casa. Contraseñas, tokens, URLs que conectan tu app con Supabase, con Resend, con todo lo demás. Viven en un archivo que nunca se sube al código público (.env.local). Si lo pierdes, nada funciona. Si lo compartes, cualquiera tiene acceso a todo.

No es glamuroso. No es interesante de contar. Pero son decisiones que tomas una vez y condicionan meses de desarrollo. Como elegir el diámetro de las tuberías de tu casa: nadie lo ve, nadie te lo pregunta, pero si lo haces mal, lo pagas cada día.


Tres posts pensando. Uno montando tuberías. Y mientras tanto, las primeras pantallas ya iban tomando forma.

En la realidad, nada va en orden perfecto. Instalas Node.js, levantas una pantalla, te das cuenta de que necesitas Resend, vuelves a configurar cosas, sigues construyendo. Pero quiero documentar estas capas por separado porque la narrativa del “vibe coding” suele empezar por el final: alguien enseña una app funcionando y dice “lo hice con IA en un fin de semana”. Lo que no te cuenta son las decisiones que hicieron posible que ese fin de semana funcionara.

Vibe coding no es decirle a la IA “hazme una app”. Es tener tan claro lo que quieres que, cuando le pidas código, ese código tenga sentido.

Artículos anteriores de la serie:

La IA no te quita el trabajo de pensar. Te obliga a pensar mejor.

Construyendo Savia, estoy comprobando que la IA amplifica lo que tú ya sabes. Si llegas sin criterio, amplifica el caos. Si llegas con contexto y proceso, amplifica la velocidad. 

En el último post sobre cómo estoy montando Savia os conté todo lo que hice antes de escribir una línea de código: documentos fundacionales, sistema de skills, gobernanza del proyecto. Todo ese contexto estratégico que, para mí, es lo que separa el “vibe coding” real del “pídele cosas a la IA y cruza los dedos para que te devuelva algo sensato”.

Después de ese trabajo de contexto inicial, llegó el momento de arrancar y ver si todo ese trabajo previo servía realmente para algo. Y lo primero que descubrí es que construir algo con IA cuyo resultado quieres controlar bien no se parece demasiado a escribir un prompt y esperar a la magia.

No fue abrir un editor y decirle “hazme una app de mentoría”. Fue algo mucho más parecido a entrar en una sala con un equipo nuevo que acabas de formar, sentarte con ellos, y decir: “vale, ¿por dónde empezamos?”.

“Equipo, ya tenemos toda la info en la mesa. ¿Por dónde arrancamos?”

En lugar de dar instrucciones, hice algo que cualquier PM reconocerá: pedí una propuesta.No le dije a Claude qué hacer. Le pedí que me dijera qué creía que deberíamos hacer con todo el contexto que le había dado previamente y teniendo unos objetivos claros definidos. El prompt literal fue este:

« Claude, he terminado de subir toda la documentación del proyecto Savia. Activa todas tus Skills y asume tu rol de Staff PM. No me pidas instrucciones. Quiero que seas tú quien me proponga la hoja de ruta inmediata para las próximas 24 horas. ¿Qué es lo primero que deberíamos definir para que este MVP sea una realidad cuanto antes? Presenta tu propuesta y justifícala. »

Esto es lo que muchos llaman un prompt de arranque pasivo. Es el equivalente a entrar en la sala de reuniones y decir: “equipo, ya tenéis todo el contexto. Decidamos por dónde empezar, por qué y cómo”.

Si la propuesta que te devuelve es buena, sabes que el contexto que preparaste está bien construido. Y si es mala, sabes exactamente qué falta. Es un test del sistema, no un acto de fe.

La propuesta fue buena. Proponía empezar por dedicar algo más de tiempo a enriquecer el contexto que teníamos: definir el problema, la audiencia, la propuesta de valor, anticipar posibles problemas y riesgos, y definir las métricas de éxito antes de tocar nada técnico. Exactamente lo que yo habría hecho.

El Product Brief y el análisis de competencia

A partir de ahí, el proceso fue product discovery normal, pero a una velocidad de x5 o x10. Definimos el problema que resolvemos, para quién, y cómo. Establecimos la estrategia de lanzamiento, los objetivos y las métricas que nos dirán si vamos bien. Consolidamos todo en un Product Brief.

Después le pedí que investigara competidores. Claude analizó 13 plataformas de mentoría — desde ADPList (800K usuarios, respaldada por Sequoia) hasta asociaciones españolas como SECOT — y produjo un análisis que yo habría tardado días en hacer.

Es cierto que se fue dejando algunas fuera. Pero le pedí que estuviera atento a un tuit donde pedí a la comunidad si tenía más referencias y las fue incorporando a su análisis.

Sobre su análisis, yo le fui dando feedback de cuáles consideraba competidores más directos y cuáles no, y los motivos. Eso le ayudó a saber en qué fijarse y entender cuál era mi argumentación.

La conclusión más importante: no existe competidor directo que combine mentoría profesional 1:1, multi-sector, en español, para profesionales en carrera corporativa. ADPList es la amenaza principal pero es tech-focused, en inglés, con problemas de calidad y una UX cuestionable. Ventana de oportunidad: 6-12 meses.

Con esos insights, invoqué la skill de PMM (Product Marketing Manager) para iterar los copies y reforzar lo que nos hacía diferentes. Cada palabra de nuestra landing ahí está porque un competidor no la tiene apropiada.

Disclaimer: con el resultado del PMM no estoy especialmente contenta. Es una tarea pendiente ver cómo darle mejores skills para iterar la home más adelante.

La priorización: comparar iniciativas para decidir qué entraba en el MVP y qué no

Aquí vino una de las sesiones más útiles de toda esta fase: el ICE scoring para decidir qué entraba en el MVP y qué no. Pedí a Claude montar una sesión que lanzara en paralelo tres agentes: Product Manager, Product Designer y Software Engineer. Replicar un product trío en modo agéntico, vaya.

La sesión la liderá el Staff PM, pero involucró también al Designer y al Software Engineer — porque el Impact lo evalúa producto, pero el Ease lo evalúa quien va a construirlo.

Evaluamos cada feature candidata en tres dimensiones: Impact (¿cuánto mueve la métrica norte?), Confidence (¿cómo de seguros estamos de que podemos hacerlo?) y Ease (¿cómo de fácil es implementarlo?).

Las features core del MVP (signup, perfiles, búsqueda, solicitudes, coordinación, dashboards, emails, NPS) salieron todas por encima del threshold de 6. La más alta fue Signup con un 9.67 — bloqueante absoluto, sin mentores no hay producto. La más baja fue Coordinación con un 7.67, donde el Ease subió 2 puntos cuando decidimos hacer un sistema híbrido (coordinación en plataforma + manual como fallback) en vez del sistema completo.

Pero lo interesante fue lo que se quedó fuera: vacation mode para mentores, valoraciones públicas, matching automático por algoritmo, sistema de referrals, rol dual (ser mentor y mentee a la vez). Todas ideas tentadoras. Todas con un ICE que no justificaba meterlas en un MVP.

Disclaimer: viendo el feedback inicial y teniendo en cuenta mi criterio, creo que el ICE no evalúa bien la feature del rol dual. Es una de las cosas que creo que vamos a tener que incorporar antes.

Donde la cosa se pone interesante: el debate a 3 bandas

Cuando tocó diseñar los wireframes, los fuimos creando flujo a flujo. Y cuando estuvieron los 8 listos, hice algo que también fue un momento guay para el proyecto.

Volví a activar tres skills distintas — Staff PM, UX Designer y Critical Auditor — y les pedí que revisaran cada wireframe desde su perspectiva. No una revisión genérica. Una auditoría estructurada donde cada rol aplica sus propios criterios.

El resultado fue una sesión que produjo un informe de validación con 44 issues detectados. Pero lo interesante no es el número. Es cómo cada perspectiva veía cosas distintas en el mismo diseño. Por ejemplo, en el wireframe de onboarding para mentores:

  • El Staff PM detectó que la bio de 100-500 caracteres era una barrera alta con riesgo de 40-60% de abandono. Propuso añadir ejemplos y templates.
  • El UX Designer vio que la preview del perfil no se actualizaba en tiempo real — mostraba placeholders estáticos en lugar de lo que el mentor iba escribiendo. También encontró que faltaba drag & drop para la foto y que el contador de caracteres no funcionaba.
  • El Critical Auditor encontró el issue más grave: no había autosave. Un mentor podía pasar 15 minutos rellenando su perfil, cerrar el navegador por error, y perderlo todo. Lo clasificó como P0 bloqueante y estimó un 30-40% de abandono por frustración.

Ese P0 no lo habría encontrado yo sola. O lo habría encontrado después, cuando algún mentor real hubiese perdido sus datos y me hubiese escrito frustrado.

Hubo otro momento más pequeño que también me enseñó algo interesante. Estaba revisando los wireframes antes de empezar a implementar y vi dos cosas que me chirriaban: un badge de “Perfil verificado” sin proceso de verificación real, y un botón de “Favorito” desactivado con un “Disponible próximamente”.

Le pedí a Claude que lo analizara con la skill de Staff PM. No le dije “quita esto”. Le pregunté si deberíamos quitarlo. Y aplicó exactamente los frameworks que yo le había enseñado semanas antes: articuló el JTBD de cada elemento, calculó el ICE Score (4.67 — por debajo del threshold), detectó que el badge era un deceptive pattern con riesgo legal, y recomendó eliminar ambos. Cinco minutos, dos decisiones de producto, y varias líneas de código menos tiradas.

La IA amplifica lo que tú ya sabes

Si tuviera que quedarme con una sola cosa de estos primeros días, es esta: la IA amplifica lo que tú ya sabes. Si llegas sin criterio, amplifica el caos. Si llegas con contexto y proceso, amplifica la velocidad.

Trabajar con Claude Code como PM no se parece a programar. Se parece más a dirigir un equipo muy capaz que necesita que tú tengas las ideas claras. Que ejecuta a una velocidad brutal, pero que depende de que tú entiendas lo que está pasando — no solo aceptes resultados.

No puedes delegar el criterio. Si no entiendes por qué Claude propone algo, tienes un problema. Si no cuestionas lo que genera, tienes un problema mayor. La IA no piensa por ti. Te obliga a pensar mejor, porque te devuelve las cosas tan rápido que no puedes esconderte detrás de “ya lo revisaré luego”.

En los próximos posts contaré qué pasó cuando empezamos a codear de verdad — infraestructura, decisiones de stack, los primeros despliegues. Pero si algo quiero que os llevéis de este, es que la diferencia entre “vibe coding” como lo vende el hype y cómo funciona realmente es enorme. No es magia. Es proceso. Pero es proceso a una velocidad que cambia las reglas del juego.

Y vosotros… ¿habéis probado a trabajar así con IA? ¿Pedís propuestas o dais instrucciones?

Si has llegado hasta aquí y te apetece mentorizar o ser mentorizado en Savia, regístrate. Si no te convence el proyecto después de leer esto, dame feedback y cuéntame por qué.

Artículos anteriores de la serie: