diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000..e4ef3e7
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,13 @@
+# This file is a template, and might need editing before it works on your project.
+# Full project: https://gitlab.com/pages/plain-html
+pages:
+ stage: deploy
+ script:
+ - mkdir public
+ - cp -r cp -r website/* public/
+ - mv .public public
+ artifacts:
+ paths:
+ - public
+ only:
+ - main
diff --git a/website/.gitignore b/website/.gitignore
new file mode 100644
index 0000000..600d2d3
--- /dev/null
+++ b/website/.gitignore
@@ -0,0 +1 @@
+.vscode
\ No newline at end of file
diff --git a/website/LICENSE b/website/LICENSE
new file mode 100644
index 0000000..2a6a69b
--- /dev/null
+++ b/website/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 2 Chainz Rest API
+
+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/css/mvp.css b/website/css/mvp.css
new file mode 100644
index 0000000..f7e4e05
--- /dev/null
+++ b/website/css/mvp.css
@@ -0,0 +1,448 @@
+/* MVP.css v1.6.2 - https://github.com/andybrewer/mvp */
+
+:root {
+ --border-radius: 5px;
+ --box-shadow: 2px 2px 10px;
+ --color: #118bee;
+ --color-accent: #118bee15;
+ --color-bg: #fff;
+ --color-bg-secondary: #e9e9e9;
+ --color-secondary: #920de9;
+ --color-secondary-accent: #920de90b;
+ --color-shadow: #f4f4f4;
+ --color-text: #000;
+ --color-text-secondary: #999;
+ --font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ --hover-brightness: 1.2;
+ --justify-important: center;
+ --justify-normal: left;
+ --line-height: 1.5;
+ --width-card: 285px;
+ --width-card-medium: 460px;
+ --width-card-wide: 800px;
+ --width-content: 1080px;
+}
+
+/*
+@media (prefers-color-scheme: dark) {
+ :root {
+ --color: #0097fc;
+ --color-accent: #0097fc4f;
+ --color-bg: #333;
+ --color-bg-secondary: #555;
+ --color-secondary: #e20de9;
+ --color-secondary-accent: #e20de94f;
+ --color-shadow: #bbbbbb20;
+ --color-text: #f7f7f7;
+ --color-text-secondary: #aaa;
+ }
+}
+*/
+
+/* Layout */
+article aside {
+ background: var(--color-secondary-accent);
+ border-left: 4px solid var(--color-secondary);
+ padding: 0.01rem 0.8rem;
+}
+
+body {
+ background: var(--color-bg);
+ color: var(--color-text);
+ font-family: var(--font-family);
+ line-height: var(--line-height);
+ margin: 0;
+ overflow-x: hidden;
+ padding: 1rem 0;
+}
+
+footer,
+header,
+main {
+ margin: 0 auto;
+ max-width: var(--width-content);
+ padding: 2rem 1rem;
+}
+
+hr {
+ background-color: var(--color-bg-secondary);
+ border: none;
+ height: 1px;
+ margin: 4rem 0;
+}
+
+section {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: var(--justify-important);
+}
+
+section aside {
+ border: 1px solid var(--color-bg-secondary);
+ border-radius: var(--border-radius);
+ box-shadow: var(--box-shadow) var(--color-shadow);
+ margin: 1rem;
+ padding: 1.25rem;
+ width: var(--width-card);
+}
+
+section aside:hover {
+ box-shadow: var(--box-shadow) var(--color-bg-secondary);
+}
+
+section aside img {
+ max-width: 100%;
+}
+
+[hidden] {
+ display: none;
+}
+
+/* Headers */
+article header,
+div header,
+main header {
+ padding-top: 0;
+}
+
+header {
+ text-align: var(--justify-important);
+}
+
+header a b,
+header a em,
+header a i,
+header a strong {
+ margin-left: 0.5rem;
+ margin-right: 0.5rem;
+}
+
+header nav img {
+ margin: 1rem 0;
+}
+
+section header {
+ padding-top: 0;
+ width: 100%;
+}
+
+/* Nav */
+nav {
+ align-items: center;
+ display: flex;
+ font-weight: bold;
+ justify-content: space-between;
+ margin-bottom: 7rem;
+}
+
+nav ul {
+ list-style: none;
+ padding: 0;
+}
+
+nav ul li {
+ display: inline-block;
+ margin: 0 0.5rem;
+ position: relative;
+ text-align: left;
+}
+
+/* Nav Dropdown */
+nav ul li:hover ul {
+ display: block;
+}
+
+nav ul li ul {
+ background: var(--color-bg);
+ border: 1px solid var(--color-bg-secondary);
+ border-radius: var(--border-radius);
+ box-shadow: var(--box-shadow) var(--color-shadow);
+ display: none;
+ height: auto;
+ left: -2px;
+ padding: .5rem 1rem;
+ position: absolute;
+ top: 1.7rem;
+ white-space: nowrap;
+ width: auto;
+}
+
+nav ul li ul li,
+nav ul li ul li a {
+ display: block;
+}
+
+/* Typography */
+code,
+samp {
+ background-color: var(--color-accent);
+ border-radius: var(--border-radius);
+ color: var(--color-text);
+ display: inline-block;
+ margin: 0 0.1rem;
+ padding: 0 0.5rem;
+}
+
+details {
+ margin: 1.3rem 0;
+}
+
+details summary {
+ font-weight: bold;
+ cursor: pointer;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ line-height: var(--line-height);
+}
+
+mark {
+ padding: 0.1rem;
+}
+
+ol li,
+ul li {
+ padding: 0.2rem 0;
+}
+
+p {
+ margin: 0.75rem 0;
+ padding: 0;
+}
+
+pre {
+ margin: 1rem 0;
+ max-width: var(--width-card-wide);
+ padding: 1rem 0;
+}
+
+pre code,
+pre samp {
+ display: block;
+ max-width: var(--width-card-wide);
+ padding: 0.5rem 2rem;
+ white-space: pre-wrap;
+}
+
+small {
+ color: var(--color-text-secondary);
+}
+
+sup {
+ background-color: var(--color-secondary);
+ border-radius: var(--border-radius);
+ color: var(--color-bg);
+ font-size: xx-small;
+ font-weight: bold;
+ margin: 0.2rem;
+ padding: 0.2rem 0.3rem;
+ position: relative;
+ top: -2px;
+}
+
+/* Links */
+a {
+ color: var(--color-secondary);
+ display: inline-block;
+ font-weight: bold;
+ text-decoration: none;
+}
+
+a:hover {
+ filter: brightness(var(--hover-brightness));
+ text-decoration: underline;
+}
+
+a b,
+a em,
+a i,
+a strong,
+button {
+ border-radius: var(--border-radius);
+ display: inline-block;
+ font-size: medium;
+ font-weight: bold;
+ line-height: var(--line-height);
+ margin: 0.5rem 0;
+ padding: 1rem 2rem;
+}
+
+button {
+ font-family: var(--font-family);
+}
+
+button:hover {
+ cursor: pointer;
+ filter: brightness(var(--hover-brightness));
+}
+
+a b,
+a strong,
+button {
+ background-color: var(--color);
+ border: 2px solid var(--color);
+ color: var(--color-bg);
+}
+
+a em,
+a i {
+ border: 2px solid var(--color);
+ border-radius: var(--border-radius);
+ color: var(--color);
+ display: inline-block;
+ padding: 1rem 2rem;
+}
+
+/* Images */
+figure {
+ margin: 0;
+ padding: 0;
+}
+
+figure img {
+ max-width: 100%;
+}
+
+figure figcaption {
+ color: var(--color-text-secondary);
+}
+
+/* Forms */
+
+button:disabled,
+input:disabled {
+ background: var(--color-bg-secondary);
+ border-color: var(--color-bg-secondary);
+ color: var(--color-text-secondary);
+ cursor: not-allowed;
+}
+
+button[disabled]:hover {
+ filter: none;
+}
+
+form {
+ border: 1px solid var(--color-bg-secondary);
+ border-radius: var(--border-radius);
+ box-shadow: var(--box-shadow) var(--color-shadow);
+ display: block;
+ max-width: var(--width-card-wide);
+ min-width: var(--width-card);
+ padding: 1.5rem;
+ text-align: var(--justify-normal);
+}
+
+form header {
+ margin: 1.5rem 0;
+ padding: 1.5rem 0;
+}
+
+input,
+label,
+select,
+textarea {
+ display: block;
+ font-size: inherit;
+ max-width: var(--width-card-wide);
+}
+
+input[type="checkbox"],
+input[type="radio"] {
+ display: inline-block;
+}
+
+input[type="checkbox"]+label,
+input[type="radio"]+label {
+ display: inline-block;
+ font-weight: normal;
+ position: relative;
+ top: 1px;
+}
+
+input,
+select,
+textarea {
+ border: 1px solid var(--color-bg-secondary);
+ border-radius: var(--border-radius);
+ margin-bottom: 1rem;
+ padding: 0.4rem 0.8rem;
+}
+
+input[readonly],
+textarea[readonly] {
+ background-color: var(--color-bg-secondary);
+}
+
+label {
+ font-weight: bold;
+ margin-bottom: 0.2rem;
+}
+
+/* Tables */
+table {
+ border: 1px solid var(--color-bg-secondary);
+ border-radius: var(--border-radius);
+ border-spacing: 0;
+ display: inline-block;
+ max-width: 100%;
+ overflow-x: auto;
+ padding: 0;
+ white-space: nowrap;
+}
+
+table td,
+table th,
+table tr {
+ padding: 0.4rem 0.8rem;
+ text-align: var(--justify-important);
+}
+
+table thead {
+ background-color: var(--color);
+ border-collapse: collapse;
+ border-radius: var(--border-radius);
+ color: var(--color-bg);
+ margin: 0;
+ padding: 0;
+}
+
+table thead th:first-child {
+ border-top-left-radius: var(--border-radius);
+}
+
+table thead th:last-child {
+ border-top-right-radius: var(--border-radius);
+}
+
+table thead th:first-child,
+table tr td:first-child {
+ text-align: var(--justify-normal);
+}
+
+table tr:nth-child(even) {
+ background-color: var(--color-accent);
+}
+
+/* Quotes */
+blockquote {
+ display: block;
+ font-size: x-large;
+ line-height: var(--line-height);
+ margin: 1rem auto;
+ max-width: var(--width-card-medium);
+ padding: 1.5rem 1rem;
+ text-align: var(--justify-important);
+}
+
+blockquote footer {
+ color: var(--color-text-secondary);
+ display: block;
+ font-size: small;
+ line-height: var(--line-height);
+ padding: 1.5rem 0;
+}
\ No newline at end of file
diff --git a/website/favicon-16x16.png b/website/favicon-16x16.png
new file mode 100644
index 0000000..0dd5c7e
Binary files /dev/null and b/website/favicon-16x16.png differ
diff --git a/website/favicon-32x32.png b/website/favicon-32x32.png
new file mode 100644
index 0000000..1c86e14
Binary files /dev/null and b/website/favicon-32x32.png differ
diff --git a/website/favicon.ico b/website/favicon.ico
new file mode 100644
index 0000000..2f58d74
Binary files /dev/null and b/website/favicon.ico differ
diff --git a/website/index.html b/website/index.html
new file mode 100644
index 0000000..9a92b08
--- /dev/null
+++ b/website/index.html
@@ -0,0 +1,300 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2chainz.ansonbiggs.com
+
+
+
+
+
+
+
+
+ Quote
+
+
+ Returns a random 2 Chainz Quote in json
format like the
+ following example:
+
+
+
+ send a get
request to
+ https://chainz-rest.azurewebsites.net/quote
+
+
+ {
+ "quote": "I got a pocket full of money, it got me walking all slew-foot"
+ }
+
+
+ Parameters
+
+
+ This endpoint also supports an optional batch
parameter
+ to get more than one quote per request. Maximum quotes that the
+ endpoint will return is the amount of quotes in
+ quotes.py
+ and is subject to change. An example return from
+
+ https://chainz-rest.azurewebsites.net/quote?batch=2
+
+
+ {
+ "quotes": [
+ "I'm in the kitchen. Yams errrrrwhere.",
+ "Started from the trap, now I rap"
+ ]
+ }
+
+
+
+ Alias
+
+ Returns a random 2 Chainz alias in json
format. The
+ return values are weighted and a full list can be seen in
+ aliases.py .
+
+
+ send a get
request to
+ https://chainz-rest.azurewebsites.net/alias
+
+ {
+ "alias": "Dos Cadenas"
+ }
+
+
+
+
+
+ Projects built using 2chainz.ansonbiggs.com (Your project could be here!)
+
+
+
+
+
+ An inline Telegram bot that sends a random 2 Chainz Quote. Hosted on
+ a
+ DigitalOcean Kubernetes
+ Cluster.
+
+ Source Code
+
+
+
+
+
+ A Twitter bot that posts weekly 2 Chainz Quotes. Built with Azure
+ Serverless Functions and Python.
+
+ Source Code
+
+
+
+
+
+
+ Frequently Asked Questions
+
+
+
+ Do I need an API key or is this API rate limited?
+
+ No, the API is totally free and unlimited. However, its being hosted
+ by a college student so be nice.
+
+
+
+
+ Does 2 Chainz know about this?
+
+ Probably not.
+
+
+
+
+
+
+
+
+
+
diff --git a/website/js/index.js b/website/js/index.js
new file mode 100644
index 0000000..6236b18
--- /dev/null
+++ b/website/js/index.js
@@ -0,0 +1,16 @@
+getQuote();
+
+function getQuote() {
+ fetch("https://api.chainz.rest/quote", { method: "GET" })
+ .then(resp => resp.json())
+ .then(function(data) {
+ document.getElementById("quote").innerHTML = data.quote;
+
+ const tweet = encodeURIComponent(
+ `"${data.quote}" -@2chainz via https://2.chainz.rest`
+ );
+ document.getElementById(
+ "tweet"
+ ).href = `https://twitter.com/intent/tweet?text=${tweet}`;
+ });
+}
diff --git a/website/plain.html b/website/plain.html
new file mode 100644
index 0000000..18cbe28
--- /dev/null
+++ b/website/plain.html
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2.chainz.rest
+
+
+
+
+ Make an Asian want hibachi
+
+
+
+
+
+
+