Rebounder Tech Blog

Written by the people who actually run these systems in production.

Rebounder Tech Blog

Field notes from the production systems we actually run.

term_months Display Drifts From Amount After Term ExtensionPayments · 2026-09-25@media(max-width:899px) Leaks Into a Scaled Signage PreviewFrontend · 2026-09-25semgrep --config=auto Turns main Red, No Code Changeddevenv · 2026-09-25amount_unset: Stripe's 7-Day Auto-Switch Never FiresPayments · 2026-09-24sp.units Query Param Shows 5x Price for a 1-Unit InvitePayments · 2026-09-23gen-og.ts Cache Hid an Overwritten OG Image on 91 Postsdevenv · 2026-09-23Next.js 15.1.6 Got Blocked by Vercel as a Vulnerable VersionFrontend · 2026-09-23pnpm-lock.yaml Made Vercel Misdetect an npm Project as pnpmdevenv · 2026-09-23Next.js Server Action Fail-Open: error Read as SuccessFrontend · 2026-09-2201.dnsv.jp Full-Zone Replace Deletes Unrelated A RecordsDNS · 2026-09-22console_name.sql Collided Again 58 Minutes LaterGoogle Cloud · 2026-09-21fail-closed Guard Was Missing From Two Other Write PathsPayments · 2026-09-21reminder_log_kind_check Regex Test Was a False Greendevenv · 2026-09-21RegExp.test False Positive: "unsigned" Matches "signed"devenv · 2026-09-20Google Custom Search API 403: Switched to Brave Search APIdevenv · 2026-09-20copyOneDay Overwrite Silently Drops Pinned NoticesDigital signage · 2026-09-19supabase-js count Query Returns null on FailureGoogle Cloud · 2026-09-19start_month Missing Lets a Contract's Period Go NULLPayments · 2026-09-17Next.js Middleware Missing an Exclusion Forces LoginGoogle Cloud · 2026-09-17entity_id Was uuid, We Inserted a Token — 22P02Google Cloud · 2026-09-16A 200 OK That Crashes a Server ComponentGoogle Cloud · 2026-09-16PostgREST .or() Breaks Silently on a CommaGoogle Cloud · 2026-09-16Only system_admin Hits The Audit Log Foreign Key ConstraintGoogle Cloud · 2026-09-15polynomial-redos: Missing ^ Made a Trim Regex O(n^2)devenv · 2026-09-15pnpm --filter build: Why It Throws 93 Module Not Founddevenv · 2026-09-14Duplicate Key Value Violates Unique Constraint, PermanentlyGoogle Cloud · 2026-09-14Cloudflare Web Analytics Over GA4 for This Tech Blogdevenv · 2026-09-13drizzle-kit generate Re-Emits an ALTER From a Stale SnapshotGoogle Cloud · 2026-09-13NoSuchBucket: Destroying Staging Broke Prod Ad ImagesGoogle Cloud · 2026-09-13findUnmaskedPii False-Positives After Unmaskai · 2026-09-13"An invalid form control is not focusable" killed submitFrontend · 2026-09-10Next.js Build Breaks on a Module-Level Resend ClientGoogle Cloud · 2026-09-10supabase-js .range() Without .order() Drops RowsGoogle Cloud · 2026-09-09Two PaymentIntents: a Losing webhook Reverts the WinnerPayments · 2026-09-09supabase-js try/catch Never Fires, Errors Get DroppedGoogle Cloud · 2026-09-09read-merge-write Drops a Key Without FOR UPDATEGoogle Cloud · 2026-09-08if/else-if as Kotlin's ?.let Return Value Requires elseDigital signage · 2026-09-08Telling not-allowed From no-speech in SpeechRecognitionFrontend · 2026-09-08Promise.all Concurrent Writes Lose to last-writer-winsGoogle Cloud · 2026-09-07Missing frame-src in CSP Blocks YouTube, Kills Watch LogsFrontend · 2026-09-07bodySizeLimit Alone Isn't Enough, Hits the Error BoundaryGoogle Cloud · 2026-09-07An Empty contractId Gives invalid input syntax uuidPayments · 2026-09-07onConflictDoUpdate Overwrites Good Values With NullGoogle Cloud · 2026-09-06cqw Fails Silently When the DOM Around It ChangesFrontend · 2026-09-04Hand-Built Preview Payload Drifts From the DeviceDigital signage · 2026-09-04pdfjs-dist standard_fonts Missing From standaloneGoogle Cloud · 2026-09-04A disabled Submit Button Dies Before HydrationFrontend · 2026-09-04Duplicate URLs in a Feed Break ON CONFLICT DO UPDATEGoogle Cloud · 2026-09-03A Ledger INSERT Failure Swallowed as a DuplicatePayments · 2026-09-03maybeSingle() Throws PGRST116 on a Too-Loose FilterGoogle Cloud · 2026-09-03Missing passThroughEnv Skips Tests While CI Stays GreenGoogle Cloud · 2026-09-03Only the Poll Stringifies Date: getTime Is Not a FunctionGoogle Cloud · 2026-09-02insetsController Is null Before setContentViewDigital signage · 2026-09-01One startActivity Is Not Enough to Blank a Kiosk ScreenDigital signage · 2026-09-01SECURITY DEFINER Functions Are PUBLIC EXECUTEGoogle Cloud · 2026-09-01read-merge-write Without FOR UPDATE Loses KeysGoogle Cloud · 2026-08-30Only One Branch Had No Way to Add the First ItemFrontend · 2026-08-30Re-consent to Revised Terms Does Not Reset auto_renewPayments · 2026-08-30Media Queries See the Real Viewport in a Scaled StageDigital signage · 2026-08-30left:50% With width:fit-content Makes max-width Never ApplyFrontend · 2026-08-29An inset box-shadow Ring Hides Behind a Child BackgroundFrontend · 2026-08-29The Edit Form Pruned Selections It Could Not SeeFrontend · 2026-08-28A Non-Numeric env Becomes NaN and Slips Past ??Google Cloud · 2026-08-28Narrowing a Page's Roles Left the Action's GateFrontend · 2026-08-28A Post-Charge DB Failure Read as a Card DeclinePayments · 2026-08-28RLS Allowing actor_user_id NULL Erases Audit TrailsGoogle Cloud · 2026-08-27A Leftover sticky top:0 Makes a fixed Bar Fill the ScreenFrontend · 2026-08-27The Leak Check Only Grepped Half the Packagedevenv · 2026-08-27A New httpOnly Cookie 401s Only Already-Logged-In UsersFrontend · 2026-08-26A Public Route Missing From the middleware matcherFrontend · 2026-08-26Duplicating a Placement Without Ending the Old OnePayments · 2026-08-26LIMIT 1 Without ORDER BY Returns Another TenantGoogle Cloud · 2026-08-25proxy.ts Redirected API-Key Endpoints to the Login PageFrontend · 2026-08-25?? Defaults Overwrite Fields the Form Never SentFrontend · 2026-08-25Holding-Only Checks Reapply a Bundle DiscountPayments · 2026-08-24The Lock Held; the Count Counted Intent, Not WritesGoogle Cloud · 2026-08-24A Temp-Password Guard Written Per Page Leaks by URLFrontend · 2026-08-24RLS On Is Not Safe While TRUNCATE Is Grantedai · 2026-08-24Humanising an Error Message Cost the Dead-Letter Its TraceGoogle Cloud · 2026-08-22Permissions-Policy: microphone=() Blocks Your Own Origin TooFrontend · 2026-08-22Omitting expires_at Holds a Seat for 24 HoursPayments · 2026-08-22Aborting streamObject Leaves usage as an Unhandled Rejectionai · 2026-08-21Fixing a detect-non-literal-regexp False Positivedevenv · 2026-08-21A Stale Branch Deploy Silently Reverted FeaturesGoogle Cloud · 2026-08-21YT.Player Replacing a div Can Leave a Black ScreenVideo · 2026-08-21Removing a Role-Change Seam With No Callers LeftGoogle Cloud · 2026-08-20Phone Numbers Garble When Copied From a pdf-lib PDFdevenv · 2026-08-20Remounting a Form by key Resets Uncontrolled InputsFrontend · 2026-08-20Carrying a creative_id Revived an Ended PlacementGoogle Cloud · 2026-08-20Two Migrations Claimed the Same Sequence Numberdevenv · 2026-08-19A staging Default in env Deleted Production ImagesGoogle Cloud · 2026-08-19Half-Controlled Forms Silently Revert on ResubmitFrontend · 2026-08-19Linking Everyone to a Tenant-Only Feature Gave 502Frontend · 2026-08-19A CHECK Rewrite Erased Another Branch's ValuePayments · 2026-08-18A 23503 FK Violation Disguised as a ConflictGoogle Cloud · 2026-08-18auth/invalid-password: App Allowed Shorter PasswordsGoogle Cloud · 2026-08-18A Missing force-dynamic Froze a Flag Flip Behind Static HTMLFrontend · 2026-08-18A UI Freeze Without a Server Check Is Not a Freezedevenv · 2026-08-18An Android Foreground Service Can Die Without CrashingDigital signage · 2026-08-17Enabling a Cloud Run Job Fails With SecretsAccessCheckFailedGoogle Cloud · 2026-08-17Routing Scanned PDFs to Gemini by Chars per Pageai · 2026-08-17Auth Middleware Redirects robots.txt to the Login PageFrontend · 2026-08-17Astro 7 Breaks Content Collections in Three PlacesFrontend · 2026-08-16drizzle-kit migrate Does Not Apply Hand-Written SQLGoogle Cloud · 2026-08-16Your First Dev Board Depends on What You'll Buildmaker · 2026-08-16Three Errors You Actually Hit Connecting Actions to GCPGoogle Cloud · 2026-08-16Gemini Thinking Tokens Eat maxOutputTokensai · 2026-08-16The JMA Evening Update Nulls Today's TemperatureDigital signage · 2026-08-16FLAG_KEEP_SCREEN_ON Ignored: It's the ScreensaverDigital signage · 2026-08-16Next.js Bundling a wasm Package Breaks Only in ProductionFrontend · 2026-08-16SECURITY DEFINER Fails in Production: the Executing RoleGoogle Cloud · 2026-08-16The Still-Frame Threshold Depends on Bit DepthVideo · 2026-08-16A Conditional UPDATE Needs error, Not Just dataPayments · 2026-08-16terraform enabled = false Cannot Tear Down an EnvGoogle Cloud · 2026-08-16How I Settled on Splitting AI Coding Toolsai · 2026-08-15A Prompt Template for Mass-Producing Thumbnailsai · 2026-08-15Cloud Run Jobs Freeze Their ImageGoogle Cloud · 2026-08-15Writing 3D Models as Code Instead of Mouse Workmaker · 2026-08-15Why I Chose the DE10-Lite as a First FPGA Boardmaker · 2026-08-15DeepL and Whisper Quietly Save Timeai · 2026-08-15Splitting Personal-Project Infrastructure by UseGoogle Cloud · 2026-08-15Heat and Battery Are a Choice on a Dev Laptopdevenv · 2026-08-15Putting ESP32 Sensor Data in the Browser With Web SerialDigital signage · 2026-08-15Building the Same App on Firebase and SupabaseGoogle Cloud · 2026-08-15Pick a First 3D Printer on Assembly and Levellingmaker · 2026-08-15Running a Google TV Kiosk for Several MonthsDigital signage · 2026-08-15Figma Is Enough for a Logo and a Business Carddevenv · 2026-08-15Running a Local LLM with Ollama and Building RAGai · 2026-08-15Two Settings to Change When Supports Won't Come Offmaker · 2026-08-15Face Recognition on a Raspberry Pi 5 Hits a Speed Wallmaker · 2026-08-15Building a Power Factor Meter With a Raspberry Pi PicoDigital signage · 2026-08-15What Stops You First in Quartus Is the Setupmaker · 2026-08-15Google TV or Raspberry Pi for a Signage DeviceDigital signage · 2026-08-15Reading a SwitchBot Motion Sensor Over BLE DirectlyDigital signage · 2026-08-15Task Management Sticks When Entry Has No Frictionai · 2026-08-15Separate the Machine You Touch Hardware Withdevenv · 2026-08-15Three Vercel Traps I Hit After Going LiveFrontend · 2026-08-15