diff --git a/readme.md b/README.md
similarity index 100%
rename from readme.md
rename to README.md
diff --git a/data/awshit.png b/data/awshit.png
deleted file mode 100644
index 3076374..0000000
Binary files a/data/awshit.png and /dev/null differ
diff --git a/data/bean.webp b/data/bean.webp
deleted file mode 100644
index 554b2c5..0000000
Binary files a/data/bean.webp and /dev/null differ
diff --git a/data/bisexual.webp b/data/bisexual.webp
deleted file mode 100644
index a17a418..0000000
Binary files a/data/bisexual.webp and /dev/null differ
diff --git a/data/counter.png b/data/counter.png
deleted file mode 100644
index 5bfd2f0..0000000
Binary files a/data/counter.png and /dev/null differ
diff --git a/data/cursor.png b/data/cursor.png
deleted file mode 100644
index 7dde816..0000000
Binary files a/data/cursor.png and /dev/null differ
diff --git a/data/election.png b/data/election.png
deleted file mode 100644
index f10ba68..0000000
Binary files a/data/election.png and /dev/null differ
diff --git a/data/girl.png b/data/girl.png
deleted file mode 100644
index 9a45223..0000000
Binary files a/data/girl.png and /dev/null differ
diff --git a/data/gracies.png b/data/gracies.png
deleted file mode 100644
index 5c37724..0000000
Binary files a/data/gracies.png and /dev/null differ
diff --git a/data/obama.png b/data/obama.png
deleted file mode 100644
index 61ceb68..0000000
Binary files a/data/obama.png and /dev/null differ
diff --git a/data/onion.webp b/data/onion.webp
deleted file mode 100644
index f2e05fc..0000000
Binary files a/data/onion.webp and /dev/null differ
diff --git a/data/pepsi.png b/data/pepsi.png
deleted file mode 100644
index 9ed6667..0000000
Binary files a/data/pepsi.png and /dev/null differ
diff --git a/data/phone.webp b/data/phone.webp
deleted file mode 100644
index 8fe9a6a..0000000
Binary files a/data/phone.webp and /dev/null differ
diff --git a/data/rats.png b/data/rats.png
deleted file mode 100644
index bac5c06..0000000
Binary files a/data/rats.png and /dev/null differ
diff --git a/data/recharge.webp b/data/recharge.webp
deleted file mode 100644
index ac7cf47..0000000
Binary files a/data/recharge.webp and /dev/null differ
diff --git a/data/rit.webp b/data/rit.webp
deleted file mode 100644
index b5086c8..0000000
Binary files a/data/rit.webp and /dev/null differ
diff --git a/data/roo.webp b/data/roo.webp
deleted file mode 100644
index e4c443f..0000000
Binary files a/data/roo.webp and /dev/null differ
diff --git a/data/silence.webp b/data/silence.webp
deleted file mode 100644
index 614f488..0000000
Binary files a/data/silence.webp and /dev/null differ
diff --git a/data/twitter.webp b/data/twitter.webp
deleted file mode 100644
index 90e4aa7..0000000
Binary files a/data/twitter.webp and /dev/null differ
diff --git a/data/ul.png b/data/ul.png
deleted file mode 100644
index 6a4063d..0000000
Binary files a/data/ul.png and /dev/null differ
diff --git a/data/umbrella.webp b/data/umbrella.webp
deleted file mode 100644
index 1e87b3d..0000000
Binary files a/data/umbrella.webp and /dev/null differ
diff --git a/index.html b/index.html
deleted file mode 100644
index 5aca8f7..0000000
--- a/index.html
+++ /dev/null
@@ -1,152 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-    <head>
-        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-        <meta name="viewport" content="width=device-width, initial-scale=1.0">
-        <link rel="stylesheet" href="style.css">
-        <title>munson</title>
-    </head>
-    <body><div><div><div id="mainBod">
-        <menu class="flashy"></menu>
-        <p class="title">
-            <span style="display:inline-block;animation:1s title linear infinite;animation-delay:-1.42s">r</span>
-            <span style="display:inline-block;animation:1s title linear infinite;animation-delay:-1.22s">i</span>
-            <span style="display:inline-block;animation:1s title linear infinite;animation-delay:-1.01s">t</span>
-            <span style="display:inline-block;animation:1s title linear infinite;animation-delay:-0.81s">.</span>
-            <span style="display:inline-block;animation:1s title linear infinite;animation-delay:-0.61s">w</span>
-            <span style="display:inline-block;animation:1s title linear infinite;animation-delay:-0.41s">t</span>
-            <span style="display:inline-block;animation:1s title linear infinite;animation-delay:-0.21s">f</span>
-        </p>
-        <table class="top">
-            <tr>
-                <td style="animation-delay:-0.61s">
-                    <a href="http://munsonmakesamillion.com/" target="_blank">
-                        💸 Munson Money 💸
-                    </a>
-                </td>
-                <td style="animation-delay:0s">
-                    <a href="https://www.rit.edu/news/umbrella-mistaken-as-weapon-campus" target="_blank">
-                        Got an umbrella? ☂️
-                    </a>
-                </td>
-                <td style="animation-delay:+0.21s">
-                    <a href="data/gracies.png" target="_blank">
-                        Gracies dinner time theater
-                    </a>
-                </td>
-            </tr>
-        </table> 
-        <marquee behavior="alternate">
-            <img src="data/awshit.png" loading="lazy"/>
-            <img src="data/counter.png" loading="lazy"/>
-            <img src="data/election.png" loading="lazy"/>
-            <img src="data/girl.png" loading="lazy"/>
-            <img src="data/pepsi.png" loading="lazy"/>
-            <img src="data/rats.png" loading="lazy"/>
-            <img src="data/roo.webp" loading="lazy"/>
-            <img src="data/bisexual.webp" loading="lazy"/>
-            <img src="data/onion.webp" loading="lazy"/>
-            <img src="data/twitter.webp" loading="lazy"/>
-            <img src="data/silence.webp" loading="lazy" />
-            <img src="data/recharge.webp" loading="lazy" />
-            <img src="data/phone.webp" loading="lazy" />
-            <img src="data/obama.png" loading="lazy" />
-            <img src="data/bean.webp" loading="lazy" />
-        </marquee>
-        <p class="sprinkler">
-            Call 1-800-1ST-YEAR to get a sprinkler to go off in a dorm near you!
-        </p>
-        <div class="center">
-            <div id="webring">
-                <p>
-                    The
-                    <a class="spread" href="https://wr.stationery.faith">Stationery</a>
-                    Webring
-                </p>
-                <div class="links">
-                    <a href="https://wr.stationery.faith/prev/rit.wtf">&lt; Prev</a>
-                    <a href="https://wr.stationery.faith/random">Random</a>
-                    <a href="https://wr.stationery.faith/next/rit.wtf">Next &gt;</a>
-                </div>
-            </div>
-        </div>
-        <p id="middle">
-            important stuff
-        </p>
-        <table class="middle">
-            <tr>
-                <td>
-                    <a href="http://rochesterapex.com/" target="_blank">
-                        <img src="data/housing.gif"/>
-                    </a>
-                </td>
-            </tr>
-            <tr>
-                <td>
-                    <a href="https://www.reveddit.com/v/rit/comments/z719e8/theyre_lying_to_us_about_the_females_here_blowing/?utm_source=share&utm_medium=ios_app&utm_name=iossmf" target="_blank">
-                        <img src="data/counting.gif"/>
-                    </a>
-                </td>
-            </tr>
-            <tr>
-                <td>
-                    <a href="https://www.democratandchronicle.com/story/news/2021/08/31/peter-kiwitt-former-rit-professor-sex-trafficking/5589597001/" target="_blank">
-                        <img src="data/education.gif"/>
-                    </a>
-                </td>
-            </tr>
-            <tr>
-                <td>
-                    <a href="https://www.rit.edu/fa/diningservices/gracies#1" target="_blank">
-                        <img src="data/food.gif"/>
-                    </a>
-                </td>
-            </tr>
-        </table>
-        <iframe src="https://john.citrons.xyz/embed?ref=rit.wtf" class="john"></iframe>
-        <p class=munson>
-            The munson art gallery
-        </p>
-        <div id="munson">
-            <img src="data/munson/1.jpg" loading="lazy"/>
-            <img src="data/munson/3.jpg" loading="lazy"/>
-            <img src="data/munson/4.jpg" loading="lazy"/>
-            <img src="data/munson/5.jpg" loading="lazy"/>
-            <img src="data/munson/6.jpg" loading="lazy"/>
-            <img src="data/munson/7.jpg" loading="lazy"/>
-            <img src="data/munson/8.jpg" loading="lazy"/>
-            <img src="data/munson/9.jpg" loading="lazy"/>
-            <img src="data/munson/10.jpg" loading="lazy"/>
-        </div>
-        <div id="batterys">
-            <p style="--rot: 0deg;">Lithium Ion Battery's</p>
-            <p style="--rot: 270deg;">Lithium Ion Battery's</p>
-        </div>
-        <div id="batterys" style="margin-bottom: 30vw;">
-            <img style="--rot: 0deg;" src="data/battery.jpg" loading="lazy"/>
-            <img style="--rot: 270deg;" src="data/battery.jpg" loading="lazy"/>
-        </div>
-        <div class="thicc"></div>
-        <div class="buttons">
-            <img src="data/apocalypse.gif" loading="lazy" class="clickable" onclick="document.documentElement.classList.toggle('wank')"/>
-            <img src="data/amd.gif" loading="lazy"/>
-            <img src="data/dither.gif" loading="lazy" class="clickable" onclick="document.documentElement.classList.toggle('dither')"/>
-            <a class="clickable" href="https://validator.w3.org/nu/?doc=https%3A%2F%2Frit.wtf" target="_blank">
-                <img src="data/html.gif" loading="lazy"/>
-            </a>
-            <img src="data/ie.gif" loading="lazy"  class="clickable" onclick="document.documentElement.classList.toggle('flash')"/>
-            <img src="data/netscape.gif" loading="lazy"/>
-            <a class="clickable" href="https://g.freya.cat/freya/rit.wtf" target="_blank">
-                <img src="data/free.gif" loading="lazy"/>
-            </a>
-        </div>
-        <footer>
-            <video autoplay muted loop>
-                <source src="data/raiders.webm" type="video/mp4">
-            </video>
-            <video autoplay muted loop>
-                <source src="data/munson.mp4" type="video/mp4">
-            </video>
-        </footer>
-    </div></div></div></div></body>
-</html>
diff --git a/index.php b/index.php
new file mode 100644
index 0000000..447b300
--- /dev/null
+++ b/index.php
@@ -0,0 +1,166 @@
+<?php
+/// RIT.WTF --- Daddy munson
+/// Copyright © 2024 Freya Murphy <freya@freyacat.org>
+
+
+// Create global assets object
+
+function __make_assets(): object {
+	$assets = array(
+		// 80x33 buttons
+		'buttons' => array(
+			'amd' => 'amd.gif',
+			'apocalypse' => 'apocalypse.gif',
+			'dither' => 'dither.gif',
+			'download' => 'download.gif',
+			'html' => 'html.gif',
+			'ie' => 'ie.gif',
+			'netscape' => 'netscape.gif',
+		),
+		// css styles
+		'css' => array(
+			'main' => 'main.css', // main style
+			'anim' => 'anim.css', // animations
+
+			'home' => 'home.css',
+			'fire' => 'fire.css',
+			'gallery' => 'gallery.css',
+			'error' => 'error.css',
+		),
+		// why does rit keep catching on fire!
+		'fires' => array(
+			'battery' => 'battery.jpg',
+			'gosnell' => 'gosnell.jpg',
+			'sol' => 'sol.jpg',
+			'stadium' => 'stadium.jpg',
+		),
+		// standard imaged images
+		'images' => array(
+			'rit' => 'rit.jpg',
+			'rotchie' => 'rotchie.jpg',
+		),
+		// goofy ahh memes
+		'memes' => array(
+			'awshit' => 'awshit.jpg',
+			'bean' => 'bean.jpg',
+			'bisexual' => 'bisexual.jpg',
+			'counter' => 'counter.jpg',
+			'election' => 'election.jpg',
+			'girl' => 'girl.jpg',
+			'gracies' => 'gracies.jpg',
+			'obama' => 'obama.jpg',
+			'onion' => 'onion.jpg',
+			'pepsi' => 'pepsi.jpg',
+			'phone' => 'phone.jpg',
+			'rats' => 'rats.jpg',
+			'recharge' => 'recharge.jpg',
+			'roo' => 'roo.jpg',
+			'silence' => 'silence.jpg',
+			'twitter' => 'twitter.jpg',
+			'ul' => 'ul.jpg',
+			'umbrella' => 'umbrella.jpg',
+		),
+		// munson art gallery
+		'munson' => array(
+			'1.jpg',
+			'3.jpg',
+			'4.jpg',
+			'5.jpg',
+			'6.jpg',
+			'7.jpg',
+			'8.jpg',
+			'9.jpg',
+			'10.jpg',
+		),
+		// sanders art gallery
+		'sanders' => array(
+			'1.jpg',
+			'2.jpg',
+			'3.jpg',
+		),
+		// text gifs
+		'text' => array(
+			'counting' => 'counting.gif',
+			'education' => 'education.gif',
+			'food' => 'food.gif',
+			'housing' => 'housing.gif',
+		),
+		// feature films
+		'videos' => array(
+			'review' => '2012 - Rap in Review.mp4',
+			'jedi' => '2015 - The Return of the Holiday Rap: A Jedi\'s Chant.mp4',
+			'brick' => '2022 - In the Brick of Time.mp4',
+			'raiders' => '2023 - Raiders of the Golden Brick.mp4',
+			'wizard' => '2024 - The Wonderful Wizard of RIT.mp4',
+		),
+	);
+
+	function update_paths(&$data, $path) {
+		foreach ($data as $key => $value) {
+			if (is_array($value)) {
+				update_paths($value, "$path/$key");
+				$data[$key] = $value;
+			} else {
+				$data[$key] = "$path/$value?rev=1";
+			}
+		}
+		$data = (object) $data;
+	}
+	update_paths($assets, 'public');
+	return $assets;
+}
+
+define('ASSETS', __make_assets());
+
+// Helper functions
+
+// Parse request route
+
+function __get_route() {
+	$method = $_SERVER['REQUEST_METHOD'];
+	$uri_str = $_SERVER['REQUEST_URI'];
+	$uri = parse_url($uri_str);
+
+	$path = '/';
+	if ($uri && array_key_exists('path', $uri))
+		$path = $uri['path'];
+
+	return [$method, $path];
+}
+
+define('ROUTE', __get_route());
+
+// Pages
+
+function home() {
+	$css = ASSETS->css->home;
+	include('web/home.php');
+}
+
+function fire() {
+	$css = ASSETS->css->fire;
+	include('web/fire.php');
+}
+
+function gallery() {
+	$css = ASSETS->css->gallery;
+	include('web/gallery.php');
+}
+
+function error($code) {
+	$css = ASSETS->css->error;
+	include('web/error.php');
+}
+
+// Dispatch
+
+try {
+	match (ROUTE) {
+		['GET', '/'] => home(),
+		['GET', '/fire'] => fire(),
+		['GET', '/gallery'] => gallery(),
+		default => error(404)
+	};
+} catch (Throwable $e) {
+	error(500);
+}
diff --git a/data/amd.gif b/public/buttons/amd.gif
similarity index 100%
rename from data/amd.gif
rename to public/buttons/amd.gif
diff --git a/data/apocalypse.gif b/public/buttons/apocalypse.gif
similarity index 100%
rename from data/apocalypse.gif
rename to public/buttons/apocalypse.gif
diff --git a/data/dither.gif b/public/buttons/dither.gif
similarity index 100%
rename from data/dither.gif
rename to public/buttons/dither.gif
diff --git a/data/free.gif b/public/buttons/download.gif
similarity index 100%
rename from data/free.gif
rename to public/buttons/download.gif
diff --git a/data/html.gif b/public/buttons/html.gif
similarity index 100%
rename from data/html.gif
rename to public/buttons/html.gif
diff --git a/data/ie.gif b/public/buttons/ie.gif
similarity index 100%
rename from data/ie.gif
rename to public/buttons/ie.gif
diff --git a/data/netscape.gif b/public/buttons/netscape.gif
similarity index 100%
rename from data/netscape.gif
rename to public/buttons/netscape.gif
diff --git a/public/css/anim.css b/public/css/anim.css
new file mode 100644
index 0000000..d46feb4
--- /dev/null
+++ b/public/css/anim.css
@@ -0,0 +1,115 @@
+
+/* used for background */
+@keyframes diag {
+    from {
+      background-position: 0 0;
+    }
+    to {
+      background-position: 10% 10%;
+    }
+}
+
+/* used for title */
+@keyframes bounce {
+    0%,
+    100% {
+     transform:translateY(-25%);
+     animation-timing-function:cubic-bezier(.8,0,1,1)
+    }
+    50% {
+     transform:none;
+     animation-timing-function:cubic-bezier(0,0,.2,1)
+    }
+}
+
+/* used in footer videos */
+@keyframes flip {
+    0%, 100% {
+        transform: rotateY(0deg) rotateX(0deg);
+    }
+    50%  {
+        transform: rotateY(3000deg) rotateX(3000deg);
+    }
+}
+
+/* used in ie button */
+@keyframes strobe {
+    0%, 100% {
+        background-color: rgba(255,0,0,.4);
+    }
+    20% {
+        background-color: rgba(255,255,0,.4);
+    }
+    40% {
+        background-color: rgba(0,255,0,.4);
+    }
+    60% {
+        background-color: rgba(0,255,255,.4);
+    }
+    80% {
+        background-color: rgba(0,0,255,.4);
+    }
+}
+
+/* LITHIUM ION BATTERIES!!! */
+@keyframes cube {
+    from {
+        transform: translateX(-50%) rotateY(var(--rot)) translateZ(calc(var(--width)/2));
+    }
+	to {
+		transform: translateX(-50%) rotateY(calc(var(--rot) + 90deg)) translateZ(calc(var(--width)/2));
+	}
+}
+
+/* used in motd */
+@keyframes flash {
+    50% {
+        opacity: 0;
+    }
+}
+
+@keyframes colorflash {
+    0%, 100%, 49% {
+        border: 5px solid orange;
+        background-color: black;
+        color: orange;
+    }
+    50%, 99% {
+        border: 5px solid black;
+        background-color: orange;
+        color: black;
+    }
+}
+
+@keyframes border {
+    0%,
+    100% {
+        border: 2px solid rgb(255, 0, 0);
+    }
+    33% {
+        border: 2px solid rgb(0, 255, 0);
+    }
+    66% {
+        border: 2px solid rgb(0, 0, 255);
+    }
+}
+
+@keyframes across {
+    0%,
+    100% {
+      transform: translateX(0%);
+    }
+    50% {
+      transform: translateX(calc(80vw - 100%));
+    }
+}
+
+@keyframes scale {
+    from {
+        transform: scale3d(100%, 100%, 100%);
+    }
+    to {
+        transform: scale3d(120%, 120%, 120%);
+    }
+}
+
diff --git a/public/css/error.css b/public/css/error.css
new file mode 100644
index 0000000..b43bb65
--- /dev/null
+++ b/public/css/error.css
@@ -0,0 +1,36 @@
+#error {
+	color: white;
+	margin: 100px 0;
+
+	* {
+		display: block;
+		width: fit-content;
+		margin: 0 auto;
+	}
+
+	.code {
+		color: yellow;
+		font-size: 80px;
+        text-shadow: 0px 0px 0 rgb(240,248,0),
+                     1px 1px 0 rgb(234,242,0),
+                     2px 2px 0 rgb(227,235,0),
+                     3px 3px 0 rgb(221,229,0),
+                     4px 4px 0 rgb(214,222,0),
+                     5px 5px 0 rgb(208,216,0),
+                     6px 6px 0 rgb(201,209,0),
+                     7px 7px 0 rgb(194,202,0),
+                     8px 8px 0 rgb(188,196,0),
+                     9px 9px 0 rgb(181,189,0),
+                     10px 10px 0 rgb(175,183,0),
+                     11px 11px 0 rgb(168,176,0),
+                     12px 12px 0 rgb(161,169,0),
+                     13px 13px 0 rgb(155,163,0),
+                     14px 14px 0 rgb(148,156,0),
+                     15px 15px 0 rgb(142,150,0),
+                     16px 16px 0 rgb(135,143,0),
+                     17px 17px 0 rgb(129,137,0),
+                     18px 18px 0 rgb(122,130,0),
+                     19px 19px 0 rgb(115,123,0),
+                     20px 20px 0 rgb(109,117,0);
+	}
+}
diff --git a/public/css/fire.css b/public/css/fire.css
new file mode 100644
index 0000000..ecf5dff
--- /dev/null
+++ b/public/css/fire.css
@@ -0,0 +1,12 @@
+
+#fires {
+	marquee {
+		margin: 20px auto;
+		display: block;
+
+		img {
+			width: fit-content;
+			height: 400px;
+		}
+	}
+}
diff --git a/public/css/gallery.css b/public/css/gallery.css
new file mode 100644
index 0000000..ff64c88
--- /dev/null
+++ b/public/css/gallery.css
@@ -0,0 +1,41 @@
+.title {
+    text-align: center;
+    width: 80%;
+    font-size: 5vh;
+    padding: 0;
+    margin: 0;
+    margin-bottom: 1em;
+    animation: colorflash 1s linear infinite;
+    margin-left: 10%;
+}
+
+#munson {
+    margin-top: 40px;
+
+    .gallery {
+        display: grid;
+        grid-template-columns: repeat(3, 1fr);
+
+        img {
+            height: 20vh;
+            width: 100%;
+
+            &:hover {
+                animation: scale 0.3s linear;
+                animation-fill-mode: forwards;
+            }
+        }
+    }
+}
+
+#films, #raps {
+    margin-top: 40px;
+
+    video {
+        display: block;
+        margin: 0 auto;
+        padding: 10px;
+        max-width: 900px;
+        width: 80%;
+    }
+}
diff --git a/public/css/home.css b/public/css/home.css
new file mode 100644
index 0000000..1310db1
--- /dev/null
+++ b/public/css/home.css
@@ -0,0 +1,108 @@
+
+#memes {
+    margin-top: 40px;
+
+    img {
+        height: 200px;
+    }
+}
+
+#motd {
+    margin-top: 40px;
+    text-align: center;
+    font-size: 30px;
+    font-weight: 1000;
+    color: aqua;
+    animation: flash 1s linear infinite;
+    background-color: black;
+}
+
+#links {
+    .title {
+        width: fit-content;
+        background-color: black;
+        color: orange;
+        font-size: 30px;
+        margin-left: 10%;
+        margin-bottom: 10px;
+        animation: across 2s linear infinite;
+    }
+
+    .btn {
+        width: 600px;
+        margin: 0 auto;
+
+        img {
+            display: block;
+            margin: 0 auto;
+        }
+    }
+}
+
+#battery {
+    margin: 0 auto;
+    width: fit-content;
+    margin-top: 40px;
+    perspective: infinite;
+
+    * {
+        --width: 500px;
+        width: var(--width);
+    }
+
+    .title, .battery {
+        position: relative;
+
+        >* {
+            position: absolute;
+            left: 50%;
+            animation: cube 2.5s linear infinite;
+        }
+    }
+
+    .title {
+        height: 95px;
+        >* {
+            background-color: #232323;
+            color: #fff;
+            font-size: 40px;
+            text-align: center;
+            text-shadow: 0 0 5px #fff, 0 0 10px #fff, 0 0 15px #fff, 0 0 20px #49ff18, 0 0 30px #49ff18, 0 0 40px #49ff18, 0 0 55px #49ff18, 0 0 75px #49ff18;
+        }
+    }
+
+    .battery {
+        height: 280px;
+    }
+}
+
+#sanders {
+    margin-top: 40px;
+
+    .title {
+        text-align: center;
+        width: 80%;
+        font-size: 5vh;
+        padding: 0;
+        margin: 0;
+        margin-bottom: 1em;
+        animation: colorflash 1s linear infinite;
+        margin-left: 10%;
+    }
+
+    .gallery {
+        display: grid;
+        grid-template-columns: repeat(3, 1fr);
+
+        img {
+            height: 20vh;
+            width: 100%;
+
+            &:hover {
+                animation: scale 0.3s linear;
+                animation-fill-mode: forwards;
+            }
+        }
+    }
+}
+
diff --git a/public/css/main.css b/public/css/main.css
new file mode 100644
index 0000000..c2cba8b
--- /dev/null
+++ b/public/css/main.css
@@ -0,0 +1,177 @@
+/* elements */
+
+html {
+    overflow: auto;
+}
+
+body {
+    margin: 0;
+    min-width: 800px;
+    min-height: 100vh;
+    position: relative;
+    font-family: "Comic Sans", "Comic Sans MS", sans-serif;
+    cursor: url("../images/rotchie.jpg"), auto;
+    background-image: url("../images/rit.jpg");
+    animation: diag 1s linear infinite alternate;
+}
+
+a {
+    color: yellow;
+}
+
+a:hover, [onclick]:hover {
+    cursor: url("../images/cursor.png"), pointer !important;
+}
+
+.btn {
+    background: black;
+    color: yellow;
+    padding: 5px;
+    margin: 5px auto;
+    border: 3px solid yellow;
+    width: fit-content;
+
+    &:hover {
+        background: orange;
+        color: black;
+        border-color: black;
+    }
+}
+
+/* header */
+
+header#header {
+
+    /* goofy bouncy title :3 */
+    div#title {
+        margin-top: 40px;
+        width: 100%;
+        text-align: center;
+        font-size: 75px;
+        color: #f7ff07;
+        font-family: Courier New;
+        text-shadow: 0px 0px 0 rgb(240,248,0),
+                     1px 1px 0 rgb(234,242,0),
+                     2px 2px 0 rgb(227,235,0),
+                     3px 3px 0 rgb(221,229,0),
+                     4px 4px 0 rgb(214,222,0),
+                     5px 5px 0 rgb(208,216,0),
+                     6px 6px 0 rgb(201,209,0),
+                     7px 7px 0 rgb(194,202,0),
+                     8px 8px 0 rgb(188,196,0),
+                     9px 9px 0 rgb(181,189,0),
+                     10px 10px 0 rgb(175,183,0),
+                     11px 11px 0 rgb(168,176,0),
+                     12px 12px 0 rgb(161,169,0),
+                     13px 13px 0 rgb(155,163,0),
+                     14px 14px 0 rgb(148,156,0),
+                     15px 15px 0 rgb(142,150,0),
+                     16px 16px 0 rgb(135,143,0),
+                     17px 17px 0 rgb(129,137,0),
+                     18px 18px 0 rgb(122,130,0),
+                     19px 19px 0 rgb(115,123,0),
+                     20px 20px 0 rgb(109,117,0),
+                     21px 21px 0 rgb(102,110,0),
+                     22px 22px 0 rgb(96,104,0),
+                     23px 23px 0 rgb(89,97,0),
+                     24px 24px 0 rgb(83,91,0),
+                     25px 25px 0 rgb(76,84,0),
+                     26px 26px 0 rgb(69,77,0),
+                     27px 27px 0 rgb(63,71,0),
+                     28px 28px 0 rgb(56,64,0),
+                     29px 29px 0 rgb(50,58,0),
+                     30px 30px 0 rgb(43,51,0),
+                     31px 31px 0 rgb(36,44,0),
+                     32px 32px 0 rgb(30,38,0),
+                     33px 33px 0 rgb(23,31,0),
+                     34px 34px 0 rgb(17,25,0),
+                     35px 35px 0 rgb(10,18,0),
+                     36px 36px 0 rgb(4,12,0),
+                     37px 37px 0 rgb(-3,5,0),
+                     38px 38px  0 rgb(-10,-2,0),
+                     39px 39px 38px rgba(255,0,0,1),
+                     39px 39px 1px rgba(255,0,0,0.5),
+                     0px 0px 38px rgba(255,0,0,.2);
+
+        span {
+            display: inline-block;
+            animation: 1s bounce linear infinite;
+        }
+    }
+
+    /* nav bar */
+    nav#nav {
+        margin-top: 40px;
+        margin-left: auto;
+        margin-right: auto;
+        width: fit-content;
+    }
+
+}
+
+/* footer */
+
+footer#footer {
+    margin-top: 40px;
+
+    #buttons {
+        display: block;
+        margin: 0 auto;
+        width: fit-content;
+
+        img {
+            height: 33px;
+        }
+    }
+
+    #john {
+        display: block;
+        margin: 0 auto;
+        max-width: 732px;
+        height: 94px;
+        width: 100%;
+        border: none;
+        background: white;
+    }
+}
+
+/* dither */
+
+html.dither {
+
+    #ditherMask {
+        background: url("data:image/webp;base64,UklGRjAAAABXRUJQVlA4TCQAAAAvA8AAAIVS27ahb3uzOUmSJoqqrOq6P47of8DQdcprYdP8/VY=");
+        filter: contrast(2000);
+        image-rendering: crisp-edges;
+    }
+
+    #ditherFilter {
+        filter: initial;
+        mix-blend-mode: soft-light;
+        isolation: isolate;
+        image-rendering: initial;
+    }
+}
+
+/* flip */
+
+html.flip {
+    transform: rotateZ(180deg);
+}
+
+/* strobe */
+
+#strobe {
+    pointer-events: none;
+    position: sticky;
+    top: 0;
+    left: 0;
+    height: 100%;
+    width: 100vw;
+}
+
+html.strobe {
+    #strobe {
+        animation: strobe .25s linear infinite;
+    }
+}
diff --git a/data/battery.jpg b/public/fires/battery.jpg
similarity index 100%
rename from data/battery.jpg
rename to public/fires/battery.jpg
diff --git a/public/fires/gosnell.jpg b/public/fires/gosnell.jpg
new file mode 100644
index 0000000..7e737fb
Binary files /dev/null and b/public/fires/gosnell.jpg differ
diff --git a/public/fires/sol.jpg b/public/fires/sol.jpg
new file mode 100644
index 0000000..bc74472
Binary files /dev/null and b/public/fires/sol.jpg differ
diff --git a/public/fires/stadium.jpg b/public/fires/stadium.jpg
new file mode 100644
index 0000000..4adc767
Binary files /dev/null and b/public/fires/stadium.jpg differ
diff --git a/public/images/rit.jpg b/public/images/rit.jpg
new file mode 100644
index 0000000..9b1766f
Binary files /dev/null and b/public/images/rit.jpg differ
diff --git a/data/rotchie.png b/public/images/rotchie.jpg
similarity index 57%
rename from data/rotchie.png
rename to public/images/rotchie.jpg
index 31828ed..ba19441 100644
Binary files a/data/rotchie.png and b/public/images/rotchie.jpg differ
diff --git a/public/memes/awshit.jpg b/public/memes/awshit.jpg
new file mode 100644
index 0000000..6c5f65c
Binary files /dev/null and b/public/memes/awshit.jpg differ
diff --git a/public/memes/bean.jpg b/public/memes/bean.jpg
new file mode 100644
index 0000000..3e1d9ee
Binary files /dev/null and b/public/memes/bean.jpg differ
diff --git a/public/memes/bisexual.jpg b/public/memes/bisexual.jpg
new file mode 100644
index 0000000..1252b7b
Binary files /dev/null and b/public/memes/bisexual.jpg differ
diff --git a/public/memes/counter.jpg b/public/memes/counter.jpg
new file mode 100644
index 0000000..8ba677f
Binary files /dev/null and b/public/memes/counter.jpg differ
diff --git a/public/memes/election.jpg b/public/memes/election.jpg
new file mode 100644
index 0000000..49cff44
Binary files /dev/null and b/public/memes/election.jpg differ
diff --git a/public/memes/girl.jpg b/public/memes/girl.jpg
new file mode 100644
index 0000000..8f7f8f0
Binary files /dev/null and b/public/memes/girl.jpg differ
diff --git a/public/memes/gracies.jpg b/public/memes/gracies.jpg
new file mode 100644
index 0000000..4bf6c07
Binary files /dev/null and b/public/memes/gracies.jpg differ
diff --git a/public/memes/obama.jpg b/public/memes/obama.jpg
new file mode 100644
index 0000000..14c0aa6
Binary files /dev/null and b/public/memes/obama.jpg differ
diff --git a/public/memes/onion.jpg b/public/memes/onion.jpg
new file mode 100644
index 0000000..a2c7587
Binary files /dev/null and b/public/memes/onion.jpg differ
diff --git a/public/memes/pepsi.jpg b/public/memes/pepsi.jpg
new file mode 100644
index 0000000..6e3136f
Binary files /dev/null and b/public/memes/pepsi.jpg differ
diff --git a/public/memes/phone.jpg b/public/memes/phone.jpg
new file mode 100644
index 0000000..ab11938
Binary files /dev/null and b/public/memes/phone.jpg differ
diff --git a/public/memes/rats.jpg b/public/memes/rats.jpg
new file mode 100644
index 0000000..bb34a7d
Binary files /dev/null and b/public/memes/rats.jpg differ
diff --git a/public/memes/recharge.jpg b/public/memes/recharge.jpg
new file mode 100644
index 0000000..1aaf2ea
Binary files /dev/null and b/public/memes/recharge.jpg differ
diff --git a/public/memes/roo.jpg b/public/memes/roo.jpg
new file mode 100644
index 0000000..b6d253c
Binary files /dev/null and b/public/memes/roo.jpg differ
diff --git a/public/memes/silence.jpg b/public/memes/silence.jpg
new file mode 100644
index 0000000..85263d2
Binary files /dev/null and b/public/memes/silence.jpg differ
diff --git a/public/memes/twitter.jpg b/public/memes/twitter.jpg
new file mode 100644
index 0000000..81228b3
Binary files /dev/null and b/public/memes/twitter.jpg differ
diff --git a/public/memes/ul.jpg b/public/memes/ul.jpg
new file mode 100644
index 0000000..c9d0d63
Binary files /dev/null and b/public/memes/ul.jpg differ
diff --git a/public/memes/umbrella.jpg b/public/memes/umbrella.jpg
new file mode 100644
index 0000000..2833327
Binary files /dev/null and b/public/memes/umbrella.jpg differ
diff --git a/data/munson/1.jpg b/public/munson/1.jpg
similarity index 100%
rename from data/munson/1.jpg
rename to public/munson/1.jpg
diff --git a/data/munson/10.jpg b/public/munson/10.jpg
similarity index 100%
rename from data/munson/10.jpg
rename to public/munson/10.jpg
diff --git a/data/munson/3.jpg b/public/munson/3.jpg
similarity index 100%
rename from data/munson/3.jpg
rename to public/munson/3.jpg
diff --git a/data/munson/4.jpg b/public/munson/4.jpg
similarity index 100%
rename from data/munson/4.jpg
rename to public/munson/4.jpg
diff --git a/data/munson/5.jpg b/public/munson/5.jpg
similarity index 100%
rename from data/munson/5.jpg
rename to public/munson/5.jpg
diff --git a/data/munson/6.jpg b/public/munson/6.jpg
similarity index 100%
rename from data/munson/6.jpg
rename to public/munson/6.jpg
diff --git a/data/munson/7.jpg b/public/munson/7.jpg
similarity index 100%
rename from data/munson/7.jpg
rename to public/munson/7.jpg
diff --git a/data/munson/8.jpg b/public/munson/8.jpg
similarity index 100%
rename from data/munson/8.jpg
rename to public/munson/8.jpg
diff --git a/data/munson/9.jpg b/public/munson/9.jpg
similarity index 100%
rename from data/munson/9.jpg
rename to public/munson/9.jpg
diff --git a/public/sanders/1.jpg b/public/sanders/1.jpg
new file mode 100644
index 0000000..cf06886
Binary files /dev/null and b/public/sanders/1.jpg differ
diff --git a/public/sanders/2.jpg b/public/sanders/2.jpg
new file mode 100644
index 0000000..e75954f
Binary files /dev/null and b/public/sanders/2.jpg differ
diff --git a/public/sanders/3.jpg b/public/sanders/3.jpg
new file mode 100644
index 0000000..8c76c43
Binary files /dev/null and b/public/sanders/3.jpg differ
diff --git a/data/counting.gif b/public/text/counting.gif
similarity index 100%
rename from data/counting.gif
rename to public/text/counting.gif
diff --git a/data/education.gif b/public/text/education.gif
similarity index 100%
rename from data/education.gif
rename to public/text/education.gif
diff --git a/data/food.gif b/public/text/food.gif
similarity index 100%
rename from data/food.gif
rename to public/text/food.gif
diff --git a/data/housing.gif b/public/text/housing.gif
similarity index 100%
rename from data/housing.gif
rename to public/text/housing.gif
diff --git a/public/videos/2012 - Rap in Review.mp4 b/public/videos/2012 - Rap in Review.mp4
new file mode 100644
index 0000000..6ebe71f
Binary files /dev/null and b/public/videos/2012 - Rap in Review.mp4 differ
diff --git a/data/raiders.webm b/public/videos/2015 - The Return of the Holiday Rap: A Jedi's Chant.mp4
similarity index 75%
rename from data/raiders.webm
rename to public/videos/2015 - The Return of the Holiday Rap: A Jedi's Chant.mp4
index c462adf..c584476 100644
Binary files a/data/raiders.webm and b/public/videos/2015 - The Return of the Holiday Rap: A Jedi's Chant.mp4 differ
diff --git a/data/munson.mp4 b/public/videos/2022 - In the Brick of Time.mp4
similarity index 80%
rename from data/munson.mp4
rename to public/videos/2022 - In the Brick of Time.mp4
index cc158f5..9de4e8e 100644
Binary files a/data/munson.mp4 and b/public/videos/2022 - In the Brick of Time.mp4 differ
diff --git a/public/videos/2023 - Raiders of the Golden Brick.mp4 b/public/videos/2023 - Raiders of the Golden Brick.mp4
new file mode 100644
index 0000000..9a6cd10
Binary files /dev/null and b/public/videos/2023 - Raiders of the Golden Brick.mp4 differ
diff --git a/public/videos/2024 - The Wonderful Wizard of RIT.mp4 b/public/videos/2024 - The Wonderful Wizard of RIT.mp4
new file mode 100644
index 0000000..c1197a6
Binary files /dev/null and b/public/videos/2024 - The Wonderful Wizard of RIT.mp4 differ
diff --git a/style.css b/style.css
deleted file mode 100644
index 19add7a..0000000
--- a/style.css
+++ /dev/null
@@ -1,450 +0,0 @@
-html, body, #mainBod {
-    margin: 0;
-    padding: 0;
-}
-
-#mainBod {
-    cursor: url("data/rotchie.png"), auto;
-    top: 0; bottom: 0;
-    left: 0; right: 0;
-    overflow: auto;
-    background-image: url("data/rit.webp");
-    width: 100vw;
-    min-height: 100vh;
-    height: 100vh;
-    animation: bg 1s linear infinite alternate;
-    display: flex;
-    flex-direction: column;
-    font-family: "Comic Sans", "Comic Sans MS", "Chalkboard", "ChalkboardSE-Regular", sans-serif;
-}
-
-.wank {
-    transform: rotateZ(180deg);
-}
-
-.thicc {
-    flex: 1;
-}
-
-.top {
-    width: 50%;
-    background-color: black;
-    color: white;
-    align-self: center;
-    text-align: center;
-}
-
-#middle {
-    font-size: 2em;
-    width: fit-content;
-    background-color: black;
-    color: orange;
-    animation: across 2s linear infinite;
-    margin-left: 10%;
-}
-
-a {
-    cursor: url("data/cursor.png"), pointer !important;
-}
-
-td a {
-    color: yellow;
-}
-
-.clickable:hover {
-    cursor: url("data/cursor.png"), pointer !important;
-}
-
-td:hover {
-    background-color: orange;
-}
-
-td:hover a {
-    color: black;
-}
-
-.top td {
-    animation: border 1s linear infinite alternate;
-}
-
-.middle {
-    width: 75%;
-    align-self: center;
-    text-align: center;
-    background-color: black;
-    margin-bottom: 2em;
-}
-
-.middle td {
-    border: .25vw solid orange;
-    height: 5vw;
-}
-
-.middle td:hover {
-    border: 2px solid black;
-    background-color: orange;
-}
-
-footer {
-    background-size: cover;
-    position: sticky;
-    display: flex;
-    flex-direction: column;
-    bottom: 0;
-    height: 20%;
-    min-height: 20%;
-    margin: 0;
-    overflow: auto;
-}
-
-.buttons {
-    position: sticky;
-    bottom: 20%;
-    align-self: center;
-    margin: 0;
-    margin-top: 1em;
-}
-
-.buttons img {
-    height: 2em;
-}
-
-footer video {
-    width: 100%;
-    height: 100%;
-    object-fit: fill;
-    margin: 0;
-    animation: spin 10s linear infinite;
-}
-
-marquee {
-    margin-top: 2em;
-    display: block;
-    height: 12em;
-    flex-shrink: 0;
-}
-
-marquee img {
-    height: 12em;
-}
-
-.title {
-    width: 100%;
-    text-align: center;
-    font-size: 75px;
-    margin: 0.75em 0em;
-    color: #f7ff07;
-    font-family: Courier New;
-    text-shadow: 0px 0px 0 rgb(240,248,0),
-                 1px 1px 0 rgb(234,242,0),
-                 2px 2px 0 rgb(227,235,0),
-                 3px 3px 0 rgb(221,229,0),
-                 4px 4px 0 rgb(214,222,0),
-                 5px 5px 0 rgb(208,216,0),
-                 6px 6px 0 rgb(201,209,0),
-                 7px 7px 0 rgb(194,202,0),
-                 8px 8px 0 rgb(188,196,0),
-                 9px 9px 0 rgb(181,189,0),
-                 10px 10px 0 rgb(175,183,0),
-                 11px 11px 0 rgb(168,176,0),
-                 12px 12px 0 rgb(161,169,0),
-                 13px 13px 0 rgb(155,163,0),
-                 14px 14px 0 rgb(148,156,0),
-                 15px 15px 0 rgb(142,150,0),
-                 16px 16px 0 rgb(135,143,0),
-                 17px 17px 0 rgb(129,137,0),
-                 18px 18px 0 rgb(122,130,0),
-                 19px 19px 0 rgb(115,123,0),
-                 20px 20px 0 rgb(109,117,0),
-                 21px 21px 0 rgb(102,110,0),
-                 22px 22px 0 rgb(96,104,0),
-                 23px 23px 0 rgb(89,97,0),
-                 24px 24px 0 rgb(83,91,0),
-                 25px 25px 0 rgb(76,84,0),
-                 26px 26px 0 rgb(69,77,0),
-                 27px 27px 0 rgb(63,71,0),
-                 28px 28px 0 rgb(56,64,0),
-                 29px 29px 0 rgb(50,58,0),
-                 30px 30px 0 rgb(43,51,0),
-                 31px 31px 0 rgb(36,44,0),
-                 32px 32px 0 rgb(30,38,0),
-                 33px 33px 0 rgb(23,31,0),
-                 34px 34px 0 rgb(17,25,0),
-                 35px 35px 0 rgb(10,18,0),
-                 36px 36px 0 rgb(4,12,0),
-                 37px 37px 0 rgb(-3,5,0),
-                 38px 38px  0 rgb(-10,-2,0),
-                 39px 39px 38px rgba(255,0,0,1),
-                 39px 39px 1px rgba(255,0,0,0.5),
-                 0px 0px 38px rgba(255,0,0,.2);
- }
-
-html.dither>body>div{
-    background: url("data:image/webp;base64,UklGRjAAAABXRUJQVlA4TCQAAAAvA8AAAIVS27ahb3uzOUmSJoqqrOq6P47of8DQdcprYdP8/VY=");
-    filter: contrast(2000);
-    image-rendering: crisp-edges;
-}
-
-html.dither>body>div>div{
-    filter: initial;
-    mix-blend-mode: soft-light;
-    isolation: isolate;
-    image-rendering: initial;
-}
-
-.sprinkler {
-    margin-top: 2.5em;
-    text-align: center;
-    font-size: 2.5em;
-    font-weight: 1000;
-    color: aqua;
-    animation: flash 0.3s linear infinite;
-}
-
-.munson {
-    text-align: center;
-    width: 80%;
-    font-size: 5vh;
-    padding: 0;
-    margin: 0;
-    margin-bottom: 1em;
-    animation: colorflash 1s linear infinite;
-    margin-left: 10%;
-}
-
-#munson {
-    display: grid;
-    grid-template-columns: repeat(3, 1fr);
-}
-
-#munson img {
-    height: 20vh;
-    width: 100%;
-}
-
-#munson img:hover {
-    animation: scale 0.3s linear;
-    animation-fill-mode: forwards;
-}
-
-.john {
-    margin-left: auto;
-    display: block;
-    margin-right: auto;
-    max-width: 732px;
-    width: 100%;
-    height: 94px;
-    border: none;
-    margin-bottom: 2em;
-}
-
-#batterys {
-    perspective: infinite;
-	position: relative;
-	height: 2em;
-	width: 100%;
-	overflow-x: visible;
-    margin-bottom: 13vw;
-}
-
-#batterys p {
-    text-align: center;
-    font-size: 4vw;
-    color: #fff;
-    width: 50.1vw;
-    background-color: #232323;
-    text-shadow: 0 0 5px #fff, 0 0 10px #fff, 0 0 15px #fff, 0 0 20px #49ff18, 0 0 30px #49ff18, 0 0 40px #49ff18, 0 0 55px #49ff18, 0 0 75px #49ff18;
-    display: inline-block;
-    position: absolute;
-    left: 50%;
-    animation: spincube 2.5s linear infinite;
-}
-
-
-#batterys img {
-    display: inline-block;
-    text-shadow: 0 0 5px #fff, 0 0 10px #fff, 0 0 15px #fff, 0 0 20px #49ff18, 0 0 30px #49ff18, 0 0 40px #49ff18, 0 0 55px #49ff18, 0 0 75px #49ff18;
-    display: inline-block;
-    position: absolute;
-    left: 50%;
-    width: 48.1vw;
-    border: black 1vw solid;
-    animation: spincube 2.5s linear infinite;
-}
-
-
-@keyframes spincube {
-    from {
-        transform: translateX(-50%) rotateY(var(--rot)) translateZ(25vw);
-    }
-	to {
-		transform: translateX(-50%) rotateY(calc(var(--rot) + 90deg)) translateZ(25vw);
-	}
-}
-
-@keyframes bg {
-    from {
-      background-position: 0 0;
-    }
-    to {
-      background-position: 10% 10%;
-    }
-}
-
-@keyframes spin {
-    0%, 100% {
-        transform: rotateY(0deg) rotateX(0deg);
-    }
-    50%  {
-        transform: rotateY(3000deg) rotateX(3000deg);
-    }
-}
-
-@keyframes title {
-    0%,
-    100% {
-     transform:translateY(-25%);
-     animation-timing-function:cubic-bezier(.8,0,1,1)
-    }
-    50% {
-     transform:none;
-     animation-timing-function:cubic-bezier(0,0,.2,1)
-    }
-}
-
-@keyframes flash {
-    50% {
-        opacity: 0;
-    }
-}
-
-@keyframes colorflash {
-    0%, 100%, 49% {
-        border: 5px solid orange;
-        background-color: black;
-        color: orange;
-    }
-    50%, 99% {
-        border: 5px solid black;
-        background-color: orange;
-        color: black;
-    }
-}
-
-@keyframes border {
-    0%,
-    100% {
-        border: 2px solid rgb(255, 0, 0);
-    }
-    33% {
-        border: 2px solid rgb(0, 255, 0);
-    }
-    66% {
-        border: 2px solid rgb(0, 0, 255);
-    }
-}
-
-@keyframes across {
-    0%,
-    100% {
-      transform: translateX(0%);
-    }
-    50% {
-      transform: translateX(calc(80vw - 100%));
-    }
-}
-
-@keyframes scale {
-    from {
-        transform: scale3d(100%, 100%, 100%);
-    }
-    to {
-        transform: scale3d(120%, 120%, 120%);
-    }
-}
-
-html.flash>body>div>div>div>menu {
-    animation: epilepsy .25s linear infinite;
-}
-
-.flashy {
-    margin: 0;
-    padding: 0;
-    list-style:none; 
-    position: absolute;
-    width: 100%;
-    height: 100%;
-    z-index: 10;
-    overflow: scroll;
-    pointer-events: none;
-}
-
-@keyframes epilepsy {
-    0%, 100% {
-        background-color: rgba(255,0,0,.4);
-    }
-    20% {
-        background-color: rgba(255,255,0,.4);
-    }
-    40% {
-        background-color: rgba(0,255,0,.4);
-    }
-    60% {
-        background-color: rgba(0,255,255,.4);
-    }
-    80% {
-        background-color: rgba(0,0,255,.4);
-    }
-}
-
-.center {
-    width: 100%;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-}
-
-#webring {
-    min-width: 25%;
-    padding: .5rem;
-    border: solid 5px orange;
-    background-color: black;
-    color: white;
-    display: flex;
-    flex-direction: row;
-}
-
-#webring .links {
-    display: flex;
-    flex-direction: row;
-    justify-content: space-between;
-    min-width: 30%;
-    padding: 0 .5rem;
-}
-
-#webring .links a {
-    margin: 0;
-    height: auto;
-    margin-left: .25rem;
-}
-
-#webring p {
-    margin: 0;
-    flex: 1;
-}
-
-.spread {
-    animation: 3s infinite ease-in-out alternate kurn;
-    font-style: italic;
-    text-decoration: underline;
-}
-
-@keyframes kurn {
-    from {
-        letter-spacing: .05rem;
-    }
-
-    to {
-        letter-spacing: .25rem;
-    }
-}
diff --git a/web/error.php b/web/error.php
new file mode 100644
index 0000000..f7a2f4e
--- /dev/null
+++ b/web/error.php
@@ -0,0 +1,14 @@
+<?php
+    // home page of rit.wtf
+    $title = "rit.wtf - $code";
+    include('parts/head.php');
+    include('parts/header.php');
+?>
+
+<div id="error">
+    <p class="code"><?=$code?></p>
+</div>
+
+<?php
+    include('parts/footer.php');
+?>
diff --git a/web/fire.php b/web/fire.php
new file mode 100644
index 0000000..b40262b
--- /dev/null
+++ b/web/fire.php
@@ -0,0 +1,22 @@
+<?php
+    // home page of rit.wtf
+    $title = "rit.wtf - 🔥🔥🔥";
+    include('parts/head.php');
+    include('parts/header.php');
+?>
+
+<? /* fires */ ?>
+<div id="fires">
+    <?php
+        $rev = FALSE;
+        foreach (ASSETS->fires as $_key => $link) {
+            $dir = ($rev) ? "left" : "right";
+            echo "<marquee truespeed scrolldelay=\"10\" direction=\"{$dir}\"><img src=\"{$link}\" loading=\"lazy\"></marquee>";
+            $rev = !$rev;
+        }
+    ?>
+</div>
+
+<?php
+    include('parts/footer.php');
+?>
diff --git a/web/gallery.php b/web/gallery.php
new file mode 100644
index 0000000..f35634c
--- /dev/null
+++ b/web/gallery.php
@@ -0,0 +1,57 @@
+<?php
+    // home page of rit.wtf
+    $title = "rit.wtf - RIP Munson";
+    include('parts/head.php');
+    include('parts/header.php');
+?>
+
+<? /* munson */ ?>
+<div id="munson"?>
+    <div class="title"?>
+        <span>The munson art gallery</span>
+    </div>
+    <div class="gallery">
+        <?php
+            foreach (ASSETS->munson as $_key => $link) {
+                echo "<img src=\"{$link}\" loading=\"lazy\"/>";
+            }
+        ?>
+    </div>
+</div>
+
+<? /* films */ ?>
+<div id="films"?>
+    <div class="title"?>
+        <span>Munson's sick films!</span>
+    </div>
+    <div class="films">
+        <video autoplay muted loop>
+            <source src="<?=ASSETS->videos->wizard?>" type="video/mp4">
+        </video>
+        <video autoplay muted loop>
+            <source src="<?=ASSETS->videos->raiders?>" type="video/mp4">
+        </video>
+        <video autoplay muted loop>
+            <source src="<?=ASSETS->videos->brick?>" type="video/mp4">
+        </video>
+    </div>
+</div>
+
+<? /* raps */ ?>
+<div id="raps"?>
+    <div class="title"?>
+        <span>Munson's sick raps!</span>
+    </div>
+    <div class="raps">
+        <video autoplay muted loop>
+            <source src="<?=ASSETS->videos->review?>" type="video/mp4">
+        </video>
+        <video autoplay muted loop>
+            <source src="<?=ASSETS->videos->jedi?>" type="video/mp4">
+        </video>
+    </div>
+</div>
+
+<?php
+    include('parts/footer.php');
+?>
diff --git a/web/home.php b/web/home.php
new file mode 100644
index 0000000..3f1083e
--- /dev/null
+++ b/web/home.php
@@ -0,0 +1,86 @@
+<?php
+    // home page of rit.wtf
+    $title = 'rit.wtf - home';
+    include('parts/head.php');
+    include('parts/header.php');
+?>
+
+<? /* memes */ ?>
+<marquee id="memes" behavior="alternate">
+    <?php
+        $memes = (array) ASSETS->memes;
+        shuffle($memes);
+        foreach ($memes as $_key => $link) {
+            echo "<img src=\"{$link}\" loading=\"lazy\"/>";
+        }
+    ?>
+</marquee>
+
+<? /* motd */ ?>
+<div id="motd">
+    <p><?php
+        $messages = [
+            "Call 1-800-1ST-YEAR to get a sprinkler to go off in a dorm near you!",
+            "#1 in Lithium-ion battery fires!",
+            "Welcome daddy Sanders",
+            "Make sure to not be seen by the counter",
+            "Disfunctionally operating since 1829",
+        ];
+        echo $messages[array_rand($messages)];
+    ?></p>
+</div>
+
+<? /* links */ ?>
+<div id="links">
+    <div class="title">
+        <span>important stuff</span>
+    </div>
+    <div class="btn">
+        <a href="http://rochesterapex.com/" target="_blank">
+            <img src="<?=ASSETS->text->housing?>"/>
+        </a>
+    </div>
+    <div class="btn">
+        <a href="https://www.democratandchronicle.com/story/news/2021/08/31/peter-kiwitt-former-rit-professor-sex-trafficking/5589597001/" target="_blank">
+            <img src="<?=ASSETS->text->education?>"/>
+        </a>
+    </div>
+    <div class="btn">
+        <a href="https://www.rit.edu/fa/diningservices/gracies#1" target="_blank">
+            <img src="<?=ASSETS->text->food?>"/>
+        </a>
+    </div>
+</div>
+
+<? /* battery */ ?>
+<div id="battery">
+    <div class="title">
+        <p style="--rot: 0deg;">Lithium Ion Battery's</p>
+        <p style="--rot: 270deg;">Lithium Ion Battery's</p>
+    </div>
+    <div class="battery">
+        <img style="--rot: 0deg;" src="<?=ASSETS->fires->battery?>" loading="lazy"/>
+        <img style="--rot: 270deg;" src="<?=ASSETS->fires->battery?>" loading="lazy"/>
+    </div>
+</div>
+<div class="btn">
+    <a href="fire">See more 🔥</a>
+</div>
+
+<? /*sanders */ ?>
+<div id="sanders">
+    <div class="title"?>
+        <span>Welcome our new president!</span>
+    </div>
+    <div class="gallery">
+        <?php
+            foreach (ASSETS->sanders as $_key => $link) {
+                echo "<img src=\"{$link}\" loading=\"lazy\"/>";
+            }
+        ?>
+    </div>
+</div>
+
+<?php
+    include('parts/footer.php');
+?>
diff --git a/web/parts/footer.php b/web/parts/footer.php
new file mode 100644
index 0000000..88ab860
--- /dev/null
+++ b/web/parts/footer.php
@@ -0,0 +1,22 @@
+<footer id="footer">
+    <div id="buttons">
+        <img src="<?=ASSETS->buttons->apocalypse?>" loading="lazy" onclick="document.documentElement.classList.toggle('flip')"/>
+        <img src="<?=ASSETS->buttons->amd?>" loading="lazy"/>
+        <img src="<?=ASSETS->buttons->dither?>" loading="lazy" onclick="document.documentElement.classList.toggle('dither')"/>
+        <a href="https://validator.w3.org/nu/?doc=https%3A%2F%2Frit.wtf" target="_blank">
+            <img src="<?=ASSETS->buttons->html?>" loading="lazy"/>
+        </a>
+        <img src="<?=ASSETS->buttons->ie?>" loading="lazy"  onclick="document.documentElement.classList.toggle('strobe')"/>
+        <img src="<?=ASSETS->buttons->netscape?>" loading="lazy"/>
+        <a href="https://g.freya.cat/freya/rit.wtf" target="_blank">
+            <img src="<?=ASSETS->buttons->download?>" loading="lazy"/>
+        </a>
+    </div>
+    <iframe
+        height="94"
+        id="john"
+		<? /* hack to disable firefox cookie warning*/?>
+		sandbox="allow-scripts"
+		src="https://john.citrons.xyz/embed?ref=rit.wtf"
+	></iframe>
+</footer>
diff --git a/web/parts/head.php b/web/parts/head.php
new file mode 100644
index 0000000..c5d6f78
--- /dev/null
+++ b/web/parts/head.php
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html lang="en">
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+        <meta name="viewport" content="width=device-width, initial-scale=1.0">
+        <base target="_blank" />
+        <link rel="stylesheet" href="<?=ASSETS->css->main?>">
+        <link rel="stylesheet" href="<?=ASSETS->css->anim?>">
+        <?php if(isset($css)): ?>
+            <link rel="stylesheet" href="<?=$css?>">
+        <?php endif; ?>
+        <title><?=$title?></title>
+    </head>
+    <body>
diff --git a/web/parts/header.php b/web/parts/header.php
new file mode 100644
index 0000000..801ecfc
--- /dev/null
+++ b/web/parts/header.php
@@ -0,0 +1,35 @@
+
+<? /* needed for screen dither */ ?>
+<div id="ditherMask">
+<div id="ditherFilter">
+
+<? /* needed for screen strobe */ ?>
+<menu id="strobe"></menu>
+
+<header id="header">
+
+	<? /* rit.wtf title */?>
+    <div id="title">
+        <span style="animation-delay:-1.42s">r</span>
+        <span style="animation-delay:-1.22s">i</span>
+        <span style="animation-delay:-1.01s">t</span>
+        <span style="animation-delay:-0.81s">.</span>
+        <span style="animation-delay:-0.61s">w</span>
+        <span style="animation-delay:-0.41s">t</span>
+        <span style="animation-delay:-0.21s">f</span>
+	</div>
+
+	<? /* nav bar */ ?>
+    <nav id="nav">
+        <a href="/" class="btn">
+            rit.wtf Home 🐯
+        </a>
+        <a href="/gallery" class="btn">
+            Munson Memorial 💀
+        </a>
+        <a href="http://munsonmakesamillion.com/" target="_blank" class="btn">
+            Munson Money 💸
+        </a>
+    </nav>
+
+</header>