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>
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
- It never replies to people. If a reply is needed, u/igneum_network writes it.
- It posts only the two kinds above.
- It posts numbers from the public API and incident sentences a person wrote; it never infers an incident.
- Its credentials are never printed, logged or committed.
- If it misbehaves, the account is disabled first and the cause found second.