diff --git a/lib/docs/filters/odin/clean_html.rb b/lib/docs/filters/odin/clean_html.rb
new file mode 100644
index 0000000000..92eff0ade2
--- /dev/null
+++ b/lib/docs/filters/odin/clean_html.rb
@@ -0,0 +1,12 @@
+module Docs
+ class Odin
+ class CleanHtmlFilter < Filter
+ def call
+ @doc = at_css('#pkg') || doc
+
+ css('nav').remove
+ doc
+ end
+ end
+ end
+end
diff --git a/lib/docs/filters/odin/entries.rb b/lib/docs/filters/odin/entries.rb
new file mode 100644
index 0000000000..081c182306
--- /dev/null
+++ b/lib/docs/filters/odin/entries.rb
@@ -0,0 +1,24 @@
+module Docs
+ class Odin
+ class EntriesFilter < Docs::EntriesFilter
+ def get_name
+ title = context[:html_title].gsub(/ \| Odin Programming Language/, "")
+ title
+ end
+
+ def get_type
+ if subpath.start_with?('docs')
+ "Documentation"
+ elsif subpath.start_with?('spec')
+ "Specifications"
+ end
+ end
+
+ def additional_entries
+ entries = []
+ entries
+ end
+ end
+ end
+end
+
diff --git a/lib/docs/filters/odin_packages/clean_html.rb b/lib/docs/filters/odin_packages/clean_html.rb
new file mode 100644
index 0000000000..929ab8b339
--- /dev/null
+++ b/lib/docs/filters/odin_packages/clean_html.rb
@@ -0,0 +1,19 @@
+module Docs
+ class OdinPackages
+ class CleanHtmlFilter < Filter
+ def call
+ @doc = at_css('#pkg') || doc
+
+ css('.pkg-breadcrumb').remove
+ css('.a-hidden').remove
+ css('.doc-source').remove
+ css('.odin-search-wrapper').remove
+ css('#pkg-sidebar').remove
+ css('#odin-search-info').remove
+ css('#odin-search-results').remove
+
+ doc
+ end
+ end
+ end
+end
diff --git a/lib/docs/filters/odin_packages/entries.rb b/lib/docs/filters/odin_packages/entries.rb
new file mode 100644
index 0000000000..adc8b7ebb8
--- /dev/null
+++ b/lib/docs/filters/odin_packages/entries.rb
@@ -0,0 +1,40 @@
+module Docs
+ class OdinPackages
+ class EntriesFilter < Docs::EntriesFilter
+ def get_name
+ breadcrumbs = css(".pkg-breadcrumb > ol > li")
+ if breadcrumbs
+ if breadcrumbs[1]
+ breadcrumbs[1].content
+ elsif breadcrumbs[0]
+ breadcrumbs[0].content
+ end
+ end
+ title = context[:html_title].gsub(/- pkg.odin-lang.org/, "")
+ title = title.gsub(/^package /, "")
+ title
+ end
+
+ def get_type
+ breadcrumb_base = css(".pkg-breadcrumb > ol > li")
+ doc_directory = css(".doc-directory")
+ if breadcrumb_base[0]
+ breadcrumb_base[0].content
+ elsif doc_directory
+ title = context[:html_title].gsub(/ library - pkg.odin-lang.org/, "")
+ title
+ elsif context[:html_title].starts_with?('package')
+ 'Packages'
+ else
+ 'Docs'
+ end
+ end
+
+ def additional_entries
+ entries = []
+ entries
+ end
+ end
+ end
+end
+
diff --git a/lib/docs/scrapers/odin.rb b/lib/docs/scrapers/odin.rb
new file mode 100644
index 0000000000..b180b6356e
--- /dev/null
+++ b/lib/docs/scrapers/odin.rb
@@ -0,0 +1,38 @@
+module Docs
+ class Odin < UrlScraper
+ self.name = 'Odin'
+ self.slug = 'odin'
+ self.type = 'odin'
+ self.release = 'latest'
+ self.base_url = 'https://odin-lang.org/'
+ self.root_path = 'https://odin-lang.org/'
+ self.initial_paths = %w(docs spec)
+
+ self.links = {
+ home: 'https://odin-lang.org/',
+ code: 'https://github.com/odin-lang/Odin'
+ }
+
+ html_filters.push 'odin/entries', 'odin/clean_html'
+ options[:download_images] = false
+
+ options[:container] = '.odin-main'
+
+ options[:only_patterns] = [/docs/, /spec/]
+ options[:trailing_slash] = false
+
+ options[:skip] = %w(
+ docs/examples
+ docs/nightly
+ docs/odin-book
+ docs/spec
+ docs/packages
+ )
+
+ options[:attribution] = <<-HTML
+ © 2016-#{Date.today.year} Ginger Bill
+ Licensed under the 3-clause BSD License.
+ HTML
+
+ end
+end
diff --git a/lib/docs/scrapers/odin_packages.rb b/lib/docs/scrapers/odin_packages.rb
new file mode 100644
index 0000000000..3047c5cc55
--- /dev/null
+++ b/lib/docs/scrapers/odin_packages.rb
@@ -0,0 +1,28 @@
+module Docs
+ class OdinPackages < UrlScraper
+ self.name = 'Odin Packages'
+ self.slug = 'odin_packages'
+ self.type = 'odin_packages'
+ self.release = 'latest'
+ self.base_url = 'https://pkg.odin-lang.org/'
+ self.initial_paths = %w(base core vendor)
+
+ options[:trailing_slash] = false
+
+ self.links = {
+ home: 'https://odin-lang.org/',
+ code: 'https://github.com/odin-lang/Odin'
+ }
+
+ html_filters.push 'odin_packages/entries', 'odin_packages/clean_html'
+
+ options[:download_images] = false
+ options[:container] = '.odin-main'
+
+ options[:attribution] = <<-HTML
+ © 2016-#{Date.today.year} Ginger Bill
+ Licensed under the 3-clause BSD License.
+ HTML
+
+ end
+end
diff --git a/public/icons/docs/odin/16.png b/public/icons/docs/odin/16.png
new file mode 100644
index 0000000000..038d7d801b
Binary files /dev/null and b/public/icons/docs/odin/16.png differ
diff --git a/public/icons/docs/odin/16@2x.png b/public/icons/docs/odin/16@2x.png
new file mode 100644
index 0000000000..d4a3e83320
Binary files /dev/null and b/public/icons/docs/odin/16@2x.png differ
diff --git a/public/icons/docs/odin/SOURCE b/public/icons/docs/odin/SOURCE
new file mode 100644
index 0000000000..167c103d26
--- /dev/null
+++ b/public/icons/docs/odin/SOURCE
@@ -0,0 +1 @@
+https://github.com/odin-lang/odin-lang.org/blob/master/static/favicon.svg
\ No newline at end of file
diff --git a/public/icons/docs/odin_packages/16.png b/public/icons/docs/odin_packages/16.png
new file mode 100644
index 0000000000..038d7d801b
Binary files /dev/null and b/public/icons/docs/odin_packages/16.png differ
diff --git a/public/icons/docs/odin_packages/16@2x.png b/public/icons/docs/odin_packages/16@2x.png
new file mode 100644
index 0000000000..d4a3e83320
Binary files /dev/null and b/public/icons/docs/odin_packages/16@2x.png differ
diff --git a/public/icons/docs/odin_packages/SOURCE b/public/icons/docs/odin_packages/SOURCE
new file mode 100644
index 0000000000..167c103d26
--- /dev/null
+++ b/public/icons/docs/odin_packages/SOURCE
@@ -0,0 +1 @@
+https://github.com/odin-lang/odin-lang.org/blob/master/static/favicon.svg
\ No newline at end of file