BSBKJVWEBYLTASVBBEWMBT4TDBY|HymnsMusicDonate
Menu
Announcements

Running a SermonIndex Node — Technical Reference

sermonindex Jul 9, 2026

A hands-on reference for running the Node Software and operating a seed node.
Written for technical users; assumes comfort with a router admin page and a
terminal. (Building from source and server/maintainer setup live in a separate
document.)


App: SermonIndex Node Software v1.1.0
Every node downloads sermons and shares them peer-to-peer (BitTorrent).
Seed nodes hold a large portion — or all — of the library and stay online,
forming the reachable backbone of the network.



1. How a node behaves


HTTP (Bunny CDN / Archive.org) is the guaranteed way to get a file; once a
file is on disk the app seeds it over BitTorrent (DHT + trackers + UPnP).
The downloads folder is the source of truth. On launch the app reseeds
exactly what's on disk — delete a file and it's truly gone (no silent
re-download).
One instance only — launching again focuses the existing window.
Leaf vs seed: even behind a closed router your node still uploads to
reachable peers. A node that is itself reachable (§5) becomes backbone.



2. Install & first run


Install the app for your OS (.dmg/.app, .msi/.exe, or .AppImage/.deb).
Launch it. On first run it fetches the catalog and starts the BitTorrent node.
Check the Connections page — it shows your listen port, reachability, DHT
and peer status.


No account or configuration is required to be a normal (leaf) node — just leave it
running.


3. Where your data lives

All state is under ~/.sermonindex/:

~/.sermonindex/
├── downloads/ # default download root (relocatable)
│ ├── ar/aRkmxYLtHA4H8-9Y.mp3 # sharded: <2-char>/<id>.<ext>
│ └── speaker-images/ # right-click → Download image
├── torrents/ # .torrent files for locally-seeded media
├── settings.json # holds your "storage_dir" override
├── catalog.json / download-state.json
└── torrent-session/ # DHT cache


Filenames are the sermon id (<id>.mp3/.mp4) — that is the file's
torrent identity; don't rename them or seeding breaks. Use Export (in My
Downloads) to get human-named copies in Desktop/<Speaker>/<Title>.ext.
Sharding: files auto-sort into 2-character subfolders so no single folder
holds tens of thousands of files (matters on exFAT/FAT32 external drives). It's
purely local and never affects the torrent/infohash.


Relocating storage (e.g. an external drive)

My Downloads → Change… (or the Seed Node setup) → pick the drive. This
persists storage_dir; new downloads go there, existing files stay put. Set
this before a big seed download so everything lands on the drive.


4. Networking & firewall

PropertyValueListen portsTCP/UDP 42800–42839Port mappingUPnP + NAT-PMP (auto)Peer discoveryMainline DHT + public UDP trackers

If you run a restrictive firewall, allow outbound HTTPS to:

*.sermonindex.net · *.b-cdn.net · *.archive.org
community-chat-z71kj.bunny.run · app-endpoints-gkb5p.bunny.run
ipapi.co · ipwho.is · ip-api.com

For inbound reachability (seed nodes), forward TCP 42800 (§5).


5. Running a seed node


Unlock the Seed Node page (password provided by a maintainer:
<SEED_PASSWORD>).
Pick scope:

Audio only — full mp3 library, ~400 GB
Full — audio + video, ~2.4 TB (~2 TB video)



Point storage at your dedicated drive first (§3).
Start the scope-filtered bulk download. It fetches only what's missing and
resumes across restarts, so you can stop/start freely. Full runs take days —
just leave it going.
Make the node reachable (§6) so you count as backbone.


Verified Seed Node requires both:


≥ 95 % of the chosen scope present on disk (measured by an actual disk scan,
not download history), and
the node is reachable from the internet.


The Seed Node page shows your on-disk coverage; the menu badge counts reachable
seed nodes network-wide (your own node isn't counted for you).


6. Making your node reachable

Check the Connections page: Good/Excellent = reachable, Fair = running
but not reachable.

Automatic (works on many routers)

The app tries UPnP / NAT-PMP on start. If your router allows it, you're done.

Manual port forward


Reserve a static LAN IP for the seed machine (DHCP reservation in router).
Open the router admin page (often http://192.168.1.1).
Under Port Forwarding / Virtual Servers / NAT, forward
TCP 42800 → <machine-LAN-IP> (or the full 42800–42839 range).
Save and restart the app.


Verify from outside

bashcurl -X POST 'https://app-endpoints-gkb5p.bunny.run/probe' \
-H 'content-type: application/json' \
-d '{"port":42800,"ip":"<YOUR_PUBLIC_IP>"}'
# → {"ok":true,"open":true,...} open:true means reachable

Gotchas


CGNAT (many cellular / some fiber ISPs): inbound is impossible without a
real public IP — ask the ISP for bridge mode, or tunnel through a VPS/VPN that
offers port forwarding.
Changing WAN IP: use a free Dynamic DNS hostname.
Forward TCP — peer traffic here is TCP; DHT (UDP) works outbound regardless.
You don't need to forward to help, but reachable nodes are what keep the
archive alive 24/7.



7. Always-on / Raspberry Pi

A Raspberry Pi 4/5 (4 GB+), 64-bit OS, with an external USB/NVMe drive makes a
great low-power permanent node:


Run the Linux build, point storage at the external drive, forward the port (§6).
The app registers autostart, so it relaunches on boot — set it and forget it.
Keep OS/webview packages patched.


Any always-on machine (mini-PC, NAS that runs desktop Linux, a spare laptop with
the lid-close-sleep disabled) works equally well.


8. Everyday operation


Status at a glance: Connections page (reachability, peers, port), Seed Node
page (scope coverage %), sidebar badges (nodes / seeds online).
Updates: the app checks for signed updates on launch and applies them
automatically.
Moving the drive: quit the app, move the drive, relaunch, and re-point
storage_dir if the mount path changed — it reseeds from disk.
Pause/resume bulk downloads any time; progress is derived from disk, so
nothing is lost.



9. Troubleshooting

SymptomCause / fixOffline / Fair on ConnectionsPort not reachable — forward TCP 42800 (§6); confirm no second instance; check for CGNAT.No data loadingCatalog/master-list fetch failing — allow outbound to *.b-cdn.net and analytics.sermonindex.net; it retries automatically.Downloaded files not in My DownloadsState is rebuilt from disk on launch; reopen the page. Files are named <id>.<ext> by design.Files reappear after I delete themShould not happen on current builds (no torrent persistence; reseed-from-disk). Update if you see it.Seed % stuck below VerifiedNeed ≥95 % of the scope on disk and reachability — verify the drive holds the full scope and the port is open.Speaker images broken/slowCosmetic; the app falls back to a bundled placeholder. Some portraits are missing upstream.Change-folder button does nothingUse a current build; relaunch after changing the storage folder.

This discussion is locked.

Archived
1 of 1 posts