<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Firdausng</title>
    <link>https://firdausng.com</link>
    <atom:link href="https://firdausng.com/rss.xml" rel="self" type="application/rss+xml" />
    <description>Practical posts on SvelteKit, Cloudflare Workers, Drizzle + D1, and related full-stack tooling.</description>
    <language>en</language>
    <lastBuildDate>Sun, 19 Apr 2026 00:00:00 GMT</lastBuildDate>
    <managingEditor>firdauskamaruddin@hotmail.com (Firdaus Kamaruddin)</managingEditor>
    <webMaster>firdauskamaruddin@hotmail.com (Firdaus Kamaruddin)</webMaster>
    <item>
      <title>D1 has no transactions — using client.batch() for multi-step writes</title>
      <link>https://firdausng.com/posts/d1-has-no-transactions-use-client-batch</link>
      <guid isPermaLink="true">https://firdausng.com/posts/d1-has-no-transactions-use-client-batch</guid>
      <pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate>
      <description>Cloudflare D1 has no BEGIN/COMMIT. The official answer is client.batch(), but it has four subtle rules worth writing down. Worked example from DuitGee&apos;s fund-transfer handler.</description>
      <category>cloudflare D1</category>
      <category>drizzle</category>
      <category>hono</category>
      <category>sveltekit</category>
      <category>duitgee</category>
      <dc:creator>Firdaus Kamaruddin</dc:creator>
    </item>
    <item>
      <title>Fixing Giscus comments: why Announcements is a trap</title>
      <link>https://firdausng.com/posts/fix-giscus-announcements-category-trap</link>
      <guid isPermaLink="true">https://firdausng.com/posts/fix-giscus-announcements-category-trap</guid>
      <pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate>
      <description>If you&apos;re manually creating a GitHub Discussion for every blog post, your Giscus category is probably the problem. The fix is four small config decisions — plus one migration footgun nobody warns you about.</description>
      <category>giscus</category>
      <category>sveltekit</category>
      <category>github discussions</category>
      <dc:creator>Firdaus Kamaruddin</dc:creator>
    </item>
    <item>
      <title>Cloudflare Cron Jobs in SvelteKit</title>
      <link>https://firdausng.com/posts/cloudflare-cron-jobs-in-sveltekit</link>
      <guid isPermaLink="true">https://firdausng.com/posts/cloudflare-cron-jobs-in-sveltekit</guid>
      <pubDate>Sun, 08 Mar 2026 00:00:00 GMT</pubDate>
      <description>How to add cron job support to a SvelteKit app deployed on Cloudflare Workers, since the adapter doesn&apos;t natively support the scheduled event handler.</description>
      <category>sveltekit</category>
      <category>cloudflare workers</category>
      <category>cron</category>
      <dc:creator>Firdaus Kamaruddin</dc:creator>
    </item>
    <item>
      <title>Migrate a Cloudflare D1 database to another account</title>
      <link>https://firdausng.com/posts/migrate-cf-d1-to-another-cf-account</link>
      <guid isPermaLink="true">https://firdausng.com/posts/migrate-cf-d1-to-another-cf-account</guid>
      <pubDate>Wed, 15 Oct 2025 00:00:00 GMT</pubDate>
      <description>Exporting a D1 database with wrangler and replaying it on a different Cloudflare account — plus the foreign-key ordering error that always trips people up on first try.</description>
      <category>cloudflare D1</category>
      <category>cloudflare workers</category>
      <dc:creator>Firdaus Kamaruddin</dc:creator>
    </item>
    <item>
      <title>Integrate Better Auth and Google One Tap with Hono and SvelteKit</title>
      <link>https://firdausng.com/posts/integrating-better-auth-with-hono-svelte-google-one-tap</link>
      <guid isPermaLink="true">https://firdausng.com/posts/integrating-better-auth-with-hono-svelte-google-one-tap</guid>
      <pubDate>Thu, 09 Oct 2025 00:00:00 GMT</pubDate>
      <description>A walkthrough of wiring Better Auth with Google One Tap into a SvelteKit app, using Hono for the API layer and Cloudflare D1 + Workers for the backend.</description>
      <category>better auth</category>
      <category>google one tap</category>
      <category>hono</category>
      <category>sveltekit</category>
      <category>drizzle</category>
      <category>cloudflare workers</category>
      <category>cloudflare D1</category>
      <dc:creator>Firdaus Kamaruddin</dc:creator>
    </item>
    <item>
      <title>Better Auth + better-sqlite3 under pnpm — &quot;Could not locate the bindings file&quot;</title>
      <link>https://firdausng.com/posts/integrating-better-auth-better-sqlite3-drizzle-pnpm</link>
      <guid isPermaLink="true">https://firdausng.com/posts/integrating-better-auth-better-sqlite3-drizzle-pnpm</guid>
      <pubDate>Wed, 08 Oct 2025 00:00:00 GMT</pubDate>
      <description>Running Better Auth&apos;s schema generator under pnpm throws &quot;Could not locate the bindings file&quot; because pnpm&apos;s strict isolation skips native module builds by default. Here&apos;s why, and the one-line fix.</description>
      <category>better auth</category>
      <category>better sqlite3</category>
      <category>drizzle</category>
      <category>pnpm</category>
      <dc:creator>Firdaus Kamaruddin</dc:creator>
    </item>
    <item>
      <title>Handling remote-load errors in Angular Module Federation v2 with Rspack</title>
      <link>https://firdausng.com/posts/handle-angular-error-with-rspack-module-federation</link>
      <guid isPermaLink="true">https://firdausng.com/posts/handle-angular-error-with-rspack-module-federation</guid>
      <pubDate>Sun, 02 Mar 2025 00:00:00 GMT</pubDate>
      <description>How to show a graceful fallback component when a Module Federation v2 remote fails to load in an Nx + Angular + Rspack setup, using the errorLoadRemote runtime plugin.</description>
      <category>rspack</category>
      <category>angular</category>
      <category>module federation</category>
      <category>nx</category>
      <dc:creator>Firdaus Kamaruddin</dc:creator>
    </item>
    <item>
      <title>Drizzle with Cloudflare D1 — the everyday usage guide</title>
      <link>https://firdausng.com/posts/d1-cloudflare-with-drizzle</link>
      <guid isPermaLink="true">https://firdausng.com/posts/d1-cloudflare-with-drizzle</guid>
      <pubDate>Sun, 02 Feb 2025 00:00:00 GMT</pubDate>
      <description>The read, write, and soft-delete patterns I reach for every day when working against Cloudflare D1 through Drizzle — dynamic filters, joins, RETURNING, audit fields, and the sql template. Worked examples from DuitGee.</description>
      <category>cloudflare D1</category>
      <category>drizzle</category>
      <category>hono</category>
      <category>sveltekit</category>
      <category>duitgee</category>
      <dc:creator>Firdaus Kamaruddin</dc:creator>
    </item>
    <item>
      <title>Lark Suite API with Hono on Cloudflare Workers — a basic guide</title>
      <link>https://firdausng.com/posts/lark-suite-api-in-action-with-hono-and-cloudlfare-worker-basic-guide</link>
      <guid isPermaLink="true">https://firdausng.com/posts/lark-suite-api-in-action-with-hono-and-cloudlfare-worker-basic-guide</guid>
      <pubDate>Fri, 31 Jan 2025 00:00:00 GMT</pubDate>
      <description>Lark Suite (ByteDance&apos;s Google-Workspace competitor) has a capable API and a generous free tier. This guide walks through setting up a custom Lark app, authenticating with a tenant access token, and hitting the Sheets/Bitable API from a Hono worker on Cloudflare.</description>
      <category>lark suite</category>
      <category>cloudflare workers</category>
      <category>hono</category>
      <dc:creator>Firdaus Kamaruddin</dc:creator>
    </item>
    <item>
      <title>Setting up D1 Database with Drizzle in a Hono Cloudflare Worker App</title>
      <link>https://firdausng.com/posts/setup-d1-cloudflare-worker-with-drizzle</link>
      <guid isPermaLink="true">https://firdausng.com/posts/setup-d1-cloudflare-worker-with-drizzle</guid>
      <pubDate>Sun, 12 Jan 2025 00:00:00 GMT</pubDate>
      <description>This guide covers configuring a D1 database using Drizzle in a Hono app deployed using Cloudflare Workers.</description>
      <category>cloudflare workers</category>
      <category>cloudflare D1</category>
      <category>hono</category>
      <category>drizzle</category>
      <dc:creator>Firdaus Kamaruddin</dc:creator>
    </item>
    <item>
      <title>Using Nx with SvelteKit — caching without the monorepo</title>
      <link>https://firdausng.com/posts/using-nx-in-sveltekit</link>
      <guid isPermaLink="true">https://firdausng.com/posts/using-nx-in-sveltekit</guid>
      <pubDate>Sat, 28 Dec 2024 00:00:00 GMT</pubDate>
      <description>Nx is usually pitched as a monorepo tool for Angular or React, but since v18&apos;s &quot;project crystal&quot; it works cleanly on a single SvelteKit project too — and the build cache alone is worth the install.</description>
      <category>sveltekit</category>
      <category>svelte</category>
      <category>nx</category>
      <dc:creator>Firdaus Kamaruddin</dc:creator>
    </item>
    <item>
      <title>Using Cloudflare KV with SvelteKit</title>
      <link>https://firdausng.com/posts/using-cloudflare-kv-in-sveltekit</link>
      <guid isPermaLink="true">https://firdausng.com/posts/using-cloudflare-kv-in-sveltekit</guid>
      <pubDate>Mon, 23 Dec 2024 00:00:00 GMT</pubDate>
      <description>How to wire a Cloudflare KV namespace into a SvelteKit app deployed on Cloudflare — creating the namespace, binding it in wrangler, exposing it through hooks, and the basic read/write patterns in server routes.</description>
      <category>sveltekit</category>
      <category>svelte</category>
      <category>cloudflare workers</category>
      <category>cloudflare kv</category>
      <dc:creator>Firdaus Kamaruddin</dc:creator>
    </item>
    <item>
      <title>Deploy SvelteKit to Cloudflare Pages</title>
      <link>https://firdausng.com/posts/deploy-sveltekit-to-cloudflare</link>
      <guid isPermaLink="true">https://firdausng.com/posts/deploy-sveltekit-to-cloudflare</guid>
      <pubDate>Sun, 22 Dec 2024 00:00:00 GMT</pubDate>
      <description>A straight walkthrough for deploying a SvelteKit app to Cloudflare Pages — installing the Cloudflare adapter, wiring a Git repo to a Pages project, and configuring the build.</description>
      <category>sveltekit</category>
      <category>svelte</category>
      <category>cloudflare workers</category>
      <dc:creator>Firdaus Kamaruddin</dc:creator>
    </item>
    <item>
      <title>Finding GitHub pull requests that leaked sensitive data — a script</title>
      <link>https://firdausng.com/posts/using-github-api-to-list-down-github-pull-request-that-contained-sensitive-data</link>
      <guid isPermaLink="true">https://firdausng.com/posts/using-github-api-to-list-down-github-pull-request-that-contained-sensitive-data</guid>
      <pubDate>Mon, 08 Apr 2024 00:00:00 GMT</pubDate>
      <description>If you&apos;ve committed a secret to a repo, rewriting git history with BFG doesn&apos;t clean the pull requests — GitHub caches them separately. This is a TypeScript script that walks every PR, scans every commit&apos;s patch for secret patterns, and writes a CSV you can hand to GitHub support.</description>
      <category>git</category>
      <category>github</category>
      <dc:creator>Firdaus Kamaruddin</dc:creator>
    </item>
    <item>
      <title>Use SvelteKit with a Wails desktop app</title>
      <link>https://firdausng.com/posts/use-sveltekit-with-wails-app</link>
      <guid isPermaLink="true">https://firdausng.com/posts/use-sveltekit-with-wails-app</guid>
      <pubDate>Sun, 19 Nov 2023 00:00:00 GMT</pubDate>
      <description>Wails bundles a Go backend with a web frontend into a native desktop binary. The default scaffold uses vanilla Svelte; swapping in SvelteKit as the frontend takes four config changes and an SPA-mode layout file.</description>
      <category>sveltekit</category>
      <category>svelte</category>
      <category>wails</category>
      <category>go</category>
      <dc:creator>Firdaus Kamaruddin</dc:creator>
    </item>
    <item>
      <title>Managing multiple Git SSH keys for GitHub on Windows</title>
      <link>https://firdausng.com/posts/managing-multiple-git-ssh-keys-for-git-on-windows</link>
      <guid isPermaLink="true">https://firdausng.com/posts/managing-multiple-git-ssh-keys-for-git-on-windows</guid>
      <pubDate>Mon, 24 Jul 2023 00:00:00 GMT</pubDate>
      <description>Working with multiple GitHub accounts on one Windows machine means one SSH key per account, plus an SSH config alias so git knows which key to use per host. Five steps — generate the keys, add them to the agent, write the config file, rewrite the remote URL, and upload the public keys.</description>
      <category>git</category>
      <category>github</category>
      <category>windows</category>
      <dc:creator>Firdaus Kamaruddin</dc:creator>
    </item>
    <item>
      <title>Load testing a single-page application with JMeter is not straightforward</title>
      <link>https://firdausng.com/posts/load-testing-single-page-application-using-jmeter</link>
      <guid isPermaLink="true">https://firdausng.com/posts/load-testing-single-page-application-using-jmeter</guid>
      <pubDate>Thu, 31 May 2018 00:00:00 GMT</pubDate>
      <description>JMeter sends HTTP requests sequentially, but SPAs fire multiple XHRs in parallel. The result is inflated response times that don&apos;t reflect what a real user sees. Custom samplers (JSR223, AJAX, WebDriver) can work around it, each with its own cost.</description>
      <category>performance test</category>
      <category>jmeter</category>
      <dc:creator>Firdaus Kamaruddin</dc:creator>
    </item>
  </channel>
</rss>