The modules
The service is a single Rust binary. One process starts three things: the API (axum), the poller and the emission worker.
The module map
What each one does
Fetching material — ingesta/
One module per source, all behind the same shape: given an account and its cursor, return what is new.
| Module | Source | How |
|---|---|---|
ingesta/cliente.rs | Instagram with a token | Graph API, Business/Creator accounts |
ingesta/instagram_publico.rs | Instagram without a token | Headless browser over the public profile |
ingesta/telegram.rs | Telegram | Bot API (getUpdates) |
ingesta/rss.rs | Any feed | feed-rs, RSS and Atom |
ingesta/web.rs | Your own site | The Antisionista API |
Instagram has two modules and not one. With a token the official API is
used, which is fast and stable. Without a token —a public account that gave
permission but cannot hand over business credentials— the profile is opened
with a browser. They are different paths with different costs, and the marker
for which one to use is explicit (config.via = 'navegador'), never
inferred from a missing credential: inferring it would turn a revoked token
into scraping without anyone deciding so.
Publishing — redes/
| Module | Destination |
|---|---|
redes/mastodon.rs | Mastodon and compatibles |
redes/telegram.rs | Channels and groups |
redes/identidad.rs | “Who am I with this token?” — verifies before signing an account up |
redes/segmentacion.rs | Splits a long video into publishable pieces |
redes/falso.rs | A fake destination, for the tests |
The probes — probe/
They answer “would this work?” without publishing anything. They are split
into origen and destino because those are different questions: whether you
can read, and whether you can write.
A probe never returns “ok” without having touched the network. It may
return no_verificado, which is neither good nor bad: there was nothing to
check it with. Having it as a state of its own is what stops “could not look”
from being counted as “it is fine”.
How the emission pieces relate
The tap (max_por_hora) lives on the destination ACCOUNT, not on the
route. The limit belongs to whoever receives: if three different flows point
at the same Mastodon account, the ceiling is set by Mastodon and not by each
flow separately. Putting it on the route would have let three routes “of 4 per
hour” do 12.
The two surfaces: HTTP and CLI
They do similar things and they are not interchangeable.
The backup with encrypted credentials only comes out through the CLI. Over HTTP the tokens always come out empty. That cut is what leaves the invariant “this service has no endpoint that returns ciphertext” without exceptions: the only path that touches them is not an endpoint.
The CLI does not get a free pass for running on the server. Import and restore validate identity against the host and require the administration capability. Only export and validate are exempt, because a backup has to be able to run from cron.