diff --git a/assets/javascripts/news.json b/assets/javascripts/news.json
index 38dd4bc4..5b175a75 100644
--- a/assets/javascripts/news.json
+++ b/assets/javascripts/news.json
@@ -1,4 +1,8 @@
[
+ [
+ "2024-02-20",
+ "New documentation: Nextjs"
+ ],
[
"2024-01-24",
"New documentation: Playwright"
diff --git a/lib/docs/filters/nextjs/clean_html.rb b/lib/docs/filters/nextjs/clean_html.rb
new file mode 100644
index 00000000..6197de17
--- /dev/null
+++ b/lib/docs/filters/nextjs/clean_html.rb
@@ -0,0 +1,19 @@
+module Docs
+ class Nextjs
+ class CleanHtmlFilter < Filter
+ def call
+ css('.zola-anchor').remove
+ doc.prepend_child("
NextJS2
") if root_page?
+ css('div:contains("NEWS:")').remove
+ css('h2:contains("sponsors"), #sponsor-table').remove
+ css('div.sticky').remove #remove the floating menu
+ css('div.-mt-4').remove #remove the navigation line
+ css('footer').remove
+ css('div.feedback_inlineTriggerWrapper__o7yUx').remove
+ css('header').remove #remove links from the top of the page
+ css('nav').remove
+ doc
+ end
+ end
+ end
+end
diff --git a/lib/docs/filters/nextjs/entries.rb b/lib/docs/filters/nextjs/entries.rb
new file mode 100644
index 00000000..4e67f00d
--- /dev/null
+++ b/lib/docs/filters/nextjs/entries.rb
@@ -0,0 +1,43 @@
+module Docs
+ class Nextjs
+ class EntriesFilter < Docs::EntriesFilter
+ def get_name
+ name = at_css('h1').content
+ name.strip!
+ #name
+ subpath_items = subpath.split('/', -1)
+ if subpath_items.length >= 5
+ subpath_items[3].capitalize + ': ' + name # e.g. Routing: Defining Routes
+ else
+ name
+ end
+ end
+
+ def get_type
+ if subpath.include?('/architecture')
+ 'Architecture'
+ elsif subpath.include?('/community')
+ 'Community'
+ elsif subpath.include?('/getting-started')
+ 'Getting Started'
+ elsif subpath.include?('/messages')
+ 'Messages'
+ elsif subpath.include?('/app/building-your-application')
+ 'Using App Router: Building your application'
+ elsif subpath.include?('/app/api-reference')
+ 'Using App Router: api-reference'
+ elsif subpath.include?('/app')
+ 'Using App Router'
+ elsif subpath.include?('/pages/building-your-application')
+ 'Using Pages Router: Building your application'
+ elsif subpath.include?('/pages/api-reference')
+ 'Using Pages Router: api-reference'
+ elsif subpath.include?('/pages')
+ 'Using Pages Router'
+ else
+ get_name
+ end
+ end
+ end
+ end
+end
diff --git a/lib/docs/scrapers/nextjs.rb b/lib/docs/scrapers/nextjs.rb
new file mode 100644
index 00000000..a20cf800
--- /dev/null
+++ b/lib/docs/scrapers/nextjs.rb
@@ -0,0 +1,20 @@
+module Docs
+ class Nextjs < UrlScraper
+ self.name = 'NextJS'
+ self.type = 'simple'
+ self.release = 'v14.1.0'
+ self.base_url = 'https://nextjs.org/docs'
+ self.initial_paths = %w(reference/)
+ self.links = {
+ home: 'https://www.nextjs.org/',
+ code: 'https://github.com/vercel/next.js'
+ }
+
+ html_filters.push 'nextjs/entries', 'nextjs/clean_html'
+
+ options[:attribution] = <<-HTML
+ © 2024 Vercel, Inc.
+ Licensed under the MIT License.
+ HTML
+ end
+end
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 00000000..c77b993a
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,6 @@
+{
+ "name": "devdocs",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {}
+}
diff --git a/public/icons/docs/nextjs/16.png b/public/icons/docs/nextjs/16.png
new file mode 100644
index 00000000..41e7ff4d
Binary files /dev/null and b/public/icons/docs/nextjs/16.png differ
diff --git a/public/icons/docs/nextjs/16@2x.png b/public/icons/docs/nextjs/16@2x.png
new file mode 100644
index 00000000..e35d18e2
Binary files /dev/null and b/public/icons/docs/nextjs/16@2x.png differ
diff --git a/public/icons/docs/nextjs/SOURCE b/public/icons/docs/nextjs/SOURCE
new file mode 100644
index 00000000..178b8630
--- /dev/null
+++ b/public/icons/docs/nextjs/SOURCE
@@ -0,0 +1,2 @@
+https://assets.vercel.com/image/upload/v1662130559/nextjs/Icon_dark_background.png
+https://github.com/vercel/next.js/blob/canary/examples/cms-enterspeed/public/favicon/favicon.ico
\ No newline at end of file