substack-blog
npx skills add https://github.com/easymailing/substack-blog --skill substack-blog
Agent 安装分布
Skill 文档
Substack Blog
Crea artÃculos de blog personal para Substack con tono técnico-conversacional.
Configuración requerida
Archivo de configuración
Verifica que existe .blog-config.json en la carpeta de esta skill. Si no existe, pregunta:
- “¿Cuál es la ruta de tu vault de Obsidian?”
- “¿Cuál es la URL de tu publicación en Substack? (ej: https://tunombre.substack.com)”
- “¿Cuál es tu user_id de Substack?”
Crea el archivo:
{
"obsidian_vault_path": "{ruta al vault}",
"substack_publication_url": "{url de la publicación}",
"user_id": "{tu user_id}"
}
Autenticación (automática)
Las cookies se extraen automáticamente de Safari, Chrome o Firefox usando @steipete/sweet-cookie.
Solo necesitas estar logueado en substack.com en tu navegador.
Fallback manual: Si la extracción automática falla, crea .env en la carpeta de la skill:
SID=tu_cookie_sid
SUBSTACK_SID=tu_cookie_substack_sid
SUBSTACK_LLI=tu_cookie_substack_lli
Style guide
Verifica que existe Areas/Writing/style-guide.md en el vault de Obsidian. Si no existe, créalo con el contenido base (ver sección Referencias).
Paso 1: Origen de la idea
Pregunta:
¿De dónde viene la idea?
1. Buscar en Inbox/ - Seleccionar idea guardada
2. Tema nuevo - Describir directamente
Si elige Inbox/
-
Lista archivos en:
{vault}/Inbox/ideas/{vault}/Inbox/bookmarks/{vault}/Inbox/trending/
-
Muestra lista numerada con tÃtulo de cada archivo
-
Usuario selecciona uno
-
Lee el contenido como contexto para el artÃculo
Si elige tema nuevo
Pregunta: “¿De qué quieres escribir?”
Paso 2: Discusión interactiva
Haz estas preguntas UNA A UNA:
- “¿Qué quieres que el lector se lleve de este artÃculo?”
- “¿Hay código o ejemplos concretos que mostrar?”
- “¿Qué aprendiste tú en el proceso?”
- “¿Hubo algún error, problema interesante o decisión difÃcil?”
- “¿Algo más que quieras incluir?”
Paso 3: Generar outline
Presenta estructura propuesta:
## Outline propuesto
1. **Gancho** - {descripción}
2. **Contexto/Problema** - {descripción}
3. **Desarrollo**
- {sección 1}
- {sección 2}
- ...
4. **Reflexión** - {descripción}
5. **Cierre** - {descripción}
¿Ajustamos algo?
Itera hasta que el usuario apruebe.
Paso 4: Escribir artÃculo
- Lee
{vault}/Areas/Writing/style-guide.md - Genera artÃculo completo en Markdown
- Incluye frontmatter:
---
title: "{tÃtulo}"
date: {fecha actual YYYY-MM-DD}
tags: [{tags relevantes}]
excerpt: "{resumen de 1-2 frases}"
status: draft
---
- Muestra el artÃculo completo
- Pregunta: “¿Ajustamos algo?”
Paso 5: Revisar (opcional)
Pregunta: “¿Quieres que revise claridad y estilo?”
Si responde sÃ:
- Invoca
marketing-skills:copy-editing - Instrucciones especiales:
- Revisar claridad de frases
- Eliminar redundancias
- NO añadir CTAs ni tono de venta
- Mantener voz personal en primera persona
Paso 6: Guardar en Obsidian
Genera el slug del tÃtulo (lowercase, guiones, sin caracteres especiales).
Crea carpeta y archivos:
{vault}/Areas/Writing/{slug}/
âââ article.md # ArtÃculo final con frontmatter
âââ source-idea.md # Solo si vino de Inbox/
Si la idea vino de Inbox/:
- Copia el archivo original a
source-idea.md - Mueve el archivo original a
{vault}/Processed/{subcarpeta original}/
Paso 7: Crear draft en Substack
Ejecuta:
npx bun {skill_path}/scripts/substack.ts create --title "{tÃtulo}" --subtitle "{excerpt}" --file "{vault}/Areas/Writing/{slug}/article.md"
Muestra resultado:
- Si éxito: “Draft creado. Abre Substack para revisar y publicar: {url}”
- Si error: Muestra el error y sugiere verificar cookies
Referencias
Style guide base
Si no existe Areas/Writing/style-guide.md, créalo con:
# Style Guide - Blog Personal
## Voz y Tono
- **Perspectiva:** Primera persona ("descubrÃ", "decidÃ", "me funcionó")
- **Tono:** Conversacional, como hablar con un colega
- **Honestidad:** Admitir limitaciones ("esto no es perfecto", "hay casos donde no aplica")
- **Opiniones:** Claras y fundamentadas ("prefiero X porque...")
## Principios de Escritura
### 1. Muestra el proceso, no solo el resultado
- Qué problema tenÃas
- Qué intentaste
- Qué falló y por qué
- Qué funcionó finalmente
### 2. Código con contexto
- No code dumps sin explicación
- Explica el "por qué", no solo el "qué"
- Muestra errores reales que cometiste
### 3. Reflexiones genuinas
- Qué aprendiste
- Qué harÃas diferente
- Qué sigue sin estar claro
### 4. Estructura clara pero no rÃgida
- Headers que guÃan la lectura
- Párrafos cortos (2-3 lÃneas máximo)
- Listas cuando ayudan, no por defecto
## Qué Evitar
- Tono de tutorial genérico ("en este post vamos a ver...")
- Exceso de disclaimers
- Falsa modestia
- Jerga innecesaria sin explicar
- CTAs o tono de venta
- Frases vacÃas ("es importante mencionar que...")
## Estructura TÃpica
1. **Gancho** - Problema o situación interesante
2. **Contexto** - Por qué importa, qué intentabas
3. **Desarrollo** - El journey, con código si aplica
4. **Reflexión** - Qué aprendiste, qué cambiarÃas
5. **Cierre** - Próximos pasos, preguntas abiertas (opcional)
## Formato
### TÃtulos
- Descriptivos y especÃficos
- Pueden ser preguntas
- Evitar clickbait
### Código
- Bloques con lenguaje especificado
- Comentarios donde ayuden
- Mostrar output cuando sea relevante
### Links
- Solo si aportan valor real
- Describir a dónde llevan
Rutas del proyecto
Leer de .blog-config.json:
- Vault Obsidian:
obsidian_vault_path - Substack URL:
substack_publication_url - User ID:
user_id
Script de Substack
La skill incluye un script CLI para interactuar con Substack:
# Crear draft desde archivo markdown
npx bun scripts/substack.ts create --title "TÃtulo" --file path/to/article.md
# Crear draft con subtÃtulo
npx bun scripts/substack.ts create --title "TÃtulo" --subtitle "SubtÃtulo" --file article.md
# Listar drafts existentes
npx bun scripts/substack.ts drafts
El script lee automáticamente .blog-config.json y .env de la carpeta de la skill.