<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Tutorials — Sergio Xalambrí</title>
    <description>Tutorials by Sergio Xalambrí.</description>
    <link>https://r3.sergiodxa.com/tutorials</link>
    <item>
        <guid>4a0e9fc9-98a9-475a-a9cf-25fbc7ccf260</guid>
        <title>Access React Router Context with AsyncLocalStorage</title>
        <description>Access React Router's context from any function without passing it through every layer.</description>
        <link>https://r3.sergiodxa.com/tutorials/access-react-router-context-with-asynclocalstorage</link>
        <pubDate>Fri, 06 Mar 2026 17:12:29 GMT</pubDate>
      </item>
<item>
        <guid>fbddd4a9-0014-4156-873d-6e734a58de91</guid>
        <title>Create a Per-Request Database Instance with Middleware</title>
        <description>Manage database lifecycle with React Router middleware, ensuring connections close even when errors occur.</description>
        <link>https://r3.sergiodxa.com/tutorials/create-a-per-request-database-instance-with-middleware</link>
        <pubDate>Tue, 03 Mar 2026 05:37:11 GMT</pubDate>
      </item>
<item>
        <guid>ccb38b2d-2b56-4492-916b-503c16560888</guid>
        <title>Use Sec-Fetch Headers for CSRF Protection</title>
        <description>Protect your React Router app from CSRF attacks using browser Sec-Fetch headers in middleware.</description>
        <link>https://r3.sergiodxa.com/tutorials/use-sec-fetch-headers-for-csrf-protection</link>
        <pubDate>Mon, 23 Feb 2026 04:49:51 GMT</pubDate>
      </item>
<item>
        <guid>d7480bad-f5af-428f-9fa9-8accbae23de6</guid>
        <title>Dedupe Server Calls with Remix Utils Batcher</title>
        <description>Prevent duplicate API calls in React Router loaders using Remix Utils Batcher middleware for better performance.</description>
        <link>https://r3.sergiodxa.com/tutorials/dedupe-server-calls-with-remix-utils-batcher</link>
        <pubDate>Sun, 19 Oct 2025 07:14:18 GMT</pubDate>
      </item>
<item>
        <guid>9c80a2de-da65-450b-865c-8b041c20398e</guid>
        <title>Transform FormData Between UI and Database in React Router</title>
        <description>Transform form data to database objects and back using actions and loaders with proper separation of concerns.</description>
        <link>https://r3.sergiodxa.com/tutorials/transform-formdata-between-ui-and-database-in-react-router</link>
        <pubDate>Wed, 15 Oct 2025 04:58:31 GMT</pubDate>
      </item>
<item>
        <guid>5e485164-47ab-4f0e-abca-2854ab676173</guid>
        <title>Build a Master-Detail UI with React Router</title>
        <description>Create a master-detail interface that adapts based on how users access it, full context when browsing, focused when direct.</description>
        <link>https://r3.sergiodxa.com/tutorials/build-a-master-detail-ui-with-react-router</link>
        <pubDate>Fri, 03 Oct 2025 06:42:21 GMT</pubDate>
      </item>
<item>
        <guid>c61faf82-33cc-4bd5-84e0-073d31655693</guid>
        <title>Leverage React Router's Built-in Data Deduplication</title>
        <description>Learn how React Router's built-in deduplication system uses references to eliminate duplicate data transmission when combining promises in y</description>
        <link>https://r3.sergiodxa.com/tutorials/leverage-react-router-s-built-in-data-deduplication</link>
        <pubDate>Thu, 25 Sep 2025 06:08:18 GMT</pubDate>
      </item>
<item>
        <guid>750e1e1d-f479-4b30-9361-a140f6bb3315</guid>
        <title>Redirect Based on Screen Size in React Router</title>
        <description>Learn how to use a nested index route with a clientLoader in React Router to conditionally redirect based on screen size, ensuring a smooth </description>
        <link>https://r3.sergiodxa.com/tutorials/redirect-based-on-screen-size-in-react-router</link>
        <pubDate>Wed, 13 Aug 2025 08:18:55 GMT</pubDate>
      </item>
<item>
        <guid>457074e9-3258-496d-afdc-f6826b8ac1b9</guid>
        <title>Avoid Waterfalls in React Suspense</title>
        <description>Learn how React Suspense boundaries can cause or prevent data loading waterfalls, the difference between nested and sibling boundaries, and </description>
        <link>https://r3.sergiodxa.com/tutorials/avoid-waterfalls-in-react-suspense</link>
        <pubDate>Tue, 12 Aug 2025 14:33:41 GMT</pubDate>
      </item>
<item>
        <guid>2f52ceb1-381d-41ef-9ee3-63446f0a638f</guid>
        <title>Handle deferred data in React Router</title>
        <description>Three approaches to handle deferred promises in React Router v7: Await component, React.use hook, and direct promise rendering.</description>
        <link>https://r3.sergiodxa.com/tutorials/handle-deferred-data-in-react-router</link>
        <pubDate>Thu, 31 Jul 2025 20:00:25 GMT</pubDate>
      </item>
<item>
        <guid>07c9acf9-aa8d-4300-a231-948963553120</guid>
        <title>Use Action Routes in React Router</title>
        <description>Learn how to structure server and client actions in React Router using a clear and scalable pattern. Centralize logic, handle forms, manage </description>
        <link>https://r3.sergiodxa.com/tutorials/use-action-routes-in-react-router</link>
        <pubDate>Sun, 20 Jul 2025 07:04:15 GMT</pubDate>
      </item>
<item>
        <guid>18e4b638-17e7-42e5-81aa-08789e59e647</guid>
        <title>Add a Color Scheme Toggle in React Router</title>
        <description>Add a color scheme toggle to your React Router app using cookies for persistent, flash-free light, dark, or system preference.</description>
        <link>https://r3.sergiodxa.com/tutorials/add-a-color-scheme-toggle-in-react-router</link>
        <pubDate>Wed, 07 May 2025 05:55:43 GMT</pubDate>
      </item>
<item>
        <guid>e8f59d6d-3e4c-4f9a-8832-5d1b817bef1c</guid>
        <title>Debounce Loaders and Actions in React Router</title>
        <description>Debounce loaders and actions in React Router at the route level—cleaner code, better control, no extra wrappers needed.</description>
        <link>https://r3.sergiodxa.com/tutorials/debounce-loaders-and-actions-in-react-router</link>
        <pubDate>Mon, 14 Apr 2025 04:58:58 GMT</pubDate>
      </item>
<item>
        <guid>508b80da-7fc6-4e9a-8227-cbb5ce9efae7</guid>
        <title>Use client_id and client_secret in OAuth2</title>
        <description>Use client_id and client_secret to authenticate your app with the Authorization Server in OAuth2 flows.</description>
        <link>https://r3.sergiodxa.com/tutorials/use-client_id-and-client_secret-in-oauth2</link>
        <pubDate>Sat, 05 Apr 2025 00:17:43 GMT</pubDate>
      </item>
<item>
        <guid>7ee0a528-76bc-4f6e-a598-a91c41f367a3</guid>
        <title>Use the OAuth2 Introspection Endpoint</title>
        <description>Learn how to use the introspection endpoint in OAuth2 to validate opaque tokens and extract user and scope information.</description>
        <link>https://r3.sergiodxa.com/tutorials/use-the-oauth2-introspection-endpoint</link>
        <pubDate>Wed, 02 Apr 2025 19:03:39 GMT</pubDate>
      </item>
<item>
        <guid>6f77eef4-2392-453b-a905-db69db68778b</guid>
        <title>Revoke a Refresh Token in OAuth2</title>
        <description>Learn how to securely revoke refresh tokens in OAuth2 and prevent unauthorized access after logout or token compromise.</description>
        <link>https://r3.sergiodxa.com/tutorials/revoke-a-refresh-token-in-oauth2</link>
        <pubDate>Tue, 01 Apr 2025 00:02:49 GMT</pubDate>
      </item>
<item>
        <guid>f67c8826-d769-4e5b-95e1-b4069afe89e3</guid>
        <title>Use PKCE in OAuth2 Authorization Code Flow</title>
        <description>Learn how to securely implement PKCE in the OAuth2 Authorization Code flow and why it’s useful for public and server-rendered apps.</description>
        <link>https://r3.sergiodxa.com/tutorials/use-pkce-in-oauth2-authorization-code-flow</link>
        <pubDate>Wed, 26 Mar 2025 03:26:52 GMT</pubDate>
      </item>
<item>
        <guid>ca633663-962e-47ae-9fdf-152194dbb194</guid>
        <title>Add Custom Claims to JWT Access Tokens</title>
        <description>Learn how to add custom claims to JWT access tokens in OAuth2 without exposing sensitive data.</description>
        <link>https://r3.sergiodxa.com/tutorials/add-custom-claims-to-jwt-access-tokens</link>
        <pubDate>Tue, 25 Mar 2025 18:03:05 GMT</pubDate>
      </item>
<item>
        <guid>8ab1f14d-94ee-4f6c-bcd7-19fa61826718</guid>
        <title>Validate exp, iat, and nbf in JWTs</title>
        <description>Learn how to validate exp, iat, and nbf claims in JWT access tokens to ensure your API only accepts valid tokens.</description>
        <link>https://r3.sergiodxa.com/tutorials/validate-exp-iat-and-nbf-in-jwts</link>
        <pubDate>Tue, 25 Mar 2025 06:27:23 GMT</pubDate>
      </item>
<item>
        <guid>a05ef2f1-7987-48d9-8e32-7c21083b42b5</guid>
        <title>Use `scope` to Authorize Actions in Your API</title>
        <description>Learn how to use the scope claim in OAuth2 access tokens to authorize actions in your API with fine-grained permissions.</description>
        <link>https://r3.sergiodxa.com/tutorials/use-scope-to-authorize-actions-in-your-api</link>
        <pubDate>Mon, 24 Mar 2025 04:52:09 GMT</pubDate>
      </item>
<item>
        <guid>2940b4ab-916d-4c52-8727-905c20754a44</guid>
        <title>Validate JWTs with JWKS</title>
        <description>Learn how to verify JWT access tokens securely using JWKS, without hitting your Authorization Server on every request.</description>
        <link>https://r3.sergiodxa.com/tutorials/validate-jwts-with-jwks</link>
        <pubDate>Mon, 24 Mar 2025 04:39:27 GMT</pubDate>
      </item>
<item>
        <guid>7f14ac20-45fa-4a97-91cd-704da084b609</guid>
        <title>Create a Per-Request Singleton with React Router Middleware</title>
        <description>Create a per-request singleton in React Router middleware to optimize request-based caching and batching without persistent global state.</description>
        <link>https://r3.sergiodxa.com/tutorials/create-a-per-request-singleton-with-react-router-middleware</link>
        <pubDate>Tue, 11 Mar 2025 05:34:35 GMT</pubDate>
      </item>
<item>
        <guid>d88bf449-bcad-4bc0-b7df-cdcd193cda36</guid>
        <title>Test Middleware in React Router</title>
        <description>Learn how to test React Router middleware using Bun Test, mock requests, and validate session handling in just a few simple steps.</description>
        <link>https://r3.sergiodxa.com/tutorials/test-middleware-in-react-router</link>
        <pubDate>Mon, 10 Mar 2025 19:17:05 GMT</pubDate>
      </item>
<item>
        <guid>98276c3c-88d8-4d76-8796-0ca9ee04509c</guid>
        <title>Use middleware in React Router</title>
        <description>Enable middleware in React Router 7.3.0 to intercept requests and enhance loaders and actions on both server and client.</description>
        <link>https://r3.sergiodxa.com/tutorials/use-middleware-in-react-router</link>
        <pubDate>Sat, 08 Mar 2025 07:43:41 GMT</pubDate>
      </item>
<item>
        <guid>98020084-853d-4c2e-ab01-062e36cc6b7a</guid>
        <title>Show a 404 in React Router</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/create-show-a-404-in-react-router</link>
        <pubDate>Sun, 02 Mar 2025 10:11:07 GMT</pubDate>
      </item>
<item>
        <guid>d354a607-7508-4da7-920d-1e255db6608f</guid>
        <title>Download a file from a React Router route</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/download-a-file-from-a-react-router-route</link>
        <pubDate>Mon, 24 Feb 2025 06:15:30 GMT</pubDate>
      </item>
<item>
        <guid>6dc822e5-00b7-42a9-882a-4a41ca964a46</guid>
        <title>Use Bullet to Detect N+1 Queries in Rails</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/use-bullet-to-detect-n-1-queries-in-rails</link>
        <pubDate>Sat, 08 Feb 2025 22:30:12 GMT</pubDate>
      </item>
<item>
        <guid>2ba97a47-eca3-4b6c-97af-3d0c4aeb4879</guid>
        <title>Use Pandoc to convert a Markdown to a PDF and ePUB</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/use-pandoc-to-convert-a-markdown-to-a-pdf-and-epub</link>
        <pubDate>Fri, 07 Feb 2025 19:32:44 GMT</pubDate>
      </item>
<item>
        <guid>abc90f14-05f3-4e52-b80e-faf5a74580b0</guid>
        <title>Load Dynamic Stylesheets in React Router</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/load-dynamic-stylesheets-in-react-router</link>
        <pubDate>Mon, 03 Feb 2025 05:02:01 GMT</pubDate>
      </item>
<item>
        <guid>f3d21883-eb38-4490-973e-c2011b95941c</guid>
        <title>Split routes config in React Router</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/split-routes-config-in-react-router</link>
        <pubDate>Wed, 15 Jan 2025 05:36:05 GMT</pubDate>
      </item>
<item>
        <guid>2a79aedb-2237-4452-b364-71ba71dfa34e</guid>
        <title> Configure the tracking branch in Git</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/configure-the-tracking-branch-in-git</link>
        <pubDate>Tue, 14 Jan 2025 22:45:32 GMT</pubDate>
      </item>
<item>
        <guid>d666931c-b537-4722-8697-2ea9826c6275</guid>
        <title>Reuse route modules in React Router</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/reuse-route-modules-in-react-router</link>
        <pubDate>Mon, 13 Jan 2025 18:12:37 GMT</pubDate>
      </item>
<item>
        <guid>5e44620f-860b-4904-b382-08ea94d2637d</guid>
        <title>Populate Your Rails Database with Fixtures</title>
        <description>Learn how to populate your Rails database with fixtures for testing and development.</description>
        <link>https://r3.sergiodxa.com/tutorials/populate-your-rails-database-with-fixtures</link>
        <pubDate>Wed, 18 Dec 2024 21:03:28 GMT</pubDate>
      </item>
<item>
        <guid>918bf794-28a9-4a51-bd8f-2a854f149643</guid>
        <title>Stub a method in a class with Minitest</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/stub-a-method-in-a-class-with-minitest</link>
        <pubDate>Mon, 02 Sep 2024 17:49:10 GMT</pubDate>
      </item>
<item>
        <guid>5da63444-0dea-465b-b486-0ad18bd0799b</guid>
        <title>Show toast after a Remix action</title>
        <description>Learn to display a toast notification after a Remix action by utilizing the clientAction function to ensure consistent user feedback.</description>
        <link>https://r3.sergiodxa.com/tutorials/show-toast-after-a-remix-action</link>
        <pubDate>Fri, 30 Aug 2024 07:39:08 GMT</pubDate>
      </item>
<item>
        <guid>6a97f238-4d90-402e-941e-965bf090b082</guid>
        <title>Simplify Component Imports with TypeScript Namespaces</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/simplify-component-imports-with-typescript-namespaces</link>
        <pubDate>Wed, 10 Jul 2024 21:34:33 GMT</pubDate>
      </item>
<item>
        <guid>afc5b33c-e68e-4328-bc1d-c254d85d2468</guid>
        <title>Validate Form in Remix with clientAction</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/validate-form-in-remix-with-clientaction</link>
        <pubDate>Tue, 18 Jun 2024 06:26:14 GMT</pubDate>
      </item>
<item>
        <guid>2fbdeaf2-e390-4dc9-88fe-4d6134eabaa7</guid>
        <title>Generate Cloudflare environment type with wrangler</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/generate-cloudflare-environment-type-with-wrangler</link>
        <pubDate>Tue, 18 Jun 2024 06:10:40 GMT</pubDate>
      </item>
<item>
        <guid>587c21fe-d16e-4d10-9d1b-83a6eb6b5aae</guid>
        <title>Configure scoped private packages in Bun</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/configure-scoped-private-packages-in-bun</link>
        <pubDate>Tue, 18 Jun 2024 06:05:06 GMT</pubDate>
      </item>
<item>
        <guid>fab5e004-f5ad-48ae-a648-91467fbdc9c3</guid>
        <title>Use package.json#bin to create a CLI</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/use-package-json-bin-to-create-a-cli</link>
        <pubDate>Tue, 26 Mar 2024 22:01:17 GMT</pubDate>
      </item>
<item>
        <guid>9e58a26a-9362-4036-a406-bb5b93a11a64</guid>
        <title>Access location.state in Remix loaders and actions</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/access-location-state-in-remix-loaders-and-actions</link>
        <pubDate>Wed, 13 Mar 2024 22:39:02 GMT</pubDate>
      </item>
<item>
        <guid>007b3c60-b01a-4f76-84b4-0880ed503c4f</guid>
        <title>Add i18n to a Remix Vite app</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/add-i18n-to-a-remix-vite-app</link>
        <pubDate>Fri, 08 Mar 2024 00:39:07 GMT</pubDate>
      </item>
<item>
        <guid>e8bdf09b-769c-422e-8a3f-8cd062609b9e</guid>
        <title>Autoload the correct Node version with NVM</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/autoload-the-correct-node-version-with-nvm</link>
        <pubDate>Fri, 01 Mar 2024 17:12:49 GMT</pubDate>
      </item>
<item>
        <guid>69ac35a3-3dc4-42d0-a63e-7e6fab9b26b7</guid>
        <title>Nest routes with dynamic params in Remix</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/nest-routes-with-dynamic-params-in-remix</link>
        <pubDate>Thu, 15 Feb 2024 16:52:53 GMT</pubDate>
      </item>
<item>
        <guid>9adefeaf-e0f9-4f23-bcd8-79237a2958d8</guid>
        <title>Build a simple login and logout with Remix</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/build-a-simple-login-and-logout-with-remix</link>
        <pubDate>Tue, 13 Feb 2024 05:57:59 GMT</pubDate>
      </item>
<item>
        <guid>78ea7328-6db4-47b2-b95d-55caad5dae21</guid>
        <title>Access React Router's loader data from a route ErrorBoundary</title>
        <description>Use useRouteLoaderData hook to access route loader data inside ErrorBoundary components when handling errors.</description>
        <link>https://r3.sergiodxa.com/tutorials/access-remix-s-loader-data-from-a-root-errorboundary</link>
        <pubDate>Tue, 13 Feb 2024 05:35:44 GMT</pubDate>
      </item>
<item>
        <guid>8dab3d0e-64ac-4990-9076-c821a8d9bcb7</guid>
        <title>Access React Router's Loaders Data in entry.client</title>
        <description>Access loader data from entry.client.tsx using the global window.__reactRouterContext object before hydrating your app.</description>
        <link>https://r3.sergiodxa.com/tutorials/access-remix-s-loaders-data-in-entry-client</link>
        <pubDate>Tue, 13 Feb 2024 05:25:07 GMT</pubDate>
      </item>
<item>
        <guid>0aabde7c-2d38-41bd-aaa3-361669b3660b</guid>
        <title>Handle not found URLs with Remix</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/handle-not-found-urls-with-remix</link>
        <pubDate>Sat, 10 Feb 2024 04:07:57 GMT</pubDate>
      </item>
<item>
        <guid>e1b23b7d-be27-47f5-98bd-c69350c52ea1</guid>
        <title>Persist the User Locale Using Cookies with React Router and i18next</title>
        <description>Store user language preferences in cookies to persist locale selections across sessions using middleware.</description>
        <link>https://r3.sergiodxa.com/tutorials/persist-the-user-locale-using-cookies-with-remix-i18next</link>
        <pubDate>Wed, 07 Feb 2024 17:16:37 GMT</pubDate>
      </item>
<item>
        <guid>99efe7cd-cc86-4b29-9e76-ebbc1006a23a</guid>
        <title>Add dynamic canonical URL to Remix routes</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/add-dynamic-canonical-url-to-remix-routes</link>
        <pubDate>Sun, 04 Feb 2024 05:38:01 GMT</pubDate>
      </item>
<item>
        <guid>35803825-3636-41dc-9964-9b89cbba23e5</guid>
        <title>Add custom attributes to Markdoc code fences</title>
        <description>@markdoc/markdoc@0.4.0</description>
        <link>https://r3.sergiodxa.com/tutorials/add-custom-attributes-to-markdoc-code-fences</link>
        <pubDate>Sat, 03 Feb 2024 05:12:14 GMT</pubDate>
      </item>
<item>
        <guid>cc7241b9-6a86-44f3-816a-3b5d90831eb1</guid>
        <title>Enable Remix ~/ aliased imports in Vitest</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/enable-remix-aliased-imports-in-vitest</link>
        <pubDate>Fri, 02 Feb 2024 00:09:44 GMT</pubDate>
      </item>
<item>
        <guid>837d5feb-8e54-48d4-b8ea-0e24d9fb9ca7</guid>
        <title>Add syntax highlight to Markdoc using Prism.js</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/add-syntax-highlight-to-markdoc-using-prism-js</link>
        <pubDate>Wed, 31 Jan 2024 00:08:25 GMT</pubDate>
      </item>
<item>
        <guid>eb261b13-e0f3-4396-ac12-60afe728a2f7</guid>
        <title>Create a CRUD with Remix</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/create-a-crud-with-remix</link>
        <pubDate>Thu, 25 Jan 2024 05:04:07 GMT</pubDate>
      </item>
<item>
        <guid>ce70d2a6-245e-4201-8129-0b971cc0300a</guid>
        <title>Pass Cookies from a React Router Loader to an External API</title>
        <description>Forward browser cookies to external APIs by passing request headers through fetch calls.</description>
        <link>https://r3.sergiodxa.com/tutorials/pass-cookies-from-a-remix-loader-to-an-external-api</link>
        <pubDate>Mon, 22 Jan 2024 06:02:45 GMT</pubDate>
      </item>
<item>
        <guid>92294a9a-96e8-4d65-92ee-d4aeaceb2e73</guid>
        <title>Call an action from a loader in Remix</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/call-an-action-from-a-loader-in-remix</link>
        <pubDate>Mon, 22 Jan 2024 05:57:32 GMT</pubDate>
      </item>
<item>
        <guid>7cb13b2e-94ad-488f-9555-eef99caf0098</guid>
        <title>Use React Portal in Remix</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/use-react-portal-in-remix</link>
        <pubDate>Mon, 22 Jan 2024 05:48:48 GMT</pubDate>
      </item>
<item>
        <guid>453a85d5-b8f4-41c6-bbdd-43f9c6ecbb74</guid>
        <title>Prevent the React Router Loader to Run after Document Request</title>
        <description>Use clientLoader to prevent server loader execution during client-side navigation while keeping it on document requests.</description>
        <link>https://r3.sergiodxa.com/tutorials/prevent-the-remix-loader-to-run-after-document-request</link>
        <pubDate>Mon, 22 Jan 2024 05:04:15 GMT</pubDate>
      </item>
<item>
        <guid>fcd0a387-95ca-417b-9658-6a6d68a1732e</guid>
        <title>Defer a Fetch response in Remix</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/defer-a-fetch-response-in-remix</link>
        <pubDate>Fri, 19 Jan 2024 23:39:03 GMT</pubDate>
      </item>
<item>
        <guid>42648b77-d40e-4474-a5ad-e62be79f0818</guid>
        <title>Use a CDN for your static assets in Remix</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/use-a-cdn-for-your-static-assets-in-remix</link>
        <pubDate>Fri, 19 Jan 2024 23:32:26 GMT</pubDate>
      </item>
<item>
        <guid>58f492a9-d64a-4123-a449-034053c4d76f</guid>
        <title>Get the absolute URL in Remix's MetaFunction</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/get-the-absolute-url-in-remix-s-metafunction</link>
        <pubDate>Fri, 19 Jan 2024 23:26:21 GMT</pubDate>
      </item>
<item>
        <guid>0f06bfd2-99ec-4e44-b0ed-06b9a7f96430</guid>
        <title>Build an app with Remix and Bun</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/build-an-app-with-remix-and-bun</link>
        <pubDate>Fri, 19 Jan 2024 22:36:30 GMT</pubDate>
      </item>
<item>
        <guid>b3d20f6f-2d22-4f20-a2f8-a47c832f774b</guid>
        <title>Find and remove unused code with Knip</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/find-and-remove-unused-code-with-knip</link>
        <pubDate>Thu, 18 Jan 2024 22:24:28 GMT</pubDate>
      </item>
<item>
        <guid>f8093c61-d529-4227-b1e5-9e072ff189a8</guid>
        <title>Create multiple top-level layouts in Remix</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/create-multiple-top-level-layouts-in-remix</link>
        <pubDate>Wed, 17 Jan 2024 00:15:29 GMT</pubDate>
      </item>
<item>
        <guid>1f8ba001-8d93-4aba-abd8-33e8b2eff4b4</guid>
        <title>Test meta tags using Playwright</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/test-meta-tags-using-playwright</link>
        <pubDate>Wed, 10 Jan 2024 22:47:06 GMT</pubDate>
      </item>
<item>
        <guid>cbd27182-c9c2-468f-bb94-8a1a56382470</guid>
        <title>Prefetch data for Remix Fetcher usage</title>
        <description>If you're using Remix, you can ask it to prefetch the data of a new route using Link's prefetch prop, but if you need to use `fetcher.loa…</description>
        <link>https://r3.sergiodxa.com/tutorials/prefetch-data-for-remix-fetcher-usage</link>
        <pubDate>Fri, 08 Dec 2023 22:31:58 GMT</pubDate>
      </item>
<item>
        <guid>114b3ead-20e2-4174-93c3-8ddfca2ca785</guid>
        <title>Keep Your Loader Data Fresh in Remix</title>
        <description>Using the useRevalidator hook we can revalidate our loader data on an interval to ensure that our data is always fresh.  How fresh can depe…</description>
        <link>https://r3.sergiodxa.com/tutorials/keep-your-loader-data-fresh-in-remix</link>
        <pubDate>Fri, 01 Dec 2023 05:35:33 GMT</pubDate>
      </item>
<item>
        <guid>e702cb53-79c8-4f6e-a263-2479a97452f6</guid>
        <title>Expose Remix Routes as API Endpoints</title>
        <description>If you're building a Remix web app, and then you decide to expose an API from that app, you may be tempted to try to reuse the same routes …</description>
        <link>https://r3.sergiodxa.com/tutorials/expose-remix-routes-as-api-endpoints</link>
        <pubDate>Mon, 27 Nov 2023 18:43:34 GMT</pubDate>
      </item>
<item>
        <guid>1e6d833d-19c2-4452-a40c-d2c0db2fcd46</guid>
        <title>Access the Search Params of a Request in React Router</title>
        <description>Learn how to access URL search params in React Router loaders and components using the URL and URLSearchParams APIs.</description>
        <link>https://r3.sergiodxa.com/tutorials/access-the-search-params-of-a-request-in-remix</link>
        <pubDate>Wed, 22 Nov 2023 23:17:29 GMT</pubDate>
      </item>
<item>
        <guid>bbc2d771-4516-4d6d-b11a-2585c1147c4c</guid>
        <title>Upload Images in a Remix Application</title>
        <description>If you want to add file upload to let users send you images, e.g., for an avatar, Remix provides a few (still unstable for some reason) too…</description>
        <link>https://r3.sergiodxa.com/tutorials/upload-images-in-remix-apps</link>
        <pubDate>Mon, 23 Oct 2023 23:40:03 GMT</pubDate>
      </item>
<item>
        <guid>55e27fe3-4d5b-4dd2-bbc9-32ba5feb8280</guid>
        <title>Redirect with Search Param in Remix</title>
        <description>Let's say you want to ensure a specific search param is always set. To do so, you can first check if the search param is set, and if not, r…</description>
        <link>https://r3.sergiodxa.com/tutorials/redirect-with-search-param-in-remix</link>
        <pubDate>Fri, 06 Oct 2023 23:47:03 GMT</pubDate>
      </item>
<item>
        <guid>3b9b64e1-f973-4812-aaed-d620999ae1fa</guid>
        <title>Access the Loader Data in Remix</title>
        <description>If you're using Remix, you may have noticed that the loader data is not passed to the components as props. This is because the loader data …</description>
        <link>https://r3.sergiodxa.com/tutorials/access-loaders-data-in-remix</link>
        <pubDate>Thu, 05 Oct 2023 20:33:52 GMT</pubDate>
      </item>
<item>
        <guid>a7be77b2-610a-4b97-8d8e-d33c6519367c</guid>
        <title>Abort Async Calls Inside Remix Loaders and Actions</title>
        <description>Let's say you're writing a loader that needs to do a fetch call to get some data, something simple just for the example:  ```ts import { js…</description>
        <link>https://r3.sergiodxa.com/tutorials/abort-async-calls-inside-remix-loaders-and-actions</link>
        <pubDate>Sun, 24 Sep 2023 07:41:49 GMT</pubDate>
      </item>
<item>
        <guid>530263a7-7559-4031-8df2-e3317a952d79</guid>
        <title>Get Remix route params `entry.server`</title>
        <description>If you have a parameter like the locale `/:locale/*` that you want to get in entry.server for any reason, you can use the `EntryContext` ob…</description>
        <link>https://r3.sergiodxa.com/tutorials/get-remix-route-params-in-entry-server</link>
        <pubDate>Fri, 08 Sep 2023 16:36:36 GMT</pubDate>
      </item>
<item>
        <guid>994f6ec4-a705-477f-8937-30d1d315733b</guid>
        <title>Test meta tags with Cypress</title>
        <description>If you want to ensure your webs have the correct meta tags like the title, description, Open Graph or Twitter Cards.  We can test the title…</description>
        <link>https://r3.sergiodxa.com/tutorials/test-meta-tags-with-cypress</link>
        <pubDate>Wed, 06 Sep 2023 04:42:31 GMT</pubDate>
      </item>
<item>
        <guid>badb7de6-6a1c-4e88-85d3-daf18c28ca24</guid>
        <title>Strongly type Remix route IDs</title>
        <description>When using something like `useRouteLoaderData()` we need to provide the route ID of the route we want to get the data from.  This could als…</description>
        <link>https://r3.sergiodxa.com/tutorials/strongly-type-remix-route-ids</link>
        <pubDate>Mon, 17 Jul 2023 23:33:22 GMT</pubDate>
      </item>
<item>
        <guid>43dda622-38d6-4ed0-a62c-3f37a19e1a21</guid>
        <title>Strongly type public assets in Remix</title>
        <description>Remix gives us two ways to work with assets, we can import them directly and get a string to the hashed file path, or we can place the file…</description>
        <link>https://r3.sergiodxa.com/tutorials/strongly-type-public-assets-in-remix</link>
        <pubDate>Mon, 17 Jul 2023 15:29:17 GMT</pubDate>
      </item>
<item>
        <guid>2bbae9d1-cce6-447f-af7f-a2f5a4cd2aef</guid>
        <title>Create a reusable Form component in Remix</title>
        <description>Let's say we want to build a custom Form component for our application, this Form will do things inside like rendering a hidden input with …</description>
        <link>https://r3.sergiodxa.com/tutorials/create-a-reusable-form-component-in-remix</link>
        <pubDate>Fri, 07 Jul 2023 22:35:43 GMT</pubDate>
      </item>
<item>
        <guid>84028037-2930-48ae-bdbb-6b6b1212036c</guid>
        <title>Sync text input with URLSearchParam in Remix</title>
        <description>Let's say we're building a search form that needs to keep the value on the search params as the user type.  We could directly update on the…</description>
        <link>https://r3.sergiodxa.com/tutorials/sync-text-input-with-urlsearch-params-in-remix</link>
        <pubDate>Thu, 06 Jul 2023 17:28:54 GMT</pubDate>
      </item>
<item>
        <guid>8cbcf6a4-b387-42a8-ba32-e04d87ebd303</guid>
        <title>Use TanStack Query to Share Data between React Router Loaders</title>
        <description>Share data between React Router loaders efficiently using TanStack Query to avoid duplicate fetches and improve performance.</description>
        <link>https://r3.sergiodxa.com/tutorials/use-tanstack-query-to-share-data-between-remix-loaders</link>
        <pubDate>Mon, 05 Jun 2023 16:01:26 GMT</pubDate>
      </item>
<item>
        <guid>b50daf66-45e6-4dbd-a2d0-b55dc4983be9</guid>
        <title>Logout from Auth0 with Remix Auth</title>
        <description>If you're using Remix Auth together with Auth0, you may found out that if you just use the logout method from Remix Auth and try to login a…</description>
        <link>https://r3.sergiodxa.com/tutorials/logout-from-auth0-with-remix-auth</link>
        <pubDate>Wed, 24 May 2023 04:41:20 GMT</pubDate>
      </item>
<item>
        <guid>1b30e4cf-133a-44fb-b430-8f2ffe0ad474</guid>
        <title>Send Node.js ReadStream objects from Remix loaders</title>
        <description>If you're creating route in Remix that needs to send a file from you may want to use `node:fs` to get the file content from the system and …</description>
        <link>https://r3.sergiodxa.com/tutorials/send-node-read-stream-objects-from-remix-loaders</link>
        <pubDate>Mon, 15 May 2023 21:00:05 GMT</pubDate>
      </item>
<item>
        <guid>6e7df66d-ecbc-43f9-9aeb-248deefebf91</guid>
        <title>Reset a form on success in Remix</title>
        <description>If you have a form with one or more uncontrolled inputs you may have seen the case where the user submits the form but the inputs are not c…</description>
        <link>https://r3.sergiodxa.com/tutorials/reset-a-form-on-success-in-remix</link>
        <pubDate>Mon, 15 May 2023 20:46:56 GMT</pubDate>
      </item>
<item>
        <guid>d1525d30-e998-4d17-83e6-ed0fe7953bc5</guid>
        <title>Use `qs.parse` to use nested form fields in Remix</title>
        <description>The traditional way to parse a form body in Remix is by using `request.formData()` to get a new FormData object, then use `formData.get()` …</description>
        <link>https://r3.sergiodxa.com/tutorials/use-qs-parse-to-use-nested-form-fields-in-remix</link>
        <pubDate>Mon, 15 May 2023 18:51:52 GMT</pubDate>
      </item>
<item>
        <guid>bea97751-fc9f-4d71-8068-f4da8e740712</guid>
        <title>Send JSON to a Remix action</title>
        <description>While [there's a proposal to add support for this](https://github.com/remix-run/remix/discussions/1959#discussioncomment-2205718), right no…</description>
        <link>https://r3.sergiodxa.com/tutorials/send-json-to-a-remix-action</link>
        <pubDate>Sat, 13 May 2023 23:14:44 GMT</pubDate>
      </item>
<item>
        <guid>a7e1db39-e333-4496-92dc-ec424c998c91</guid>
        <title>Set Multiple Cookies in the Same Response in React Router Loaders</title>
        <description>Set multiple Set-Cookie headers in loader responses using header arrays or the Headers.append method.</description>
        <link>https://r3.sergiodxa.com/tutorials/set-multiple-cookies-in-the-same-response-in-remix-loaders</link>
        <pubDate>Fri, 12 May 2023 22:34:08 GMT</pubDate>
      </item>
<item>
        <guid>7b587419-5714-4ea7-adc7-25f7c8b239d3</guid>
        <title>Close SSE connection from the server in Remix</title>
        <description>If you're using SSE in a Remix app, you may find you want to be able to close the connection from the server.  The [Remix Utils `eventStrea…</description>
        <link>https://r3.sergiodxa.com/tutorials/close-sse-connection-from-the-server-in-remix</link>
        <pubDate>Wed, 10 May 2023 23:43:44 GMT</pubDate>
      </item>
<item>
        <guid>dd058b68-93e2-4b96-8453-212138eed212</guid>
        <title>Measure performance with the Server-Timing header in React Router</title>
        <description>Add performance measurements to response headers to inspect route timing from the browser DevTools.</description>
        <link>https://r3.sergiodxa.com/tutorials/measure-performance-with-the-server-timing-header-in-remix</link>
        <pubDate>Sun, 30 Apr 2023 06:20:25 GMT</pubDate>
      </item>
<item>
        <guid>52e93d4a-cd93-4f2a-a09b-8a9b262778d2</guid>
        <title>Automatically commit sessions on Remix</title>
        <description>When you use Remix's session feature you have to always remember to commit your session before sending the response.  This is a simpler fun…</description>
        <link>https://r3.sergiodxa.com/tutorials/automatically-commit-session-on-remix</link>
        <pubDate>Tue, 04 Apr 2023 21:37:26 GMT</pubDate>
      </item>
<item>
        <guid>bcbe5ba4-9c3b-4ab4-b723-da8b9486ef56</guid>
        <title>Customize Remix AppLoadContext type</title>
        <description></description>
        <link>https://r3.sergiodxa.com/tutorials/customize-remix-app-load-context-type</link>
        <pubDate>Thu, 16 Mar 2023 21:17:58 GMT</pubDate>
      </item>
<item>
        <guid>736e1f21-25d2-4f76-942e-a5abe329adc4</guid>
        <title>Turn on Caps Lock on Cypress</title>
        <description>If you're testing a feature that depends on Caps Lock to be on, e.g. detect Caps Lock and warn on password inputs. You can test this works …</description>
        <link>https://r3.sergiodxa.com/tutorials/turn-on-caps-lock-on-cypress</link>
        <pubDate>Tue, 14 Mar 2023 17:27:21 GMT</pubDate>
      </item>
<item>
        <guid>40816af1-790b-4b02-97b6-af9640fa8117</guid>
        <title>Delete a Cookie using Remix cookie helpers</title>
        <description>If we have set a cookie and we need to tell the browser to delete it, we can do that with a simple trick, we can set the cookie value to an…</description>
        <link>https://r3.sergiodxa.com/tutorials/delete-a-cookie-using-remix-cookie-helpers</link>
        <pubDate>Mon, 13 Feb 2023 22:41:53 GMT</pubDate>
      </item>
<item>
        <guid>d10a30c6-a96c-4f59-a6cb-841fcf678c64</guid>
        <title>Add runtime SSG and ISR to Remix</title>
        <description>If you came to Remix from the Next.js world, you might wonder how to use SSG and ISR with Remix.  The framework doesn't support it; instead…</description>
        <link>https://r3.sergiodxa.com/tutorials/add-runtime-ssg-and-isr-to-remix</link>
        <pubDate>Sun, 29 Jan 2023 05:24:17 GMT</pubDate>
      </item>
<item>
        <guid>8d9297a4-a462-4658-b74f-5b6440618357</guid>
        <title>Improve SEO by not sending JS in Remix</title>
        <description>When Google crawls your website, it will try to execute all the JavaScript it finds. And even if your app…</description>
        <link>https://r3.sergiodxa.com/tutorials/improve-seo-by-not-sending-js-in-remix</link>
        <pubDate>Wed, 25 Jan 2023 20:24:28 GMT</pubDate>
      </item>
<item>
        <guid>1918409d-39d6-4bd5-9ed7-eda45dbbe5e7</guid>
        <title>Use AMP with Remix</title>
        <description>If for any reason, you want to add AMP to your Remix app, there are a few things you need to do.

First, go to your `app/root…</description>
        <link>https://r3.sergiodxa.com/tutorials/use-amp-with-remix</link>
        <pubDate>Mon, 23 Jan 2023 23:10:44 GMT</pubDate>
      </item>
<item>
        <guid>97b32b62-ec30-4ccb-95e8-170ea5b7e21a</guid>
        <title>Use Remix as a SPA only</title>
        <description>Remix always does SSR on document requests. Then it works as an MPA until JS loads and React hydrates your app. At that …</description>
        <link>https://r3.sergiodxa.com/tutorials/use-remix-as-a-spa-only</link>
        <pubDate>Mon, 23 Jan 2023 22:39:20 GMT</pubDate>
      </item>
<item>
        <guid>e99054f4-8201-49a3-834f-b49b686c5f07</guid>
        <title>Downgrade to MPA if Users Prefer Reduced Data in React Router</title>
        <description>Detect the Save-Data header and conditionally disable client-side JavaScript to reduce data usage.</description>
        <link>https://r3.sergiodxa.com/tutorials/downgrade-to-mpa-if-users-prefer-reduced-data-in-remix</link>
        <pubDate>Thu, 15 Dec 2022 18:03:02 GMT</pubDate>
      </item>
<item>
        <guid>de673902-090a-46a7-943a-2094764d9aa9</guid>
        <title>Add rolling sessions to Remix</title>
        <description>Rolling sessions is a technique to extend the maxAge of a session cookie by resetting the cookie's expiration date…</description>
        <link>https://r3.sergiodxa.com/tutorials/add-rolling-sessions-to-remix</link>
        <pubDate>Thu, 01 Dec 2022 20:32:16 GMT</pubDate>
      </item>
<item>
        <guid>a9a54bae-0ac7-4513-bc4d-ead45645a891</guid>
        <title>Use Server-Sent Events with Remix</title>
        <description>Using Server-Sent Events (SSE) you can keep a connection between a browser (client) and an HTTP server open an…</description>
        <link>https://r3.sergiodxa.com/tutorials/use-server-sent-events-with-remix</link>
        <pubDate>Fri, 25 Nov 2022 23:45:39 GMT</pubDate>
      </item>
<item>
        <guid>49b7237c-8bbf-4230-9c22-cbce6fdb18b6</guid>
        <title>Progressively Enhance the useFetcher Hook in React Router</title>
        <description>Support both JavaScript and no-JavaScript users by detecting hydration state in fetcher forms.</description>
        <link>https://r3.sergiodxa.com/tutorials/progressively-enhance-the-usefetcher-hook-in-remix</link>
        <pubDate>Wed, 16 Nov 2022 22:13:23 GMT</pubDate>
      </item>
<item>
        <guid>d70531b7-e8ab-492d-9681-f5c47e37b64f</guid>
        <title>Use `process.env` client-side with Remix</title>
        <description>Use process.env client-side with Remix

The process.env thing is a Node.js-only feature that many front-end developers adopted as something t…</description>
        <link>https://r3.sergiodxa.com/tutorials/use-process-env-client-side-with-remix</link>
        <pubDate>Wed, 09 Nov 2022 16:58:37 GMT</pubDate>
      </item>
<item>
        <guid>1e9ab918-8468-4085-85f3-45e3c9011ef8</guid>
        <title>Persist inputs after a form submit in Remix</title>
        <description>Let's say you have a form with a few inputs. You want to persist the inputs' values after submitting…</description>
        <link>https://r3.sergiodxa.com/tutorials/persist-inputs-after-a-form-submit-in-remix</link>
        <pubDate>Thu, 20 Oct 2022 22:11:55 GMT</pubDate>
      </item>
<item>
        <guid>b991d4e0-5adf-4985-8182-a37396ef358d</guid>
        <title>Lazy-load React components in Remix</title>
        <description>Suppose we want to create a timeline component that lists different events. Each event type has a unique com…</description>
        <link>https://r3.sergiodxa.com/tutorials/lazy-load-react-components-in-remix</link>
        <pubDate>Wed, 12 Oct 2022 21:31:09 GMT</pubDate>
      </item>
<item>
        <guid>a5c0e9ee-8537-4eb8-8f2e-5fe4cb7ddb2c</guid>
        <title>Destroy User Session and While Setting a Flash Message in React Router</title>
        <description>Set flash messages while destroying user sessions using cookie or database session storage.</description>
        <link>https://r3.sergiodxa.com/tutorials/destroy-user-session-and-while-setting-a-flash-message-in-remix</link>
        <pubDate>Wed, 21 Sep 2022 20:48:27 GMT</pubDate>
      </item>
<item>
        <guid>85215ec1-2baa-4c9b-ab59-1220064eb903</guid>
        <title>Add additional data before submitting on Remix</title>
        <description>The Remix approach to submitting forms is to replace the &lt;form&gt; tag with their &lt;Form&gt; compone…</description>
        <link>https://r3.sergiodxa.com/tutorials/add-additional-data-before-submitting-on-remix</link>
        <pubDate>Wed, 21 Sep 2022 20:31:22 GMT</pubDate>
      </item>
<item>
        <guid>05fbbc06-4b78-46fd-9f5f-4ff0b5003e0d</guid>
        <title>Redirect to an external website with Remix</title>
        <description>Remix gives us a useful redirect helper function which lets us quickly create a new redirect Respon…</description>
        <link>https://r3.sergiodxa.com/tutorials/redirect-to-an-external-website-with-remix</link>
        <pubDate>Wed, 21 Sep 2022 20:07:18 GMT</pubDate>
      </item>
<item>
        <guid>747de196-331e-4944-be76-7642003c08ca</guid>
        <title>Bubble up data on Remix routes</title>
        <description>React introduced a one-way data flow where a parent component has some data (state) and passes it to the children…</description>
        <link>https://r3.sergiodxa.com/tutorials/bubble-up-data-on-remix-routes</link>
        <pubDate>Tue, 13 Sep 2022 23:04:17 GMT</pubDate>
      </item>
<item>
        <guid>58444295-3648-489f-b83c-0bc2a3ea7eac</guid>
        <title>Group related routes together in Remix</title>
        <description>Next.js released its new nested routes feature yesterday (Friday, 9th September). One of the things they …</description>
        <link>https://r3.sergiodxa.com/tutorials/group-related-routes-together-in-remix</link>
        <pubDate>Fri, 09 Sep 2022 17:51:15 GMT</pubDate>
      </item>
<item>
        <guid>20b6aab6-7252-4210-8bc3-758b9a5e7fa9</guid>
        <title>Parse Markdown with Markdoc in Remix</title>
        <description>Markdoc is this new Markdown parser by Stripe, and it's a simple to use yet extendable library we can use i…</description>
        <link>https://r3.sergiodxa.com/tutorials/parse-markdown-with-markdoc-in-remix</link>
        <pubDate>Thu, 21 Jul 2022 22:43:43 GMT</pubDate>
      </item>
<item>
        <guid>f5bbb049-386b-4791-b1ed-61acd0873288</guid>
        <title>Optimize image loading with plain HTML</title>
        <description>If you're building some page like a landing with some images, you may want to optimize how these images l…</description>
        <link>https://r3.sergiodxa.com/tutorials/optimize-image-loading-with-plain-html</link>
        <pubDate>Mon, 09 May 2022 17:31:08 GMT</pubDate>
      </item>
<item>
        <guid>f57ef76b-acfc-4790-a089-6543d7f6908a</guid>
        <title>Add returnTo behavior to Remix Auth</title>
        <description>If you're using Remix Auth, you may want to add support to return the user to where it was before redirectin…</description>
        <link>https://r3.sergiodxa.com/tutorials/add-returnto-behavior-to-remix-auth</link>
        <pubDate>Fri, 25 Feb 2022 03:34:26 GMT</pubDate>
      </item>
<item>
        <guid>da12077f-67c9-4d77-a5b2-d1c2e899cf45</guid>
        <title>Share session and cookies between Next and Remix</title>
        <description>I have been migrating a Next.js app to Remix for a few months. I already wrote how to run them …</description>
        <link>https://r3.sergiodxa.com/tutorials/share-session-and-cookies-between-next-and-remix</link>
        <pubDate>Thu, 24 Feb 2022 21:52:55 GMT</pubDate>
      </item>
<item>
        <guid>1b09e16a-286c-4005-88a3-3d97483e7356</guid>
        <title>Fix double data request when prefetching in Remix</title>
        <description>Suppose you rendered a &lt;Link prefetch="intent" /&gt; component in your UI with the idea of pref…</description>
        <link>https://r3.sergiodxa.com/tutorials/fix-double-data-request-when-prefetching-in-remix</link>
        <pubDate>Thu, 24 Feb 2022 20:45:58 GMT</pubDate>
      </item>
<item>
        <guid>d15cb70a-a4fb-4572-861c-9aff3c652932</guid>
        <title>Run Tailwind and Remix in Parallel with PM2</title>
        <description>If you use Remix together Tailwind (and you should!), you may have found out that you need to run th…</description>
        <link>https://r3.sergiodxa.com/tutorials/run-tailwind-and-remix-in-parallel-with-pm2</link>
        <pubDate>Wed, 19 Jan 2022 05:37:24 GMT</pubDate>
      </item>
<item>
        <guid>8dd575df-d498-4ede-b7de-aa2a1a0d4cdc</guid>
        <title>Use Remix with socket.io</title>
        <description>If you want to add real-time capabilities to your Remix app without using an external service, the easiest way is proba…</description>
        <link>https://r3.sergiodxa.com/tutorials/use-remix-with-socket-io</link>
        <pubDate>Tue, 11 Jan 2022 21:20:22 GMT</pubDate>
      </item>
<item>
        <guid>90977c4c-53c2-48a8-bb32-865208d237df</guid>
        <title>Generate a PDF in Remix with Resource Routes</title>
        <description>Remix has a feature called Resource Routes which let you create endpoints returning anything.

Usin…</description>
        <link>https://r3.sergiodxa.com/tutorials/generate-a-pdf-in-remix-with-resource-routes</link>
        <pubDate>Mon, 10 Jan 2022 16:43:09 GMT</pubDate>
      </item>
<item>
        <guid>f08306b9-4e5a-49ba-8241-889ed66517c1</guid>
        <title>Avoid waterfalls of queries in Remix loaders</title>
        <description>Remix does a fantastic job of avoiding waterfalls everywhere. It preloads assets. It downloads JS a…</description>
        <link>https://r3.sergiodxa.com/tutorials/avoid-waterfalls-of-queries-in-remix-loaders</link>
        <pubDate>Thu, 06 Jan 2022 17:05:58 GMT</pubDate>
      </item>
<item>
        <guid>a5768f69-17a2-42ba-9006-40f8258d2de5</guid>
        <title>Run Next and Remix on the same server</title>
        <description>If you want to migrate a Next app to Remix, you may be tempted to do a complete migration. Still, if your …</description>
        <link>https://r3.sergiodxa.com/tutorials/run-next-and-remix-on-the-same-server</link>
        <pubDate>Mon, 03 Jan 2022 18:49:57 GMT</pubDate>
      </item>
<item>
        <guid>b57b20e9-829f-4e8f-b739-fb9ecf659605</guid>
        <title>Test Remix loaders and actions</title>
        <description>If you are using Remix, most of your application code will live in the loaders and actions instead of React compo…</description>
        <link>https://r3.sergiodxa.com/tutorials/test-remix-loaders-and-actions</link>
        <pubDate>Thu, 25 Nov 2021 06:53:55 GMT</pubDate>
      </item>
<item>
        <guid>07347da6-bb26-4bef-8e1e-4e202eaf60fb</guid>
        <title>Use NProgress in a Remix app</title>
        <description>Remix's philosophy is to kill all the spinner! This is amazing, but sometimes it's not possible. Connections may be…</description>
        <link>https://r3.sergiodxa.com/tutorials/use-nprogress-in-a-remix-app</link>
        <pubDate>Wed, 24 Nov 2021 16:07:35 GMT</pubDate>
      </item>
<item>
        <guid>724b233f-f2b7-4451-86e9-12b87b44923c</guid>
        <title>Use Fathom with Remix</title>
        <description>If you want to use Fathom for your analytics and use Remix to build your app, you can configure it to work quite quickly.
…</description>
        <link>https://r3.sergiodxa.com/tutorials/use-fathom-with-remix</link>
        <pubDate>Thu, 23 Sep 2021 21:47:25 GMT</pubDate>
      </item>
<item>
        <guid>f62924ea-eb76-4a03-9b33-288be706def5</guid>
        <title>Fix `gyp: No Xcode or CLT version detected!` error</title>
        <description>Fix gyp: No Xcode or CLT version detected! error

If you have this error, and you running xcode-select --install tells you you have them inst…</description>
        <link>https://r3.sergiodxa.com/tutorials/fix-gyp-no-xcode-or-clt-version-detected-error</link>
        <pubDate>Thu, 09 Sep 2021 16:34:31 GMT</pubDate>
      </item>
<item>
        <guid>fc20a489-5a9d-49e9-973b-22dd724e03bf</guid>
        <title>Use Dependabot to keep Remix up-to-date</title>
        <description>If you use Dependabot to keep your project dependencies up-to-date, and if you use Remix you may have no…</description>
        <link>https://r3.sergiodxa.com/tutorials/use-dependabot-to-keep-remix-up-to-date</link>
        <pubDate>Wed, 08 Sep 2021 17:45:06 GMT</pubDate>
      </item>
<item>
        <guid>730eb5c9-79e3-4cc6-b3e0-262a1d952a90</guid>
        <title>Load only the data you need in Remix</title>
        <description>If you are used to build SPA and your APIs are REST you probably have found the issue with over fetching, t…</description>
        <link>https://r3.sergiodxa.com/tutorials/load-only-the-data-you-need-in-remix</link>
        <pubDate>Fri, 18 Jun 2021 16:45:32 GMT</pubDate>
      </item>
<item>
        <guid>3ebf4c7e-834c-4307-a202-06986ab9be90</guid>
        <title>Use ETags in Remix</title>
        <description>ETags are strings used to identify a particular version of a resource. If the URL is the identity of a resource the ETag is t…</description>
        <link>https://r3.sergiodxa.com/tutorials/use-etags-in-remix</link>
        <pubDate>Wed, 16 Jun 2021 16:32:36 GMT</pubDate>
      </item>
<item>
        <guid>986edd2c-a6ea-4a08-abd5-28892cd960c7</guid>
        <title>Redirect to the original URL inside a Remix action</title>
        <description>Let's say the user is currently at the URL /:username, and there's a button to follow that …</description>
        <link>https://r3.sergiodxa.com/tutorials/redirect-to-the-original-url-inside-a-remix-action</link>
        <pubDate>Thu, 20 May 2021 21:29:16 GMT</pubDate>
      </item>
<item>
        <guid>bb2f2a70-caa0-41aa-96b4-4d3ce3e06103</guid>
        <title>Read search params with JS</title>
        <description>If you need to read the search params (aka query string) from a URL in JS the most common way is to use one of the mu…</description>
        <link>https://r3.sergiodxa.com/tutorials/read-search-params-with-js</link>
        <pubDate>Tue, 18 May 2021 16:31:40 GMT</pubDate>
      </item>
<item>
        <guid>277a7e39-b460-43df-976c-8e4ccec6e74b</guid>
        <title>Use ActiveModel::Serializer with non ActiveRecord object</title>
        <description>If you are trying to serialize an object which is not an instance of ActiveRecord, when…</description>
        <link>https://r3.sergiodxa.com/tutorials/use-activemodel-serializer-with-non-activerecord-object</link>
        <pubDate>Mon, 17 May 2021 20:15:30 GMT</pubDate>
      </item>
<item>
        <guid>0f8c90cd-4d04-4e97-bdda-9350c84ad2d6</guid>
        <title>Serialize list of items with ActiveModel::Serializer</title>
        <description>Most of the them, when working on Rails with ActiveModel::Serializer you will do something …</description>
        <link>https://r3.sergiodxa.com/tutorials/serialize-list-of-items-with-activemodel-serializer</link>
        <pubDate>Mon, 17 May 2021 18:42:02 GMT</pubDate>
      </item>
<item>
        <guid>35cdbf34-4426-4876-bf4b-89ca54d14250</guid>
        <title>Use serializers with JSON.stringify and JSON.parse</title>
        <description>If you are working with an API which expects and returns keys without using camelCase, e.g if…</description>
        <link>https://r3.sergiodxa.com/tutorials/use-serializers-with-json-stringify-and-json-parse</link>
        <pubDate>Wed, 12 May 2021 23:19:48 GMT</pubDate>
      </item>
<item>
        <guid>22da0bdc-d599-47ee-85ab-272efcbc740d</guid>
        <title>Force a locale in Rails I18n from the params</title>
        <description>If you want to change the local used for internationalization a single time from the params of the …</description>
        <link>https://r3.sergiodxa.com/tutorials/force-a-locale-in-rails-i18n-from-the-params</link>
        <pubDate>Tue, 11 May 2021 05:02:35 GMT</pubDate>
      </item>
<item>
        <guid>e8679159-1a70-4ce9-8dd8-447181fb520f</guid>
        <title>Add missing `created_at` and `updated_at` columns in Rails</title>
        <description>Add missing created_at and updated_at columns in Rails

If, like me, you forgot to add the t.timestamps when creating a new table, you may …</description>
        <link>https://r3.sergiodxa.com/tutorials/add-missing-created_at-and-updated_at-columns-in-rails</link>
        <pubDate>Tue, 23 Mar 2021 22:53:31 GMT</pubDate>
      </item>
<item>
        <guid>49ed5a33-1dc6-4a32-9cab-bec3ff3ee49b</guid>
        <title>Build your own RSS Reader</title>
        <description>RSS is a standard way to use XML to share content from a website so other apps could read it and show it in a differen…</description>
        <link>https://r3.sergiodxa.com/tutorials/build-your-own-rss-reader</link>
        <pubDate>Mon, 01 Feb 2021 05:53:03 GMT</pubDate>
      </item>
<item>
        <guid>06d17028-1c57-4efb-b052-252a5359e3d1</guid>
        <title>Keep Heading Levels Consistent with React Context</title>
        <description>When building for the web one of the most common elements are the heading tags (h1 to h6) …</description>
        <link>https://r3.sergiodxa.com/tutorials/keep-heading-levels-consistent-with-react-context</link>
        <pubDate>Sun, 31 Jan 2021 22:37:23 GMT</pubDate>
      </item>
<item>
        <guid>e4ba7878-5144-49f2-bec4-fb067f3031a8</guid>
        <title>Use TailwindCSS Typography with Dark Mode Styles</title>
        <description>Since TailwindCSS v2 it comes with dark mode support. Enabling it is really simple, in the `tai…</description>
        <link>https://r3.sergiodxa.com/tutorials/use-tailwindcss-typography-with-dark-mode-styles</link>
        <pubDate>Mon, 16 Nov 2020 06:57:08 GMT</pubDate>
      </item>
<item>
        <guid>57bba8f3-2056-4d11-95b2-32fc6521931a</guid>
        <title>Use SWR with Geolocation</title>
        <description>Learn how to use SWR with the Geolocation WebAPI to show the user location in a map and keep it up-to-date with any change.</description>
        <link>https://r3.sergiodxa.com/tutorials/swr/geolocation</link>
        <pubDate>Fri, 19 Jun 2020 05:36:42 GMT</pubDate>
      </item>
<item>
        <guid>e585d2c4-e819-4b6e-ab69-2c87ba7f8e35</guid>
        <title>Sync WebApp Session Status between Tabs with SWR</title>
        <description>Implement a synced session status using SWR to keep the user logged in/out in all the tabs or windows</description>
        <link>https://r3.sergiodxa.com/tutorials/swr/sync-session</link>
        <pubDate>Fri, 15 May 2020 07:11:20 GMT</pubDate>
      </item>
<item>
        <guid>245d7926-b6bd-4a29-9d2a-65a5af86ecdf</guid>
        <title>Sync SWR cache with Web Storage</title>
        <description>Use Web Storage to retain SWR cache between page reloads</description>
        <link>https://r3.sergiodxa.com/tutorials/swr/storage-sync</link>
        <pubDate>Fri, 15 May 2020 05:28:17 GMT</pubDate>
      </item>
<item>
        <guid>16a6b1a9-af7a-4a52-ac22-a3d7e72ee79d</guid>
        <title>Configure Google Suite MX records in Vercel</title>
        <description>Use Google Suite with a domain whose NS records is in Vercel</description>
        <link>https://r3.sergiodxa.com/tutorials/vercel/configure-gsuite</link>
        <pubDate>Tue, 12 May 2020 05:10:09 GMT</pubDate>
      </item>
<item>
        <guid>64c60cd3-c6fd-430f-9a4f-f6b4be75807d</guid>
        <title>Report Web Vitals in Next.js</title>
        <description>Measure the performance of our Next.js application with Web Vitals</description>
        <link>https://r3.sergiodxa.com/tutorials/next/web-vitals</link>
        <pubDate>Mon, 11 May 2020 17:49:13 GMT</pubDate>
      </item>
<item>
        <guid>d6930967-c724-4eeb-be60-d4758f45a9d9</guid>
        <title>Use React.Suspense to wait for an image to load</title>
        <description>Learn how to use React.Suspense to handle the loading state of an image.</description>
        <link>https://r3.sergiodxa.com/tutorials/react/suspense-image-loading</link>
        <pubDate>Sat, 09 May 2020 09:13:43 GMT</pubDate>
      </item>
<item>
        <guid>403d43ab-fecc-4d9c-9810-3ff1d0743f6f</guid>
        <title>Purge unused CSS with TailwindCSS</title>
        <description>Learn how to use the built-in purge support of Tailwind to remove unused classes in production.</description>
        <link>https://r3.sergiodxa.com/tutorials/tailwind/purge-unused-css</link>
        <pubDate>Sat, 09 May 2020 09:05:38 GMT</pubDate>
      </item>
<item>
        <guid>7e9c2cdf-12ea-40d1-a158-cb0241a3e0b5</guid>
        <title>Setup a redirect inside a project deployed to Vercel</title>
        <description>Learn how you can create a redirect in any project deployed to the Vercel platform.</description>
        <link>https://r3.sergiodxa.com/tutorials/vercel/setup-redirect</link>
        <pubDate>Sat, 09 May 2020 08:37:03 GMT</pubDate>
      </item>
<item>
        <guid>0888b51e-5653-413a-a43a-abdaf9a6bde2</guid>
        <title>Use a scoped registry with Yarn</title>
        <description>Learn how you can configure Yarn to use a different registry for scoped packages</description>
        <link>https://r3.sergiodxa.com/tutorials/use-scoped-registry</link>
        <pubDate>Sat, 09 May 2020 08:23:30 GMT</pubDate>
      </item>
<item>
        <guid>d56ca00c-f52e-49f7-ae16-9ee2c528f4df</guid>
        <title>Automatically Publish to npm using GitHub Actions</title>
        <description>Create a GitHub Actions workflow to automatically publish new version of a package when creating a new release on GitHub.</description>
        <link>https://r3.sergiodxa.com/tutorials/github-actions-npm-publish</link>
        <pubDate>Tue, 29 Oct 2019 15:49:37 GMT</pubDate>
      </item>
  </channel>
</rss>