<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://blog.waffly.xyz/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blog.waffly.xyz/" rel="alternate" type="text/html" /><updated>2026-04-25T18:26:34+00:00</updated><id>https://blog.waffly.xyz/feed.xml</id><title type="html">Waffle</title><subtitle>Hobby developer exploring game development with C++ and Raylib.  Sharing insights on Luau, TypeScript, and open source projects.</subtitle><entry><title type="html">Devlog: Bringing Supabase Auth to Roblox</title><link href="https://blog.waffly.xyz/devlog/luau/roblox/2026/04/22/roblox-supabase-devlog.html" rel="alternate" type="text/html" title="Devlog: Bringing Supabase Auth to Roblox" /><published>2026-04-22T05:30:00+00:00</published><updated>2026-04-22T05:30:00+00:00</updated><id>https://blog.waffly.xyz/devlog/luau/roblox/2026/04/22/roblox-supabase-devlog</id><content type="html" xml:base="https://blog.waffly.xyz/devlog/luau/roblox/2026/04/22/roblox-supabase-devlog.html"><![CDATA[<p>Building a real backend integration inside Roblox is full of small surprises. This devlog captures the decisions I made while wiring up Supabase auth in Luau.</p>

<h2 id="why-a-luau-client-at-all">Why a Luau client at all?</h2>

<p>Roblox sandboxes the network heavily. <code class="language-plaintext highlighter-rouge">HttpService</code> is the only outbound channel, and it’s restricted to server scripts. That means every auth flow has to be brokered through the server — there is no “client SDK” in the browser sense.</p>

<h2 id="token-storage">Token storage</h2>

<p>Tokens live in <code class="language-plaintext highlighter-rouge">DataStoreService</code> keyed by <code class="language-plaintext highlighter-rouge">UserId</code>. Refresh happens lazily on the first authenticated call after expiry, with a small jitter so we don’t stampede the refresh endpoint.</p>

<h2 id="whats-next">What’s next</h2>

<ul>
  <li>Realtime subscriptions over WebSocket</li>
  <li>Storage uploads via signed URLs</li>
  <li>A typed query builder that mirrors the JS client</li>
</ul>

<p>Stay tuned — the next devlog will cover the realtime piece.</p>]]></content><author><name></name></author><category term="devlog" /><category term="luau" /><category term="roblox" /><summary type="html"><![CDATA[Notes on shipping the auth layer for Roblox-Supabase — token refresh, secure storage, and the quirks of HttpService.]]></summary></entry><entry><title type="html">Getting Started with Raylib in C++</title><link href="https://blog.waffly.xyz/gamedev/cpp/raylib/2026/04/20/getting-started-with-raylib.html" rel="alternate" type="text/html" title="Getting Started with Raylib in C++" /><published>2026-04-20T01:00:00+00:00</published><updated>2026-04-20T01:00:00+00:00</updated><id>https://blog.waffly.xyz/gamedev/cpp/raylib/2026/04/20/getting-started-with-raylib</id><content type="html" xml:base="https://blog.waffly.xyz/gamedev/cpp/raylib/2026/04/20/getting-started-with-raylib.html"><![CDATA[<p>Raylib is a fantastic little library for prototyping 2D and 3D games without the ceremony of a full engine. In this tutorial we’ll set up a fresh C++ project, link Raylib, and render our first window.</p>

<h2 id="project-layout">Project layout</h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>my-game/
├── CMakeLists.txt
└── src/
    └── main.cpp
</code></pre></div></div>

<h2 id="cmake-configuration">CMake configuration</h2>

<div class="language-cmake highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cmake_minimum_required</span><span class="p">(</span>VERSION 3.20<span class="p">)</span>
<span class="nb">project</span><span class="p">(</span>my_game CXX<span class="p">)</span>

<span class="nb">find_package</span><span class="p">(</span>raylib CONFIG REQUIRED<span class="p">)</span>
<span class="nb">add_executable</span><span class="p">(</span>my_game src/main.cpp<span class="p">)</span>
<span class="nb">target_link_libraries</span><span class="p">(</span>my_game PRIVATE raylib<span class="p">)</span>
</code></pre></div></div>

<h2 id="first-window">First window</h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">"raylib.h"</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">InitWindow</span><span class="p">(</span><span class="mi">800</span><span class="p">,</span> <span class="mi">450</span><span class="p">,</span> <span class="s">"Hello Raylib"</span><span class="p">);</span>
    <span class="n">SetTargetFPS</span><span class="p">(</span><span class="mi">60</span><span class="p">);</span>

    <span class="k">while</span> <span class="p">(</span><span class="o">!</span><span class="n">WindowShouldClose</span><span class="p">())</span> <span class="p">{</span>
        <span class="n">BeginDrawing</span><span class="p">();</span>
            <span class="n">ClearBackground</span><span class="p">(</span><span class="n">RAYWHITE</span><span class="p">);</span>
            <span class="n">DrawText</span><span class="p">(</span><span class="s">"Hello, Waffle!"</span><span class="p">,</span> <span class="mi">280</span><span class="p">,</span> <span class="mi">200</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="n">DARKGRAY</span><span class="p">);</span>
        <span class="n">EndDrawing</span><span class="p">();</span>
    <span class="p">}</span>

    <span class="n">CloseWindow</span><span class="p">();</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>That’s it — build, run, and you should see a small window with your first message rendered. From here you can iterate quickly into sprites, input handling and physics.</p>]]></content><author><name></name></author><category term="gamedev" /><category term="cpp" /><category term="raylib" /><summary type="html"><![CDATA[A walkthrough of setting up a Raylib project in C++, from CMake configuration to drawing your very first window.]]></summary></entry></feed>