Transmissions into the Void
2025-09-06
If you're reading this, I'm sure you're aware of Antenna.
It's a great feed aggregator for geminispace. One of the things I think is
really innovative about it is that it does no automatic scraping. Instead, when
posts are made on some capsule it is the capsule's responsibility to notify
Antenna that there's New Stuff. This ensures that
- it's showing the most recent stuff at all times
- there's only active sources for Antenna to worry about
So me being very lazy, I wanted to automate this ping. As part of my pipeline I
automatically regenerate my /posts/index.gmi and /posts/atom.xml files.
(Incidentally, /posts/index.gmi is in proper gemlog format now, so yay.) I just
needed something to notice when one of those files is updated to ping Antenna.
What I came up with is the following. First, a quick and dirty shell script to
notify Antenna that New Stuff is available.
#!/usr/bin/env bash
# /usr/local/bin/antenna-ping
set -euo pipefail FEED_URL="${1:-gemini://remort.app/posts/atom.xml}"
# URL-encode the feed
ENC=$( python3 - "$FEED_URL" <<'PY' import sys,
urllib.parse print(urllib.parse.quote(sys.argv[1], safe='')) PY )
# Fire-and-forget Gemini GET to Antenna
printf 'gemini://warmedal.se/~antenna/submit?%s\r\n' "$ENC" \
| openssl s_client -quiet -servername warmedal.se -connect \
warmedal.se:1965 >/dev/null
exit 0
I set that executable of course (chmod +x). Then I'm leveraging a feature of
systemd that watches paths for changes (and optionally in place file
modifications which I use for my gopher mirror generator). To use that, we first
create a systemd service as normal:
# /etc/systemd/system/antenna-ping.service [Unit] Description=Ping Antenna after feed update [Service] Type=oneshot User=remort Group=remort ExecStart=/usr/local/bin/antenna-ping gemini://remort.app/posts/atom.xml
So all that does it run our little script and passes in the url to give to
Antenna. Then the file watcher bit is another systemd unit:
# /etc/systemd/system/antenna-ping.path [Unit] Description=Watch /srv/gemini/posts/atom.xml for changes [Path] PathModified=/srv/gemini/posts/atom.xml Unit=antenna-ping.service [Install] WantedBy=multi-user.target
In my case I'm just having it watch my atom.xml feed file. And whenever that
changes it calls the service which in turn runs our little script and Antenna is
notified.
Now I can be lazy and not have to think about it.