<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Postgres on Vitor Pontual | The VeePee Hub</title>
    <link>https://vitorpontual.com/tags/postgres/</link>
    <description>Recent content in Postgres on Vitor Pontual | The VeePee Hub</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 02 Jun 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://vitorpontual.com/tags/postgres/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>VeePeenini, Part 5: Going Live</title>
      <link>https://vitorpontual.com/posts/veepeenini-5-going-live/</link>
      <pubDate>Tue, 02 Jun 2026 00:00:00 +0000</pubDate>
      <guid>https://vitorpontual.com/posts/veepeenini-5-going-live/</guid>
      <description>&lt;p&gt;The last stretch before kickoff was about one feeling: when a match is on, the app should feel like everyone is in the same room. The album is a between-matches thing. The lounge is a during-the-match thing, and it needed real reasons to be open while a game is playing.&lt;/p&gt;&#xA;&lt;h2 id=&#34;half-drops&#34;&gt;Half-drops&lt;/h2&gt;&#xA;&lt;p&gt;The core new lever is half-drops. During each half of a live match, everyone can claim one free card, but only from inside the lounge, and only while that half is actually running. Miss the window and it&amp;rsquo;s gone. Two cards a match, max. It rewards being there, live, with the group.&lt;/p&gt;</description>
    </item>
    <item>
      <title>VeePeenini, Part 4: Correctness Before Kickoff</title>
      <link>https://vitorpontual.com/posts/veepeenini-4-correctness-before-kickoff/</link>
      <pubDate>Mon, 01 Jun 2026 00:00:00 +0000</pubDate>
      <guid>https://vitorpontual.com/posts/veepeenini-4-correctness-before-kickoff/</guid>
      <description>&lt;p&gt;With the first match a few days out, my priorities flipped. Up to now the question had been &amp;ldquo;what should this do next.&amp;rdquo; Now it was &amp;ldquo;can I promise this won&amp;rsquo;t lose anyone&amp;rsquo;s cards or mis-grade a prediction.&amp;rdquo; Those are different jobs. The first is additive and fun. The second is paranoid and quiet, and it&amp;rsquo;s the one that decides whether a group of friends still trusts the app in week three.&lt;/p&gt;</description>
    </item>
    <item>
      <title>VeePeenini, Part 3: Launch and the Long Tail of Data</title>
      <link>https://vitorpontual.com/posts/veepeenini-3-launch-and-the-long-tail/</link>
      <pubDate>Fri, 29 May 2026 00:00:00 +0000</pubDate>
      <guid>https://vitorpontual.com/posts/veepeenini-3-launch-and-the-long-tail/</guid>
      <description>&lt;p&gt;The day after launch, one of my friends sent me a message: a group on the bracket was showing the wrong teams. Not a crash, not an error page. Just quietly, confidently wrong. This is exactly the kind of bug you only catch once real people are looking, because they know the tournament better than your test data does.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-bug-that-was-really-two-files-arguing&#34;&gt;The bug that was really two files arguing&lt;/h2&gt;&#xA;&lt;p&gt;The group letters were wrong on the bracket but right everywhere the actual fixtures were involved. When I dug in with Claude, the cause was almost funny: two different files in the codebase each held their own hardcoded copy of which team is in which group, and over a week of changes they had drifted apart. Nine of the twelve groups had at least one wrong assignment in one of the files. The database, the actual source of truth, had been correct the whole time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>VeePeenini, Part 2: Making It Real</title>
      <link>https://vitorpontual.com/posts/veepeenini-2-making-it-real/</link>
      <pubDate>Tue, 26 May 2026 00:00:00 +0000</pubDate>
      <guid>https://vitorpontual.com/posts/veepeenini-2-making-it-real/</guid>
      <description>&lt;p&gt;By the end of day one VeePeenini ran. That is a very different thing from being ready to put in front of people I actually like. The next two days were about the unglamorous distance between those two states, and most of it was product work, not new features.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-auth-reckoning&#34;&gt;The auth reckoning&lt;/h2&gt;&#xA;&lt;p&gt;My first auth choice was magic links. Click a link in your email, you&amp;rsquo;re in. Clean, no passwords to manage. Except it broke the moment the app went behind a Cloudflare Tunnel. The verification token is tied to the host that issued it, and the proxied host didn&amp;rsquo;t match, so every link came back invalid. I spent a little time poking at it and then made a product call: this is a closed group of about a dozen people I know personally. I don&amp;rsquo;t need self-serve signup. I&amp;rsquo;ll provision the accounts myself and hand out passwords.&lt;/p&gt;</description>
    </item>
    <item>
      <title>VeePeenini, Part 1: The Idea and Day One</title>
      <link>https://vitorpontual.com/posts/veepeenini-1-the-idea-and-day-one/</link>
      <pubDate>Sun, 24 May 2026 00:00:00 +0000</pubDate>
      <guid>https://vitorpontual.com/posts/veepeenini-1-the-idea-and-day-one/</guid>
      <description>&lt;p&gt;The idea showed up on a plane. I was flying back from Las Vegas on May 24 with a few empty hours and nothing to do, and I started sketching out a World Cup app for my friends. The tournament kicks off June 11, so I&amp;rsquo;d handed myself a little under three weeks. That&amp;rsquo;s exactly the kind of deadline that forces you to scope hard and skip everything that doesn&amp;rsquo;t matter.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
