<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Unstuck</title><description>Real bugs from real indie projects, and the fixes that worked.</description><link>https://unstucked.dev/</link><item><title>Pin a card footer to the bottom of an equal-height grid</title><link>https://unstucked.dev/fixes/flexbox-pin-card-footer-equal-height/</link><guid isPermaLink="true">https://unstucked.dev/fixes/flexbox-pin-card-footer-equal-height/</guid><description>Cards in a grid have different amounts of text, so their prices and links land at ragged heights. Two CSS lines pin every footer to the bottom, no fixed heights and no JavaScript.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate></item><item><title>PowerShell mangles quotes in CLI args, so pass JSON by file</title><link>https://unstucked.dev/fixes/powershell-mangles-quotes-native-exe-args/</link><guid isPermaLink="true">https://unstucked.dev/fixes/powershell-mangles-quotes-native-exe-args/</guid><description>A curl or gh command with inline JSON works in bash and cmd but the payload arrives corrupted from PowerShell. PowerShell rewrites embedded double quotes when handing args to native executables. Pass the payload by file or stdin instead.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Search Console rejects a bare sitemap filename</title><link>https://unstucked.dev/fixes/search-console-sitemap-needs-full-url/</link><guid isPermaLink="true">https://unstucked.dev/fixes/search-console-sitemap-needs-full-url/</guid><description>Submitting sitemap.xml to a Search Console domain property fails or just won&apos;t take. A domain property wants the full absolute URL, not the filename.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate></item><item><title>The hidden attribute stops working when CSS sets display</title><link>https://unstucked.dev/fixes/css-display-overrides-hidden-attribute/</link><guid isPermaLink="true">https://unstucked.dev/fixes/css-display-overrides-hidden-attribute/</guid><description>A modal with the hidden attribute rendered open on every page load and refused to close. The cause: a one-line CSS display rule silently overrides the hidden attribute, and a one-line attribute selector fixes it.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate></item><item><title>The Supabase free-tier keepalive that actually works</title><link>https://unstucked.dev/fixes/supabase-free-tier-keepalive-ping/</link><guid isPermaLink="true">https://unstucked.dev/fixes/supabase-free-tier-keepalive-ping/</guid><description>A free-tier Supabase project pauses after a week idle, and the obvious keepalive cron still let it sleep. The reason: the request was getting a 401 at the gateway. Here is the endpoint that returns 200 with the anon key.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Supabase Realtime breaks on remount unless the channel is unique</title><link>https://unstucked.dev/fixes/supabase-realtime-channel-resubscribe-crash/</link><guid isPermaLink="true">https://unstucked.dev/fixes/supabase-realtime-channel-resubscribe-crash/</guid><description>A Realtime subscription works once, then throws or goes silent when the component remounts. The cause is two subscriptions fighting over the same channel name. Clean up on unmount, and make the name unique per mount.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Use signed URLs, never public storage URLs</title><link>https://unstucked.dev/fixes/supabase-signed-urls-not-public-storage/</link><guid isPermaLink="true">https://unstucked.dev/fixes/supabase-signed-urls-not-public-storage/</guid><description>A public Supabase bucket is the quick way to show user uploads, and a permanent data leak. Private bucket, owner-scoped policies, and short-lived signed URLs give you the same convenience without handing out forever-links.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate></item><item><title>When wrangler dies behind a corporate proxy, use the API</title><link>https://unstucked.dev/fixes/wrangler-blocked-by-proxy-use-cloudflare-api/</link><guid isPermaLink="true">https://unstucked.dev/fixes/wrangler-blocked-by-proxy-use-cloudflare-api/</guid><description>Wrangler and other vendor CLIs hang or throw TLS errors behind a corporate proxy that intercepts HTTPS. Skip the CLI and drive the Cloudflare REST API directly with curl and a scoped token.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate></item><item><title>A Pages custom domain added by API gets stuck on &apos;CNAME record not set&apos;</title><link>https://unstucked.dev/fixes/cloudflare-pages-custom-domain-stuck-cname/</link><guid isPermaLink="true">https://unstucked.dev/fixes/cloudflare-pages-custom-domain-stuck-cname/</guid><description>Attach a custom domain to a Cloudflare Pages project through the API and it can sit at pending forever. The dashboard auto-creates the DNS record; the API doesn&apos;t, and a Pages-scoped token can&apos;t either.</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Account deletion that satisfies the app stores (and GDPR)</title><link>https://unstucked.dev/fixes/app-store-account-deletion-supabase/</link><guid isPermaLink="true">https://unstucked.dev/fixes/app-store-account-deletion-supabase/</guid><description>Apple and Google require in-app account deletion. The traps are the order you delete in and trusting a client-supplied id. Here&apos;s the Supabase version that doesn&apos;t orphan storage or delete the wrong user.</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Rate limiting in Postgres, no Redis</title><link>https://unstucked.dev/fixes/postgres-rate-limiting-without-redis/</link><guid isPermaLink="true">https://unstucked.dev/fixes/postgres-rate-limiting-without-redis/</guid><description>You don&apos;t need Redis or a third-party service to rate-limit a Supabase app. One table, one atomic upsert, and a security-definer function keyed to the user. Race-safe and impossible to bypass.</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Your Cloudflare Pages env vars do nothing (Direct Upload vs Git build)</title><link>https://unstucked.dev/fixes/cloudflare-pages-env-vars-direct-upload/</link><guid isPermaLink="true">https://unstucked.dev/fixes/cloudflare-pages-env-vars-direct-upload/</guid><description>You set a PUBLIC_ variable in the Pages dashboard, redeploy, and the build still can&apos;t see it. The reason: a Direct Upload project builds in your CI, not on Cloudflare, so the dashboard env vars never reach the build.</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate></item><item><title>One subscription across web and mobile (Stripe + RevenueCat + Supabase)</title><link>https://unstucked.dev/fixes/shared-subscription-stripe-revenuecat-supabase/</link><guid isPermaLink="true">https://unstucked.dev/fixes/shared-subscription-stripe-revenuecat-supabase/</guid><description>Pay on web or mobile, unlock both, never double-charge, by making one Supabase column the source of truth instead of reconciling two billing systems.</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Stripe + Gelato print-on-demand, end to end</title><link>https://unstucked.dev/fixes/stripe-gelato-print-on-demand/</link><guid isPermaLink="true">https://unstucked.dev/fixes/stripe-gelato-print-on-demand/</guid><description>Let users buy a real printed poster of what they made: render at print resolution, host it, charge with Stripe, and create the Gelato order from the webhook, not the browser.</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Your Cloudflare build passes locally but silently fails in CI</title><link>https://unstucked.dev/fixes/cloudflare-build-passes-locally-fails-in-ci/</link><guid isPermaLink="true">https://unstucked.dev/fixes/cloudflare-build-passes-locally-fails-in-ci/</guid><description>A Vite alias that reached outside the repo root built fine locally but failed on Cloudflare Pages for weeks, while the old bundle kept serving.</description><pubDate>Sun, 07 Jun 2026 00:00:00 GMT</pubDate></item><item><title>A stale vite.config.js silently overrode my vite.config.ts</title><link>https://unstucked.dev/fixes/stale-vite-config-js-overrode-ts/</link><guid isPermaLink="true">https://unstucked.dev/fixes/stale-vite-config-js-overrode-ts/</guid><description>Edits to vite.config.ts had no effect because a compiled vite.config.js sat next to it, and Vite loads the .js in preference to the .ts.</description><pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Pinterest&apos;s bulk upload silently drops duplicate-link rows</title><link>https://unstucked.dev/fixes/pinterest-bulk-csv-drops-duplicate-links/</link><guid isPermaLink="true">https://unstucked.dev/fixes/pinterest-bulk-csv-drops-duplicate-links/</guid><description>A 16-row bulk pin CSV created only 2 pins because Pinterest deduplicates rows by destination link, not by image.</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Hosting public images from a locked-down Windows box</title><link>https://unstucked.dev/fixes/public-image-hosting-locked-down-windows/</link><guid isPermaLink="true">https://unstucked.dev/fixes/public-image-hosting-locked-down-windows/</guid><description>Behind a corporate proxy, wrangler and the throwaway upload hosts all failed. GitHub plus jsDelivr was the dependable free image host.</description><pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate></item><item><title>PowerShell globbing mangles Expo Router [id] file paths</title><link>https://unstucked.dev/fixes/powershell-globbing-breaks-bracket-paths/</link><guid isPermaLink="true">https://unstucked.dev/fixes/powershell-globbing-breaks-bracket-paths/</guid><description>Reading and writing files at bracketed paths like app/[id]/index.tsx failed because PowerShell treats [id] as a wildcard character class.</description><pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate></item></channel></rss>