---
title: "Dynamic page without a loading boundary (data/no-loading-boundary)"
description: "A page rendered per request that awaits data, with no loading.tsx or <Suspense> above it, sends nothing until its slowest await resolves: TTFB and FCP wait for the database."
url: http://localhost:4173/rules/data/no-loading-boundary
updated: 2026-11-11
---

# Dynamic page without a loading boundary

> `data/no-loading-boundary` is a vetd rule. It flags: Dynamic page without a loading boundary. It runs on every `check`, together with the TypeScript check.

| Fact | Value |
| --- | --- |
| Rule id | `data/no-loading-boundary` |
| Severity | warning |
| Group | Data fetching |
| Tags | performance, nextjs-16 |

## Why it matters

A page rendered per request that awaits data, with no loading.tsx or <Suspense> above it, sends nothing until its slowest await resolves: TTFB and FCP wait for the database.

## How to fix it

Add loading.tsx to the segment, or move the slow part into an async component wrapped in <Suspense>.

## Credit

Based on work by:

- [Next.js team](https://nextjs.org): loading.js and Suspense let Next.js stream a fallback immediately instead of waiting for the slowest data.
- [React team](https://react.dev): Suspense shows a fallback while children load.

## References

- [loading.js](https://nextjs.org/docs/app/api-reference/file-conventions/loading), Next.js
- [Streaming](https://nextjs.org/docs/app/guides/streaming), Next.js
- [<Suspense>](https://react.dev/reference/react/Suspense), React
- [Time to First Byte (TTFB)](https://web.dev/articles/ttfb), web.dev

## See it

Demos in the vetd Lab:

- [Stream with Suspense](http://localhost:4173/lab/nextjs/stream-with-suspense)
- [Stream, don't spin](http://localhost:4173/lab/rauch/stream-the-shell)
- [Stream behind Suspense](http://localhost:4173/lab/react-perf/stream-with-suspense)

## Related rules

- [`data/force-dynamic-layout`](http://localhost:4173/rules/data/force-dynamic-layout.md)
- [`data/await-in-loop`](http://localhost:4173/rules/data/await-in-loop.md)

## Get this text from vetd

MCP: call `explain` with `{ "diagnosticId": "data/no-loading-boundary" }`. CLI: `npx vetd explain data/no-loading-boundary`.

---

[All 92 rules](http://localhost:4173/rules.md) · Previous: [`data/client-fetch-waterfall`](http://localhost:4173/rules/data/client-fetch-waterfall.md) · Next: [`data/force-dynamic-layout`](http://localhost:4173/rules/data/force-dynamic-layout.md)
