diff --git a/arrows/left.svg b/arrows/left.svg
new file mode 100644
index 0000000..216f5bc
--- /dev/null
+++ b/arrows/left.svg
@@ -0,0 +1 @@
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24.39781" height="40.84766" viewBox="0,0,24.39781,40.84766"><g transform="translate(-383.10315,-227.43774)"><g fill="#59d1ff" stroke="none" stroke-width="0" stroke-miterlimit="10"><path d="M383.11376,235.59304c0.0417,-1.28124 0.28408,-3.05221 0.52072,-4.52665c0.06427,-0.40046 0.95106,-2.75365 1.55773,-2.75365c1.46906,0 7.96106,-0.875 14.92534,-0.875c9.3685,0 9.82235,7.18112 1.35686,7.18521c-3.8115,0.00185 -7.59051,0.64161 -9.6918,0.68055c-2.03349,0.03769 1.02447,24.24763 -0.13762,28.15481c-2.69245,9.05257 -7.94532,2.59519 -7.94532,2.59519c0,0 -0.68953,-27.27634 -0.58591,-30.46046z"/></g></g></svg><!--rotationCenter:41.89684967562516:12.562256428571374-->
\ No newline at end of file
diff --git a/arrows/right.svg b/arrows/right.svg
new file mode 100644
index 0000000..9145fe9
--- /dev/null
+++ b/arrows/right.svg
@@ -0,0 +1 @@
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="30.09294" height="45.84839" viewBox="0,0,30.09294,45.84839"><g transform="translate(-382.61101,-201.83478)"><g fill="#59d1ff" stroke="none" stroke-width="0" stroke-miterlimit="10"><path d="M383.20753,204.06668c0,0 5.25287,-6.45738 7.94532,2.59519c1.16209,3.90718 -1.89587,28.11712 0.13762,28.15481c2.10129,0.03894 5.8803,0.6787 9.6918,0.68055c8.46549,0.00409 8.01164,7.18521 -1.35686,7.18521c-6.96428,0 -13.45628,-0.875 -14.92534,-0.875c-0.60667,0 -1.49346,-2.35319 -1.55773,-2.75365c-0.23664,-1.47444 -0.47902,-3.24541 -0.52072,-4.52665c-0.10362,-3.18412 0.58591,-30.46046 0.58591,-30.46046z"/><path d="M412.70395,238.07506l-9.82048,9.60811l0.44465,-20.24512z"/></g></g></svg><!--rotationCenter:42.38899245042728:38.16522307833455-->
\ No newline at end of file
diff --git a/index.css b/index.css
new file mode 100644
index 0000000..97f2874
--- /dev/null
+++ b/index.css
@@ -0,0 +1,94 @@
+:root,
+input,
+button {
+    font-family: sans-serif;
+}
+
+body {
+    margin: 0;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+    height: 100vh;
+
+}
+
+#form {
+    background: rgba(0, 0, 0, 0.15);
+    padding: 0.25rem;
+    box-sizing: border-box;
+    backdrop-filter: blur(10px);
+    position: sticky;
+    bottom: 0;
+}
+
+.inner-form {
+    display: flex;
+    flex-direction: row;
+    justify-content: center;
+}
+
+#input {
+    border: none;
+    padding: 0 1rem;
+    border-radius: 0.3rem;
+    margin: 0.25rem;
+    height: 2rem;
+    flex-grow: 1;
+}
+
+#input:focus {
+    outline: none;
+}
+
+.inner-form>button {
+    background: #333;
+    border: none;
+    padding: 0 1rem;
+    margin: 0.25rem;
+    height: 2rem;
+    border-radius: 3px;
+    outline: none;
+    flex-grow: 1;
+}
+
+button, button a {
+    color: #fff;
+    text-decoration: none;
+}
+
+button a {
+    width: 100%;
+    height: 2rem;
+    text-align: center;
+    line-height:2rem;
+    vertical-align: middle;
+    display: inline-block;
+}
+
+#messages {
+    list-style-type: none;
+    margin: 0;
+    padding: 0;
+}
+
+#messages>li {
+    padding: 0.5rem 1rem;
+    white-space: pre-wrap;
+}
+#messages>li>li {
+    margin: 0;
+    line-height: 1em;
+    height: 1em;
+    padding-bottom: 0.1em; 
+    overflow: hidden;
+}
+
+
+#messages>li>li>img {
+    height: 1.1em;
+}
+
+#messages>li:nth-child(odd) {
+    background: #efefef;
+}
\ No newline at end of file
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..6f7f524
--- /dev/null
+++ b/index.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <title>Dervland</title>
+    <link rel="stylesheet" href="index.css">
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+</head>
+
+<body>
+    <ul id="messages"></ul>
+    <form id="form" action="">
+        <div class='inner-form'>
+        <input id="input" autocomplete="off" />
+        </div>
+        <div class='inner-form'>
+            <button class='send'><a href='#'>Send</a></button>
+            <button class='next'><a href='#'>Previous</a></button>
+            <button class='prev'><a href='#'>Next</a></button>
+        </div>
+        <div class='inner-form'>
+            <button><a href='https://git.dervland.net/elemental'>Frontends</a></button>
+            <button><a href='https://discord.gg/Wkr7PVk3cF'>Discord</a></button>
+        </div>
+    </form>
+    <script src='/index.js'></script>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/index.js b/index.js
new file mode 100644
index 0000000..ae6600c
--- /dev/null
+++ b/index.js
@@ -0,0 +1,76 @@
+
+var messages = document.getElementById('messages');
+var form = document.getElementById('form');
+var input = document.getElementById('input');
+const server = new URLSearchParams(document.location.search).get('server') || '/';
+
+async function goPage(count) {
+    let counter = input.value.match(/[^\s]+$/g);
+    if (!counter) return false;
+
+    input.value = `${input.value.match(/^[^\s]+/g)[0]} ${counter[0] * 1 + count}`;
+    main(new Event('placeholder'));
+    return false;
+}
+
+async function addMsg(msg) {
+    let lines = msg.split('\n');
+    var wrap = document.createElement('li');
+
+    for (let line of lines) {
+        var item = document.createElement('li');
+        item.textContent = line;
+
+        if (line.startsWith('-') || line.startsWith('<')) {
+            let img = new Image();
+            if (line.startsWith('<') || line[2] == '>') {
+                item.textContent = line.slice(3);
+                img.src = `arrows/left.svg`;
+            } else {
+                item.textContent = line.slice(2);
+                img.src = `arrows/right.svg`;
+            }
+            item.insertBefore(img, item.childNodes[0])
+        }
+        wrap.appendChild(item);
+    }
+    messages.appendChild(wrap);
+    window.scrollTo(0, messages.offsetHeight);
+}
+
+async function main(e) {
+    e.preventDefault();
+
+    if (!input.value) return false;
+
+    let msg = await fetch(server, {
+        "method": "POST",
+        "headers": {
+            "content-type": "application/json",
+        },
+        "body": JSON.stringify({ "data": input.value })
+    })
+
+    msg = await msg.text();
+    msg = msg.trim();
+
+    addMsg(input.value)
+    addMsg(msg)
+
+    return false;
+}
+
+form.addEventListener('submit', main);
+
+document.querySelector('.send').addEventListener('click', main);
+document.querySelector('.prev').addEventListener('click', (e) => { e.preventDefault(); return goPage(1) });
+document.querySelector('.next').addEventListener('click', (e) => { e.preventDefault(); return goPage(-1) });
+
+
+input.value = '/help 1';
+goPage(0);
+
+setTimeout(function () {
+    input.value = '/inv 1';
+    goPage(0);
+}, 500)
\ No newline at end of file