
Product
Socket for Jira Is Now Available
Socket for Jira lets teams turn alerts into Jira tickets with manual creation, automated ticketing rules, and two-way sync.
next-nprogress-bar
Advanced tools
NProgress integration on Next.js compatible with /app and /pages folders
Next NProgress Bar and NProgress V2 become BProgress!
The next-nprogress-bar and nprogress-v2 packages remain available and usable in their current versions, but will no longer be maintained. We therefore advise you to migrate to @bprogress/next.
Go to the migration documentation
npm install next-nprogress-bar
or
yarn add next-nprogress-bar
Import it into your /pages/_app(.js/.jsx/.ts/.tsx) or /app/layout(.js/.jsx/.ts/.tsx) folder
// In app directory
import { AppProgressBar as ProgressBar } from 'next-nprogress-bar';
// In pages directory
import { PagesProgressBar as ProgressBar } from 'next-nprogress-bar';
<ProgressBar />
import { PagesProgressBar as ProgressBar } from 'next-nprogress-bar';
export default function App({ Component, pageProps }) {
return (
<>
<Component {...pageProps} />
<ProgressBar
height="4px"
color="#fffd00"
options={{ showSpinner: false }}
shallowRouting
/>
</>
);
}
import type { AppProps } from 'next/app';
import { PagesProgressBar as ProgressBar } from 'next-nprogress-bar';
export default function App({ Component, pageProps }: AppProps) {
return (
<>
<Component {...pageProps} />
<ProgressBar
height="4px"
color="#fffd00"
options={{ showSpinner: false }}
shallowRouting
/>
</>
);
}
// In /app/layout.jsx
'use client';
import { AppProgressBar as ProgressBar } from 'next-nprogress-bar';
export default function RootLayout({ children }) {
return (
<html lang="en">
<body>
{children}
<ProgressBar
height="4px"
color="#fffd00"
options={{ showSpinner: false }}
shallowRouting
/>
</body>
</html>
);
}
// Create a Providers component to wrap your application with all the components requiring 'use client', such as next-nprogress-bar or your different contexts...
'use client';
import { AppProgressBar as ProgressBar } from 'next-nprogress-bar';
const Providers = ({ children }) => {
return (
<>
{children}
<ProgressBar
height="4px"
color="#fffd00"
options={{ showSpinner: false }}
shallowRouting
/>
</>
);
};
export default Providers;
// Import and use it in /app/layout.jsx
import Providers from './providers';
export const metadata = {
title: 'Create Next App',
description: 'Generated by create next app',
};
export default function RootLayout({ children }) {
return (
<html lang="en">
<body>
<Providers>{children}</Providers>
</body>
</html>
);
}
// In /app/layout.tsx
'use client';
import { AppProgressBar as ProgressBar } from 'next-nprogress-bar';
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en">
<body>
{children}
<ProgressBar
height="4px"
color="#fffd00"
options={{ showSpinner: false }}
shallowRouting
/>
</body>
</html>
);
}
// Create a Providers component to wrap your application with all the components requiring 'use client', such as next-nprogress-bar or your different contexts...
'use client';
import { AppProgressBar as ProgressBar } from 'next-nprogress-bar';
const Providers = ({ children }: { children: React.ReactNode }) => {
return (
<>
{children}
<ProgressBar
height="4px"
color="#fffd00"
options={{ showSpinner: false }}
shallowRouting
/>
</>
);
};
export default Providers;
// Import and use it in /app/layout.tsx
import Providers from './providers';
export const metadata = {
title: 'Create Next App',
description: 'Generated by create next app',
};
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en">
<body>
<Providers>{children}</Providers>
</body>
</html>
);
}
You can disable the progress bar on specific links by adding the data-disable-nprogress={true} attribute.
/!\ This will not work for Link in svg elements.
<Link href="#features" data-disable-nprogress={true}>
Features
</Link>
You can prevent the progress bar from starting by adding the data-prevent-nprogress={true} attribute.
<Link href="/dashboard">
<span>Dashboard</span>
<span onClick={(e) => e.preventDefault()} data-prevent-nprogress={true}>
preventDefault
</span>
</Link>
Height of the progress bar - by default 2px
Color of the progress bar - by default #0A2FFF
by default undefined
Position of the spinner (if showSpinner is true) - by default top-right
Do not display the progress bar when the query parameters change but the route remains the same - by default false
See Next.js docs
The position the progress bar starts at from 0 to 1 - by default 0
When the page loads faster than the progress bar, it does not display - by default 0
Disable the progress bar when the target URL is the same as the current URL - by default true
The delay in milliseconds before the progress bar stops - by default 0
A cryptographic nonce (number used once) used to declare inline scripts for Content Security Policy - by default undefined
A cryptographic nonce (number used once) used to declare inline scripts for Content Security Policy - by default true
Your custom CSS - by default NProgress CSS
Disable the default CSS - by default false If you need to disable the default CSS, you will need to add your own CSS to see the progress bar. You can use NProgress CSS as a base.
Activates a detailed comparison of component props to determine if a rerender is necessary.
When true, the component will only rerender if there are changes in key props such as color, height, shallowRouting, delay, options, and style.
This is useful for optimizing performance in scenarios where these props change infrequently. If not provided or set to false, the component will assume props have not changed and will not rerender, which can enhance performance in scenarios where the props remain static. - by default undefined
Provides a custom function to preprocess the target URL before comparing it with the current URL.
This is particularly useful in scenarios where URLs undergo transformations, such as localization or path modifications, after navigation.
The function takes a URL object as input and should return a modified URL object.
If this prop is provided, the preprocessed URL will be used for comparisons, ensuring accurate determination of whether the navigation target is equivalent to the current URL.
This can prevent unnecessary display of the progress bar when the target URL is effectively the same as the current URL after preprocessing. - by default undefined
Start the progress bar on load - by default false
import { useRouter } from 'next-nprogress-bar';
router.push(url: string, options?: NavigateOptions, NProgressOptions?: RouterNProgressOptions)
router.replace(url: string, options?: NavigateOptions, NProgressOptions?: RouterNProgressOptions)
router.back(NProgressOptions?: RouterNProgressOptions)
router.refresh(NProgressOptions?: RouterNProgressOptions)
NavigateOptions is the options of the next router.
interface RouterNProgressOptions {
showProgressBar?: boolean;
startPosition?: number;
disableSameURL?: boolean;
}
Replace your 'next/navigation' routers with this one. It's the same router, but this one supports NProgress.
const router = useRouter();
// With progress bar
router.push('/about');
router.replace('/?counter=10');
router.back();
router.refresh();
It also has an optional parameter (customRouter) that allows you to use this router with another custom router (for example, it could be the one from next-intl):
import { useRouter as useAnotherCustomRouter } from 'sample-package';
const router = useRouter(useAnotherCustomRouter);
// With progress bar
router.push('/about');
router.replace('/?counter=10');
router.back();
router.refresh();
// before (v1)
import ProgressBar from 'next-nprogress-bar';
<ProgressBar
height="4px"
color="#fffd00"
options={{ showSpinner: false }}
shallowRouting
/>;
// after (v2)
import { PagesProgressBar as ProgressBar } from 'next-nprogress-bar';
<ProgressBar
height="4px"
color="#fffd00"
options={{ showSpinner: false }}
shallowRouting
/>;
// before (v1)
import ProgressBar from 'next-nprogress-bar';
<ProgressBar
height="4px"
color="#fffd00"
options={{ showSpinner: false }}
appDirectory
shallowRouting
/>;
// after (v2)
import { AppProgressBar as ProgressBar } from 'next-nprogress-bar';
<ProgressBar
height="4px"
color="#fffd00"
options={{ showSpinner: false }}
shallowRouting
/>;
I am no longer upgrading this package. If you encounter any problems, do not hesitate to make a PR here.
MIT
FAQs
NextJS progress bar compatible with new app directory
The npm package next-nprogress-bar receives a total of 68,018 weekly downloads. As such, next-nprogress-bar popularity was classified as popular.
We found that next-nprogress-bar demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Product
Socket for Jira lets teams turn alerts into Jira tickets with manual creation, automated ticketing rules, and two-way sync.

Company News
Socket won two 2026 Reppy Awards from RepVue, ranking in the top 5% of all sales orgs. AE Alexandra Lister shares what it's like to grow a sales career here.

Security News
NIST will stop enriching most CVEs under a new risk-based model, narrowing the NVD's scope as vulnerability submissions continue to surge.