diff --git a/.eslintrc.json b/.eslintrc.json
index 09716b3c4107..2a93dc678591 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -22,16 +22,6 @@
     "import/internal-regex": "^next/"
   },
   "overrides": [
-    {
-      "files": ["packages/**"],
-      "rules": {
-        "no-shadow": ["warn", { "builtinGlobals": false }],
-        "import/no-extraneous-dependencies": [
-          "error",
-          { "devDependencies": false }
-        ]
-      }
-    },
     {
       "files": ["test/**/*.test.js"],
       "extends": ["plugin:jest/recommended"],
@@ -121,6 +111,29 @@
           }
         ]
       }
+    },
+    {
+      "files": ["packages/**"],
+      "rules": {
+        "no-shadow": ["warn", { "builtinGlobals": false }],
+        "import/no-extraneous-dependencies": [
+          "error",
+          { "devDependencies": false }
+        ]
+      }
+    },
+    {
+      "files": ["packages/**/*.tsx", "packages/**/*.ts"],
+      "rules": {
+        "@typescript-eslint/no-unused-vars": [
+          "warn",
+          {
+            "args": "all",
+            "argsIgnorePattern": "^_",
+            "ignoreRestSiblings": true
+          }
+        ]
+      }
     }
   ],
   "rules": {
diff --git a/packages/next/build/babel/plugins/jsx-pragma.ts b/packages/next/build/babel/plugins/jsx-pragma.ts
index a8b111fb08e2..cd09b76c1751 100644
--- a/packages/next/build/babel/plugins/jsx-pragma.ts
+++ b/packages/next/build/babel/plugins/jsx-pragma.ts
@@ -8,13 +8,13 @@ export default function ({
   return {
     inherits: require('babel-plugin-syntax-jsx'),
     visitor: {
-      JSXElement(path, state) {
+      JSXElement(_path, state) {
         state.set('jsx', true)
       },
 
       // Fragment syntax is still JSX since it compiles to createElement(),
       // but JSXFragment is not a JSXElement
-      JSXFragment(path, state) {
+      JSXFragment(_path, state) {
         state.set('jsx', true)
       },
 
diff --git a/packages/next/build/entries.ts b/packages/next/build/entries.ts
index 5945d56a2bf6..05333b3d5637 100644
--- a/packages/next/build/entries.ts
+++ b/packages/next/build/entries.ts
@@ -62,7 +62,6 @@ type Entrypoints = {
 }
 
 export function createEntrypoints(
-  dev: boolean,
   pages: PagesMapping,
   target: 'server' | 'serverless' | 'experimental-serverless-trace',
   buildId: string,
diff --git a/packages/next/build/index.ts b/packages/next/build/index.ts
index 26bda734892f..8f9c5fc30d83 100644
--- a/packages/next/build/index.ts
+++ b/packages/next/build/index.ts
@@ -213,7 +213,6 @@ export default async function build(dir: string, conf = null): Promise<void> {
 
   const mappedPages = createPagesMapping(pagePaths, config.pageExtensions)
   const entrypoints = createEntrypoints(
-    /* dev */ false,
     mappedPages,
     target,
     buildId,
diff --git a/packages/next/build/webpack/loaders/next-data-loader.ts b/packages/next/build/webpack/loaders/next-data-loader.ts
index c17f1d778b05..db1ef36351f2 100644
--- a/packages/next/build/webpack/loaders/next-data-loader.ts
+++ b/packages/next/build/webpack/loaders/next-data-loader.ts
@@ -1,7 +1,7 @@
 import { loader } from 'webpack'
 import hash from 'next/dist/compiled/string-hash'
 import { basename } from 'path'
-const nextDataLoader: loader.Loader = function (source) {
+const nextDataLoader: loader.Loader = function () {
   const filename = this.resourcePath
   return `
   import {createHook} from 'next/data'
diff --git a/packages/next/build/webpack/loaders/next-plugin-loader.ts b/packages/next/build/webpack/loaders/next-plugin-loader.ts
index 9d9e8ef18894..185eb38230d0 100644
--- a/packages/next/build/webpack/loaders/next-plugin-loader.ts
+++ b/packages/next/build/webpack/loaders/next-plugin-loader.ts
@@ -12,7 +12,7 @@ export const pluginLoaderOptions: {
   plugins: [],
 }
 
-const nextPluginLoader: loader.Loader = function (source) {
+const nextPluginLoader: loader.Loader = function () {
   const { middleware }: NextPluginLoaderQuery =
     typeof this.query === 'string' ? parse(this.query.substr(1)) : this.query
 
diff --git a/packages/next/build/webpack/plugins/next-esm-plugin.ts b/packages/next/build/webpack/plugins/next-esm-plugin.ts
index 104b57dcef5c..00254666a3a3 100644
--- a/packages/next/build/webpack/plugins/next-esm-plugin.ts
+++ b/packages/next/build/webpack/plugins/next-esm-plugin.ts
@@ -368,7 +368,7 @@ export default class NextEsmPlugin implements Plugin {
           setTimeout(() => {
             this.updateOptions(childCompiler)
 
-            childCompiler.runAsChild((err, entries, childCompilation) => {
+            childCompiler.runAsChild((err, _entries, childCompilation) => {
               if (err) {
                 return reject(err)
               }
diff --git a/packages/next/build/webpack/plugins/profiling-plugin.ts b/packages/next/build/webpack/plugins/profiling-plugin.ts
index b01bb48b59ea..80bd99feed25 100644
--- a/packages/next/build/webpack/plugins/profiling-plugin.ts
+++ b/packages/next/build/webpack/plugins/profiling-plugin.ts
@@ -137,13 +137,15 @@ const interceptAllParserHooks = (moduleFactory: any, tracer: any) => {
   moduleTypes.forEach((moduleType) => {
     moduleFactory.hooks.parser
       .for(moduleType)
-      .tap('ProfilingPlugin', (parser: any, parserOpts: any) => {
+      .tap('ProfilingPlugin', (parser: any) => {
         interceptAllHooksFor(parser, tracer, 'Parser')
       })
   })
 }
 
-const makeInterceptorFor = (instance: any, tracer: any) => (hookName: any) => ({
+const makeInterceptorFor = (_instance: any, tracer: any) => (
+  hookName: any
+) => ({
   register: ({ name, type, context, fn }: any) => {
     const newFn = makeNewProfiledTapFn(hookName, tracer, {
       name,
@@ -172,7 +174,7 @@ const makeInterceptorFor = (instance: any, tracer: any) => (hookName: any) => ({
  * @returns {PluginFunction} Chainable hooked function.
  */
 const makeNewProfiledTapFn = (
-  hookName: any,
+  _hookName: any,
   tracer: any,
   { name, type, fn }: any
 ) => {
diff --git a/packages/next/build/webpack/plugins/webpack-conformance-plugin/checks/duplicate-polyfills-conformance-check.ts b/packages/next/build/webpack/plugins/webpack-conformance-plugin/checks/duplicate-polyfills-conformance-check.ts
index 70ddad247bec..9e900f8909ed 100644
--- a/packages/next/build/webpack/plugins/webpack-conformance-plugin/checks/duplicate-polyfills-conformance-check.ts
+++ b/packages/next/build/webpack/plugins/webpack-conformance-plugin/checks/duplicate-polyfills-conformance-check.ts
@@ -154,7 +154,7 @@ export class DuplicatePolyfillsConformanceCheck
       },
       {
         visitor: 'visitCallExpression',
-        inspectNode: (path: NodePath, { request }: IParsedModuleDetails) => {
+        inspectNode: (path: NodePath) => {
           const { node }: { node: types.namedTypes.CallExpression } = path
           if (!node.arguments || node.arguments.length < 2) {
             return EARLY_EXIT_SUCCESS_RESULT
diff --git a/packages/next/build/webpack/plugins/webpack-conformance-plugin/index.ts b/packages/next/build/webpack/plugins/webpack-conformance-plugin/index.ts
index 670ac4ccf951..696d8affde96 100644
--- a/packages/next/build/webpack/plugins/webpack-conformance-plugin/index.ts
+++ b/packages/next/build/webpack/plugins/webpack-conformance-plugin/index.ts
@@ -49,7 +49,7 @@ export default class WebpackConformancePlugin {
   }
 
   private buildStartedHandler = (
-    compilation: CompilationType.Compilation,
+    _compilation: CompilationType.Compilation,
     callback: () => void
   ) => {
     const buildStartedResults: IConformanceTestResult[] = this.tests.map(
diff --git a/packages/next/client/dev/on-demand-entries-client.js b/packages/next/client/dev/on-demand-entries-client.js
index 3f11f6c87d97..4176b9ec921a 100644
--- a/packages/next/client/dev/on-demand-entries-client.js
+++ b/packages/next/client/dev/on-demand-entries-client.js
@@ -13,7 +13,7 @@ export default async ({ assetPrefix }) => {
 
   // prevent HMR connection from being closed when running tests
   if (!process.env.__NEXT_TEST_MODE) {
-    document.addEventListener('visibilitychange', (event) => {
+    document.addEventListener('visibilitychange', (_event) => {
       const state = document.visibilityState
       if (state === 'visible') {
         setupPing(assetPrefix, () => Router.pathname, true)
diff --git a/packages/next/client/next-dev.js b/packages/next/client/next-dev.js
index 0f94523fa6dd..ba2d19e35f31 100644
--- a/packages/next/client/next-dev.js
+++ b/packages/next/client/next-dev.js
@@ -28,7 +28,7 @@ const webpackHMR = initWebpackHMR({ assetPrefix: prefix })
 
 window.next = next
 initNext({ webpackHMR })
-  .then(({ emitter, renderCtx, render }) => {
+  .then(({ renderCtx, render }) => {
     initOnDemandEntries({ assetPrefix: prefix })
     if (process.env.__NEXT_BUILD_INDICATOR) initializeBuildWatcher()
     if (
diff --git a/packages/next/next-server/lib/loadable.js b/packages/next/next-server/lib/loadable.js
index a3c4f18fc085..a81d792610ed 100644
--- a/packages/next/next-server/lib/loadable.js
+++ b/packages/next/next-server/lib/loadable.js
@@ -252,8 +252,7 @@ class LoadableSubscription {
         this._update({})
         this._clearTimeouts()
       })
-      // eslint-disable-next-line handle-callback-err
-      .catch((err) => {
+      .catch((_err) => {
         this._update({})
         this._clearTimeouts()
       })
diff --git a/packages/next/next-server/server/next-server.ts b/packages/next/next-server/server/next-server.ts
index efa818bf55fc..1a347704cde1 100644
--- a/packages/next/next-server/server/next-server.ts
+++ b/packages/next/next-server/server/next-server.ts
@@ -475,7 +475,7 @@ export default class Server {
           type,
           match: getCustomRouteMatcher(r.source),
           name: type,
-          fn: async (req, res, params, parsedUrl) => ({ finished: false }),
+          fn: async (_req, _res, _params, _parsedUrl) => ({ finished: false }),
         } as Route & Rewrite & Header)
 
       const updateHeaderValue = (value: string, params: Params): string => {
@@ -672,7 +672,7 @@ export default class Server {
   }
 
   // Used to build API page in development
-  protected async ensureApiPage(pathname: string): Promise<void> {}
+  protected async ensureApiPage(_pathname: string): Promise<void> {}
 
   /**
    * Resolves `API` request, in development builds on demand
diff --git a/packages/next/server/hot-reloader.ts b/packages/next/server/hot-reloader.ts
index cee48e939e6e..3f41d5355df7 100644
--- a/packages/next/server/hot-reloader.ts
+++ b/packages/next/server/hot-reloader.ts
@@ -265,7 +265,6 @@ export default class HotReloader {
       this.config.pageExtensions
     )
     const entrypoints = createEntrypoints(
-      /* dev */ true,
       pages,
       'server',
       this.buildId,
diff --git a/packages/next/server/next-dev-server.ts b/packages/next/server/next-dev-server.ts
index 7bf2bda55d12..d6cba6ce9b88 100644
--- a/packages/next/server/next-dev-server.ts
+++ b/packages/next/server/next-dev-server.ts
@@ -135,7 +135,7 @@ export default class DevServer extends Server {
           match: route(path),
           type: 'route',
           name: `${path} exportpathmap route`,
-          fn: async (req, res, params, parsedUrl) => {
+          fn: async (req, res, _params, parsedUrl) => {
             const { query: urlQuery } = parsedUrl
 
             Object.keys(urlQuery)
diff --git a/packages/next/taskfile.js b/packages/next/taskfile.js
index 89f5579c0af0..1d2310541f0f 100644
--- a/packages/next/taskfile.js
+++ b/packages/next/taskfile.js
@@ -681,7 +681,7 @@ export async function pages_document(task) {
   await task.source('pages/_document.tsx').babel('server').target('dist/pages')
 }
 
-export async function pages(task, opts) {
+export async function pages(task, _opts) {
   await task.parallel(['pages_app', 'pages_error', 'pages_document'])
 }
 
diff --git a/packages/react-dev-overlay/src/internal/ReactDevOverlay.tsx b/packages/react-dev-overlay/src/internal/ReactDevOverlay.tsx
index 8eeceeb07b59..baf04aed7a40 100644
--- a/packages/react-dev-overlay/src/internal/ReactDevOverlay.tsx
+++ b/packages/react-dev-overlay/src/internal/ReactDevOverlay.tsx
@@ -54,7 +54,7 @@ function ReactDevOverlay({ children }) {
   }, [dispatch])
 
   const onComponentError = React.useCallback(
-    (error: Error, componentStack: string | null) => {
+    (_error: Error, _componentStack: string | null) => {
       // TODO: special handling
     },
     []
diff --git a/packages/react-refresh-utils/ReactRefreshWebpackPlugin.ts b/packages/react-refresh-utils/ReactRefreshWebpackPlugin.ts
index 8c208a90da34..8bcd53a8507c 100644
--- a/packages/react-refresh-utils/ReactRefreshWebpackPlugin.ts
+++ b/packages/react-refresh-utils/ReactRefreshWebpackPlugin.ts
@@ -11,7 +11,7 @@ function webpack4(compiler: Compiler) {
     const hookRequire: typeof compilation['mainTemplate']['hooks']['requireExtensions'] = (compilation
       .mainTemplate.hooks as any).require
 
-    hookRequire.tap('ReactFreshWebpackPlugin', (source, chunk, hash) => {
+    hookRequire.tap('ReactFreshWebpackPlugin', (source, _chunk, _hash) => {
       // Webpack 4 evaluates module code on the following line:
       // ```
       // modules[moduleId].call(module.exports, module, module.exports, hotCreateRequire(moduleId));
