diff --git a/www/LICENSE b/www/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..284d79f6c013bd4eeeb2a3c60d5f41c5ee2a64a0
--- /dev/null
+++ b/www/LICENSE
@@ -0,0 +1,208 @@
+The ghcup website, excluding ghcup, fonts, bootstrap-haskell script are subject
+to the license below. Design, javascript and css are used from the rustup
+project: https://github.com/rust-lang/rustup.rs/tree/master/www
+
+
+
+===============================================================================
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/www/fonts/FiraSans-Light.woff b/www/fonts/FiraSans-Light.woff
new file mode 100644
index 0000000000000000000000000000000000000000..af97f5022bdae95bd52ebf078fa52ae69aff5fd5
Binary files /dev/null and b/www/fonts/FiraSans-Light.woff differ
diff --git a/www/fonts/FiraSans-Medium.woff b/www/fonts/FiraSans-Medium.woff
new file mode 100644
index 0000000000000000000000000000000000000000..61a59e010c640e3f76f4a26d58efecc09a6270b1
Binary files /dev/null and b/www/fonts/FiraSans-Medium.woff differ
diff --git a/www/fonts/FiraSans-Regular.woff b/www/fonts/FiraSans-Regular.woff
new file mode 100644
index 0000000000000000000000000000000000000000..16e74f2b406319f7a443624e16e1c069f308b1d6
Binary files /dev/null and b/www/fonts/FiraSans-Regular.woff differ
diff --git a/www/fonts/Inconsolata-Regular.ttf b/www/fonts/Inconsolata-Regular.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..bbc964755611ebc43842a70bfc07ecaf74dbe77f
Binary files /dev/null and b/www/fonts/Inconsolata-Regular.ttf differ
diff --git a/www/fonts/OFL.txt b/www/fonts/OFL.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d9ae615922b15d40d7038887dbc99eefc22c64f1
--- /dev/null
+++ b/www/fonts/OFL.txt
@@ -0,0 +1,92 @@
+Copyright (c) 2011, Raph Levien (firstname.lastname@gmail.com), Copyright (c) 2012, Cyreal (cyreal.org)
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded, 
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/www/fonts/WorkSans-Medium.ttf b/www/fonts/WorkSans-Medium.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..137cf564c9e675dfbb8c2d6d574027b8763ff2ec
Binary files /dev/null and b/www/fonts/WorkSans-Medium.ttf differ
diff --git a/www/ghcup.css b/www/ghcup.css
new file mode 100644
index 0000000000000000000000000000000000000000..a2737f6c9a3311741211656846cf2b23ba81f322
--- /dev/null
+++ b/www/ghcup.css
@@ -0,0 +1,162 @@
+@font-face {
+    font-family: 'Fira Sans';
+    font-style: normal;
+    font-weight: 300;
+    src: local('Fira Sans Light'), url("fonts/FiraSans-Light.woff") format('woff');
+}
+@font-face {
+    font-family: 'Fira Sans';
+    font-style: normal;
+    font-weight: 400;
+    src: local('Fira Sans'), url("fonts/FiraSans-Regular.woff") format('woff');
+}
+@font-face {
+    font-family: 'Fira Sans';
+    font-style: normal;
+    font-weight: 500;
+    src: local('Fira Sans Medium'), url("fonts/FiraSans-Medium.woff") format('woff');
+}
+
+@font-face {
+    font-family: 'Work Sans';
+    font-style: normal;
+    font-weight: 500;
+    src: local('Work Sans Medium'), url("fonts/WorkSans-Medium.ttf") format('ttf');
+}
+
+@font-face {
+    font-family: 'Inconsolata';
+    font-style: normal;
+    font-weight: 400;
+    src: local('Inconsolata Regular'), url("fonts/Inconsolata-Regular.ttf") format('ttf');
+}
+
+body {
+    margin-top: 2em;
+    background-color: white;
+    color: #515151;
+    font-family: "Fira Sans","Helvetica Neue",Helvetica,Arial,sans-serif;
+    font-weight: 300;
+    font-size: 25px;
+}
+
+pre {
+    font-family: Inconsolata,Menlo,Monaco,Consolas,"Courier New",monospace;
+    font-weight: 400;
+}
+
+body#idx #pitch > a {
+    font-weight: 500;
+    line-height: 2em;
+}
+
+a {
+    color: #428bca;
+    text-decoration: none;
+}
+
+a:hover {
+    color: rgb(42, 100, 150);
+}
+
+body#idx > * {
+    margin-left: auto;
+    margin-right: auto;
+    text-align: center;
+    width: 31em;
+}
+
+body#idx > #pitch {
+    width: 30rem;
+}
+
+#pitch em {
+    font-style: normal;
+    font-weight: 400;
+}
+
+body#idx p {
+    margin-top: 2em;
+    margin-bottom: 2em;
+}
+
+body#idx p.other-help {
+    font-size: 0.6em;
+}
+
+.instructions {
+    background-color: rgb(250, 250, 250);
+    margin-left: auto;
+    margin-right: auto;
+    width: 45rem;
+    text-align: center;
+    border-radius: 3px;
+    border: 1px solid rgb(204, 204, 204);
+    box-shadow: 0px 1px 4px 0px rgb(204, 204, 204);
+}
+
+.instructions > * {
+    width: 45rem;
+    margin-left: auto;
+    margin-right: auto;
+}
+
+hr {
+    margin-top: 2em;
+    margin-bottom: 2em;
+}
+
+#platform-instructions-linux > pre,
+#platform-instructions-mac > pre,
+#platform-instructions-freebsd > pre,
+#platform-instructions-win32 > pre,
+#platform-instructions-win64 > pre,
+#platform-instructions-default > div > pre,
+#platform-instructions-unknown > div > pre {
+    background-color: #515151;
+    color: white;
+    margin-left: auto;
+    margin-right: auto;
+    padding-top: 1rem;
+    padding-bottom: 1rem;
+    text-align: center;
+    border-radius: 3px;
+    box-shadow: inset 0px 0px 20px 0px #333333;
+}
+
+#platform-instructions-win32 a.windows-download,
+#platform-instructions-win64 a.windows-download,
+#platform-instructions-default a.windows-download,
+#platform-instructions-unknown a.windows-download {
+    display: block;
+    padding-top: 0.4rem;
+    padding-bottom: 0.6rem;
+    font-family: "Work Sans", "Fira Sans","Helvetica Neue",Helvetica,Arial,sans-serif;
+    font-weight: 500;
+    letter-spacing: 0.1rem;
+}
+
+/* This is the box that prints navigator.platform, navigator.appVersion values */
+#platform-instructions-unknown > div:first-of-type {
+    font-size: 16px;
+    line-height: 2rem;
+}
+
+#about {
+    font-size: 16px;
+    line-height: 2em;
+}
+
+#about > img {
+    width: 30px;
+    height: 30px;
+    transform: translateY(11px);
+}
+
+#platform-button {
+    background-color: #515151;
+    color: white;
+    margin-left: auto;
+    margin-right: auto;
+    padding: 1em;
+}
diff --git a/www/ghcup.js b/www/ghcup.js
new file mode 100644
index 0000000000000000000000000000000000000000..6085e540e48311c5bda7704d7f5633f4b5257c2b
--- /dev/null
+++ b/www/ghcup.js
@@ -0,0 +1,156 @@
+var platforms = ["default", "unknown", "win32", "win64", "linux", "freebsd", "mac"];
+var platform_override = null;
+
+function detect_platform() {
+    "use strict";
+
+    if (platform_override !== null) {
+        return platforms[platform_override];
+    }
+
+    var os = "unknown";
+
+    if (navigator.platform == "Linux x86_64") {os = "linux";}
+    if (navigator.platform == "Linux i686") {os = "linux";}
+    if (navigator.platform == "Linux i686 on x86_64") {os = "linux";}
+    if (navigator.platform == "Linux aarch64") {os = "linux";}
+    if (navigator.platform == "Linux armv6l") {os = "linux";}
+    if (navigator.platform == "Linux armv7l") {os = "linux";}
+    if (navigator.platform == "Linux armv8l") {os = "linux";}
+    if (navigator.platform == "Linux ppc64") {os = "linux";}
+    if (navigator.platform == "Linux mips") {os = "linux";}
+    if (navigator.platform == "Linux mips64") {os = "linux";}
+    if (navigator.platform == "Mac") {os = "mac";}
+    if (navigator.platform == "Win32") {os = "win32";}
+    if (navigator.platform == "Win64" ||
+        navigator.userAgent.indexOf("WOW64") != -1 ||
+        navigator.userAgent.indexOf("Win64") != -1) { os = "win64"; }
+    if (navigator.platform == "FreeBSD x86_64") {os = "freebsd";}
+    if (navigator.platform == "FreeBSD amd64") {os = "freebsd";}
+    // if (navigator.platform == "NetBSD x86_64") {os = "unix";}
+    // if (navigator.platform == "NetBSD amd64") {os = "unix";}
+
+    // I wish I knew by now, but I don't. Try harder.
+    if (os == "unknown") {
+        if (navigator.appVersion.indexOf("Win")!=-1) {os = "win32";}
+        if (navigator.appVersion.indexOf("Mac")!=-1) {os = "mac";}
+        if (navigator.appVersion.indexOf("FreeBSD")!=-1) {os = "freebsd";}
+    }
+
+    // Firefox Quantum likes to hide platform and appVersion but oscpu works
+    if (navigator.oscpu) {
+        if (navigator.oscpu.indexOf("Win32")!=-1) {os = "win32";}
+        if (navigator.oscpu.indexOf("Win64")!=-1) {os = "win64";}
+        if (navigator.oscpu.indexOf("Mac")!=-1) {os = "mac";}
+        if (navigator.oscpu.indexOf("Linux")!=-1) {os = "linux";}
+        if (navigator.oscpu.indexOf("FreeBSD")!=-1) {os = "freebsd";}
+        // if (navigator.oscpu.indexOf("NetBSD")!=-1) {os = "unix";}
+    }
+
+    return os;
+}
+
+function adjust_for_platform() {
+    "use strict";
+
+    var platform = detect_platform();
+
+    platforms.forEach(function (platform_elem) {
+        var platform_div = document.getElementById("platform-instructions-" + platform_elem);
+        platform_div.style.display = "none";
+        if (platform == platform_elem) {
+            platform_div.style.display = "block";
+        }
+    });
+
+    adjust_platform_specific_instrs(platform);
+}
+
+function adjust_platform_specific_instrs(platform) {
+    var platform_specific = document.getElementsByClassName("platform-specific");
+    for (var el of platform_specific) {
+        var el_is_not_win = el.className.indexOf("not-win") !== -1;
+        var el_is_inline = el.tagName.toLowerCase() == "span";
+        var el_visible_style = "block";
+        if (el_is_inline) {
+            el_visible_style = "inline";
+        }
+        if (platform == "win64" || platform == "win32") {
+            if (el_is_not_win) {
+                el.style.display = "none";
+            } else {
+                el.style.display = el_visible_style;
+            }
+        } else {
+            if (el_is_not_win) {
+                el.style.display = el_visible_style;
+            } else {
+                el.style.display = "none";
+            }
+        }
+    }
+}
+
+function cycle_platform() {
+    if (platform_override == null) {
+        platform_override = 0;
+    } else {
+        platform_override = (platform_override + 1) % platforms.length;
+    }
+    adjust_for_platform();
+}
+
+function set_up_cycle_button() {
+    var cycle_button = document.getElementById("platform-button");
+    cycle_button.onclick = cycle_platform;
+
+    var key="test";
+    var idx=0;
+    var unlocked=false;
+
+    document.onkeypress = function(event) {
+        if (event.key == "n" && unlocked) {
+            cycle_platform();
+        }
+
+        if (event.key == key[idx]) {
+            idx += 1;
+
+            if (idx == key.length) {
+                cycle_button.style.display = "block";
+                unlocked = true;
+                cycle_platform();
+            }
+        } else if (event.key == key[0]) {
+            idx = 1;
+        } else {
+            idx = 0;
+        }
+    };
+}
+
+function go_to_default_platform() {
+    platform_override = 0;
+    adjust_for_platform();
+}
+
+function set_up_default_platform_buttons() {
+    var defaults_buttons = document.getElementsByClassName('default-platform-button');
+    for (var i = 0; i < defaults_buttons.length; i++) {
+        defaults_buttons[i].onclick = go_to_default_platform;
+    }
+}
+
+function fill_in_bug_report_values() {
+    var nav_plat = document.getElementById("nav-plat");
+    var nav_app = document.getElementById("nav-app");
+    nav_plat.textContent = navigator.platform;
+    nav_app.textContent = navigator.appVersion;
+}
+
+(function () {
+    adjust_for_platform();
+    set_up_cycle_button();
+    set_up_default_platform_buttons();
+    fill_in_bug_report_values();
+}());
diff --git a/www/haskell-logo.svg b/www/haskell-logo.svg
new file mode 100644
index 0000000000000000000000000000000000000000..e255f5bf3997cd51e49b7924f8534b011dbc6cc2
--- /dev/null
+++ b/www/haskell-logo.svg
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="109"
+   height="80"
+   viewBox="0 0 109.00001 80"
+   version="1.1"
+   id="svg14"
+   sodipodi:docname="haskell-logo.svg"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)">
+  <metadata
+     id="metadata20">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs18" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1916"
+     inkscape:window-height="1033"
+     id="namedview16"
+     showgrid="false"
+     inkscape:zoom="2.0159478"
+     inkscape:cx="298.15447"
+     inkscape:cy="-2.7202801"
+     inkscape:window-x="1366"
+     inkscape:window-y="22"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg14" />
+  <path
+     d="M 1.842,77.722 26.586,40.63 1.842,3.537 H 20.4 L 45.144,40.63 20.4,77.722 Z m 0,0"
+     id="path8"
+     inkscape:connector-curvature="0"
+     style="fill:#453a62" />
+  <path
+     d="M 26.586,77.722 51.33,40.63 26.586,3.537 H 45.144 L 94.63,77.722 H 76.074 L 60.61,54.54 45.143,77.722 Z m 0,0"
+     id="path10"
+     inkscape:connector-curvature="0"
+     style="fill:#5e5086" />
+  <path
+     d="M 86.384,56.085 78.136,43.72 h 28.868 V 56.086 H 86.384 Z M 74.012,37.54 65.764,25.175 h 41.24 V 37.54 Z m 0,0"
+     id="path12"
+     inkscape:connector-curvature="0"
+     style="fill:#8f4e8b" />
+</svg>
diff --git a/www/index.html b/www/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..b4e62d19c3a1c14242c0f5fc6f8b55fb098104e4
--- /dev/null
+++ b/www/index.html
@@ -0,0 +1,177 @@
+<!DOCTYPE html>
+
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>ghcup - The Haskell (GHC) toolchain installer</title>
+    <meta name="keywords" content="Haskell, Haskell programming language, ghc, ghcup">
+    <meta name="description" content="The Haskell (GHC) toolchain installer">
+
+    <link rel="stylesheet" href="normalize.css">
+    <link rel="stylesheet" href="ghcup.css">
+
+  </head>
+
+  <body id="idx">
+
+    <script id='html-content' type="text/html">
+      <a id="platform-button" style="display: none;" href="#">
+        click or press "n" to cycle platforms
+      </a>
+
+      <p id="pitch">
+        <em>ghcup</em> is an installer for<br/>
+        the general purpose language <a href="https://www.haskell.org/">Haskell</a>
+      </p>
+
+      <div id="platform-instructions-linux" class="instructions" style="display: none;">
+        <p>Run the following in your terminal, then follow the onscreen instructions.</p>
+        <pre>curl https://get-ghcup.haskell.org -sSf | sh</pre>
+        <p class="other-help">If you don't like curl | sh, see <a href="https://github.com/haskell/ghcup#manual-install">other installation methods</a>.<br/>You appear to be running Linux. If not, <a class="default-platform-button" href="#">display all supported installers</a>.</p>
+      </div>
+
+      <div id="platform-instructions-mac" class="instructions" style="display: none;">
+        <p>Run the following in your terminal, then follow the onscreen instructions.</p>
+        <pre>curl https://get-ghcup.haskell.org -sSf | sh</pre>
+        <p class="other-help">If you don't like curl | sh, see <a href="https://github.com/haskell/ghcup#manual-install">other installation methods</a>.<br/>You appear to be running Mac OS X. If not, <a class="default-platform-button" href="#">display all supported installers</a>.</p>
+      </div>
+
+      <div id="platform-instructions-freebsd" class="instructions" style="display: none;">
+        <p>Run the following in your terminal, then follow the onscreen instructions.</p>
+        <pre>curl https://get-ghcup.haskell.org -sSf | sh</pre>
+        <p class="other-help">If you don't like curl | sh, see <a href="https://github.com/haskell/ghcup#manual-install">other installation methods</a>.<br/>You appear to be running FreeBSD. If not, <a class="default-platform-button" href="#">display all supported installers</a>.</p>
+      </div>
+
+      <div id="platform-instructions-win32" class="instructions">
+        <p>
+          To install Haskell, follow the instructions on
+          <a class="windows-download" href="https://www.haskell.org/platform/#windows">Haskell Platform</a>
+        </p>
+        <p class="other-help">You appear to be running Windows 32-bit. If not, <a class="default-platform-button" href="#">display all supported installers</a>.</p>
+      </div>
+
+      <div id="platform-instructions-win64" class="instructions" style="display: none;">
+        <p>
+          To install Haskell, follow the instructions on
+          <a class="windows-download" href="https://www.haskell.org/platform/#windows">Haskell Platform</a>
+        </p>
+        <p class="other-help">You appear to be running Windows 64-bit. If not, <a class="default-platform-button" href="#">display all supported installers</a>.</p>
+      </div>
+
+      <div id="platform-instructions-unknown" class="instructions" style="display: none;">
+        <!-- unrecognized platform: ask for help -->
+        <p>I don't recognize your platform.</p>
+        <p>
+          ghcup runs on Linux, Mac OS X and FreeBSD. If
+          you are on one of these platforms and are seeing this then please
+          <a href="https://github.com/haskell/ghcup/issues">report an issue</a>,
+          along with the following values:
+        </p>
+
+        <div>
+          <div>navigator.platform:</div>
+          <div id="nav-plat"></div>
+          <div>navigator.appVersion:</div>
+          <div id="nav-app"></div>
+        </div>
+
+        <!-- duplicate the default cross-platform instructions -->
+        <div>
+          <p>If you are running Linux, Mac OS X or FreeBSD,<br/>run the following in your terminal, then follow the onscreen instructions.</p>
+          <pre>curl https://get-ghcup.haskell.org -sSf | sh</pre>
+          <p class="other-help">If you don't like curl | sh, see <a href="https://github.com/haskell/ghcup#manual-install">other installation methods</a>.</p>
+        </div>
+
+        <hr/>
+
+        <div>
+          <p>
+            If you are running Windows,<br/>follow the instructions on
+            <a class="windows-download" href="https://www.haskell.org/platform/#windows">Haskell Platform</a>
+          </p>
+        </div>
+
+      </div>
+
+      <div id="platform-instructions-default" class="instructions">
+        <div>
+          <p>To install Haskell, if you are running Linux, Mac OS X or FreeBSD,<br/>run the following
+          in your terminal, then follow the onscreen instructions.</p>
+          <pre>curl https://get-ghcup.haskell.org -sSf | sh</pre>
+          <p class="other-help">If you don't like curl | sh, see <a href="https://github.com/haskell/ghcup#manual-install">other installation methods</a>.</p>
+        </div>
+
+        <hr/>
+
+        <div>
+          <p>
+            If you are running Windows,<br/>follow the instructions on
+            <a class="windows-download" href="https://www.haskell.org/platform/#windows">Haskell Platform</a>
+          </p>
+        </div>
+
+      </div>
+
+      <p>
+        Need help? <a href="http://webchat.freenode.net/?randomnick=1&channels=%23haskell&uio=d4">Ask on #haskell</a>.
+      </p>
+
+      <p id="about">
+        <img src="haskell-logo.svg" alt="" />
+        ghcup is a haskell.org hosted project.
+        <br/>
+        <a href="https://www.haskell.org/downloads/">other installation options</a>
+        &nbsp;&middot;&nbsp;
+        <a href="https://github.com/haskell/ghcup">about ghcup</a>
+        &nbsp;&middot;&nbsp;
+        <a href="https://github.com/rust-lang/rustup.rs/tree/master/www">web design from rustup</a>
+      </p>
+    </script>
+    <script>
+      document.write(document.getElementById("html-content").innerHTML);
+    </script>
+    <script type="text/javascript" src="ghcup.js"></script>
+
+    <noscript>
+      <p id="pitch">
+        <em>ghcup</em> is an installer for<br/>
+        the general purpose language <a href="https://www.haskell.org/">Haskell</a>
+      </p>
+
+      <div id="platform-instructions-default" class="instructions">
+        <div>
+          <p>To install Haskell, if you are running Linux, Mac OS X or FreeBSD,<br/>run the following
+          in your terminal, then follow the onscreen instructions.</p>
+          <pre>curl https://get-ghcup.haskell.org -sSf | sh</pre>
+          <p class="other-help">If you don't like curl | sh, see <a href="https://github.com/haskell/ghcup#manual-install">other installation methods</a>.</p>
+        </div>
+
+        <hr/>
+
+        <div>
+          <p>
+            If you are running Windows,<br/>follow the instructions on
+            <a class="windows-download" href="https://www.haskell.org/platform/#windows">Haskell Platform</a>
+          </p>
+        </div>
+
+      </div>
+
+      <p>
+        Need help? <a href="http://webchat.freenode.net/?randomnick=1&amp;channels=%23haskell&amp;uio=d4">Ask on #haskell</a>.
+      </p>
+
+      <p id="about">
+        <img src="haskell-logo.svg" alt="" />
+        ghcup is a haskell.org hosted project.
+        <br/>
+        <a href="https://www.haskell.org/downloads/">other installation options</a>
+        &nbsp;&middot;&nbsp;
+        <a href="https://github.com/haskell/ghcup">about ghcup</a>
+        &nbsp;&middot;&nbsp;
+        <a href="https://github.com/rust-lang/rustup.rs/tree/master/www">web design from rustup</a>
+      </p>
+
+    </noscript>
+  </body>
+</html>
diff --git a/www/normalize.css b/www/normalize.css
new file mode 100644
index 0000000000000000000000000000000000000000..458eea1ea3d5d57b8d35a7453763e681e4ffe383
--- /dev/null
+++ b/www/normalize.css
@@ -0,0 +1,427 @@
+/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
+
+/**
+ * 1. Set default font family to sans-serif.
+ * 2. Prevent iOS text size adjust after orientation change, without disabling
+ *    user zoom.
+ */
+
+html {
+  font-family: sans-serif; /* 1 */
+  -ms-text-size-adjust: 100%; /* 2 */
+  -webkit-text-size-adjust: 100%; /* 2 */
+}
+
+/**
+ * Remove default margin.
+ */
+
+body {
+  margin: 0;
+}
+
+/* HTML5 display definitions
+   ========================================================================== */
+
+/**
+ * Correct `block` display not defined for any HTML5 element in IE 8/9.
+ * Correct `block` display not defined for `details` or `summary` in IE 10/11
+ * and Firefox.
+ * Correct `block` display not defined for `main` in IE 11.
+ */
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+  display: block;
+}
+
+/**
+ * 1. Correct `inline-block` display not defined in IE 8/9.
+ * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
+ */
+
+audio,
+canvas,
+progress,
+video {
+  display: inline-block; /* 1 */
+  vertical-align: baseline; /* 2 */
+}
+
+/**
+ * Prevent modern browsers from displaying `audio` without controls.
+ * Remove excess height in iOS 5 devices.
+ */
+
+audio:not([controls]) {
+  display: none;
+  height: 0;
+}
+
+/**
+ * Address `[hidden]` styling not present in IE 8/9/10.
+ * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
+ */
+
+[hidden],
+template {
+  display: none;
+}
+
+/* Links
+   ========================================================================== */
+
+/**
+ * Remove the gray background color from active links in IE 10.
+ */
+
+a {
+  background-color: transparent;
+}
+
+/**
+ * Improve readability when focused and also mouse hovered in all browsers.
+ */
+
+a:active,
+a:hover {
+  outline: 0;
+}
+
+/* Text-level semantics
+   ========================================================================== */
+
+/**
+ * Address styling not present in IE 8/9/10/11, Safari, and Chrome.
+ */
+
+abbr[title] {
+  border-bottom: 1px dotted;
+}
+
+/**
+ * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
+ */
+
+b,
+strong {
+  font-weight: bold;
+}
+
+/**
+ * Address styling not present in Safari and Chrome.
+ */
+
+dfn {
+  font-style: italic;
+}
+
+/**
+ * Address variable `h1` font-size and margin within `section` and `article`
+ * contexts in Firefox 4+, Safari, and Chrome.
+ */
+
+h1 {
+  font-size: 2em;
+  margin: 0.67em 0;
+}
+
+/**
+ * Address styling not present in IE 8/9.
+ */
+
+mark {
+  background: #ff0;
+  color: #000;
+}
+
+/**
+ * Address inconsistent and variable font size in all browsers.
+ */
+
+small {
+  font-size: 80%;
+}
+
+/**
+ * Prevent `sub` and `sup` affecting `line-height` in all browsers.
+ */
+
+sub,
+sup {
+  font-size: 75%;
+  line-height: 0;
+  position: relative;
+  vertical-align: baseline;
+}
+
+sup {
+  top: -0.5em;
+}
+
+sub {
+  bottom: -0.25em;
+}
+
+/* Embedded content
+   ========================================================================== */
+
+/**
+ * Remove border when inside `a` element in IE 8/9/10.
+ */
+
+img {
+  border: 0;
+}
+
+/**
+ * Correct overflow not hidden in IE 9/10/11.
+ */
+
+svg:not(:root) {
+  overflow: hidden;
+}
+
+/* Grouping content
+   ========================================================================== */
+
+/**
+ * Address margin not present in IE 8/9 and Safari.
+ */
+
+figure {
+  margin: 1em 40px;
+}
+
+/**
+ * Address differences between Firefox and other browsers.
+ */
+
+hr {
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+  height: 0;
+}
+
+/**
+ * Contain overflow in all browsers.
+ */
+
+pre {
+  overflow: auto;
+}
+
+/**
+ * Address odd `em`-unit font size rendering in all browsers.
+ */
+
+code,
+kbd,
+pre,
+samp {
+  font-family: monospace, monospace;
+  font-size: 1em;
+}
+
+/* Forms
+   ========================================================================== */
+
+/**
+ * Known limitation: by default, Chrome and Safari on OS X allow very limited
+ * styling of `select`, unless a `border` property is set.
+ */
+
+/**
+ * 1. Correct color not being inherited.
+ *    Known issue: affects color of disabled elements.
+ * 2. Correct font properties not being inherited.
+ * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
+ */
+
+button,
+input,
+optgroup,
+select,
+textarea {
+  color: inherit; /* 1 */
+  font: inherit; /* 2 */
+  margin: 0; /* 3 */
+}
+
+/**
+ * Address `overflow` set to `hidden` in IE 8/9/10/11.
+ */
+
+button {
+  overflow: visible;
+}
+
+/**
+ * Address inconsistent `text-transform` inheritance for `button` and `select`.
+ * All other form control elements do not inherit `text-transform` values.
+ * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
+ * Correct `select` style inheritance in Firefox.
+ */
+
+button,
+select {
+  text-transform: none;
+}
+
+/**
+ * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
+ *    and `video` controls.
+ * 2. Correct inability to style clickable `input` types in iOS.
+ * 3. Improve usability and consistency of cursor style between image-type
+ *    `input` and others.
+ */
+
+button,
+html input[type="button"], /* 1 */
+input[type="reset"],
+input[type="submit"] {
+  -webkit-appearance: button; /* 2 */
+  cursor: pointer; /* 3 */
+}
+
+/**
+ * Re-set default cursor for disabled elements.
+ */
+
+button[disabled],
+html input[disabled] {
+  cursor: default;
+}
+
+/**
+ * Remove inner padding and border in Firefox 4+.
+ */
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+  border: 0;
+  padding: 0;
+}
+
+/**
+ * Address Firefox 4+ setting `line-height` on `input` using `!important` in
+ * the UA stylesheet.
+ */
+
+input {
+  line-height: normal;
+}
+
+/**
+ * It's recommended that you don't attempt to style these elements.
+ * Firefox's implementation doesn't respect box-sizing, padding, or width.
+ *
+ * 1. Address box sizing set to `content-box` in IE 8/9/10.
+ * 2. Remove excess padding in IE 8/9/10.
+ */
+
+input[type="checkbox"],
+input[type="radio"] {
+  box-sizing: border-box; /* 1 */
+  padding: 0; /* 2 */
+}
+
+/**
+ * Fix the cursor style for Chrome's increment/decrement buttons. For certain
+ * `font-size` values of the `input`, it causes the cursor style of the
+ * decrement button to change from `default` to `text`.
+ */
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+  height: auto;
+}
+
+/**
+ * 1. Address `appearance` set to `searchfield` in Safari and Chrome.
+ * 2. Address `box-sizing` set to `border-box` in Safari and Chrome
+ *    (include `-moz` to future-proof).
+ */
+
+input[type="search"] {
+  -webkit-appearance: textfield; /* 1 */
+  -moz-box-sizing: content-box;
+  -webkit-box-sizing: content-box; /* 2 */
+  box-sizing: content-box;
+}
+
+/**
+ * Remove inner padding and search cancel button in Safari and Chrome on OS X.
+ * Safari (but not Chrome) clips the cancel button when the search input has
+ * padding (and `textfield` appearance).
+ */
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+  -webkit-appearance: none;
+}
+
+/**
+ * Define consistent border, margin, and padding.
+ */
+
+fieldset {
+  border: 1px solid #c0c0c0;
+  margin: 0 2px;
+  padding: 0.35em 0.625em 0.75em;
+}
+
+/**
+ * 1. Correct `color` not being inherited in IE 8/9/10/11.
+ * 2. Remove padding so people aren't caught out if they zero out fieldsets.
+ */
+
+legend {
+  border: 0; /* 1 */
+  padding: 0; /* 2 */
+}
+
+/**
+ * Remove default vertical scrollbar in IE 8/9/10/11.
+ */
+
+textarea {
+  overflow: auto;
+}
+
+/**
+ * Don't inherit the `font-weight` (applied by a rule above).
+ * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
+ */
+
+optgroup {
+  font-weight: bold;
+}
+
+/* Tables
+   ========================================================================== */
+
+/**
+ * Remove most spacing between table cells.
+ */
+
+table {
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+
+td,
+th {
+  padding: 0;
+}