<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[CardGame Notes]]></title><description><![CDATA[CardGame Notes]]></description><link>https://cardgamenotes.hashnode.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1593680282896/kNC7E8IR4.png</url><title>CardGame Notes</title><link>https://cardgamenotes.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Fri, 09 Oct 2026 09:45:37 GMT</lastBuildDate><atom:link href="https://cardgamenotes.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Why My Solitaire Portal Has No Database (and Probably Never Will)]]></title><description><![CDATA[Decision record: no backend, by design
Every architecture starts with requirements. Mine had exactly three: instant load, zero maintenance, and nothing to break at 3 a.m. A database serves none of tho]]></description><link>https://cardgamenotes.hashnode.dev/why-my-solitaire-portal-has-no-database-and-probably-never-will</link><guid isPermaLink="true">https://cardgamenotes.hashnode.dev/why-my-solitaire-portal-has-no-database-and-probably-never-will</guid><category><![CDATA[webdev]]></category><category><![CDATA[GameDev]]></category><category><![CDATA[solitaire]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[webdevelopment]]></category><category><![CDATA[gamedevelopment]]></category><dc:creator><![CDATA[CardGame Notes]]></dc:creator><pubDate>Wed, 07 Oct 2026 04:48:59 GMT</pubDate><content:encoded><![CDATA[<h2>Decision record: no backend, by design</h2>
<p>Every architecture starts with requirements. Mine had exactly three: instant load, zero maintenance, and nothing to break at 3 a.m. A database serves none of those for a card game portal, so <a href="https://solitairepicks.com/">SolitairePicks</a> ships without one.</p>
<h2>What localStorage actually buys</h2>
<p>Player statistics — hands played, wins, best times — persist per game in localStorage. No accounts means no password resets, no GDPR export pipeline, no breach surface. The tradeoff: history is device-bound. For a free portal where the session goal is "play a hand while the coffee brews," that trade is correct.</p>
<h2>Static pages, edge delivery</h2>
<p>Every game page is a static build artifact served from the edge. Klondike, Spider, FreeCell, Pyramid — each is its own page with its own logic file. Deploying is a file sync. Rolling back is deploying yesterday's folder. There is no migration to run and no connection pool to exhaust.</p>
<h2>Where the deep links live</h2>
<ul>
<li><p><a href="https://solitairepicks.com/best/klondike/">Klondike</a> — draw-one and draw-three, the default first stop</p>
</li>
<li><p><a href="https://solitairepicks.com/best/freecell/">FreeCell</a> — all cards visible from the deal, pure logic, zero luck</p>
</li>
<li><p>Pyramid, Golf, TriPeaks and a dozen more — each with per-game win-rate tracking</p>
</li>
</ul>
<h2>The cost side of the ledger</h2>
<p>No backend also means no server-side analytics. I see aggregates only where I choose to instrument them at the edge. If the portal ever needs cross-device sync, that is a product decision — and it will come with an ops bill. Until then, the simplest architecture that works keeps working.</p>
]]></content:encoded></item></channel></rss>