+
+
+
+
+
+
+
+
+ JavaScript linters fight to the death.
+ Isolated Vectors by Vecteezy.
+ Linter logos by their respective authors.
+
+
+
+
+ When people hear about quick-lint-js, they ask me one of two questions:
+
+
+
What makes quick-lint-js so fast?
+
+ Why did you make another JavaScript linter? Why not use ESLint?
+
+
+
+
+ JavaScript linters find mistakes in your code, including real bugs,
+ outdated code patterns, and style issues. ESLint is the de-facto
+ standard JavaScript linter. It is highly customizable and readily
+ available. What's not to like about ESLint?
+
+ ESLint is command-line first, CI second, and editor last.
+ ESLint focuses on checking your code after you write it, not while
+ you write it. Programmers typically run ESLint as a batch job
+ pre-commit.
+
+
+
+ I want a JavaScript code assistant; I want to catch issues while I'm
+ typing. I miss the days when Visual Studio had my back when I hacked
+ away in C#:
+
+
+
+
+ Visual Studio showing bugs in my WinForms C# code
+
+
+
+
+ While you can run ESLint in your editor, the experience
+ isn't great. I teach JavaScript a lot, so I often make small
+ programs showcasing different JavaScript, Node.js, or browser
+ features. ESLint only really works inside projects, so it
+ fights you when you're writing one-off scripts.
+
+
+
+ I use Vim. ESLint's Vim plugins are weak. The ALE plugin, for
+ example, starts a new Node.js process each time linting occurs.
+ ESLint takes over 150 milliseconds to just start up (on my
+ Zen 3 5950X CPU!); ESLint can't even keep up with typing at 80 WPM!
+ But let's talk about speed later.
+
+
+
+ When typing, you often introduce syntax errors. You type
+ ( but don't write the closing ). ESLint
+ breaks. ESLint should at least give a helpful error message, but it
+ just tells me "unexpected token }":
+
+
+
+
+
+
+
+ ESLint unhelpfully tells me that the bug is because of the
+ }
+
+
+
+
+ Because ESLint's syntax error messages are low quality, you should
+ only use ESLint after you've tested your code. But at that point,
+ ESLint is useless to me: it only is for telling me that
+ row_index is an evil variable name, not that I have
+ serious bugs.
+
+
+
+ I want a tool I can recommend to beginners. Unfortunately, the
+ ESLint Visual Studio Code extension does not bundle ESLint, so it
+ does not work out of the box. The extension doesn't tell you what's
+ wrong if you're missing ESLint or a config file; it silently doesn't
+ work. ESLint in VS Code is bad for beginners.
+
+
+
+ I want a linter which works well in my editor.
+ Editor support should be a first-class feature.
+
+
+
+
+
ESLint is plugin & config hell
+
+
+ Want to use ESLint to lint some JavaScript code? Great! Just run
+ ESLint:
+
+
+
+
+ ESLint fails but suggests that you run
+ eslint --init to configure
+
+
+
+
+ Nope. ESLint requires you to create a configuration file, even if
+ you want a default well-established configuration. As I mentioned
+ earlier, this makes it annoying to use ESLint for one-off scripts I
+ make while teaching.
+
+
+
+ Want to use ESLint with a Node.js project? Great! ESLint works out
+ of the box. Not! You need to convince ESLint that you're in
+ a Node.js project. By default, ESLint complains:
+
+
+
+ ESLint being confused by modern JavaScript
+
+
+
+ Want to use ESLint for ES modules? Great! But it doesn't work out of
+ the box; you gotta configure it:
+
+
+
+
+ ESLint desperately trying to get your attention
+
+
+
+
+ Want to use ESLint for JavaScript code from 2015, using advanced
+ features like arrow functions and async functions? Great! But it
+ doesn't work out of the box; you must configure the parser's
+ ecmaVersion.
+
+
+
+ Want to use ESLint with a JSX/React project? Great! There's a plugin
+ for that. But you can't just install the React plugin; you also need
+ to configure ESLint's parser, and you should probably specify the
+ React version too. To make matters worse, the specifics for doing
+ these things have changed over the years, so old StackOverflow
+ answers don't work anymore.
+
+
+
+
+
+ Old JSX ESLint configurations don't work with ESLint 8
+
+
+
+
+ Want to use ESLint with a TypeScript project? Great! There's a
+ plugin for that. But just like how installing the JSX plugin wasn't
+ enough, installing the TypeScript plugin isn't enough. You need to
+ replace the ESLint parser (which might mean you need to change your
+ parserOptions), and you also want to enable some TypeScript rules.
+ Lots of configuration.
+
+
+
+ Want to use ESLint for bug-finding only and leave formatting to
+ Prettier? Great! There's a plugin for that. But why do you need a
+ plugin? Shouldn't I be able to just turn off ESLint's formatting
+ rules? Well, now
+ most ESLint formatting rules are gone
+ (deprecated as of ESLint v8.53.0), but a few (such as no-extra-semi
+ and no-irregular-whitespace) remain enabled by default.
+
+
+
+ Configuring ESLint only needs to be done when you make major changes
+ to the project, or when you're just starting the project. There is
+ even an init tool to create an ESLint config for you. ESLint doesn't
+ make setup easy enough for me to recommend it to beginners,
+ and it's not easy enough for me to use for all my projects.
+
+
+
+ I want my batteries included. No required config
+ file for the basics. No plugins for the basics.
+ Easy to beginners, please.
+
+
+
+
+
ESLint is slow
+
+
+ Anyone who has used ESLint in a big project knows that ESLint's
+ performance sucks. But I work on smaller projects, so performance
+ shouldn't be too bad, right?
+
+
+
+ On one 15k SLOC project, ESLint takes around 950 milliseconds
+ (16,000 lines per second). The --cache option helps,
+ bringing linting down to around 400 milliseconds if I change one
+ file. But even with lots of caching, that's only 38,000 lines per
+ second! C++ linters run at over 100,000 lines per second without
+ caching, and C++ is notoriously uglier to deal with than JavaScript.
+ And in bigger C++ projects, parallelization kicks in to improve
+ throughput more.
+
+
+
+ Why does linting speed matter to me? Half a second isn't that bad.
+ But as I mentioned in the ESLint is editor-last section, I
+ need ESLint to keep up with my typing. ESLint being slow is
+ disorienting:
+
+
+
+
+
+
+
+ ESLint squigglies cannot keep up with slow typing (Vim ALE
+ ESLint plugin shown)
+
+
+
+
+ ESLint is distracting. "But strager, why are you linting while
+ typing? Just add debouncing so it doesn't flicker as much." No!
+ Unacceptable. The debouncing is less distracting, but it's still
+ distracting! In contrast, a fast linter like quick-lint-js is
+ not distracting to me:
+
+
+
+
+
+
+
+ quick-lint-js squigglies keep up with fast typing
+
+
+
+
+ ESLint performance has been improving.
+ eslint_d and
+ the ESLint LSP server (hidden inside the Visual Studio Code extension) help with the latency. ESLint's core has gotten faster; I had to
+ adjust my "over 130× faster than ESLint" messaging to just "over 90×
+ faster". And Node.js, V8, and computer hardware are getting faster
+ too.
+
+
+
+ Despite these improvements,
+ I want a 100× faster ESLint.
+
+
+
+
+
+
New JavaScript linters
+
+
+ I don't like ESLint. What other options are there, and how do they
+ address the problems with ESLint? Let's look at four ESLint
+ alternatives:
+
+ Deno Lint
+ is a part of the Deno project. Created in March 2020, it features
+ better performance than ESLint and integration with the rest of
+ Deno.
+
+
+
+
+ The mascot is one of the best parts of Deno
+
+
+
+ Compatibility: Because Deno Lint is designed for Deno
+ projects, it does not work well for non-Deno projects. For example,
+ Deno Lint recognizes JSX syntax, but only in
+ .jsx files. But most React-based projects use
+ .js files, so Deno Lint explodes on JSX. Deno Lint
+ probably won't ever support frameworks such as Vue and Svelte
+ either.
+
+
+
+ Editor integration: Deno has an LSP server that can run the
+ linter. Editor support is not prominently advertised, but it does
+ seem to be well-supported (including in Vim). There are caveats,
+ though. The Visual Studio Code extension does not bundle Deno and
+ disables itself by default outside of Deno projects, making it
+ harder to use for beginners.
+
+
+
+ Plugin & configs: Deno Lint works out of the box with no
+ configuration. No plugins are necessary for JSX and TypeScript.
+ Nice!
+
+
+
+ Speed: Deno Lint's command-line interface is decently fast.
+ Sadly, the LSP server is slow. The slowness is caused by intentional
+ debouncing. I could fork Deno and patch it out, of course.
+
+
+
+
+
Biome
+
+
+ Biome is a linter and formatter
+ for JavaScript and other languages. Biome's history is a bit weird:
+ Rome was created in February 2020. It was rewritten from scratch in
+ September 2021 based on
+ RSLint
+ (which was created in September 2020). The Rome dev team forked Rome
+ and called it Biome in August 2023.
+
+
+
+ Compatibility: Biome is designed to meet developers where
+ they are. As such, it supports JavaScript, JSX, and TypeScript
+ today, and will support Vue and Svelte in the future.
+
+
+
+ Editor integration: Biome has an LSP server that works in Vim
+ with coc.nvim. In my experience, the LSP server is a bit flaky
+ because it talks to a separate Biome daemon. Biome's Visual Studio
+ Code extension requires Biome to be installed separately, making it
+ harder to use for beginners.
+
+
+
+ Plugin & configs: Biome does not suffer from plugin hell
+ for basic features. Biome also works out of the box without configs.
+ However, Biome is opinionated by default; it disallows code such as
+ this.icons["zoomIn"] and sometimes
+ requires blocks inside
+ switch statements. Therefore, I need
+ to configure Biome to shut it up.
+
+
+
+ Speed: Biome started fast when it was a light fork of RSLint.
+ As new lint rules have been added over time,
+ Biome's linting performance has 50× gotten worse. In my testing, Biome's LSP server is slower than ESLint's! I'm
+ sure some of this can be fixed, but it looks like linting
+ performance is not a key feature of Biome.
+
+
+
+
+
+ quick-lint-js
+
+
+
+ quick-lint-js is my own JavaScript linter. I
+ started writing it in March 2020 after being annoyed by ESLint's
+ poor editor integration and
+ Flow being too picky.
+
+
+
+ Compatibility: Like Biome, quick-lint-js is designed to meet
+ developers where they are. It supports JavaScript and JSX today,
+ with experimental support for TypeScript. Vue and Svelte support
+ will come eventually.
+
+
+
+ Editor integration: quick-lint-js was designed to work with
+ editors from the beginning. It has first-party support for various
+ editors, including different Vim and Emacs plugins. The Visual
+ Studio Code extension comes with the linter bundled, simplifying
+ installation.
+
+
+
+ Plugin & configs: quick-lint-js is like Biome and Deno
+ Lint: Your code is correctly linted out of the box. quick-lint-js
+ focuses on correctness issues and avoids stylistic nitpicks, making
+ it usable in any project without configuration. However,
+ quick-lint-js's lack of configuration means that it cannot enforce
+ style rules in a team.
+
+
+
+ Speed: As its name implies, quick-lint-js is fast. Low
+ latency is a goal because quick-lint-js lints as you type and does
+ not want to be distracting. The other linters we've discussed
+ struggle to hit 30 FPS, and quick-lint-js easily passes 1000 FPS.
+ quick-lint-js isn't perfect, though; it currently cannot lint
+ directories and does not lint files in parallel.
+
+
+
+
+
+ quick-lint-js's mascot is objectively the cutest
+
+
+
+
+ When I created quick-lint-js, Deno Lint and Rome/Biome/RSLint didn't
+ really exist. If they had existed, I might have contributed to one
+ of those projects (probably Deno Lint). Today, it would be hard for
+ me to abandon quick-lint-js. Just thinking about it makes me sad, so
+ let's move on. 😆
+
+
+
+
+
oxlint
+
+
+ Oxc's oxlint, started in February 2023, is the newest of all the linters
+ discussed. Oxc has similar goals to Biome, but oxlint tries to be
+ compatible with ESLint.
+
+
+
+ Compatibility: oxlint supports JavaScript, JSX, and
+ TypeScript out of the box with no configuration. However, Oxc
+ will not support
+ Svelte, Vue, or HTML, making its use limited for frameworks that
+ embed JavaScript in non-.js files.
+
+
+
+ Editor integration: Oxc has a Visual Studio Code extension
+ that bundles the oxlint linter, meaning it works out of the box.
+ However, it is buggy; lint warnings get stuck until you save, and
+ squigglies are often in the wrong place, for example. oxlint's LSP
+ server exists but is not distributed, so if you want to use oxlint
+ from Vim or Neovim, you need to build oxlint and configure it
+ yourself.
+
+
+
+
+ oxlint incorrectly warns about the
+ console.log statement on line 2
+
+
+
+
+ Plugin & configs: oxlint learned the same lesson as the
+ other modern linters: work out of the box without any ugly config
+ files or separate plugins. oxlint's default rule set seems less
+ annoying than Biome's, so I don't feel pressured to maintain oxlint
+ configs in my project either. oxlint does plan to support custom
+ rules, but how these extensions are distributed remains to be seen.
+
+
+
+ Speed: oxlint claims to be very fast. And fast it is!
+ oxlint's editor latency is competitive with quick-lint-js according
+ to
+ quick-lint-js's LSP server benchmarks:
+
+
+
+
+
+ oxlint and quick-lint-js are very fast compared to ESLint.
+ Biome and Deno are slower than ESLint.
+
+
+
+
+ oxlint also has niceties in its command line, such as parallelizing
+ by default, which makes oxlint useful for pre-commit hooks.
+
+
+
+
+
+
The future of JavaScript linters
+
+
+ Biome started in February 2020. Deno Lint and quick-lint-js both
+ started in March 2020. RSLint (merged into Biome) started in September
+ 2020. Worldwide lockdowns sure gave people the time to start their
+ ESLint rewrites. 😅
+
+
+
+ But what about 2024 and beyond? Will the industry-standard ESLint
+ prevail, or will Deno Lint, Biome, quick-lint-js, or oxlint dethrone
+ ESLint? Or will even newer linters not yet created take the crown?
+
+
+
The different linters of today have different strengths:
+
+
+ ESLint is highly extensible and allows teams to tune their
+ codebase however they want.
+
+
+
+ Deno Lint is the go-to option for developers making
+ Deno-based servers and scripts.
+
+
+
+ Biome is a tool to stop the fighting and make codebases
+ consistent.
+
+
+
+ quick-lint-js lets you find bugs in any codebase without
+ being overbearing or complicated.
+
+
+
+ oxlint is a direct ESLint replacement with fewer installation
+ and configuration headaches.
+
+
+
+
+ I predict that some of these linters will converge. Biome might adopt
+ an 'easy mode', removing the need for quick-lint-js. Deno might
+ replace Deno Lint with a pre-configured ESLint. quick-lint-js might
+ add plugins and complicated configs and eventually replace ESLint.
+ oxlint might obsolete everything else!
+
+
+
+ It's hard to say what will happen exactly. But I suspect that the
+ linter landscape will change in the coming years. I hope that my
+ project (quick-lint-js) is useful today and will push other linters
+ forward.
+
+
+
+
+
+
+
diff --git a/website/public/blog/why-another-javascript-linter/linters-showdown-1x.webp b/website/public/blog/why-another-javascript-linter/linters-showdown-1x.webp
new file mode 100644
index 0000000000..92e85aae4d
Binary files /dev/null and b/website/public/blog/why-another-javascript-linter/linters-showdown-1x.webp differ
diff --git a/website/public/blog/why-another-javascript-linter/linters-showdown-2x.webp b/website/public/blog/why-another-javascript-linter/linters-showdown-2x.webp
new file mode 100644
index 0000000000..fcafd31924
Binary files /dev/null and b/website/public/blog/why-another-javascript-linter/linters-showdown-2x.webp differ
diff --git a/website/public/blog/why-another-javascript-linter/linters-showdown-splash.jpg b/website/public/blog/why-another-javascript-linter/linters-showdown-splash.jpg
new file mode 100644
index 0000000000..3245572e5e
Binary files /dev/null and b/website/public/blog/why-another-javascript-linter/linters-showdown-splash.jpg differ
diff --git a/website/public/blog/why-another-javascript-linter/linters-showdown.svg b/website/public/blog/why-another-javascript-linter/linters-showdown.svg
new file mode 100644
index 0000000000..27278834a7
--- /dev/null
+++ b/website/public/blog/why-another-javascript-linter/linters-showdown.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/website/public/blog/why-another-javascript-linter/oxlint-editor-bug.png b/website/public/blog/why-another-javascript-linter/oxlint-editor-bug.png
new file mode 100644
index 0000000000..971eecdd03
Binary files /dev/null and b/website/public/blog/why-another-javascript-linter/oxlint-editor-bug.png differ
diff --git a/website/public/blog/why-another-javascript-linter/quick-lint-js-benchmark-results.png b/website/public/blog/why-another-javascript-linter/quick-lint-js-benchmark-results.png
new file mode 100644
index 0000000000..4f02eee3f6
Binary files /dev/null and b/website/public/blog/why-another-javascript-linter/quick-lint-js-benchmark-results.png differ
diff --git a/website/public/blog/why-another-javascript-linter/quick-lint-js-no-lag-still.png b/website/public/blog/why-another-javascript-linter/quick-lint-js-no-lag-still.png
new file mode 100644
index 0000000000..aa9d1f74ea
Binary files /dev/null and b/website/public/blog/why-another-javascript-linter/quick-lint-js-no-lag-still.png differ
diff --git a/website/public/blog/why-another-javascript-linter/quick-lint-js-no-lag.webp b/website/public/blog/why-another-javascript-linter/quick-lint-js-no-lag.webp
new file mode 100644
index 0000000000..ab5714c860
Binary files /dev/null and b/website/public/blog/why-another-javascript-linter/quick-lint-js-no-lag.webp differ
diff --git a/website/public/blog/why-another-javascript-linter/visual-studio-squigglies.png b/website/public/blog/why-another-javascript-linter/visual-studio-squigglies.png
new file mode 100644
index 0000000000..d9e2285bb0
Binary files /dev/null and b/website/public/blog/why-another-javascript-linter/visual-studio-squigglies.png differ
diff --git a/website/public/deno.svg b/website/public/deno.svg
new file mode 100644
index 0000000000..73cc87c73a
--- /dev/null
+++ b/website/public/deno.svg
@@ -0,0 +1,13 @@
+
diff --git a/website/public/index.mjs b/website/public/index.mjs
index 5d65cd3c85..204598c871 100644
--- a/website/public/index.mjs
+++ b/website/public/index.mjs
@@ -88,12 +88,14 @@ function getExtraIconAttributes(attributes) {
let icons = {
chocolatey: { path: "chocolatey.svg", alt: "Chocolatey" },
"arch-linux": { path: "arch-linux.svg", alt: "Arch Linux" },
+ biome: { path: "biome.svg", alt: "Biome" },
"cli-and-lsp-server": {
path: "gnome-terminal.svg",
alt: "CLI and LSP server",
},
codespaces: { path: "codespaces.png", alt: "GitHub Codespaces" },
debian: { path: "debian.svg", alt: "Debian" },
+ deno: { path: "deno.svg", alt: "Deno" },
emacs: { path: "emacs.svg", alt: "Emacs", disableSpritesheet: true },
github: { path: "github.svg", alt: "GitHub" },
homebrew: { path: "homebrew.svg", alt: "Homebrew" },
@@ -105,6 +107,7 @@ let icons = {
"notepad-plus-plus": { path: "notepad-plus-plus.svg", alt: "Notepad++" },
npm: { path: "npm.svg", alt: "npm" },
"open-vsx": { path: "open-vsx.svg", alt: "Open VSX" },
+ oxc: { path: "oxc.png", alt: "Oxc" },
"quick-lint-js": { path: "dusty.svg", alt: "quick-lint-js" },
"quick-lint-js-small": { path: "favicon-32x32.png", alt: "quick-lint-js" },
"sublime-text": {
diff --git a/website/public/license/biome.svg.html b/website/public/license/biome.svg.html
new file mode 100644
index 0000000000..e03b2ac078
--- /dev/null
+++ b/website/public/license/biome.svg.html
@@ -0,0 +1,27 @@
+
MIT License
+
+
Copyright (c) 2023 Biome Developers and Contributors.
+
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+
diff --git a/website/public/license/deno.svg.html b/website/public/license/deno.svg.html
new file mode 100644
index 0000000000..6886959870
--- /dev/null
+++ b/website/public/license/deno.svg.html
@@ -0,0 +1,27 @@
+
MIT License
+
+
Copyright (c) 2018-2023 the Deno authors
+
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+
+ CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL
+ SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN ATTORNEY-CLIENT
+ RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS.
+ CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE OF THIS DOCUMENT OR THE
+ INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES
+ RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
+ HEREUNDER.
+
+
Statement of Purpose
+
+ The laws of most jurisdictions throughout the world automatically confer
+ exclusive Copyright and Related Rights (defined below) upon the creator and
+ subsequent owner(s) (each and all, an "owner") of an original work of
+ authorship and/or a database (each, a "Work").
+
+
+ Certain owners wish to permanently relinquish those rights to a Work for the
+ purpose of contributing to a commons of creative, cultural and scientific
+ works ("Commons") that the public can reliably and without fear of later
+ claims of infringement build upon, modify, incorporate in other works, reuse
+ and redistribute as freely as possible in any form whatsoever and for any
+ purposes, including without limitation commercial purposes. These owners may
+ contribute to the Commons to promote the ideal of a free culture and the
+ further production of creative, cultural and scientific works, or to gain
+ reputation or greater distribution for their Work in part through the use and
+ efforts of others.
+
+
+ For these and/or other purposes and motivations, and without any expectation
+ of additional consideration or compensation, the person associating CC0 with a
+ Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
+ and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
+ and publicly distribute the Work under its terms, with knowledge of his or her
+ Copyright and Related Rights in the Work and the meaning and intended legal
+ effect of CC0 on those rights.
+
+
1. Copyright and Related Rights.
+
+ A Work made available under CC0 may be protected by copyright and related or
+ neighboring rights ("Copyright and Related Rights"). Copyright and Related
+ Rights include, but are not limited to, the following:
+
+
+
+ the right to reproduce, adapt, distribute, perform, display, communicate,
+ and translate a Work;
+
+
moral rights retained by the original author(s) and/or performer(s);
+
+ publicity and privacy rights pertaining to a person's image or likeness
+ depicted in a Work;
+
+
+ rights protecting against unfair competition in regards to a Work, subject
+ to the limitations in paragraph 4(a), below;
+
+
+ rights protecting the extraction, dissemination, use and reuse of data in a
+ Work;
+
+
+ database rights (such as those arising under Directive 96/9/EC of the
+ European Parliament and of the Council of 11 March 1996 on the legal
+ protection of databases, and under any national implementation thereof,
+ including any amended or successor version of such directive); and
+
+
+ other similar, equivalent or corresponding rights throughout the world based
+ on applicable law or treaty, and any national implementations thereof.
+
+
+
2. Waiver.
+
+ To the greatest extent permitted by, but not in contravention of, applicable
+ law, Affirmer hereby overtly, fully, permanently, irrevocably and
+ unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
+ and Related Rights and associated claims and causes of action, whether now
+ known or unknown (including existing as well as future claims and causes of
+ action), in the Work (i) in all territories worldwide, (ii) for the maximum
+ duration provided by applicable law or treaty (including future time
+ extensions), (iii) in any current or future medium and for any number of
+ copies, and (iv) for any purpose whatsoever, including without limitation
+ commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes
+ the Waiver for the benefit of each member of the public at large and to the
+ detriment of Affirmer's heirs and successors, fully intending that such Waiver
+ shall not be subject to revocation, rescission, cancellation, termination, or
+ any other legal or equitable action to disrupt the quiet enjoyment of the Work
+ by the public as contemplated by Affirmer's express Statement of Purpose.
+
+
3. Public License Fallback.
+
+ Should any part of the Waiver for any reason be judged legally invalid or
+ ineffective under applicable law, then the Waiver shall be preserved to the
+ maximum extent permitted taking into account Affirmer's express Statement of
+ Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby
+ grants to each affected person a royalty-free, non transferable, non
+ sublicensable, non exclusive, irrevocable and unconditional license to
+ exercise Affirmer's Copyright and Related Rights in the Work (i) in all
+ territories worldwide, (ii) for the maximum duration provided by applicable
+ law or treaty (including future time extensions), (iii) in any current or
+ future medium and for any number of copies, and (iv) for any purpose
+ whatsoever, including without limitation commercial, advertising or
+ promotional purposes (the "License"). The License shall be deemed effective as
+ of the date CC0 was applied by Affirmer to the Work. Should any part of the
+ License for any reason be judged legally invalid or ineffective under
+ applicable law, such partial invalidity or ineffectiveness shall not
+ invalidate the remainder of the License, and in such case Affirmer hereby
+ affirms that he or she will not (i) exercise any of his or her remaining
+ Copyright and Related Rights in the Work or (ii) assert any associated claims
+ and causes of action with respect to the Work, in either case contrary to
+ Affirmer's express Statement of Purpose.
+
+
4. Limitations and Disclaimers.
+
+
+ No trademark or patent rights held by Affirmer are waived, abandoned,
+ surrendered, licensed or otherwise affected by this document.
+
+
+ Affirmer offers the Work as-is and makes no representations or warranties of
+ any kind concerning the Work, express, implied, statutory or otherwise,
+ including without limitation warranties of title, merchantability, fitness
+ for a particular purpose, non infringement, or the absence of latent or
+ other defects, accuracy, or the present or absence of errors, whether or not
+ discoverable, all to the greatest extent permissible under applicable law.
+
+
+ Affirmer disclaims responsibility for clearing rights of other persons that
+ may apply to the Work or any use thereof, including without limitation any
+ person's Copyright and Related Rights in the Work. Further, Affirmer
+ disclaims responsibility for obtaining any necessary consents, permissions
+ or other rights required for any use of the Work.
+
+
+ Affirmer understands and acknowledges that Creative Commons is not a party
+ to this document and has no duty or obligation with respect to this CC0 or
+ use of the Work.
+
+
diff --git a/website/public/main.css b/website/public/main.css
index 0cda4dc045..bbd640b303 100755
--- a/website/public/main.css
+++ b/website/public/main.css
@@ -25,7 +25,9 @@ video + figcaption,
pre + figcaption {
font-style: italic;
}
+figure > picture > img,
figure > img,
+figure > svg,
figure > video {
width: 100%;
height: auto;
diff --git a/website/public/oxc.png b/website/public/oxc.png
new file mode 100644
index 0000000000..230bd191bc
Binary files /dev/null and b/website/public/oxc.png differ