Index: unk/INSTALL.md
===================================================================
--- /trunk/INSTALL.md	(revision 70)
+++ 	(revision )
@@ -1,11 +1,0 @@
-# Installation
-
-```shell
-$ git clone git://git.chaotic.ninja/yakumo_izuru/mai
-$ cd mai
-$ make
-# make PREFIX=/usr/local install
-```
-* Read the [mai.ini(5)](mai.ini.5) manual page
-* Use any web server than is able to reverse proxy, like [Apache](https://httpd.apache.org), [h2o](https://h2o.examp1e.net), or [NGINX](https://www.nginx.com).
-  * Examples are provided on the repository
Index: unk/INSTANCES.md
===================================================================
--- /trunk/INSTANCES.md	(revision 70)
+++ 	(revision )
@@ -1,6 +1,0 @@
-# List of known instances
-
-| Name                                        | Cloudflare? | Country | URL                      | Engines supported |
-|---------------------------------------------|-------------|---------|--------------------------|-------------------|
-| Chaotic Ninja Communication Network Limited | No          | Germany | https://tr.chaotic.ninja | Google, Reverso   |
-|                                             |             |         |                          |                   |
Index: unk/LEGAL.md
===================================================================
--- /trunk/LEGAL.md	(revision 70)
+++ 	(revision )
@@ -1,9 +1,0 @@
-Mai does not host any content. All content shown on any Mai instances is from [Google Translate](https://translate.google.com), [Reverso](https://www.reverso.net/), and [LibreTranslate](https://libretranslate.com)
-
-Mai is not affiliated with none of the above, which this program relays.
-
-Trademarks belong to their respective owners. 
-Google Translate is a trademark of [Google LLC](https://www.google.com). Reverso is a trademark of Reverso, et cetera.
-
-The creators and maintainers of this repository assume no liability for the accuracy and timeliness of any information provided above. Trademark owner information was researched to the best of the author's knowledge at the time of curation and may be outdated or incorrect.
-
Index: /trunk/Makefile
===================================================================
--- /trunk/Makefile	(revision 70)
+++ /trunk/Makefile	(revision 71)
@@ -1,9 +1,9 @@
+GO ?= go
 PREFIX ?= /usr/local
-GOFLAGS ?= -v -ldflags "-w -X `go list`.Version=${VERSION} -X `go list`.Commit=${COMMIT}"
-VERSION = `git describe --abbrev=0 --tags 2>/dev/null || echo "VERSION"`
-COMMIT = `git rev-parse --short HEAD || echo "COMMIT"`
+GOFLAGS ?= -v -ldflags "-w -X `${GO} list`.Version=${VERSION}"
+VERSION ?= 2025.04.17
 
 build:
-	go build ${GOFLAGS} ./cmd/mai
+	${GO} build ${GOFLAGS} ./cmd/mai
 clean:
 	rm -f mai
Index: /trunk/cmd/mai/main.go
===================================================================
--- /trunk/cmd/mai/main.go	(revision 70)
+++ /trunk/cmd/mai/main.go	(revision 71)
@@ -13,6 +13,6 @@
 	"syscall"
 
-	"marisa.chaotic.ninja/mai"
-	"marisa.chaotic.ninja/mai/engines"
+	"mahou-no-mori.yakumo.dev/mai"
+	"mahou-no-mori.yakumo.dev/mai/engines"
 
 	"github.com/gofiber/fiber/v2"
@@ -25,34 +25,36 @@
 var (
 	configfile string
-	groupname string
-	username string
+	verbose bool
 )
 var conf struct {
-	danmaku int
+	group string
 	listen string
-	staticpath string
-	tmplpath string
+	requests int
+	static string
+	templates string
+	user string
 }
 func MaiSkipLimiter(c *fiber.Ctx) bool {
 	// Paths listed here are not considered for rate limiting
 	path := c.Path()
-	return strings.HasPrefix(path, "/static") ||
-		strings.HasPrefix(path, "/docs")
+	return strings.HasPrefix(path, "/static")
 }
 func main() {
 	parseFlags()
 
+	conf.listen = "127.0.0.1:5000"
+	conf.requests = 5
+	conf.static = "./static"
+	conf.templates = "./views"
+
 	if configfile != "" {
+		if verbose {
+			log.Printf("Reading configuration from %s", configfile)
+		}
 		readConf(configfile)
 	}
 
-	// Default settings
-	conf.danmaku = 10
-	conf.listen = "127.0.0.1:5000"
-	conf.staticpath = "./static"
-	conf.tmplpath = "./views"
-
-	if username != "" {
-		uid, gid, err := usergroupids(username, groupname)
+	if conf.user != "" {
+		uid, gid, err := usergroupids(conf.user, conf.group)
 		if err != nil {
 			log.Fatal(err)
@@ -62,5 +64,5 @@
 	}
 	
-	engine := html.New(conf.tmplpath, ".html")
+	engine := html.New(conf.templates, ".html")
 	engine.AddFunc("inc", func(i int) int { return i + 1 })
 
@@ -86,5 +88,5 @@
 	server.Use(favicon.New(
 		favicon.Config{
-			File: conf.staticpath + "/favicon.ico",
+			File: conf.static + "/favicon.ico",
 		},
 	))
@@ -101,5 +103,5 @@
 	server.Use(limiter.New(limiter.Config{
 		Next: MaiSkipLimiter,
-		Max: conf.danmaku,
+		Max: conf.requests,
 		Expiration: 30 * time.Second,
 		LimiterMiddleware: limiter.SlidingWindow{},
@@ -297,5 +299,5 @@
 
 	server.Get("/toomanyrequests", func(c *fiber.Ctx) error {
-		return c.SendFile(conf.tmplpath + "/429.html")
+		return c.SendFile(conf.templates + "/429.html")
 		return c.SendStatus(429)
 	})
@@ -326,12 +328,9 @@
 		return c.Redirect("/")
 	})
-	server.Static("/static", conf.staticpath, fiber.Static{
-		Compress: true,
+	server.Static("/static", conf.static, fiber.Static{
 		ByteRange: true,
 		Browse: true,
 	})
 
-	server.Static("/docs", "./docs", fiber.Static{})
-
 	server.Listen(conf.listen)
 }
Index: /trunk/cmd/mai/parseflags.go
===================================================================
--- /trunk/cmd/mai/parseflags.go	(revision 70)
+++ /trunk/cmd/mai/parseflags.go	(revision 71)
@@ -8,6 +8,5 @@
 func parseFlags() {
 	flag.StringVar(&configfile, "f", "", "Configuration file")
-	flag.StringVar(&username, "u", "", "Sets the user to which privilege dropping is done")
-	flag.StringVar(&groupname, "g", "", "Sets the group to which privilege dropping is done")
+	flag.BoolVar(&verbose, "v", false, "Be verbose")
 	flag.Parse()
 }
Index: /trunk/cmd/mai/readconf.go
===================================================================
--- /trunk/cmd/mai/readconf.go	(revision 70)
+++ /trunk/cmd/mai/readconf.go	(revision 71)
@@ -11,9 +11,11 @@
 		return err					        
 	}
-	conf.danmaku, _ = cfg.Section("mai").Key("danmaku").Int()
-	conf.listen = cfg.Section("mai").Key("listen").String()
-	conf.staticpath = cfg.Section("mai").Key("static").String()
-	conf.tmplpath = cfg.Section("mai").Key("templates").String()
 
+	conf.group = cfg.Section("mai").Key("group").String()
+	conf.listen = cfg.Section("http").Key("listen").String()
+	conf.requests, _ = cfg.Section("http").Key("requests").Int()
+	conf.static = cfg.Section("paths").Key("static").String()
+	conf.templates = cfg.Section("paths").Key("templates").String()
+	conf.user = cfg.Section("mai").Key("user").String()
 	return nil
 }
Index: /trunk/example/mai.apache.conf
===================================================================
--- /trunk/example/mai.apache.conf	(revision 71)
+++ /trunk/example/mai.apache.conf	(revision 71)
@@ -0,0 +1,19 @@
+<VirtualHost *:80>
+    ServerName mai.example.com
+    ServerAlias mai.example.com
+    RewriteEngine on
+    RewriteCond %{SERVER_NAME} =mai.example.com
+    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
+</VirtualHost>
+<VirtualHost *:443>
+    ServerName mai.example.com
+    ServerAlias mai.example.com
+    SSLEngine on
+    SSLCertificateFile /usr/pkg/etc/letsencrypt/live/example.com/fullchain.pem
+    SSLCertificateKeyFile /usr/pkg/etc/letsencrypt/live/example.com/privkey.pem
+    ProxyRequests off
+    ProxyPass / http://127.0.0.1:5000/
+    ProxyPassReverse / http://127.0.0.1:5000/
+    ProxyPreserveHost On
+</VirtualHost>
+
Index: /trunk/example/mai.ini
===================================================================
--- /trunk/example/mai.ini	(revision 70)
+++ /trunk/example/mai.ini	(revision 71)
@@ -1,4 +1,19 @@
+[http]
+# TCP socket to listen on.
+# Must not be already used by something else.
+listen = 127.0.0.1:5000
+# How many requests per minute are allowed
+# before a rate-limit happens.
+requests = 10
 [mai]
-listen = "127.0.0.1:5000"
-rootdir = "./static"
-tmplpath = "./views"
+# Drop privilege to the user and group specified.
+# When only the user is specified, the default group of the user will
+# be used.
+#
+# user = www
+# group = www
+[paths]
+# Where to locate resources such as CSS, etc
+static = ./static
+# Where to locate the pages to be served
+templates = ./views
Index: /trunk/example/mai.nginx
===================================================================
--- /trunk/example/mai.nginx	(revision 70)
+++ /trunk/example/mai.nginx	(revision 71)
@@ -2,5 +2,5 @@
     listen 80;
     listen [::]:80;
-    server_name mai.example.com;
+    server_name mai.example.org;
 
     location / {
@@ -12,5 +12,5 @@
     listen 443 ssl;
     listen [::]:443 ssl;
-    server_name mai.example.com;
+    server_name mai.example.org;
 
     ssl_certificate /path/to/fullchain.pem;
Index: /trunk/go.mod
===================================================================
--- /trunk/go.mod	(revision 70)
+++ /trunk/go.mod	(revision 71)
@@ -1,3 +1,3 @@
-module marisa.chaotic.ninja/mai
+module mahou-no-mori.yakumo.dev/mai
 
 go 1.20
Index: unk/mai.ini.5
===================================================================
--- /trunk/mai.ini.5	(revision 70)
+++ 	(revision )
@@ -1,40 +1,0 @@
-.Dd $Mdocdate$
-.Dt MAI.INI 5
-.Os
-.Sh NAME
-.Nm mai.ini
-.Nd Configuration file for Mai
-.Sh OPTIONS
-.Ss [mai] section
-.Bl -tag -width 11n
-.It danmaku (int)
-Control the maximum amount of requests
-before a ratelimit happens
-.It listen (string)
-HTTP port for the server to listen.
-Default is "localhost:5000"
-.It static (string)
-Directory where the static resources are located.
-Default is "./static"
-.It templates (string)
-Directory where the templates are located.
-Default is "./views"
-.El
-.Sh ENVIRONMENT
-.Bl -tag -width 11n
-.It Ev MAI_LIBRETRANSLATE_INSTANCE
-LibreTranslate instance to use, it's required for the engine to work.
-.It Ev MAI_LIBRETRANSLATE_API
-LibreTranslate API key for the above setting, it may or
-may not be required, depending on the instance.
-.El
-.Sh FILES
-.Pa /usr/local/etc/mai/mai.ini
-.Sh SEE ALSO
-.Xr mai 1
-.Sh AUTHORS
-.An fattalion
-.An metalune
-.An ManeraKai Lk https://manerakai.com
-.Sh MAINTAINERS
-.An Izuru Yakumo Aq Mt yakumo.izuru@chaotic.ninja
Index: /trunk/rc.d/FreeBSD
===================================================================
--- /trunk/rc.d/FreeBSD	(revision 70)
+++ /trunk/rc.d/FreeBSD	(revision 71)
@@ -1,4 +1,4 @@
 #!/bin/sh
-# $TheSupernovaDuo$
+# $YakumoLabs$
 #
 # PROVIDE: mai
Index: /trunk/rc.d/NetBSD
===================================================================
--- /trunk/rc.d/NetBSD	(revision 70)
+++ /trunk/rc.d/NetBSD	(revision 71)
@@ -1,9 +1,7 @@
 #!/bin/sh
-# $TheSupernovaDuo$
+# $YakumoLabs$
 #
 # PROVIDE: mai
 # REQUIRE: NETWORKING DAEMON
-# BEFORE: LOGIN
-# KEYWORD: shutdown
 
 $_rc_subr_loaded . /etc/rc.subr
@@ -11,10 +9,10 @@
 name="mai"
 rcvar=$name
-command="/usr/pkg/bin/mai"
-command_args="-f /usr/pkg/etc/mai/mai.ini -u www -g www"
+command="/usr/local/bin/mai"
+command_args="-f /usr/local/etc/mai/mai.ini"
 pidfile="/var/run/${name}.pid"
 start_cmd="mai_start"
 
-required_files="/usr/pkg/etc/mai/mai.ini"
+required_files="/usr/local/etc/mai/mai.ini"
 
 mai_start() {
Index: /trunk/rc.d/OpenBSD
===================================================================
--- /trunk/rc.d/OpenBSD	(revision 70)
+++ /trunk/rc.d/OpenBSD	(revision 71)
@@ -1,7 +1,7 @@
 #!/bin/ksh
-# $TheSupernovaDuo$
+# $YakumoLabs$
 
 daemon="/usr/local/bin/mai"
-daemon_flags="-f /usr/local/etc/mai/mai.ini -u www -g www"
+daemon_flags="-f /usr/local/etc/mai/mai.ini"
 
 . /etc/rc.d/rc.subr
Index: /trunk/rc.d/immortal.yml
===================================================================
--- /trunk/rc.d/immortal.yml	(revision 70)
+++ /trunk/rc.d/immortal.yml	(revision 71)
@@ -1,2 +1,3 @@
-cmd: /usr/local/bin/mai -f /usr/local/etc/mai/mai.ini -g www -u www
+# $YakumoLabs$
+cmd: /usr/local/bin/mai -f /usr/local/etc/mai/mai.ini
 cwd: /usr/local/share/mai
Index: /trunk/rc.d/mai.service
===================================================================
--- /trunk/rc.d/mai.service	(revision 71)
+++ /trunk/rc.d/mai.service	(revision 71)
@@ -0,0 +1,13 @@
+# $YakumoLabs$
+[Unit]
+Description=Mai
+Documentation=https://suzunaan.yakumo.dev/mai
+
+[Service]
+Type=simple
+Restart=always
+RestartSec=5
+ExecStart=/usr/local/bin/mai -f /usr/local/etc/mai/mai.ini
+
+[Install]
+WantedBy=multi-user.target
Index: /trunk/rc.d/mokou.conf
===================================================================
--- /trunk/rc.d/mokou.conf	(revision 71)
+++ /trunk/rc.d/mokou.conf	(revision 71)
@@ -0,0 +1,4 @@
+# $YakumoLabs$
+description=Mai
+exec=/usr/bin/env daemonize -p /var/run/mai.pid /usr/local/bin/mai -f /usr/local/etc/mai.ini
+pidfile=/var/run/mai.pid
Index: /trunk/rc.d/s6
===================================================================
--- /trunk/rc.d/s6	(revision 71)
+++ /trunk/rc.d/s6	(revision 71)
@@ -0,0 +1,4 @@
+#!/command/execlineb -P
+# $YakumoLabs$
+/usr/local/bin/mai
+-f /usr/local/etc/mai/mai.ini
Index: /trunk/version.go
===================================================================
--- /trunk/version.go	(revision 70)
+++ /trunk/version.go	(revision 71)
@@ -8,11 +8,8 @@
 	// Version release version
 	Version = "0.0.1"
-
-	// Commit will be overwritten automatically by the build system
-	Commit = "HEAD"
 )
 
 // FullVersion display the full version and build
 func FullVersion() string {
-	return fmt.Sprintf("%s@%s", Version, Commit)
+	return fmt.Sprintf("%s", Version)
 }
