<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Trust on Loracle Blog</title><link>https://loracle.app/blog/tags/trust/</link><description>Recent content in Trust on Loracle Blog</description><generator>Hugo -- 0.155.0</generator><language>en-us</language><lastBuildDate>Fri, 30 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://loracle.app/blog/tags/trust/index.xml" rel="self" type="application/rss+xml"/><item><title>The Unsubscribe Link Your D&amp;D Bot Owes You</title><link>https://loracle.app/blog/posts/the-unsubscribe-link-your-dnd-bot-owes-you/</link><pubDate>Fri, 30 Oct 2026 00:00:00 +0000</pubDate><guid>https://loracle.app/blog/posts/the-unsubscribe-link-your-dnd-bot-owes-you/</guid><description>Your players never signed up for anything, and our bot was set to email them twice per session anyway. The audit that caught it, and what a bot owes an inbox it borrowed.</description><content:encoded><![CDATA[<p>When you add a reminder bot to your campaign, you make a decision about five other people&rsquo;s inboxes. They were never asked. They never created an account, never typed an email into a form, never saw a checkbox. You invited a bot to the table, and the bot inherited the whole table.</p>
<p>That arrangement is normal in D&amp;D tooling and it deserves more suspicion than it gets. If you&rsquo;ve ever wondered whether a bot you&rsquo;re about to install will spam your players, this post is the audit we ran on our own product, what we found, and the checklist we&rsquo;d now hold any bot to, ours included.</p>
<h2 id="what-the-audit-found">What the audit found</h2>
<p>On October 6th we sat down and traced every path by which Loracle sends a session reminder. The defaults at the time: a reminder one day before the session and another one hour before, delivered on email and Discord both, for every campaign member, on by default.</p>
<p>Count that out. Four pings per member per session. A table of six playing weekly generates about a hundred notifications a month, to people who opted into exactly none of them.</p>
<p>The emails themselves were worse than the volume. Each one was a single line of text. No unsubscribe link. No link to a settings page. No <code>List-Unsubscribe</code> header. A player who had never logged into the web app, which describes most players, since the DM does the setup, had no way to make the emails stop. Their options were asking the DM to remove them from the campaign, or clicking &ldquo;report spam.&rdquo;</p>
<p>That second option matters beyond the one annoyed player. Spam reports are scored against the sending domain. One player flagging a reminder they couldn&rsquo;t turn off degrades deliverability for every table we serve, including the recap email someone else actually wants. An email you can&rsquo;t decline is a liability to everyone sharing the pipe.</p>
<h2 id="what-we-shipped">What we shipped</h2>
<p>Five changes, aimed at the structure that produced the problem.</p>
<p><strong>The default dropped to one reminder.</strong> An hour before the session, one slot, because that&rsquo;s the reminder that changes behavior. The day-before slot still exists for tables that want it, as an opt-in in settings. Default volume is a statement about whose time you think you own, and the honest default for someone who never signed up is the minimum useful amount.</p>
<p><strong>Every notification email now carries a signed one-click unsubscribe.</strong> The link holds a short-lived signed token naming the user and the event type. The token is the authentication. No account, no login, no password reset for an app you&rsquo;ve never opened: one click and that category of email stops. For session reminders it goes further and cancels anything already queued for you, so the unsubscribe takes effect before the next send, immediately.</p>
<p><strong>The headers went in too.</strong> <code>List-Unsubscribe</code> and <code>List-Unsubscribe-Post</code>, the RFC 8058 pair, so Gmail and Apple Mail render their own unsubscribe button at the top of the message. Most people who want out will never scroll to a footer. Meeting them where their mail client already looks is the difference between an unsubscribe and a spam report.</p>
<p><strong>The link is attached at the dispatcher, not in each template.</strong> This is the structural fix, and it&rsquo;s the part worth stealing. Every user-scoped email in the system flows through one dispatch function, and that function stamps the unsubscribe link onto the message before anything sends. A future feature can add a new email type while forgetting about unsubscribe entirely, and the link ships anyway. Per-template diligence decays; a chokepoint doesn&rsquo;t.</p>
<p><strong>Late reminders get dropped instead of sent.</strong> If the worker falls behind and a reminder comes due more than fifteen minutes late, it gets marked skipped and never sends. A reminder for a session that started twenty minutes ago is spam wearing a helpful costume. We&rsquo;d rather miss one than send it.</p>
<h2 id="the-checklist-for-any-bot-youre-about-to-install">The checklist, for any bot you&rsquo;re about to install</h2>
<p>The audit left us with a short list of what a bot owes an inbox it borrowed. You can&rsquo;t read a vendor&rsquo;s dispatch code before installing their bot, but you can check the output. Add a bot to a test server, trigger one email, and look at what arrives:</p>
<ol>
<li><strong>Is there an unsubscribe link, and does it work without an account?</strong> Forward the email to an address that has never logged in, click the link there, and see what happens. If the path to silence runs through &ldquo;create an account,&rdquo; the bot has decided your players owe it a signup.</li>
<li><strong>Does Gmail show an unsubscribe button at the top?</strong> If yes, the headers are present and your least technical player can get out in one tap. If no, the vendor hasn&rsquo;t thought about the person who never scrolls.</li>
<li><strong>What&rsquo;s the default volume for a member who configured nothing?</strong> Whatever you receive in that test is what every player at your table will receive. Judge it as if a stranger&rsquo;s bot were sending it to you, because from your players&rsquo; side, that&rsquo;s what it is.</li>
</ol>
<p>A reminder bot sits in a strange trust position: the DM chooses it, the players live with it. The vendor&rsquo;s incentives all point toward more email, since every message is an impression. Which is exactly why the unsubscribe machinery is the thing to check. A bot that makes leaving easy is a bot that expects you to want to stay.</p>
<p>Loracle&rsquo;s reminders now pass all three checks. They didn&rsquo;t three weeks ago, and nobody outside the codebase would have known either way. That&rsquo;s the real argument for running this test on any bot that touches your table, ours included: the inbox behavior of a Discord bot is invisible right up until it&rsquo;s annoying, and by then it&rsquo;s annoying five people who never chose it.</p>
]]></content:encoded></item></channel></rss>