Showcase

De tu commit a tu LinkedIn

Seis ejemplos reales del flujo completo: la fuente que inspiró el post (un commit, una decisión de framework, un artículo de RSS), el draft que generó commitvoice, y la versión final que el autor editó y publicó. Cero retoque editorial fuera del editor.

  1. 01

    El "lo arreglo después" que ya te costó horas

    LinkedIn IC ambicioso
    Fuente
    Documentación de framework docs/session-log/lessons/lesson-27-the-gate-is-the-floor.md
    eamg-globalint/commitvoice
    Hay dos pisos de validación que separan "código escrito" de "código entregado": el gate (typecheck + tests + build) y la validación en preview. Saltarse el gate produce una clase específica de fallos — typos en uniones de tipos, dependencias removidas, tests pineados a constants viejos — que se acumulan invisiblemente hasta que un audit los destapa todos a la vez.
    Draft generado por commitvoice

    Scaffolding aspiracional. Se ve genérico a propósito — el LLM arranca cerca de "AI promedio" hasta que el autor lo trabaja.

    🚀 Reflexionemos sobre la importancia de la calidad en el desarrollo de software.
    
    En el mundo del software, es fundamental mantener altos estándares de calidad. Por eso, en nuestro equipo seguimos un proceso riguroso antes de hacer commit:
    
    ✅ Type checking
    ✅ Pruebas automatizadas
    ✅ Build de producción
    
    Esto nos ayuda a prevenir errores y entregar valor a nuestros usuarios. ¿Cuál es tu proceso de quality assurance? 🤔
    
    #SoftwareDevelopment #QualityAssurance #BestPractices
    Versión publicada

    En la voz del autor, con evidencia citable. Es lo que su audiencia ve en LinkedIn / X.com.

    Un audit reveló 5 deudas de tipos en mi working tree que llevaban semanas ahí.
    
    Ninguna se introdujo en el commit que estaba revisando. Todas se acumularon antes — cada vez que extendí un union type, cambié una API o moví una constante, sin correr el gate completo.
    
    El gate son tres comandos:
    
    pnpm typecheck
    pnpm exec vitest run
    pnpm build
    
    Si los tres salen verdes, el código califica para "shipped". Si alguno falla, todavía no está listo — por más que funcione en mi máquina.
    
    Lo importante: el gate no es "buena práctica". Es el piso compilatorio. Lo que está debajo no es código entregable; es código en progreso que aún no lo sabe.
    
    El costo de correrlo ahora son 90 segundos. El costo de no correrlo es una sesión forense de 2 horas tres semanas después, intentando atribuir cuál de 18 commits introdujo la deuda.
    
    Lo dejé escrito como lección permanente del proyecto — ver fuente.
    Qué pasó en el medio

    Un decision log interno se convirtió en post sin reescribir desde cero. commitvoice cargó el `.md` como lesson, generó scaffolding genérico (corporativo, con emojis y hashtags), y el autor lo reemplazó por la voz que ya tenía escrita en su propio framework — con un incidente concreto, los tres comandos exactos, y la conclusión load-bearing del lesson original.

  2. 02

    La regla que cambió cómo dirijo agentes de IA

    LinkedIn Founder técnico
    Fuente
    Documentación de framework docs/session-log/lessons/lesson-18-ai-is-a-collaborator-not-an-apprentice.md
    eamg-globalint/commitvoice
    Una directiva que fuerza al autor a aprobar cada transición mecánica de fase es la falla relocalizada de la capa de entrada a la capa de ejecución. El AI debe correr la directiva end-to-end, decidir cada juicio citando la lección/spec/declarativa que lo justifica, emitir un Decisions Log, y parar solo bajo tres condiciones — E1 contradicción irresoluble, E2 input genuinamente ausente, E3 operación destructiva.
    Draft generado por commitvoice

    Scaffolding aspiracional. Se ve genérico a propósito — el LLM arranca cerca de "AI promedio" hasta que el autor lo trabaja.

    La IA es nuestro mejor aliado en la productividad moderna.
    
    Para sacarle el máximo provecho, es clave establecer un proceso de revisión continua: revisar paso a paso lo que el agente propone, validar cada decisión, y ajustar el rumbo conforme avanza.
    
    En mi experiencia, la combinación humano + IA funciona mejor cuando hay supervisión constante y feedback inmediato. ¿Cómo gestionas tu colaboración con IA?
    
    #AI #Productivity #Leadership
    Versión publicada

    En la voz del autor, con evidencia citable. Es lo que su audiencia ve en LinkedIn / X.com.

    Detuve a mi agente 11 veces en una sesión para "aprobar el próximo paso".
    
    Cada parada era una transición mecánica. El agente ya sabía qué seguía — yo era la pieza lenta del flujo.
    
    Lo que cambió todo fue volver explícitas las únicas tres razones legítimas para detenerse:
    
    E1 — contradicción irresoluble entre dos documentos del corpus.
    E2 — input requerido que genuinamente no existe.
    E3 — operación destructiva irreversible.
    
    Si la parada no cae en E1, E2 o E3, no es una parada — es una solicitud de tranquilidad disfrazada de gobernanza. Y duplica el tiempo de cualquier task.
    
    La versión sana: el agente corre la directiva end-to-end, decide cada juicio citando qué lección/spec/declarativa lo justifica, y emite un Decisions Log dentro del entregable. Yo reviso una vez, al final — acepto, o rechazo nombrando el modo de falla específico.
    
    Es la diferencia entre dirigir un colaborador y supervisar un aprendiz.
    Qué pasó en el medio

    El `.md` de la lesson tenía la estructura completa del argumento (abstract, correct shape, E1/E2/E3, evidence). El draft del LLM la diluyó a "trabajemos juntos con IA". El autor reincorporó las tres letras concretas, el incidente real ("11 paradas"), y la frase load-bearing del manifiesto. Cero invención — material que ya estaba en el repo, repackaged.

  3. 03

    Por qué no metimos Redis delante de Postgres

    LinkedIn Senior consultor / tech lead
    Fuente
    Commit apps/api/src/services/scheduler.ts @ 3f0a812
    eamg-globalint/commitvoice
    feat(scheduler): atomic claim via UPDATE ... WHERE status='scheduled' RETURNING — replaces SELECT FOR UPDATE pattern. Two workers competing for the same row cannot both win; the loser sees zero rows returned and yields. No Redis layer in front; business state must remain authoritative in Postgres per domain-rules §6.
    Draft generado por commitvoice

    Scaffolding aspiracional. Se ve genérico a propósito — el LLM arranca cerca de "AI promedio" hasta que el autor lo trabaja.

    En la era de los microservicios, el caching es nuestro mejor amigo para mejorar performance. Hoy quiero hablar sobre cómo Redis puede transformar tu arquitectura.
    
    Beneficios de Redis:
    
    ⚡ Velocidad ultra rápida
    🔄 Reduce carga en la DB
    📈 Escalabilidad mejorada
    
    En commitvoice tomamos decisiones de arquitectura cuidadosas para garantizar performance y confiabilidad. ¿Qué herramientas de caching usas? #Backend #Performance
    Versión publicada

    En la voz del autor, con evidencia citable. Es lo que su audiencia ve en LinkedIn / X.com.

    Tres consultas que dejé sin caché a propósito:
    
    1. status del post (draft / scheduled / publishing / published).
    2. scheduled_at de cada publicación.
    3. publish_attempt_count.
    
    Las tres son business state. Las tres son correctness-sensitive. Una lectura stale de status="scheduled" mientras el row ya pasó a "publishing" es exactamente cómo se generan publicaciones duplicadas.
    
    Redis sirve para colas (BullMQ) y rate limiting. No para business data. La latencia que ganaría cacheando esos campos no compensa el costo de un solo double-publish: un cliente que ve su post dos veces en LinkedIn pierde confianza en el producto en segundos.
    
    El claim atómico es una sola query:
    
    UPDATE schedules SET status = 'publishing'
    WHERE id = $1 AND status = 'scheduled'
    RETURNING *;
    
    Dos workers compitiendo por el mismo schedule no pueden ambos ganar. El que pierde recibe cero filas y cede. Cero duplicados, cero coordinación distribuida, cero capa adicional de software.
    
    Lo barato no es Redis. Lo barato es Postgres haciendo su trabajo.
    Qué pasó en el medio

    commitvoice ingestó el commit `3f0a812` y el `.md` de la lesson 09 como dos lessons relacionadas. El autor las usó como evidencia múltiple en el editor (el rail derecho mostró ambas). El draft genérico se reemplazó por la sustancia técnica del commit message + la regla del lesson — un post de autoridad técnica anclado en código real.

  4. 04

    Tu librería es un cementerio. Tu inbox es una promesa.

    LinkedIn IC ambicioso / builder
    Fuente
    Architecture Decision Record docs/decisions/0019-inbox-as-triage-flow.md
    eamg-globalint/commitvoice
    Cuando una colección de datos crece más allá de un puñado de filas, la forma "librería" — lista + filter pills por origen — deja de responder la pregunta real del usuario. La forma correcta es un inbox: items con estado de triage, vista por defecto solo de no-procesados, cada fila ofrece un verbo primario, el sidebar muestra cuánto queda por revisar. Library thinking hace que el usuario abra los mismos 35 items todos los días. Inbox thinking le da una línea de meta.
    Draft generado por commitvoice

    Scaffolding aspiracional. Se ve genérico a propósito — el LLM arranca cerca de "AI promedio" hasta que el autor lo trabaja.

    ¡La UX importa! Hoy quiero compartir una reflexión sobre cómo diseñamos colecciones de datos en nuestros productos.
    
    Hay dos approaches principales: lista con filtros, o inbox con estados. Cada uno tiene sus pros y contras. Lo importante es entender al usuario y elegir el que mejor se adapte a sus necesidades.
    
    En commitvoice optamos por un enfoque centrado en el usuario. ¿Cómo piensas tú la UX de tus listas? #UX #ProductDesign
    Versión publicada

    En la voz del autor, con evidencia citable. Es lo que su audiencia ve en LinkedIn / X.com.

    Lancé mi feature de "fuentes" como librería: 35 items, filtros por repo, click para preview, un botón "Crear post" en cada detalle.
    
    Abrir la pestaña se sentía igual todos los días. Los mismos 35 items. No podía distinguir lo nuevo de lo viejo. Lo que ya había usado no se diferenciaba de lo que tenía pendiente.
    
    Después de tres semanas reescribí la pantalla como inbox:
    
    — Estado por item (nuevo / archivado / guardado / en uso).
    — Vista por defecto: solo los "nuevos".
    — Cada fila ofrece un verbo primario (descartar, guardar, llevar al editor).
    — Badge en el sidebar: número de items sin procesar.
    
    Esa última línea fue la que cambió la sensación de uso. Pasó de "lista interminable" a "línea de meta". Cuando el badge baja a cero, terminé. Cuando vuelve a 5, sé exactamente qué hay nuevo.
    
    Library thinking te hace abrir los mismos 35 items todos los días. Inbox thinking te da una promesa: si triagas, terminas.
    
    Si tu colección crece más allá de un puñado de filas, la decisión no es "qué filtros agrego". Es "qué estados de triage tienen sentido".
    Qué pasó en el medio

    El ADR (`docs/decisions/0019`) contenía el antes/después literal: el problema, el reframing, los cuatro cambios concretos. El draft del LLM redujo todo a abstracción ("UX importa, pros y contras"). El autor restauró la especificidad del ADR + un dato personal ("tres semanas"). El post terminó siendo el ADR contado en primera persona, no un sermón sobre UX.

  5. 05

    Por qué corro mi SaaS en un solo Hetzner de €15/mes

    LinkedIn Founder técnico
    Fuente
    Architecture Decision Record docs/decisions/0010-self-host-first.md
    eamg-globalint/commitvoice
    Self-host first, managed services second. Evalúa el self-host honestamente. Nombra el moat que el servicio managed proveería. Elige managed solo cuando el moat justifique el subprocessor adicional. Postgres self-hosted en Hetzner — branching/autoscale de Neon/Supabase no justifican el costo para single-operator. Redis igual. Image storage filesystem local. LinkedIn publishing managed (Make.com) — moat real: compliance + OAuth review.
    Draft generado por commitvoice

    Scaffolding aspiracional. Se ve genérico a propósito — el LLM arranca cerca de "AI promedio" hasta que el autor lo trabaja.

    ¡La nube nos da superpoderes! Hoy quiero compartir mi stack para correr un SaaS productivo. Uso un mix de servicios managed para tener máxima flexibilidad y escalabilidad.
    
    Mi stack incluye:
    ☁️ Cloud DB
    🔄 Cache as a service
    📦 Object storage
    🚀 Edge functions
    
    Cada herramienta tiene su rol y juntas crean una plataforma robusta. ¿Cuál es tu stack favorito? #SaaS #CloudComputing
    Versión publicada

    En la voz del autor, con evidencia citable. Es lo que su audiencia ve en LinkedIn / X.com.

    commitvoice corre en un VM de Hetzner de €15/mes. Postgres, Redis, API, web UI, almacenamiento de imágenes — todo en la misma máquina.
    
    No es ascetismo. Es disciplina de moat.
    
    Cada vez que evaluamos un servicio managed nos hacemos una pregunta: ¿qué moat me da que self-host no puede igualar?
    
    — Postgres managed (Neon, Supabase) → branching + autoscale. No los necesito a mi escala. Self-host.
    — Redis managed → alta disponibilidad multi-AZ. No la necesito todavía. Self-host.
    — Storage S3/R2 → throughput global + lifecycle policies. Cuando el filesystem local sea un problema real, migro. Self-host.
    — Make.com como puente de publishing a LinkedIn → compliance + OAuth review de LinkedIn. Moat real. Managed.
    
    La regla simple: cada SaaS gerencial que agrego es una superficie más de riesgo, una factura más, un vendor lock-in más, una cuenta más que rotar credenciales. Lo agrego solo cuando el moat es genuino y nombrable.
    
    No es "soy hardcore". Es que cada decisión managed tiene que defenderse contra una alternativa self-host concreta. La mayoría no lo hace.
    Qué pasó en el medio

    El ADR enumera el self-host vs managed por categoría con el moat explícito de cada uno. El draft del LLM listó "cloud DB, cache as a service, etc." sin explicar por qué. El autor recuperó la lista concreta del ADR — incluyendo la única excepción managed (Make.com) y por qué — y la frase pivote "disciplina de moat".

  6. 06

    Hilo en X.com sobre el cliente que cambió de proveedor

    X.com (hilo) Builder en público
    Fuente
    Artículo RSS https://bytes.dev/archives/362
    Bytes by Tyler — newsletter
    Bun 1.2 ships a faster bundler with native CSS, eliminates the need for Vite in many SPA setups. Benchmarks show 3-4x cold start improvement vs Vite + esbuild stack on medium-sized React apps. Migration involves swapping bun build flags; the breaking change surface is small.
    Draft generado por commitvoice

    Scaffolding aspiracional. Se ve genérico a propósito — el LLM arranca cerca de "AI promedio" hasta que el autor lo trabaja.

    ¡Increíbles noticias de Bun 1.2! 🚀
    
    El bundler mejoró 3-4x en velocidad y ahora soporta CSS nativo. Esto es un game changer para el ecosistema de JavaScript.
    
    ¿Estás considerando migrar de Vite a Bun? ¡Me encantaría conocer tu opinión! 💭
    
    #JavaScript #WebDev #Performance #Bun
    Versión publicada

    En la voz del autor, con evidencia citable. Es lo que su audiencia ve en LinkedIn / X.com.

    1/ Bun 1.2 sacó bundler con CSS nativo y benchmarks 3-4x vs Vite+esbuild en SPAs medianas.
    
    Mi instinto: no migrar. Comparto por qué.
    
    2/ Mi build local con Vite tarda 1.8s. Si bajara a 0.5s, el cambio sería invisible: ya estoy en HMR el 95% del tiempo, no en cold start.
    
    El 3-4x suena enorme. En segundos absolutos: 1.3s ahorrados por build. ~5 builds frescos al día. ~7s diarios.
    
    3/ El verdadero costo no es la migración técnica (que es chica). Es la superficie de bugs nueva.
    
    Vite tiene 5 años de issues cerrados de mi stack específico (React + Tailwind + MDX + Astro plugins). Bun va a tener su propia lista — no peor, pero diferente.
    
    4/ Cuándo sí migraría:
    — Cold start de CI > 2 min (no es mi caso, 28s).
    — Equipo grande donde el tiempo de build agregado > 1h/día.
    — Necesito el runtime de Bun por otra razón (workers, FFI).
    
    5/ Regla: una mejora 3x en algo que ya no es bottleneck es bait. Lo nuevo es interesante por lo nuevo, no porque te resuelva un problema real.
    
    Cita del newsletter ↓
    Qué pasó en el medio

    commitvoice trajo el artículo de Bytes desde un feed RSS curado del catálogo (categoría Frontend perf). El draft del LLM hizo lo que hace todo generador con un input puramente informativo: ampliar la nota sin opinión. El autor introdujo su propio criterio ("una mejora 3x en algo que ya no es bottleneck es bait"), los números reales de su build (1.8s, 28s, 5 builds/día), y dividió en thread mode para X.com. La plataforma branchea — el mismo input genera un post largo para LinkedIn o un thread para X.

¿Quieres ver tu commit acá?

Conecta tu repo, elige las categorías RSS que te interesan, y empieza con tu primer post en menos de 5 minutos. Sin tarjeta, sin lock-in.