<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Yousef Selawi — Notes</title>
    <link>https://yousef.selawii.com/notes</link>
    <description>Short technical notes on Django, PostgreSQL and TimescaleDB, each built around a demo you can drive.</description>
    <language>en</language>
    <atom:link href="https://yousef.selawii.com/rss.xml" rel="self" type="application/rss+xml" />
    <lastBuildDate>Fri, 07 Aug 2026 00:00:00 GMT</lastBuildDate>
    <item>
      <title>What day is it?</title>
      <link>https://yousef.selawii.com/notes/what-day-is-it</link>
      <guid isPermaLink="true">https://yousef.selawii.com/notes/what-day-is-it</guid>
      <pubDate>Fri, 07 Aug 2026 00:00:00 GMT</pubDate>
      <description>A calendar day is a property of a place, not of a timestamp. An interactive look at why timezone-naive date truncation only breaks for the users furthest from you — and never in your tests.</description>
    </item>
    <item>
      <title>The dashboard that gets slower every day</title>
      <link>https://yousef.selawii.com/notes/continuous-aggregates</link>
      <guid isPermaLink="true">https://yousef.selawii.com/notes/continuous-aggregates</guid>
      <pubDate>Fri, 07 Aug 2026 00:00:00 GMT</pubDate>
      <description>A time-series dashboard does more work every day without anyone changing the code. How TimescaleDB continuous aggregates and compression flatten that curve, and the refresh-policy decision most write-ups skip.</description>
    </item>
    <item>
      <title>Export to CSV, and other ways to kill a container</title>
      <link>https://yousef.selawii.com/notes/streaming-exports</link>
      <guid isPermaLink="true">https://yousef.selawii.com/notes/streaming-exports</guid>
      <pubDate>Fri, 07 Aug 2026 00:00:00 GMT</pubDate>
      <description>Why the obvious CSV export holds every row in memory three times over, how streaming the response and the queryset together makes peak memory constant, and when an export should stop being a request at all.</description>
    </item>
    <item>
      <title>The N+1 you can't see</title>
      <link>https://yousef.selawii.com/notes/n-plus-one</link>
      <guid isPermaLink="true">https://yousef.selawii.com/notes/n-plus-one</guid>
      <pubDate>Thu, 06 Aug 2026 00:00:00 GMT</pubDate>
      <description>An interactive look at why Django N+1 bugs survive code review: they are invisible at the size you develop at, and linear in a number that only grows in production.</description>
    </item>
  </channel>
</rss>
