Index: unk/cmd/mai/flag.go
===================================================================
--- /trunk/cmd/mai/flag.go	(revision 65)
+++ 	(revision )
@@ -1,11 +1,0 @@
-// Set up a basic command line flags parsing
-package main
-
-import (
-	"flag"
-)
-
-func parseFlags() {
-	flag.StringVar(&configfile, "f", "", "Configuration file")
-	flag.Parse()
-}
Index: /trunk/cmd/mai/main.go
===================================================================
--- /trunk/cmd/mai/main.go	(revision 65)
+++ /trunk/cmd/mai/main.go	(revision 66)
@@ -15,4 +15,5 @@
 
 	"github.com/gofiber/fiber/v2"
+	"github.com/gofiber/fiber/v2/middleware/favicon"
 	"github.com/gofiber/fiber/v2/middleware/logger"
 	"github.com/gofiber/fiber/v2/middleware/limiter"
@@ -61,4 +62,10 @@
 	})
 
+	app.Use(favicon.New(
+		favicon.Config{
+			File: conf.staticpath + "/favicon.ico",
+		},
+	))
+
 	app.Use(logger.New(
 		logger.Config{
@@ -281,4 +288,5 @@
 		Browse: true,
 	})
+	app.Static("/docs", "./docs", fiber.Static{})
 	app.Listen(conf.listen)
 }
Index: /trunk/cmd/mai/parseflags.go
===================================================================
--- /trunk/cmd/mai/parseflags.go	(revision 66)
+++ /trunk/cmd/mai/parseflags.go	(revision 66)
@@ -0,0 +1,11 @@
+// Set up a basic command line flags parsing
+package main
+
+import (
+	"flag"
+)
+
+func parseFlags() {
+	flag.StringVar(&configfile, "f", "", "Configuration file")
+	flag.Parse()
+}
Index: /trunk/cmd/mai/readconf.go
===================================================================
--- /trunk/cmd/mai/readconf.go	(revision 65)
+++ /trunk/cmd/mai/readconf.go	(revision 66)
@@ -11,5 +11,4 @@
 		return err					        
 	}
-
 	conf.group = cfg.Section("mai").Key("group").String()
 	conf.listen = cfg.Section("mai").Key("listen").String()
Index: /trunk/docs/api/index.html
===================================================================
--- /trunk/docs/api/index.html	(revision 66)
+++ /trunk/docs/api/index.html	(revision 66)
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "//W3C DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+	<head>
+		<link rel="stylesheet" href="/docs/style.css">
+		<meta http-equiv="Content-type" content="text/html; charset=utf-8">
+		<meta name="author" content="Izuru Yakumo">
+		<title>API Documentation | Mai</title>
+	</head>
+	<body id="body">
+		<h1 id="header">API Documentation</h1>
+		<br><hr>
+		<h2 class="get">[GET] /api/translate</h2>
+		<h2 class="post">[POST] /api/translate</h2>
+		<h3>Description</h3>
+		<p>Translation endpoint, input must be URL-encoded (e.g. multi-byte characters, words separated by space)</p>
+		<h3>Arguments</h3>
+		<ul>
+			<li>engine</li>
+			<li>from</li>
+			<li>text</li>
+			<li>to</li>
+		</ul>
+		<h3>Examples</h3>
+		<p><pre><code>GET /api/translate?engine=google&amp;from=auto&amp;to=en&amp;text="sonrisa"</code></pre></p>
+		<hr>
+		<h2 class="get">[GET] /api/source_languages</h2>
+		<h2 class="get">[GET] /api/target_languages</h2>
+		<h3>Description</h3>
+		<p>Get a JSON array of supported source and target languages for a particular engine</p>
+		<h3>Arguments</h3>
+		<ul>
+			<li>engine</li>
+		</ul>
+		<h3>Examples</h3>
+		<p><pre><code>GET /api/source_languages?engine=google</code></pre></p>
+		<p><pre><code>GET /api/target_languages?engine=google</code></pre></p>
+		<hr>
+		<h2 class="get">[GET] /api/tts</h2>
+		<h3>Description</h3>
+		<p>Obtain text-to-speech audio files from an engine, provided said engine supports them</p>
+		<h3>Arguments</h3>
+		<ul>
+			<li>engine</li>
+			<li>lang</li>
+			<li>text</li>
+		</ul>
+		<h3>Examples</h3>
+		<p><pre><code>GET /api/tts?engine=google&amp;lang=en&amp;text="hi"</code></pre></p>
+		<hr>
+		<h2 class="post">[POST] /switchlanguages</h2>
+		<h3>Description</h3>
+		<p>Switch between source and target languages, as long as the source language isn't "auto"</p>
+		<hr>
+	</body>
+</html>
Index: /trunk/docs/index.html
===================================================================
--- /trunk/docs/index.html	(revision 66)
+++ /trunk/docs/index.html	(revision 66)
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML PUBLIC "//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+	<head>
+		<link rel="stylesheet" href="/docs/style.css">
+		<meta http-equiv="Content-type" content="text/html; charset=utf-8">
+		<meta name="author" content="Izuru Yakumo">
+		<title>Mai | Documentation</title>
+	</head>
+	<body id="body">
+		<img src="/static/favicon128x128.png" style="text-align: center;">
+		<h1 id="header">Documentation</h1>
+		<ul id="nav">
+			<li><a href="/docs/api">API</a></li>
+		</ul>
+	</body>
+</html>
+
Index: /trunk/docs/style.css
===================================================================
--- /trunk/docs/style.css	(revision 66)
+++ /trunk/docs/style.css	(revision 66)
@@ -0,0 +1,114 @@
+/*
+ * Taken from vnpower
+ */
+
+* {
+  box-sizing: border-box; }
+
+body {
+  top: 0;
+  margin: 0;
+  background-color: #1d1f21;
+  color: white;
+  font-family: "Open Sans", "Roboto", "Noto Sans", "Noto Sans CJK JP", sans-serif;
+  line-height: 1.618; 
+}
+
+h2.get {
+	color: orange;
+}
+
+h2.post {
+	color: green;
+}
+
+@media (max-width: 684px) {
+  body {
+    font-size: 1rem; } }
+
+@media (max-width: 382px) {
+  body {
+    font-size: 1rem; } }
+
+a {
+  color: #81a2be;
+  text-decoration-color: #81a2be; }
+
+#header {
+  width: 100%;
+  min-width: 320px;
+  background-color: #282a2e; }
+
+#header img {
+  width: 280px; }
+
+#header-content {
+  margin: 0 auto;
+  width: min-content; }
+
+#nav {
+  display: flex;
+  justify-content: center;
+  background-color: #373b41; }
+
+#footer {
+  margin-top: 0.5rem;
+  text-align: center; }
+
+#body {
+  min-height: 75vh;
+  max-width: 800px;
+  margin: 1rem auto;
+  padding: 0 0.6rem; }
+  #body h1,
+  #body h2,
+  #body h3,
+  #body h4,
+  #body h5,
+  #body h6 {
+    line-height: 1.1;
+    font-family: sans-serif;
+    font-weight: 700;
+    margin-top: 1rem;
+    margin-bottom: 1rem;
+    overflow-wrap: break-word;
+    word-wrap: break-word;
+    -ms-word-break: break-all;
+    word-break: break-word; }
+  #body h1 {
+    border-bottom: 1px solid #b5bd68;
+    display: block; }
+  #body p {
+    margin-top: 0px;
+    margin-bottom: 0.5rem; }
+  #body li > p {
+    padding: 0;
+    margin: 0; }
+  #body small,
+  #body sub,
+  #body sup {
+    font-size: 75%; }
+  #body img,
+  #body video {
+    height: auto;
+    max-width: 100%;
+    margin-top: 0.5rem;
+    margin-bottom: 0.5rem;
+    box-shadow: 0px 1px 1px 0px rgba(0, 0, 0, 0.12), 0px 2px 2px 0px rgba(0, 0, 0, 0.12), 0px 4px 4px 0px rgba(0, 0, 0, 0.12), 0px 8px 8px 0px rgba(0, 0, 0, 0.12), 0px 16px 16px 0px rgba(0, 0, 0, 0.12); }
+  #body pre {
+    background-color: #373b41;
+    display: block;
+    padding: 1em;
+    overflow-x: auto;
+    margin-top: 0px;
+    margin-bottom: 0.5rem; }
+  #body code, #body kbd, #body samp {
+    padding: 0 0.5em;
+    background-color: #373b41;
+    white-space: pre-wrap; }
+  #body pre > code {
+    padding: 0;
+    background-color: transparent;
+    white-space: pre;
+    font-size: 1em; }
+
Index: /trunk/example/mai.ini
===================================================================
--- /trunk/example/mai.ini	(revision 66)
+++ /trunk/example/mai.ini	(revision 66)
@@ -0,0 +1,5 @@
+[mai]
+listen = "127.0.0.1:5000"
+rootdir = "./static"
+tmplpath = "./views"
+user = "www"
Index: unk/example/simplytranslate.ini
===================================================================
--- /trunk/example/simplytranslate.ini	(revision 65)
+++ 	(revision )
@@ -1,3 +1,0 @@
-listen = "127.0.0.1:5000"
-rootdir = "/home/yakumo_izuru/Repos/simplytranslate/static"
-tmplpath = "./views"
Index: /trunk/rc.d/FreeBSD
===================================================================
--- /trunk/rc.d/FreeBSD	(revision 65)
+++ /trunk/rc.d/FreeBSD	(revision 66)
@@ -14,7 +14,7 @@
 load_rc_config $name
 
-: ${mai_user:="www"}
 : ${mai_enable:="NO"}
 : ${mai_config="/usr/local/etc/mai/mai.ini"}
+: ${mai_chdir="/usr/local/share/mai"}
 
 pidfile="/var/run/${name}.pid"
@@ -24,3 +24,5 @@
 command_args="-S -m 3 -s info -l daemon -p ${pidfile} /usr/bin/env ${procname} ${mai_args}"
 
+required_files="${mai_config}"
+
 run_rc_command "$1"
Index: /trunk/rc.d/NetBSD
===================================================================
--- /trunk/rc.d/NetBSD	(revision 66)
+++ /trunk/rc.d/NetBSD	(revision 66)
@@ -0,0 +1,26 @@
+#!/bin/sh
+# $TheSupernovaDuo$
+#
+# PROVIDE: mai
+# REQUIRE: NETWORKING DAEMON
+# BEFORE: LOGIN
+# KEYWORD: shutdown
+
+$_rc_subr_loaded . /etc/rc.subr
+
+name="mai"
+rcvar=$name
+command="/usr/pkg/bin/mai"
+command_args="-f /usr/pkg/etc/mai/mai.ini"
+pidfile="/var/run/${name}.pid"
+start_cmd="mai_start"
+
+required_files="/usr/pkg/etc/mai/mai.ini"
+
+mai_start() {
+	$command $command_args
+	pgrep -n $name > $pidfile
+}
+
+load_rc_config $name
+run_rc_command "$1"
Index: /trunk/rc.d/immortal.yml
===================================================================
--- /trunk/rc.d/immortal.yml	(revision 65)
+++ /trunk/rc.d/immortal.yml	(revision 66)
@@ -1,2 +1,1 @@
 cmd: /usr/local/bin/mai -f /usr/local/etc/mai/mai.ini
-user: www
Index: unk/static/docs.css
===================================================================
--- /trunk/static/docs.css	(revision 65)
+++ 	(revision )
@@ -1,114 +1,0 @@
-/*
- * Taken from vnpower
- */
-
-* {
-  box-sizing: border-box; }
-
-body {
-  top: 0;
-  margin: 0;
-  background-color: #1d1f21;
-  color: white;
-  font-family: "Open Sans", "Roboto", "Noto Sans", "Noto Sans CJK JP", sans-serif;
-  line-height: 1.618; 
-}
-
-h2.get {
-	color: orange;
-}
-
-h2.post {
-	color: green;
-}
-
-@media (max-width: 684px) {
-  body {
-    font-size: 1rem; } }
-
-@media (max-width: 382px) {
-  body {
-    font-size: 1rem; } }
-
-a {
-  color: #81a2be;
-  text-decoration-color: #81a2be; }
-
-#header {
-  width: 100%;
-  min-width: 320px;
-  background-color: #282a2e; }
-
-#header img {
-  width: 280px; }
-
-#header-content {
-  margin: 0 auto;
-  width: min-content; }
-
-#nav {
-  display: flex;
-  justify-content: center;
-  background-color: #373b41; }
-
-#footer {
-  margin-top: 0.5rem;
-  text-align: center; }
-
-#body {
-  min-height: 75vh;
-  max-width: 800px;
-  margin: 1rem auto;
-  padding: 0 0.6rem; }
-  #body h1,
-  #body h2,
-  #body h3,
-  #body h4,
-  #body h5,
-  #body h6 {
-    line-height: 1.1;
-    font-family: sans-serif;
-    font-weight: 700;
-    margin-top: 1rem;
-    margin-bottom: 1rem;
-    overflow-wrap: break-word;
-    word-wrap: break-word;
-    -ms-word-break: break-all;
-    word-break: break-word; }
-  #body h1 {
-    border-bottom: 1px solid #b5bd68;
-    display: block; }
-  #body p {
-    margin-top: 0px;
-    margin-bottom: 0.5rem; }
-  #body li > p {
-    padding: 0;
-    margin: 0; }
-  #body small,
-  #body sub,
-  #body sup {
-    font-size: 75%; }
-  #body img,
-  #body video {
-    height: auto;
-    max-width: 100%;
-    margin-top: 0.5rem;
-    margin-bottom: 0.5rem;
-    box-shadow: 0px 1px 1px 0px rgba(0, 0, 0, 0.12), 0px 2px 2px 0px rgba(0, 0, 0, 0.12), 0px 4px 4px 0px rgba(0, 0, 0, 0.12), 0px 8px 8px 0px rgba(0, 0, 0, 0.12), 0px 16px 16px 0px rgba(0, 0, 0, 0.12); }
-  #body pre {
-    background-color: #373b41;
-    display: block;
-    padding: 1em;
-    overflow-x: auto;
-    margin-top: 0px;
-    margin-bottom: 0.5rem; }
-  #body code, #body kbd, #body samp {
-    padding: 0 0.5em;
-    background-color: #373b41;
-    white-space: pre-wrap; }
-  #body pre > code {
-    padding: 0;
-    background-color: transparent;
-    white-space: pre;
-    font-size: 1em; }
-
Index: unk/static/docs/index.html
===================================================================
--- /trunk/static/docs/index.html	(revision 65)
+++ 	(revision )
@@ -1,56 +1,0 @@
-<!DOCTYPE HTML PUBLIC "//W3C DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-	<head>
-		<link rel="stylesheet" href="/static/docs.css">
-		<meta http-equiv="Content-type" content="text/html; charset=utf-8">
-		<meta name="author" content="Izuru Yakumo">
-		<title>API Documentation | Mai</title>
-	</head>
-	<body id="body">
-		<h1 id="header">Documentation</h1>
-		<br><hr>
-		<h2 class="get">[GET] /api/translate</h2>
-		<h2 class="post">[POST] /api/translate</h2>
-		<h3>Description</h3>
-		<p>Translation endpoint</p>
-		<h3>Arguments</h3>
-		<ul>
-			<li>engine</li>
-			<li>from</li>
-			<li>text</li>
-			<li>to</li>
-		</ul>
-		<h3>Examples</h3>
-		<p><pre><code>GET /api/translate?engine=google&amp;from=auto&amp;to=en&amp;text="sonrisa"</code></pre></p>
-		<hr>
-		<h2 class="get">[GET] /api/source_languages</h2>
-		<h2 class="get">[GET] /api/target_languages</h2>
-		<h3>Description</h3>
-		<p>Get a JSON array of supported source and target languages for a particular engine</p>
-		<h3>Arguments</h3>
-		<ul>
-			<li>engine</li>
-		</ul>
-		<h3>Examples</h3>
-		<p><pre><code>GET /api/source_languages?engine=google</code></pre></p>
-		<p><pre><code>GET /api/target_languages?engine=google</code></pre></p>
-		<hr>
-		<h2 class="get">[GET] /api/tts</h2>
-		<h3>Description</h3>
-		<p>Obtain text-to-speech audio files from an engine, provided said engine supports them</p>
-		<h3>Arguments</h3>
-		<ul>
-			<li>engine</li>
-			<li>lang</li>
-			<li>text</li>
-		</ul>
-		<h3>Examples</h3>
-		<p><pre><code>GET /api/tts?engine=google&amp;lang=en&amp;text="hi"</code></pre></p>
-		<hr>
-		<h2 class="post">[POST] /switchlanguages</h2>
-		<h3>Description</h3>
-		<p>Switch between source and target languages, as long as the source language isn't "auto"</p>
-		<hr>
-		<a href="/">Return to Mai</a>
-	</body>
-</html>
