diff --git a/.gitignore b/.gitignore
index 9884e6a731..e69de29bb2 100644
Binary files a/.gitignore and b/.gitignore differ
diff --git a/.new-footer-server.js b/.new-footer-server.js
new file mode 100644
index 0000000000..58f97a009e
--- /dev/null
+++ b/.new-footer-server.js
@@ -0,0 +1,51 @@
+const http = require('http');
+const fs = require('fs');
+const path = require('path');
+
+const root = path.resolve(__dirname);
+const types = {
+ '.html': 'text/html; charset=utf-8',
+ '.css': 'text/css; charset=utf-8',
+ '.js': 'application/javascript; charset=utf-8',
+ '.json': 'application/json; charset=utf-8',
+ '.png': 'image/png',
+ '.jpg': 'image/jpeg',
+ '.jpeg': 'image/jpeg',
+ '.svg': 'image/svg+xml',
+ '.webmanifest': 'application/manifest+json',
+ '.xml': 'application/xml; charset=utf-8',
+ '.txt': 'text/plain; charset=utf-8',
+};
+
+http.createServer((req, res) => {
+ try {
+ const url = new URL(req.url || '/', 'http://127.0.0.1:5000');
+ let pathname = decodeURIComponent(url.pathname);
+ if (pathname === '/') pathname = '/index.html';
+
+ const file = path.resolve(root, `.${pathname}`);
+
+ // FIX: Path traversal security fix
+ const relative = path.relative(root, file);
+ if (relative.startsWith('..') || path.isAbsolute(relative)) {
+ res.writeHead(403);
+ res.end('Forbidden');
+ return;
+ }
+
+ fs.readFile(file, (err, data) => {
+ if (err) {
+ res.writeHead(404);
+ res.end('Not found');
+ return;
+ }
+
+ res.writeHead(200, { 'Content-Type': types[path.extname(file).toLowerCase()] || 'application/octet-stream' });
+ res.end(data);
+ });
+ } catch (err) {
+ // FIX: Prevents unhandled crashes from malformed URI component parameters
+ res.writeHead(400);
+ res.end('Bad Request: Malformed URL');
+ }
+}).listen(5000, '127.0.0.1');
diff --git a/index.html b/index.html
index 46da15d130..112d5d73ef 100644
--- a/index.html
+++ b/index.html
@@ -1299,7 +1299,7 @@
schedule
Timeline
-
diff --git a/src/components/footer.html b/src/components/footer.html
index ab221426f0..a0dfbaea1b 100644
--- a/src/components/footer.html
+++ b/src/components/footer.html
@@ -1,23 +1,22 @@
-