diff --git a/packages/docs/src/pages/LearnLoadersPage.tsx b/packages/docs/src/pages/LearnLoadersPage.tsx
index 12c6c2c..198ea85 100644
--- a/packages/docs/src/pages/LearnLoadersPage.tsx
+++ b/packages/docs/src/pages/LearnLoadersPage.tsx
@@ -211,6 +211,76 @@ function UserDetail({ data }: { data: Promise
+ When a loader throws an error, the router catches it and re-throws it
+ during rendering of that route’s component. This means the error
+ can be caught by a React{" "}
+
+ Error Boundary
+ {" "}
+ placed above the route in the component tree. For async loaders that
+ return a rejected promise, the error is surfaced when{" "}
+ use(data) is called, which is also caught by Error
+ Boundaries.
+
+ The recommended pattern is to place an error boundary in your{" "}
+ root layout route, wrapping the{" "}
+ {". This catches errors from any loader in
+ the route tree while keeping the root layout (header, navigation,
+ etc.) intact:
+
+ This works for both synchronous and asynchronous loaders. For sync
+ loaders, the router catches the error and re-throws it during route
+ rendering. For async loaders, the rejected promise naturally surfaces
+ through use(). Either way, Error Boundaries catch the
+ error.
+
+ You can also place error boundaries at more granular levels (e.g.,
+ wrapping a specific route’s {" or{" "}
+ {" boundary) for fine-grained error handling.
+