José Garrido
SuscribirmeRead in EnglishEN

Te escribo cuando publico un proyecto open source: qué hace y cómo probarlo. Sin spam.

Shipcastv0.3.0

Shipcast v0.3.0 redacta tus lanzamientos desde una GitHub Action sin nada que alojar, escribe tu blog en los idiomas que elijas y trae una app rediseñada que puedes instalar.

Shipcast convierte una release de GitHub en un lanzamiento: lee el código en la etiqueta, redacta el artículo y un post para cada canal, y los publica cuando los apruebas. La versión 0.3.0 te deja ejecutarlo desde una GitHub Action en tus propios repos sin alojar nada, escribe tu blog en los idiomas que elijas y trae una app rediseñada que puedes instalar en el móvil o en el escritorio.

Si ya usas Shipcast, aquí tienes lo que ha cambiado y qué hacer al actualizar.

La app de Shipcast: los borradores de una release, aprobados y publicados

¿Por qué una GitHub Action?

Hasta ahora necesitabas un servidor para usar Shipcast. A mí me vale, pero es mucho pedir a quien solo quiere anunciar su próxima release. Con la v0.3.0 todo el flujo corre en GitHub Actions: publicas una release, llega un pull request de borradores a tu repo de lanzamientos con el artículo y un post por canal, y al hacer merge cada canal se publica una vez.

¿Cómo configuro la Action?

En el repo de tu proyecto, con Node 24:

npx @yeyo11/shipcast init

init escribe el workflow de lanzamiento que usa yeyo11/shipcast-action@v1, .github/launch.yml y, para tu repo de lanzamientos, brand.yml y un workflow de publicación. Después imprime todos los secretos que tienes que configurar. Puedes pasarle las opciones de entrada:

npx @yeyo11/shipcast init --launches-repo tu-usuario/launches --ai openai --tone "Directo, práctico, en primera persona."

Los borradores se escriben con tu propia clave. --ai acepta anthropic (por defecto) u openai, y la entrada ai-base-url de la action lo apunta a cualquier servidor compatible con OpenAI. Para probar la configuración sin publicar nada, pon la variable del repositorio SHIPCAST_DRY_RUN=true: la ejecución de publicación lista lo que publicaría.

Cada enlace a tu blog sale con utm_source, utm_medium y utm_campaign, así tu analítica muestra de qué canal llegó cada visita. dev.to y Hashnode mantienen la URL canónica limpia.

¿Y si el cron de GitHub llega tarde?

Los posts programados y los reintentos se ejecutan en una «ronda». GitHub retrasa o descarta las ejecuciones schedule, así que el workflow de publicación tiene tres líneas de cron solo como respaldo y acepta workflow_dispatch. Para que las rondas lleguen a tiempo, lánzalo cada 15 minutos desde fuera de GitHub: un Cloudflare Worker, cron-job.org o tu propio servidor. init imprime la llamada exacta:

curl -fsS -X POST \
  -H "Authorization: Bearer $SHIPCAST_DISPATCH_TOKEN" \
  -H "Accept: application/vnd.github+json" \
  https://api.github.com/repos/<tu-usuario>/launches/actions/workflows/shipcast-publish.yml/dispatches \
  -d '{"ref":"main"}'

El token es uno de grano fino solo para el repo de lanzamientos, con permiso de lectura y escritura en Actions. Una ronda tardía solo retrasa un post; no pierde ninguno.

¿Cómo elijo los idiomas de mi blog?

Lístalos en brand.yml con cualquier código ISO 639-1. El primero es el idioma principal:

# brand.yml
languages:
  blog: [en, es]

El artículo, el número de la newsletter y los posts siguen esa lista, igual que los selectores de idioma de la app. dev.to y Hashnode republican la versión en inglés si existe; si no, la del primer idioma. Ojo al actualizar: sin languages.blog, Shipcast ahora escribe solo en inglés.

¿Qué ha cambiado en la app?

Todas las pantallas se han rehecho. Los lanzamientos te esperan y los apruebas en la app. Cada borrador se abre en un editor con modos Markdown y Visual, y su barra de herramientas se ajusta a lo que el canal sabe formatear. Las estadísticas muestran cada canal y cada lanzamiento, una paleta de búsqueda te lleva a cualquier lanzamiento, cuenta o página, y Sync all actualiza todas las cuentas en Channels.

La app además se instala. En el móvil o en el escritorio se abre como aplicación independiente, muestra su propia página sin conexión cuando se cae la red y ofrece Reload cuando hay versión nueva, así nada se recarga a mitad de una edición.

¿Cómo funcionan las notificaciones?

Shipcast avisa a tu móvil o a tu escritorio cuando una respuesta a un comentario o un lanzamiento espera tu aprobación, cuando algo falla y cuando un lanzamiento sale. Actívalo en cada dispositivo en Settings → Notifications, con un interruptor por evento. En iPhone, añade antes Shipcast a la pantalla de inicio. Una notificación nunca muestra el texto de un comentario ni de un borrador. En tu propio servidor, define SHIPCAST_VAPID_PUBLIC_KEY y SHIPCAST_VAPID_PRIVATE_KEY (mira docs/push.md).

¿Cómo actualizo una instalación propia?

git pull
pnpm install
pnpm app          # las migraciones de la base de datos se ejecutan al arrancar

Dos cosas que revisar:

  • claudio arranca ahora con su propio perfil de Compose: docker compose --profile claudio up -d, o COMPOSE_PROFILES=claudio en .env. Sin ninguno de los dos, docker compose up -d solo arranca Postgres.
  • Si tu blog tiene más idiomas que el inglés, lístalos en languages.blog.

¿Y ahora qué?

La guía paso a paso de la Action está en docs/getting-started.md, y la lista completa de cambios en el changelog. Si aún no tienes blog, yeyo11/shipcast-blog es una plantilla con Astro y Tailwind que ya lee los artículos de Shipcast y se despliega en GitHub Pages.

Si Shipcast te ahorra escribir el mismo anuncio diez veces, una estrella en el repositorio ayuda a que otros desarrolladores lo encuentren.