docs: sandboxed systemd unit, auto-update requirements, v1.2.2 notes
Setup guide now installs uv system-wide for services, gives a complete
sandboxed unit (writable uv cache, system Python only, UMask=0007,
XDG_CONFIG_HOME), grants the service account write access to
directories and .git rather than files, and lists what auto-update
needs: HTTPS remote, safe.directory, clean tree. Adds the v1.2.2
untrack step and the missing state files to the table. All of it was
exercised on the production host.
67405fa
docs: install and run with uv instead of pip
v1.2.0 moved dependencies to pyproject.toml/uv.lock. Setup now uses
uv sync --frozen --no-dev and starts with uv run --frozen --no-dev;
the systemd example puts uv on PATH so auto-update can find it, and
the auto-update description covers the uv sync step and the
unknown-changes gate.
e07a09c
docs: document /media_dump and its MEDIA_DUMP_* settings
d6e9190
Document the raid protection, anti-nuke, and spam protection systems
Adds a Safety Systems page covering all three: what each detects, how
they respond, the bot permissions they need, and guidance on sizing the
thresholds against a server's own join history rather than a guess.
Records the reasoning behind the non-obvious choices, since they look
like oversights otherwise: link spam is detected behaviorally instead of
by domain blocklist (scam domains burn within days), avatar clustering
hashes image bytes rather than Discord's avatar key (whether identical
uploads share a key is undocumented and unverified), and the raid
lockdown uses Discord's self-expiring incident actions so no local state
has to survive a restart.
Spells out that anti-nuke deliberately does NOT exempt moderators. A
compromised moderator account is the threat it exists for, so exempting
trusted accounts would defeat it — and a reader assuming the usual
moderator exemption would draw exactly the wrong conclusion.
Home, Setup-Guide and Commands-Reference updated to match, including the
three permissions an existing install won't already have granted.
4028520
Document PR #5: guild-wide perms, kick rank check, param bounds, DM scope
- Permission checks are now resolved guild-wide, not per-channel
overwrite; note the security rationale and that no command works
in a DM
- /kick and /kick_role now also check the invoker's role rank, not
just the bot's
- Document the new limit param on /purge_string and /purge_webhooks,
and the scan-vs-delete distinction; note the fixed silent 100-message
cap
- Document enforced ranges on /timeout, /purge_last_messages,
/message_dump, /log_tail
- /voice_chaperone disabling now releases outstanding mutes immediately
- /check_event_feeds explicitly scoped to the invoking guild
- Event announcements changed from an embed to a plain heading + URL
(still unfurls to a native event card)
- iCal DURATION is now honored for event end times, not just DTEND
- Feed/event-page fetches now validate against SSRF and cap response
size
- /dashboard now sends multiple messages when the listing exceeds
Discord's 2000-char limit
- Corrected the Concurrency Model section to match the current
implementation (APScheduler jobs, not a reminder thread; locks guard
specific dicts, not a general cache)
- Python support: 3.11+, CI now covers 3.11-3.14
- Added an Upgrade Notes section covering the one-time event-timing
cleanup (/check_event_feeds once, then delete stale mistimed events)
59513f1
Document server backup/restore, permission-bit auth model, tag-based versioning
88c88ec
docs: genericize deployment and feed examples
- Replace the real Meetup group feed in the /add_event_feed and
/remove_event_feed examples with a neutral placeholder, and describe
the Meetup iCal URL pattern instead of naming a specific group
- systemd section now uses placeholders for the service name, user,
paths and interpreter rather than reading like one specific host
- Recommend EnvironmentFile over an inline Environment= token: unit
files under /etc/systemd/system are world-readable, so an inline
token is exposed to every account on the machine
9841309
docs: DM auto-kick policy, corrected access levels, chaperone lifecycle
- /log_tail and /list_users_without_roles moved to the Moderator row
of the permissions table and marked Moderator in their own sections
- Document the automatic DM kick on Home and in Setup-Guide, including
the moderator and recently-DMed exemptions, plus the Kick Members
permission it needs. This behavior was previously undocumented
- /clone_role_permissions: note that all moderation permissions are
excluded, and correct the @Moderator -> @Junior-Mod example, which
implied those permissions transfer
- Chaperone: single alert per incident, automatic unmute, and mute
persistence across restarts
- Day-of event reminders run Tue-Sun, not daily
- Add a Runtime State Files table covering chaperone_mutes.json
- Note the ~15 line practical cap on /log_tail output
d71b51f
Update checking is config-only; remove /update_checking docs
10feaa9
Document AUTO_UPDATE_ENABLED auto-update option
12ff129
Event feed commands are mod-only; restore 64-user Discord API limit notes
00340cf
Sync wiki with current functionality
Remove obsolete /event_announce commands (now automatic via
/add_event_feed), update feed schedule and message_dump DM delivery,
fix config setup (config_example.py), Python 3.11+, permission levels.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
6dd244d
docs: update Event Feed and add Event Announcement command docs
- Rewrite Event Feed Commands section for new architecture
- Add feed_name, required channel, RSS support, JSON-LD scraping
- Add new Event Announcement Commands section
- Update Table of Contents and permission table
32b655e
Updated to comply with project changes
6b0a519
Updated Commands Reference (markdown)
8d4bda2
Updated Setup Guide (markdown)
8f13381
Added voice chaperone switch
591d617
Added voice chaperone default state
3dbbeea
Created Commands Reference (markdown)
90deb09
Created Setup Guide (markdown)
464b69b