igneum/docs/community/reddit/bot.md
igneum-labs f53e184740 Community kit for r/igneum, the Reddit profile, Discord and the stats bot (6 October 2026)
docs/community/reddit/: settings.md (name, title, description, type, content options, topics, flair set, post requirements), automoderator.yaml (price and sale talk removed, referral links removed, flair required, accounts under 2 days queued, the bot's comments removed), rules.md (eight rules under Reddit's limits), sidebar.md (four widgets and the welcome message, five dated facts from the bench log), wiki/ (index, faq with twenty sourced answers, mining with the eleven-card table, proving tiers and pay, ledger process, glossary), posts/ (start-here, the launch post adapted, the weekly numbers template on /api/stats, /api/live and /api/supply fields, the AMA plan with fifteen questions), bot.md, outreach.md, outreach-week-1.md (the 30-day account rule), profile.md, discord.md, assets/ (Reddit avatar and banner, Discord icon and two banners, rendered from site/icon-512.png and the site's palette and fonts, no slogan).

tools/community/reddit-bot.mjs: the labelled stats bot (OAuth script app, credentials in ~/.config/igneum/reddit, dry-run mode, forbidden-string guard, no comment endpoint). Dry run against the live API at 17:34 UTC rendered; the guard refused a known-bad text and passed a clean one.

Subreddit rules in outreach.md are from memory and marked approximate: reddit.com refused every fetch route (WebFetch, the browser pane, curl 403). Every other number names its file or API field.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 17:37:48 +00:00

4.9 KiB

u/igneum_bot: the labelled stats bot

6 October 2026. A second Reddit account that posts the weekly devnet numbers and devnet incidents to r/igneum, and the same numbers to the Discord #numbers channel. It never replies to anyone. Script: tools/community/reddit-bot.mjs (Node 22, no dependencies).

The account

Field Value
Handle u/igneum_bot
Display name Igneum stats bot
About (under 200 chars) Posts the weekly devnet numbers from igneum.network/api/stats and devnet incidents to r/igneum. Never replies. Run by the project; questions go to u/igneum_network.
User flair in r/igneum Bot (mod-assigned, the only user flair)
Moderator permissions Flair only (so its posts carry the Devnet flair)
2FA On; the OAuth script app is the only thing that logs in after setup
Reddit app reddit.com/prefs/apps, type "script", name igneum-stats-bot, redirect uri http://localhost (unused), owned by u/igneum_bot. Reddit's rules for bots: a descriptive user agent naming the account, and the account is a bot in its about text (approximate; check the current API terms before the first live post)

What it posts, and when

Post When Flair Content
Weekly numbers Monday 09:00 UTC Devnet posts/02-weekly-numbers-template.md rendered from /api/stats, /api/live and /api/supply, with the previous week's snapshot in the "Last week" column
Devnet incident When the operator runs it with --text Devnet One operator-written sentence (UTC time, what happened, cause, the rule or fix) plus a fixed footer. The bot never writes an incident itself; it has no judgement to apply

Nothing else. No replies, no comments, no votes, no DMs, no crossposts. The script contains no comment endpoint, and AutoModerator rule 8 removes any comment from the account and pages the moderators if one ever appears.

Credentials

File: ~/.config/igneum/reddit, mode 600, KEY=VALUE lines, never in the repository, never printed. Keys: REDDIT_CLIENT_ID, REDDIT_CLIENT_SECRET, REDDIT_USERNAME, REDDIT_PASSWORD, REDDIT_SUBREDDIT (igneum), REDDIT_FLAIR_TEXT (Devnet, optional), DISCORD_WEBHOOK_URL (optional, the #numbers webhook). node tools/community/reddit-bot.mjs check prints which keys are present and never their values. The script reads the file at post time only.

Commands

node tools/community/reddit-bot.mjs weekly --dry-run              # renders to docs/community/reddit/out/weekly-<date>.md, posts nothing
node tools/community/reddit-bot.mjs weekly                        # posts to r/igneum, saves the snapshot for next week
node tools/community/reddit-bot.mjs weekly --discord              # the same, plus the Discord webhook
node tools/community/reddit-bot.mjs weekly --incidents file.txt   # one incident sentence per line, included under "Incidents this week"
node tools/community/reddit-bot.mjs incident --text "..." [--dry-run] [--discord]
node tools/community/reddit-bot.mjs check

The out/ directory is git-ignored. The snapshot lives in ~/.config/igneum/reddit-bot-state.json and is written only after a successful live post, so a failed post never advances "last week".

Guards

  • Dry run is the default in the operator's hands: the live command is run only after reading the dry-run file.
  • A forbidden-string guard refuses to post text matching the site's private patterns (the founder's first name, the host names, the local time zone, machine names). Tested 6 October 2026: a dry-run incident containing the founder's name was refused with exit 1; a clean one rendered.
  • Every API number renders as "n/a" when null and the post opens with a stale warning when /api/stats says stale.
  • The title is cut at 100 characters, Reddit's limit.
  • No retry loop: a failed post exits 1 and the operator reads why. A watcher that posts twice is worse than one that posts nothing.

Tested, 6 October 2026

Dry run against the live API at 17:34 UTC rendered 2,854 characters: 1.11 GH/s, height 139,180, 1,986 shards paid, median proof lag 406.5 s, 3 provers in 10 minutes, 56 voters, ramp 17.1%, supply check 500 of 500. The guard fired on the known-bad case and passed the known-good one. Not yet run: the live Reddit submit (no app or credentials exist yet), the flair lookup, the Discord webhook. The first live post is watched by hand.

Scheduling

A launchd or cron entry on the Mac, Monday 09:00 UTC (10:00 London in winter), running the live weekly command with --discord, after the credentials exist and one live post has been made by hand. Not before. The entry is the operator's, outside the repository.

Rules the bot lives under

  1. It never replies to people. If a reply is needed, u/igneum_network writes it.
  2. It posts only the two kinds above.
  3. It posts numbers from the public API and incident sentences a person wrote; it never infers an incident.
  4. Its credentials are never printed, logged or committed.
  5. If it misbehaves, the account is disabled first and the cause found second.