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.
- 01
El "lo arreglo después" que ya te costó horas
FuenteDocumentación de frameworkdocs/session-log/lessons/lesson-27-the-gate-is-the-floor.mdeamg-globalint/commitvoiceHay 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 commitvoiceScaffolding 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 publicadaEn 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.
- 02
La regla que cambió cómo dirijo agentes de IA
FuenteDocumentación de frameworkdocs/session-log/lessons/lesson-18-ai-is-a-collaborator-not-an-apprentice.mdeamg-globalint/commitvoiceUna 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 commitvoiceScaffolding 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 publicadaEn 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.
- 03
Por qué no metimos Redis delante de Postgres
FuenteCommitapps/api/src/services/scheduler.ts@ 3f0a812eamg-globalint/commitvoicefeat(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 commitvoiceScaffolding 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 publicadaEn 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.
- 04
Tu librería es un cementerio. Tu inbox es una promesa.
FuenteArchitecture Decision Recorddocs/decisions/0019-inbox-as-triage-flow.mdeamg-globalint/commitvoiceCuando 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 commitvoiceScaffolding 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 publicadaEn 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".
- 05
Por qué corro mi SaaS en un solo Hetzner de €15/mes
FuenteArchitecture Decision Recorddocs/decisions/0010-self-host-first.mdeamg-globalint/commitvoiceSelf-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 commitvoiceScaffolding 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 publicadaEn 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.
- 06
Hilo en X.com sobre el cliente que cambió de proveedor
FuenteArtículo RSShttps://bytes.dev/archives/362Bytes by Tyler — newsletterBun 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 commitvoiceScaffolding 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 publicadaEn 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 ↓
¿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.