Sergio Xalambrí

Tutorials

Learn about Remix, React, and more.

Subscribe to my tutorials using RSS.

  1. Make Regional HTTP Requests with Durable Objects

  2. Add URL Normalization Middleware in React Router

  3. Think in Remix UI Instead of React

  4. Hydrate Isolated UI with Remix Client Entries

  5. Create Animated Tab Indicators with CSS Variables

  6. Create a Copy Button for Code Blocks

  7. Build a Type-Safe Markdown Pipeline with Markdoc

  8. Use waitUntil for Non-Blocking Cache Writes

  9. Build a Cache Abstraction for Cloudflare KV

  10. Use Client Hints for Server-Side Timezone Rendering

  11. Add a Global Hotkey to a Remix UI Dialog

  12. Build a Command-Driven Markdown Toolbar in React

  13. Handle Custom Invoker Commands in React

  14. Build a User Menu in React with Invoker Popover Commands

  15. Prevent a Modal Dialog from Closing with request-close in React

  16. Open a Modal Dialog in React with the Invoker Commands API

  17. Use an `iife` Helper for Inline Control Flow in TypeScript

  18. Cancel `useFetcher().load()` Requests on Unmount in React Router

  19. Access React Router Context with AsyncLocalStorage

  20. Create a Per-Request Database Instance with Middleware

  21. Create a Multi-Directory Route Organization in React Router

  22. Use Sec-Fetch Headers for CSRF Protection

  23. Dedupe Server Calls with Remix Utils Batcher

  24. Transform FormData Between UI and Database in React Router

  25. Build a Nested Master-Detail View with Redirects in React Router

  26. Stream Shared Promise Results in React Router

  27. Redirect Based on Screen Size in React Router

  28. Avoid Waterfalls in React Suspense

  29. Render Loader Promises with Suspense in React Router

  30. Create Reusable Action Routes in React Router

  31. Add a Cookie-Based Color Scheme Toggle in React Router

  32. Debounce Loaders and Actions in React Router

  33. Authenticate OAuth2 Clients with client_id and client_secret

  34. Use the OAuth2 Introspection Endpoint

  35. Revoke OAuth 2.0 Refresh Tokens via the Revocation Endpoint

  36. Protect OAuth 2.0 Authorization Code Flow with PKCE

  37. Add Custom Claims to JWT Access Tokens Safely

  38. Validate JWT Expiration, Issued-At, and Not-Before Claims

  39. Use OAuth 2.0 Scopes to Authorize API Actions

  40. Validate JWTs with JWKS

  41. Create a Per-Request Singleton with React Router Middleware

  42. Test React Router Middleware with Bun Test

  43. Enable and use middleware in React Router 7.3

  44. Show a 404 in React Router

  45. Trigger File Downloads from React Router Loaders and Actions

  46. Use Bullet to Detect N+1 Queries in Rails

  47. Convert Markdown to PDF and ePub with Pandoc

  48. Serve User-Specific Stylesheets in React Router

  49. Split a React Router Route Config across Multiple Files

  50. Configure the tracking branch in Git

  51. Reuse route modules in React Router

  52. Populate Your Rails Database with Fixtures

  53. Stub a method in a class with Minitest

  54. Show toast after a Remix action

  55. Simplify Component Imports with TypeScript Namespaces

  56. Validate a Form in Remix with clientAction

  57. Generate a Cloudflare Environment Type with wrangler

  58. Configure Scoped Private Packages in Bun

  59. Use package.json#bin to create a CLI

  60. Access location.state in Remix Client Loaders and Actions

  61. Add Internationalization with remix-i18next to a Remix Vite App

  62. Autoload the Correct Node.js Version with NVM

  63. Nest Routes with Dynamic Params in Remix

  64. Build Register, Login, and Logout Flows with Remix Sessions

  65. Access React Router's loader data from a route ErrorBoundary

  66. Access React Router's Loaders Data in entry.client

  67. Handle not found URLs with Remix

  68. Persist the User Locale Using Cookies with React Router and i18next

  69. Add dynamic canonical URL to Remix routes

  70. Add custom attributes to Markdoc code fences

  71. Enable Remix ~/ aliased imports in Vitest

  72. Add syntax highlight to Markdoc using Prism.js

  73. Create a CRUD with Remix

  74. Pass Cookies from a React Router Loader to an External API

  75. Call an action from a loader in Remix

  76. Use React Portal in Remix

  77. Prevent the React Router Loader to Run after Document Request

  78. Defer a Fetch response in Remix

  79. Use a CDN for your static assets in Remix

  80. Get the absolute URL in Remix's MetaFunction

  81. Build an app with Remix and Bun

  82. Find and remove unused code with Knip

  83. Create multiple top-level layouts in Remix

  84. Test meta tags using Playwright

  85. Prefetch data for Remix Fetcher usage

  86. Keep Your Loader Data Fresh in Remix

  87. Share Remix Route Logic between Web and API Routes

  88. Access the Search Params of a Request in React Router

  89. Upload Images in a Remix Application

  90. Redirect with Search Param in Remix

  91. Access the Loader Data in Remix

  92. Abort Async Calls Inside Remix Loaders and Actions

  93. Get Remix route params `entry.server`

  94. Test meta tags with Cypress

  95. Strongly type Remix route IDs

  96. Strongly type public assets in Remix

  97. Create a reusable Form component in Remix

  98. Sync text input with URLSearchParam in Remix

  99. Use TanStack Query to Share Data between React Router Loaders

  100. Logout from Auth0 with Remix Auth

  101. Send Node.js ReadStream objects from Remix loaders

  102. Reset a form on success in Remix

  103. Use `qs.parse` to use nested form fields in Remix

  104. Send JSON to a Remix action

  105. Set Multiple Cookies in the Same Response in React Router Loaders

  106. Close SSE connection from the server in Remix

  107. Measure performance with the Server-Timing header in React Router

  108. Automatically commit sessions on Remix

  109. Customize Remix AppLoadContext type

  110. Turn on Caps Lock on Cypress

  111. Delete a Cookie using Remix cookie helpers

  112. Add runtime SSG and ISR to Remix

  113. Improve SEO by not sending JS in Remix

  114. Use AMP with Remix

  115. Use Remix as a SPA only

  116. Downgrade to MPA if Users Prefer Reduced Data in React Router

  117. Add rolling sessions to Remix

  118. Use Server-Sent Events with Remix

  119. Progressively Enhance the useFetcher Hook in React Router

  120. Use `process.env` client-side with Remix

  121. Persist inputs after a form submit in Remix

  122. Lazy-load React components in Remix

  123. Destroy User Session and While Setting a Flash Message in React Router

  124. Add additional data before submitting on Remix

  125. Redirect to an external website with Remix

  126. Bubble up data on Remix routes

  127. Group related routes together in Remix

  128. Parse Markdown with Markdoc in Remix

  129. Optimize image loading with plain HTML

  130. Add returnTo behavior to Remix Auth

  131. Share session and cookies between Next and Remix

  132. Fix double data request when prefetching in Remix

  133. Run Tailwind and Remix in Parallel with PM2

  134. Use Remix with socket.io

  135. Generate a PDF in Remix with Resource Routes

  136. Avoid waterfalls of queries in Remix loaders

  137. Run Next and Remix on the same server

  138. Test Remix loaders and actions

  139. Use NProgress in a Remix app

  140. Use Fathom with Remix

  141. Fix `gyp: No Xcode or CLT version detected!` error

  142. Use Dependabot to keep Remix up-to-date

  143. Load only the data you need in Remix

  144. Use ETags in Remix

  145. Redirect to the original URL inside a Remix action

  146. Read search params with JS

  147. Use ActiveModel::Serializer with non ActiveRecord object

  148. Serialize list of items with ActiveModel::Serializer

  149. Use serializers with JSON.stringify and JSON.parse

  150. Force a locale in Rails I18n from the params

  151. Add missing `created_at` and `updated_at` columns in Rails

  152. Build your own RSS Reader

  153. Keep Heading Levels Consistent with React Context

  154. Use TailwindCSS Typography with Dark Mode Styles

  155. Use SWR with Geolocation

  156. Sync WebApp Session Status between Tabs with SWR

  157. Sync SWR cache with Web Storage

  158. Configure Google Suite MX records in Vercel

  159. Report Web Vitals in Next.js

  160. Use React.Suspense to wait for an image to load

  161. Purge unused CSS with TailwindCSS

  162. Setup a redirect inside a project deployed to Vercel

  163. Use a scoped registry with Yarn

  164. Automatically Publish to npm using GitHub Actions