diff --git a/website/ads.txt b/website/ads.txt
new file mode 100644
index 000000000..0a7f85be0
--- /dev/null
+++ b/website/ads.txt
@@ -0,0 +1 @@
+google.com, pub-6535472412829264, DIRECT, f08c47fec0942fa0
diff --git a/website/apple-touch-icon.png b/website/apple-touch-icon.png
new file mode 100644
index 000000000..bfff1b75c
Binary files /dev/null and b/website/apple-touch-icon.png differ
diff --git a/website/autodownload.php b/website/autodownload.php
new file mode 100644
index 000000000..e9522844e
--- /dev/null
+++ b/website/autodownload.php
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+ Now downloading a pretty cool pokemon simulator... at least I think it's cool... (click if you're having trouble)
+
+
+
diff --git a/website/cms/.npmrc b/website/cms/.npmrc
new file mode 100644
index 000000000..43c97e719
--- /dev/null
+++ b/website/cms/.npmrc
@@ -0,0 +1 @@
+package-lock=false
diff --git a/website/cms/build b/website/cms/build
new file mode 100755
index 000000000..6268befd9
--- /dev/null
+++ b/website/cms/build
@@ -0,0 +1,45 @@
+#!/usr/bin/env node
+'use strict';
+
+const fs = require('fs');
+const showdown = require('showdown');
+const converter = new showdown.Converter({
+ tables: true,
+ simpleLineBreaks: true,
+ requireSpaceBeforeHeadingText: true,
+ simplifiedAutoLink: true,
+ literalMidWordUnderscores: true,
+ literalMidWordAsterisks: true,
+ openLinksInNewWindow: true,
+});
+
+process.chdir(__dirname);
+
+const files = fs.readdirSync('../pages/');
+const template = '' + fs.readFileSync('template.html');
+
+for (const file of files) {
+ if (!file.endsWith('.md')) continue;
+ if (/[A-Z]/.test(file)) continue;
+ let buf = '' + fs.readFileSync('../pages/' + file);
+ const name = file.slice(0, -3);
+ const nlIndex = buf.indexOf('\n');
+ const title = buf.slice(2, nlIndex);
+ const secondHashIndex = buf.indexOf('\n# ');
+ if (secondHashIndex > 0 && buf.slice(nlIndex, secondHashIndex).trim() === '') {
+ buf = buf.slice(secondHashIndex + 1);
+ }
+ buf = converter.makeHtml(buf);
+ buf = buf.replace(/