Skip to content

What this is

reply2social pulls material from a social media account, keeps the bytes, and publishes it again to other accounts — with recorded permission and, by default, after a person has looked at it.

It sounds like a bridge. It is more than that, and the difference sits in the middle: the archive.

The code is free and it is right here. Latest version: v0.1.0-rc.1 (2026-08-15) — AGPL-3.0.

Ventana de terminal
git clone https://gitlab.com/pineiden/reply2fb.git reply2social

It is a release candidate: Instagram, the source this project grew out of, has never run against Meta’s API. What it ships and what it did not verify.

Instagram’s CDN URLs expire in hours or days. A system that stored only the link would hold, a year later, a catalogue of dead links: not an archive but an index of things nobody can see anymore. That is why the bytes are downloaded and kept. That they also happen to be useful for republishing is a consequence, not the goal.

The map, at a glance

Destination networks

reply2social

Source networks

approves

Instagram

Telegram

RSS feeds

poller

fetches what is new

archive

bytes + metadata

emission

publishes, with a tap

panel

look and approve

Mastodon

Telegram

Your own site

Three pieces do the work and a fourth one watches it:

PieceWhat it doesWhere it lives
pollerEvery N hours it asks each source what is new, and downloads whatever it findssrc/poller.rs, src/ingesta/
archiveStores the bytes and the metadata. It is the centre: everything else reads from it or writes to ititems, item_medios tables
emissionTakes what was approved and publishes it, respecting each destination’s tapsrc/emision/, src/redes/
panelWhere a person looks, approves, grants permissions and pulls the brakeui/core + its wrapper

What this system cannot do

This is not a list of missing features: these are things the design prevents on purpose, and each one has its guard in the code or in the database.

It does not publish without recorded permission. A drawn flow is not a permission. Without a valid consent towards that destination account, the emission does not go out — and the panel draws the edge broken, not connected. How it works

It does not publish without attribution what arrived without consent. An item replicated from a loose link is marked atribucion_sin_permiso, and the database rejects the INSERT if it does not carry the link to the original. Attribution is not a convention: it is a CHECK.

It does not sign its own credentials. This service validates identities against the host and never issues a token. If the host does not answer, it replies 503 — “I cannot know who you are” — and not 401, which would assert that you are nobody. How it works

It does not invent a green light. No screen says “it works” without having checked against the network. The best thing an untested flow says is “untested”.

Where to go next

  • A post’s journey — from someone else’s account to publication, step by step. Start here.
  • Download the code — the repo, the tagged versions and the licence (AGPL-3.0).
  • The data — the ERD, table by table.
  • The modules — how the service is split.
  • The interface — the framework-free core and its wrappers.
  • Cauce — describing an entire installation in one file.