<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Wissensys - Engineering notes</title>
        <link>https://wissensys.com/blog</link>
        <description>Complex software, made clear and built to last.</description>
        <language>en</language>
        <atom:link href="https://wissensys.com/blog/feed.xml" rel="self" type="application/rss+xml" />
        <item>
            <title>Your suppression list belongs in the mailer, not the call site</title>
            <link>https://wissensys.com/blog/suppression-lists-belong-in-the-mailer</link>
            
            <guid isPermaLink="false">https://wissensys.com/blog/suppression-lists-belong-in-the-mailer#1</guid>
            <pubDate>Mon, 17 Aug 2026 16:41:48 +0000</pubDate>
            <description>Every &quot;we accidentally emailed someone who unsubscribed&quot; incident has the same root cause: the check lived in the code that sends, and one send path forgot it.</description>
            <category>Engineering</category>
        </item>
        <item>
            <title>A Cloudflare Tunnel turns your form redirect into a 502</title>
            <link>https://wissensys.com/blog/a-cloudflare-tunnel-turns-302-into-502</link>
            
            <guid isPermaLink="false">https://wissensys.com/blog/a-cloudflare-tunnel-turns-302-into-502#2</guid>
            <pubDate>Mon, 10 Aug 2026 16:41:48 +0000</pubDate>
            <description>Validation fails, Laravel returns a 302, and the visitor sees &quot;Service temporarily unavailable&quot; instead of &quot;email is required&quot;. Here is why, and what to do.</description>
            <category>Operations</category>
        </item>
        <item>
            <title>A retention policy nobody implemented is a false statement</title>
            <link>https://wissensys.com/blog/retention-policies-that-are-only-a-pdf</link>
            
            <guid isPermaLink="false">https://wissensys.com/blog/retention-policies-that-are-only-a-pdf#3</guid>
            <pubDate>Mon, 03 Aug 2026 16:41:48 +0000</pubDate>
            <description>If your privacy page says data is deleted after two years, something in your codebase has to actually delete it. Usually nothing does.</description>
            <category>Compliance</category>
        </item>
        <item>
            <title>A second Content-Security-Policy header is not a stronger one</title>
            <link>https://wissensys.com/blog/one-owner-per-response-header</link>
            
            <guid isPermaLink="false">https://wissensys.com/blog/one-owner-per-response-header#4</guid>
            <pubDate>Mon, 27 Jul 2026 16:41:48 +0000</pubDate>
            <description>Two CSP headers do not override each other. The browser enforces both, your new allowed origin never takes effect, and nothing in the response looks wrong.</description>
            <category>Engineering</category>
        </item>
        <item>
            <title>If a fresh install does not work, nothing else you measure matters</title>
            <link>https://wissensys.com/blog/a-fresh-install-that-does-not-work-is-a-broken-project</link>
            
            <guid isPermaLink="false">https://wissensys.com/blog/a-fresh-install-that-does-not-work-is-a-broken-project#5</guid>
            <pubDate>Mon, 20 Jul 2026 16:41:48 +0000</pubDate>
            <description>The command that rebuilds the database from nothing is the one command every new machine runs first, and it is the one nobody runs again after the first month.</description>
            <category>Engineering</category>
        </item>
        <item>
            <title>Reduced motion is not &quot;turn the animation off&quot;</title>
            <link>https://wissensys.com/blog/reduced-motion-is-not-turn-the-animation-off</link>
            
            <guid isPermaLink="false">https://wissensys.com/blog/reduced-motion-is-not-turn-the-animation-off#6</guid>
            <pubDate>Mon, 13 Jul 2026 16:41:48 +0000</pubDate>
            <description>An element that animates from invisible, told only to stop animating, stays invisible. The page does not lose its motion - it loses its content, for the people who asked for less motion.</description>
            <category>Engineering</category>
        </item>
        <item>
            <title>Moving the consent gate into the browser does not move the test</title>
            <link>https://wissensys.com/blog/the-consent-gate-belongs-in-the-browser</link>
            
            <guid isPermaLink="false">https://wissensys.com/blog/the-consent-gate-belongs-in-the-browser#7</guid>
            <pubDate>Mon, 06 Jul 2026 16:41:48 +0000</pubDate>
            <description>We moved the analytics gate out of PHP so the HTML would stop varying by cookie. For a while the entire gate could have been deleted with every server-side test still green.</description>
            <category>Compliance</category>
        </item>
        <item>
            <title>A backup you have never restored is a hope, not a backup</title>
            <link>https://wissensys.com/blog/a-backup-you-have-never-restored</link>
            
            <guid isPermaLink="false">https://wissensys.com/blog/a-backup-you-have-never-restored#8</guid>
            <pubDate>Mon, 29 Jun 2026 16:41:48 +0000</pubDate>
            <description>The nightly job is green. The bucket has files in it. Nobody has ever taken one of those files and rebuilt a working database from it, so nobody knows whether they can.</description>
            <category>Operations</category>
        </item>
    </channel>
</rss>
