<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel>
    <title>SFHooks Blog</title>
    <link>https://sfhooks.com/blog/</link>
    <description>Engineering notes from building Salesforce event-delivery infrastructure.</description>
    <item>
      <title>Six things nobody tells you about the Salesforce Pub/Sub API</title>
      <link>https://sfhooks.com/blog/salesforce-pub-sub-api-gotchas/</link>
      <guid isPermaLink="true">https://sfhooks.com/blog/salesforce-pub-sub-api-gotchas/</guid>
      <pubDate>Tue, 28 Jul 2026 12:00:00 GMT</pubDate>
      <description>Silent event loss from reading a stream in the wrong process, connections that die without a word, a replay-ID error message that says "valid", and three more failure modes we hit running CDC subscriptions in production.</description>
    </item>
    <item>
      <title>How a gRPC client leak crashed our BEAM: a literal_alloc post-mortem</title>
      <link>https://sfhooks.com/blog/beam-literal-alloc-grpc-elixir/</link>
      <guid isPermaLink="true">https://sfhooks.com/blog/beam-literal-alloc-grpc-elixir/</guid>
      <pubDate>Tue, 28 Jul 2026 12:00:00 GMT</pubDate>
      <description>grpc-elixir parks every channel — including a ~600KB cacerts blob — in :persistent_term and never erases it. Under reconnect churn that exhausts the BEAM's literal area and aborts the VM. Root cause, the erase-then-resurrect race, and the fix.</description>
    </item>
</channel></rss>
