Manifiesto
Credenciales ausentes. Sale por HTTP y por el panel; se puede commitear. No restaura: hay que recargar los tokens.
Archivo y republicación de redes · en producción
Trae material de una cuenta de red social, se queda con los bytes y lo vuelve a publicar en otras — con permiso registrado y, por defecto, después de que una persona lo mire.
Suena a un puente. La diferencia está en el medio: las URLs de los CDN vencen en horas o días, así que un sistema que guardara sólo el enlace tendría al año un catálogo de links muertos. Acá se descargan los bytes; que además sirvan para republicar es una consecuencia, no el objetivo.
★ Lo distintivo
Cauce es un TOML que describe por dónde puede correr el material: qué cuentas hay y qué va de cuál a cuál. No publica nada —eso lo sigue haciendo el worker, con su grifo y sus guardas—, pero sirve para las cuatro cosas que importan cuando algo se rompe: respaldo y desastre, alta masiva, versionar la configuración en git, y replicar a otra instalación.
formato_version = 1
credenciales = "ausentes" # sin tokens: se commitea
[[cuentas]]
handle = "fuente-ig"
plataforma = "instagram"
rol = "lectura"
poll_horas = 6
[[cuentas]]
handle = "difusion-masto"
plataforma = "mastodon"
rol = "escritura"
max_por_hora = 4 # el grifo
[[flujos]]
clave = "fuente-a-difusion" # inmutable
origen = "fuente-ig"
destino = "difusion-masto"
condicion = { tipo = ["VIDEO"] } $ cauce importar instalacion.toml
+ cuenta fuente-ig se crearía
= cuenta difusion-masto sin cambios
~ flujo fuente-a-difu… cambia: condicion
⚠ activa = true se crea PAUSADO
nada se escribió.
--aplicar para hacerlo.
Como terraform plan y apply, y el corte
no es estético: mirar no pide identidad, aplicar sí — «muta la
base = firma». Es idempotente: correrlo dos veces dice «sin
cambios» en todo.
Manifiesto
Credenciales ausentes. Sale por HTTP y por el panel; se puede commitear. No restaura: hay que recargar los tokens.
Respaldo
Credenciales cifradas, y sale sólo por CLI. Ningún endpoint de este servicio devuelve ni acepta texto cifrado — sin excepciones que recordar.
Cada una nació de un modo de fallo concreto, no de una buena práctica general. Por eso están escritas con su motivo al lado.
La cabecera no puede mentir
Si el archivo se declara «ausentes» y trae una credencial, o dice «cifradas» y no trae el bloque que dice con qué clave, la validación lo rechaza. No es un aviso: de esto depende que nadie archive un manifiesto creyendo que tiene un respaldo.
Un solo conflicto detiene todo
Aplicar «lo que se pueda» dejaría la instalación a mitad de camino entre dos descripciones, y nadie sabría en cuál está.
Importar es aditivo, y no aplica tres cosas que sí declara
El consentimiento se vuelve a otorgar a mano —un permiso es una afirmación personal y fechada, no un trámite de lote—, los flujos se crean pausados y la publicación automática queda apagada. Los tres se avisan, no se callan.
Un filtro que no se entiende es un ERROR
Escribir «tags» en vez de «tag» daba antes un archivo válido cuyo flujo publicaba todo: el motor ignoraba lo que no entendía. El filtro más peligroso es el que parece estar y no está.
Restaurar con otra clave se niega antes de tocar nada
El respaldo trae la huella de la clave con que se cifró. Escribir igual dejaría cuentas que parecen tener credencial, y el fallo aparecería recién al publicar.
Lo restaurado queda «degradado», nunca «ok»
La credencial está cargada y nadie la ejercitó contra la red. Declararla sana sería el verde falso justo donde más caro sale: quien restaura se va tranquilo.
El formato completo, con sus diagramas y siete archivos de ejemplo: cauce · cauce en ejemplos.
★ Sin verde falso
El sistema está en producción y publica de verdad. Al mismo tiempo, hay partes verificadas sólo contra servidores falsos que corren dentro de los tests, y partes que todavía son plan. Distinguirlas es parte del producto: un sistema que dice «ok» sin haberlo comprobado falla justo cuando alguien se fue tranquilo.
● Corre en producción
◐ Verificado sólo contra servidores falsos
○ En génesis
Las dos publicaciones se pueden mirar: un video de 23 s en Mastodon (3 de agosto de 2026) y otro en un canal público de Telegram (4 de agosto). Los dos salieron con su atribución al material original, recorriendo el camino entero: sondeo → archivo de los bytes → emisión → publicación.
★ De un vistazo
12
cuentas en producción
5
flujos activos
3 + 3
redes de entrada y salida
1
archivo TOML describe todo
AES-256
GCM para cada credencial
AGPL-3.0
licencia del núcleo
★ Por dentro
Un binario en Rust levanta tres cosas: el API (axum), el poller y el worker de emisión. En el medio, el archivo: bytes y metadatos en disco y en Postgres. La interfaz va aparte, partida en un núcleo de TypeScript sin ningún framework y envoltorios finos por encima — hoy Svelte.
El servicio valida identidad; nunca la emite
No tiene usuarios: le pregunta al sitio que lo hospeda quién está del otro lado, y el anfitrión relee a la persona de su base en cada validación. Suspender a alguien tiene efecto inmediato, sin esperar a que expire nada. Si el servicio pudiera firmar una credencial, podría fabricar una identidad — y una identidad fabricada por quien la usa no prueba nada.
★ Libre y público
Todo lo de esta página —el servicio en Rust, el panel, la CLI y la documentación— vive en un repositorio público, bajo AGPL-3.0: se puede usar, estudiar, modificar y desplegar, con la condición de publicar las modificaciones de quien lo ofrezca como servicio.
v0.1.0-rc.1
2026-08-15 · primera versión etiquetada
git clone https://gitlab.com/pineiden/reply2fb.git reply2social Es un release candidate, y el sufijo no es modestia: Instagram —la fuente que da origen al proyecto— nunca corrió contra la API de Meta. Ese camino está verificado contra un servidor falso que corre dentro de los tests, y un servidor falso no puede desmentir lo que uno real diría. El changelog lista los siete límites de esa clase, uno por uno.
El repositorio se llama reply2fb y el módulo
reply2social: nació espejando Instagram a una Página de
Facebook y creció hasta ser multired. No se renombró para no romper
los clones que ya existen.
★ Saber más
Diez páginas con sus diagramas —renderizados en el build, así que un diagrama roto rompe la compilación en vez de aparecer en blanco.
Qué es esto →
El mapa completo en un diagrama, y lo que el diseño impide a propósito.
★ Descargar el código →
El repo, las versiones etiquetadas, qué hay en cada directorio y qué obliga la AGPL.
El recorrido de un post →
De la cuenta de origen al destino, paso por paso.
★ Cauce: el archivo declarativo →
Manifiesto y respaldo, plan y aplicar, y por qué cada guarda existe.
★ Cauce en ejemplos →
Siete archivos, de lo mínimo a una instalación completa, cada uno con su grafo.
Los datos (DER) →
Las tablas, sus índices únicos parciales y sus CHECK.
Los módulos →
Cómo está partido el binario en Rust y por qué las fronteras están ahí.
La interfaz →
Núcleo TypeScript sin framework, y envoltorios finos por encima.
Permiso y régimen →
Quién autorizó qué, sobre el material de quién, y hasta cuándo.
Identidad y capacidades →
El servicio valida identidad; nunca la emite. Por qué eso es un invariante.
Integrarlo en tu sitio →
Paso a paso, verificable, para hospedarlo desde otra aplicación.