<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Freesbe blog</title>
    <link>https://freesbe.net/blog/</link>
    <atom:link href="https://freesbe.net/blog/rss.xml" rel="self" type="application/rss+xml" />
    <description>How Freesbe works and why we built it the way we did.</description>
    <language>en</language>
    <item>
      <title>Webhook URLs are public, so design them that way</title>
      <link>https://freesbe.net/blog/webhook-urls-are-public/</link>
      <guid isPermaLink="true">https://freesbe.net/blog/webhook-urls-are-public/</guid>
      <pubDate>Wed, 28 Oct 2026 00:00:00 GMT</pubDate>
      <description>The rules behind Freesbe's webhook URLs - nothing readable about the customer, a path that matches the settings page, old URLs that work forever - and why incoming webhooks accept Slack and Teams payloads.</description>
    </item>
    <item>
      <title>We moved CI to a MacBook Air</title>
      <link>https://freesbe.net/blog/ci-on-a-macbook/</link>
      <guid isPermaLink="true">https://freesbe.net/blog/ci-on-a-macbook/</guid>
      <pubDate>Wed, 21 Oct 2026 00:00:00 GMT</pubDate>
      <description>How a day of 266 CI runs pushed Freesbe onto self-hosted build machines - a laptop and a small virtual machine - what stayed on hosted runners, and the outage that taught us about idle timeouts.</description>
    </item>
    <item>
      <title>Shipping 25 languages with English as the key</title>
      <link>https://freesbe.net/blog/english-as-the-key/</link>
      <guid isPermaLink="true">https://freesbe.net/blog/english-as-the-key/</guid>
      <pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate>
      <description>How Freesbe is translated into 25 languages, including right-to-left Arabic and Hebrew, why our translation catalogs are keyed by the English sentence instead of an id, and what right-to-left support really takes.</description>
    </item>
    <item>
      <title>Measuring call quality without asking anyone</title>
      <link>https://freesbe.net/blog/measuring-call-quality/</link>
      <guid isPermaLink="true">https://freesbe.net/blog/measuring-call-quality/</guid>
      <pubDate>Wed, 23 Sep 2026 00:00:00 GMT</pubDate>
      <description>How every Freesbe call measures its own audio quality from WebRTC stats, what counts as a poor call, and how a weak connection automatically puts voices ahead of video.</description>
    </item>
    <item>
      <title>Search that finds the middle of a word, and the migration that broke production</title>
      <link>https://freesbe.net/blog/search-inside-words/</link>
      <guid isPermaLink="true">https://freesbe.net/blog/search-inside-words/</guid>
      <pubDate>Wed, 09 Sep 2026 00:00:00 GMT</pubDate>
      <description>How Freesbe added substring search with a SQLite trigram index next to the word index, why it matters for many languages, and the ordering mistake that broke our deploys.</description>
    </item>
    <item>
      <title>Our docs screenshots are generated, never taken</title>
      <link>https://freesbe.net/blog/screenshots-are-generated/</link>
      <guid isPermaLink="true">https://freesbe.net/blog/screenshots-are-generated/</guid>
      <pubDate>Wed, 26 Aug 2026 00:00:00 GMT</pubDate>
      <description>How every screenshot in Freesbe's help center is produced by a script from a made-up demo company, retaken once a day, and why we stopped taking screenshots by hand.</description>
    </item>
    <item>
      <title>Encrypting the local cache with a key that never touches disk</title>
      <link>https://freesbe.net/blog/encrypted-local-cache/</link>
      <guid isPermaLink="true">https://freesbe.net/blog/encrypted-local-cache/</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>How Freesbe keeps a local copy of your messages so the app opens instantly, why that copy is encrypted with a key held only in memory, and the trade-off we accepted.</description>
    </item>
    <item>
      <title>Running many AI coding agents on one repo without merge hell</title>
      <link>https://freesbe.net/blog/many-ai-agents-one-repo/</link>
      <guid isPermaLink="true">https://freesbe.net/blog/many-ai-agents-one-repo/</guid>
      <pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate>
      <description>How Freesbe runs several AI coding agents in parallel on one codebase, why merge conflicts became the bottleneck, and the merge drivers and rules that fixed it.</description>
    </item>
    <item>
      <title>One stale track muted the whole meeting</title>
      <link>https://freesbe.net/blog/one-stale-track/</link>
      <guid isPermaLink="true">https://freesbe.net/blog/one-stale-track/</guid>
      <pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate>
      <description>A postmortem of a Freesbe meeting where some people couldn't hear others, traced to a single leftover audio track and a gateway that refused whole batches, and what we changed.</description>
    </item>
    <item>
      <title>Recording calls in the browser is about 25 times cheaper</title>
      <link>https://freesbe.net/blog/recording-in-the-browser/</link>
      <guid isPermaLink="true">https://freesbe.net/blog/recording-in-the-browser/</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate>
      <description>Why Freesbe records huddles and meetings in the recorder's own app instead of on a server, what it costs each way, and the trade-offs we accepted.</description>
    </item>
    <item>
      <title>Letting AI agents into a workspace without handing them the keys</title>
      <link>https://freesbe.net/blog/ai-agents-without-the-keys/</link>
      <guid isPermaLink="true">https://freesbe.net/blog/ai-agents-without-the-keys/</guid>
      <pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate>
      <description>How Freesbe connects Claude, ChatGPT, code editors and other AI agents with the Model Context Protocol and OAuth, so each agent gets only what a person allowed and admins can see everything it did.</description>
    </item>
    <item>
      <title>We built our own call server, and our apps don't know it exists</title>
      <link>https://freesbe.net/blog/call-servers-same-api/</link>
      <guid isPermaLink="true">https://freesbe.net/blog/call-servers-same-api/</guid>
      <pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate>
      <description>Why Freesbe's own video call server answers the exact same API as the managed media service we started on, so moving a call between them changes nothing in the apps.</description>
    </item>
    <item>
      <title>We gave every customer their own database</title>
      <link>https://freesbe.net/blog/one-database-per-customer/</link>
      <guid isPermaLink="true">https://freesbe.net/blog/one-database-per-customer/</guid>
      <pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate>
      <description>Why Freesbe keeps each workspace's messages in a small database of its own instead of one big shared one, how we moved live workspaces over, and what it gave us for free.</description>
    </item>
    <item>
      <title>How Advanced AI noise cancellation works</title>
      <link>https://freesbe.net/blog/advanced-ai-noise-cancellation/</link>
      <guid isPermaLink="true">https://freesbe.net/blog/advanced-ai-noise-cancellation/</guid>
      <pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate>
      <description>How Freesbe's AI noise cancellation for calls works, how it differs from active noise cancellation in headphones, and why it runs on your own computer.</description>
    </item>
  </channel>
</rss>
