diff --git a/.gitattributes b/.gitattributes
deleted file mode 100644
index 2c3ac15..0000000
--- a/.gitattributes
+++ /dev/null
@@ -1 +0,0 @@
-static/updater/* linguist-detectable=false
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index 7753ae1..5417042 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -1,55 +1,119 @@
-name: Build and Deploy
+# SourceBans++ docs deploy workflow (cutover deliverable for issue #1333).
+#
+# This repo is the GitHub Pages deploy target for .
+# The docs source lives in `sbpp/sourcebans-pp` under `docs/` (Astro Starlight);
+# this workflow checks that repo out, builds the site, and publishes via
+# GitHub's first-party `actions/deploy-pages`.
+#
+# Triggers:
+# - repository_dispatch (event type: docs-changed) — fired by
+# `.github/workflows/docs-deploy-trigger.yml` in `sbpp/sourcebans-pp` after a
+# push to main that touches `docs/**`. The dispatcher mints a short-lived
+# installation token via the org-owned `sbpp-docs-deploy` GitHub App
+# (Actions: write scope on this repo only) so we never need a PAT.
+# - workflow_dispatch — manual button in the Actions UI for forced redeploys.
+# - schedule (weekly Sunday) — safety net in case a dispatch is dropped, the
+# upstream source is unreachable at dispatch time, or a previous deploy
+# failed silently.
+#
+# MANUAL SETUP REQUIRED (see issue #1333 cutover steps; cannot be configured in
+# workflow YAML):
+# - Settings → Pages → Source must be set to "GitHub Actions" (UI-only).
+# - The `sbpp-docs-deploy` GitHub App must exist with `Actions: write` scope on
+# this repo, be installed on this repo, and have its App ID + private key
+# registered as `vars.DOCS_DEPLOY_APP_ID` + `secrets.DOCS_DEPLOY_APP_KEY` in
+# `sbpp/sourcebans-pp` (consumed by the dispatcher there — not by anything
+# here).
+
+name: Deploy docs to Pages
on:
- push:
- branches:
- - main
+ repository_dispatch:
+ types: [docs-changed]
workflow_dispatch:
+ schedule:
+ # Weekly safety net at Sunday 05:17 UTC. Non-zero minute avoids GitHub's
+ # top-of-hour cron congestion (per their scheduled-events docs).
+ - cron: '17 5 * * 0'
permissions:
- contents: write
+ contents: read
+ pages: write
+ id-token: write
+# Allow only one concurrent deployment, but never cancel an in-flight one —
+# Pages deploys should always finish to avoid leaving the site in a
+# half-published state. Standard `actions/deploy-pages` convention.
+#
+# Group name matches the issue #1333 §6 spec (`pages-deploy`) rather than
+# GitHub's example default (`pages`). Since this is the only workflow in
+# this repo that touches Pages, either choice serializes the same set of
+# runs — we just track the spec verbatim so the cross-repo intent is
+# obvious to anyone diffing the cutover.
concurrency:
group: pages-deploy
cancel-in-progress: false
jobs:
- deploy:
- runs-on: ubuntu-latest
- env:
- HUGO_VERSION: 0.88.1
+ build-and-deploy:
+ # Pinned (not `ubuntu-latest`) to match sibling
+ # `sbpp/sourcebans-pp/.github/workflows/docs-build.yml` so the build
+ # validation gate and the deploy run on byte-identical runner images.
+ runs-on: ubuntu-24.04
+ # Belt-and-suspenders against an upstream npm/Astro hang. Sibling
+ # `docs-screenshots.yml` uses 30; the deploy is build-only (no
+ # docker-compose / Playwright), so 15 is comfortably above the
+ # observed steady-state runtime.
+ timeout-minutes: 15
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ # All `run:` steps below operate inside `docs/`. `cache-dependency-path`
+ # and `path:` inputs to `uses:` actions stay rooted at the workspace
+ # because action inputs are interpreted relative to the workspace, not
+ # the job's `working-directory` default.
+ defaults:
+ run:
+ working-directory: docs
+
steps:
- - name: Checkout
- uses: actions/checkout@v4
+ - name: Checkout sourcebans-pp (docs source)
+ # Precedence: dispatched runs (repository_dispatch from
+ # `sourcebans-pp/.github/workflows/docs-deploy-trigger.yml`)
+ # carry the source commit SHA in the client payload — pin to it
+ # so two pushes A, B in quick succession don't race (A's deploy
+ # would otherwise check out main and silently rebuild from B).
+ # workflow_dispatch and schedule have no payload, so they fall
+ # through to the floating `main` ref by design (manual reruns
+ # and the weekly safety net both want the latest).
+ uses: actions/checkout@v5
with:
- submodules: true
- fetch-depth: 0
+ repository: sbpp/sourcebans-pp
+ ref: ${{ github.event.client_payload.source_sha || 'main' }}
- name: Setup Node
- uses: actions/setup-node@v4
- with:
- node-version: lts/*
-
- - name: Setup Hugo
- uses: peaceiris/actions-hugo@v3
+ uses: actions/setup-node@v5
with:
- hugo-version: ${{ env.HUGO_VERSION }}
+ # Match sibling `sourcebans-pp/.github/workflows/docs-build.yml`
+ # and the documented floor in `sourcebans-pp/docs/README.md`
+ # ("Node 20 LTS or newer"). Asymmetry between the validation
+ # gate and the deploy would mean a build that passes CI could
+ # still fail here.
+ node-version: '20'
+ cache: 'npm'
+ cache-dependency-path: docs/package-lock.json
- name: Install dependencies
- run: |
- npm install -g grunt-cli yarn
- yarn set version latest
- yarn install --no-lockfile
-
- - name: Build content index
- run: grunt content-index
+ run: npm ci
- name: Build site
- run: hugo --minify
+ run: npm run build
- - name: Deploy to GitHub Pages
- uses: peaceiris/actions-gh-pages@v4
+ - name: Upload Pages artifact
+ uses: actions/upload-pages-artifact@v5
with:
- github_token: ${{ secrets.GITHUB_TOKEN }}
- publish_dir: ./public
- publish_branch: master
+ path: docs/dist
+
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v5
diff --git a/.gitignore b/.gitignore
index 4a32503..b0e0049 100644
--- a/.gitignore
+++ b/.gitignore
@@ -45,10 +45,3 @@ Temporary Items
# Netbeans
/nbproject/
-
-# Dependencies
-node_modules
-
-# Hugo
-public
-dev
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index a8695e2..0000000
--- a/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "themes/kube"]
- path = themes/kube
- url = https://github.com/jeblister/kube.git
diff --git a/Gruntfile.js b/Gruntfile.js
deleted file mode 100644
index eb62727..0000000
--- a/Gruntfile.js
+++ /dev/null
@@ -1,70 +0,0 @@
-const toml = require('toml');
-
-const CONTENT_PATH_PREFIX = "content/docs";
-
-module.exports = function(grunt) {
-
- grunt.registerTask("content-index", function() {
-
- grunt.log.writeln("Build pages index");
-
- let indexPages = () => {
- let pagesIndex = [];
-
- grunt.file.recurse(CONTENT_PATH_PREFIX, function(abspath, rootdir, subdir, filename) {
- grunt.verbose.writeln("Parse file:", abspath);
- pagesIndex.push(processFile(abspath, filename));
- });
-
- return pagesIndex;
- }
-
- let processFile = (abspath, filename) => {
- return (filename.endsWith('.html')) ? processHTMLFile(abspath, filename) : processMDFile(abspath, filename);
- }
-
- let processHTMLFile = (abspath, filename) => {
- return {
- title: filename.replace('.html', ''),
- href: abspath.replace(CONTENT_PATH_PREFIX, ''),
- content: grunt.file.read(abspath).replace(/<[^>]*>?/gm, '').replace(/[^\w\s]|_/g, '').replace(/\s+/g, ' ').trim(),
- }
- };
-
- let processMDFile = (abspath, filename) => {
- let content = grunt.file.read(abspath);
- let pageIndex;
-
- // First separate the Front Matter from the content and parse it
- content = content.split("+++");
-
- let frontMatter;
-
- try {
- frontMatter = toml.parse(content[1].trim());
- } catch (e) {
- console.log(e.message);
- }
-
- let href = abspath.replace(CONTENT_PATH_PREFIX, '').replace('.md', '');
-
- // href for index.md files stops at the folder name
- if (filename === 'index.md') {
- href = abspath.replace(CONTENT_PATH_PREFIX, '').replace(filename, '');
- }
-
- // Build Lunr index for this page
- pageIndex = {
- title: frontMatter.title,
- tags: frontMatter.tags,
- href: href,
- content: content[2].replace(/<[^>]*>?/gm, '').replace(/[^\w\s]|_/g, '').replace(/\s+/g, ' ').trim(),
- };
-
- return pageIndex;
- };
-
- grunt.file.write("static/Content-Index.json", JSON.stringify(indexPages()));
- grunt.log.ok("Index built");
- });
-};
diff --git a/README.md b/README.md
index d9a33af..c55c127 100644
--- a/README.md
+++ b/README.md
@@ -1,19 +1,18 @@
-# SourceBans++ Website [](https://github.com/sbpp/sbpp.github.io/actions/workflows/deploy.yml)
+# SourceBans++ Docs (deploy shell)
-### Adding Articles
+This repository is the GitHub Pages deploy target for the SourceBans++ documentation site at .
-- Fork this repository
-- From Hugo CLI, generate appropriate kind of article using the archetypes provided, to the corresponding folder
-- Fill in the front matter and content
-- Submit pull request
+**Source lives in [`sbpp/sourcebans-pp` under `docs/`](https://github.com/sbpp/sourcebans-pp/tree/main/docs).** Open PRs there.
-### Contribute to Translation
+Pages is configured to build from GitHub Actions (Settings → Pages → Source: GitHub Actions). The workflow in `.github/workflows/deploy.yml` checks out `sourcebans-pp@main`, builds `docs/`, and deploys via `actions/deploy-pages`. It runs on `repository_dispatch` from `sourcebans-pp` (event type `docs-changed`), on `workflow_dispatch`, and on a weekly schedule as a safety net.
-- Fork this repository
-- Translate the files in `content/` by making another copy of the article and appending to the extension
- - Ex: `content/docs/updating.md` -> `content/docs/updating.fr.md`
- - You may also explicitly set `translationKey` in front matter within the article for good measures
-- Create a new block within `config.toml` adding the language translations for the global variables
-- Submit pull request
+## Local preview
-##### For more information, view [Hugo's Documentation](https://gohugo.io/documentation/)
+To preview the docs locally, clone `sourcebans-pp` and run the Starlight dev server:
+
+```sh
+git clone https://github.com/sbpp/sourcebans-pp.git
+cd sourcebans-pp/docs
+npm install
+npm run dev
+```
diff --git a/archetypes/blog.md b/archetypes/blog.md
deleted file mode 100644
index 911d1a9..0000000
--- a/archetypes/blog.md
+++ /dev/null
@@ -1,7 +0,0 @@
-+++
-title = ""
-date = {{ .Date }}
-description = ""
-weight = 20
-draft = false
-+++
diff --git a/archetypes/default.md b/archetypes/default.md
deleted file mode 100644
index 00e77bd..0000000
--- a/archetypes/default.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: "{{ replace .Name "-" " " | title }}"
-date: {{ .Date }}
-draft: true
----
-
diff --git a/archetypes/docs.md b/archetypes/docs.md
deleted file mode 100644
index 8e41f20..0000000
--- a/archetypes/docs.md
+++ /dev/null
@@ -1,9 +0,0 @@
-+++
-title = ""
-description = ""
-date = {{ .Date }}
-weight = 20
-draft = false
-bref = ""
-toc = true
-+++
diff --git a/config.toml b/config.toml
deleted file mode 100644
index 67206bd..0000000
--- a/config.toml
+++ /dev/null
@@ -1,36 +0,0 @@
-baseURL = "/"
-languageCode = "en-us"
-title = "SourceBans++"
-theme = "kube"
-Paginate = 4
-googleAnalytics = "UA-68577666-5"
-enableGitInfo = true
-enableEmoji = true
-
-[Params]
- description = "Global admin, ban, and communication management system for the Source engine"
- RSSLink = "/index.xml"
- author = "SourceBans++"
- github = "sbpp"
- discord = "4Bhj6NU"
-
-[Params.seo.webmaster_verifications]
- google = "NMu_qHiZPOvLzW1_DvAKrQfdQUAOdKxGnjbI8oa0cGo"
-
-[[menu.main]]
- name = "Docs"
- weight = -100
- url = "/docs/"
-[[menu.main]]
- name = "FAQ"
- weight = -100
- url = "/faq/"
-[[menu.main]]
- name = " Discord"
- pre = ""
- weight = -98
- url = "https://discord.gg/4Bhj6NU"
-[[menu.main]]
- name = "AM Subforum"
- weight = -99
- url = "https://forums.alliedmods.net/forumdisplay.php?f=152"
diff --git a/content/docs/adding_server.md b/content/docs/adding_server.md
deleted file mode 100644
index 893daf1..0000000
--- a/content/docs/adding_server.md
+++ /dev/null
@@ -1,25 +0,0 @@
-+++
-title = "Adding Server"
-description = "Adding a server"
-date = 2018-02-18T15:27:00-05:00
-weight = 23
-draft = false
-bref = "How to start importing your servers into SourceBans++"
-toc = true
-+++
-
-### Adding server to web panel
-
-1. Navigate to Admin Panel -> Server Settings -> Add new server
-
-2. Fill out the information about the server with correct RCON Password and click Add Server when done
-
-3. On refresh, record down the `ID` column for the corresponding server
-
-### Configuring SourceBans++'s ServerID
-
-1. Navigate to addons/sourcemod/configs/sourcebans
-
-2. Edit sourcebans.cfg and modify `ServerID` to the `ID` value you recorded down
-
-3. Save, reupload file, and reload map/restart server
diff --git a/content/docs/browser_freeze.md b/content/docs/browser_freeze.md
deleted file mode 100644
index 466cbaf..0000000
--- a/content/docs/browser_freeze.md
+++ /dev/null
@@ -1,23 +0,0 @@
-+++
-title = "Browser Freeze"
-description = "Solutions & debugging to unresponsiveness"
-date = 2018-02-22T11:34:15-05:00
-weight = 24
-draft = false
-bref = "Solution and steps to debug unresponsive pages"
-toc = true
-+++
-
-### Cloudflare
-
-If your site uses Cloudflare as reverse-proxy, make sure that Rocket Loader is `off`
-
-Rocket Loader bundles mootools incorrect and cause unnecessary loop calls
-
-### Debugging
-
-Most browsers bundles with a performance debugger, typically accessible via the hotkey `F12`
-
-With the performance recorder open, start recording, navigate to the unresponsive page, end the recording after ~10 seconds and export it
-
-Join our [Discord](https://discord.gg/4Bhj6NU) guild and post in #help-support with the exported performance file attached
diff --git a/content/docs/could_not_find_driver.md b/content/docs/could_not_find_driver.md
deleted file mode 100644
index fb67406..0000000
--- a/content/docs/could_not_find_driver.md
+++ /dev/null
@@ -1,36 +0,0 @@
-+++
-title = "Could not find driver \"MySQL\""
-description = "Debugging missing driver"
-date = 2018-02-23T21:56:16-05:00
-weight = 24
-draft = false
-bref = "Could not find driver \"MySQL\""
-toc = true
-+++
-
-### Web
-
-* Ensure you have installed the mysql extension of your PHP version (Ex: php8.2-mysql, replace `8.2` with whichever PHP version you have installed)
-* Ensure `pdo_mysql` module is loaded, check `phpinfo()` for this
-
-### Plugin
-
-* Please make sure `dbi.mysql.ext.so` (`dbi.mysql.ext.dll` on Windows) extension exists and check if it is loaded via sm exts list
-
-* Make sure the extension is executable via `chmod u+x dbi.mysql.ext.so`
-
-* Install `zlib` (**Requires SSH Access**)
-
- * 32-Bit Debian/Ubuntu: `apt-get install zlib1g`
-
- * 64-Bit Debian/Ubuntu: `apt-get install lib32z1`
-
- * 32/64-Bit Fedora: `yum install zlib.i686`
-
- * 32/64-Bit Mandriva: `urpmi zlib1`
-
- * 32-Bit SUSE: `zypper install libz1`
-
- * 64-Bit SUSE: `zypper install libz1-32bit`
-
-* If all of the above does not work, use `ldd -d -r dbi.mysql.ext.so` to look for missing dependencies, and use Google to look them up
diff --git a/content/docs/database_errors.md b/content/docs/database_errors.md
deleted file mode 100644
index 771064a..0000000
--- a/content/docs/database_errors.md
+++ /dev/null
@@ -1,56 +0,0 @@
-+++
-title = "Database Errors"
-description = "Common MySQL Errors"
-date = 2018-02-24T11:52:38-05:00
-weight = 23
-draft = false
-bref = "Common MySQL Errors"
-toc = true
-+++
-
-### Access Denied
-
-* If not self-hosted, please make sure your host allows remote connections
-
-This problem is often related to user accounts that the server permits
-
-View [MariaDB #Granting]({{< ref "mariadb.md#granting-permission" >}}) for more info
-
-### Can't connect to MySQL server
-
-Normally means that there is no MySQL server running on the system or that you are using an incorrect Unix socket file name or TCP/IP port number when trying to connect to the server. You should also check that the TCP/IP port you are using has not been blocked by a firewall or port blocking service.
-
-A MySQL client on Unix can connect to the mysqld server in two different ways: By using a Unix socket file to connect through a file in the file system (default /tmp/mysql.sock), or by using TCP/IP, which connects through a port number
-
-### Lost connection to MySQL server
-
-Most commonly due to `bind-address` not commented out, view [MariaDB #Configuring]({{< ref "mariadb.md#configuring" >}}) for more info
-
-It may also indicate network connectivity trouble and you should check the condition of your network if this error occurs frequently. If the error message includes “during query,” this is probably the case you are experiencing.
-
-More rarely, it can happen when the client is attempting the initial connection to the server. In this case, if your connect_timeout value is set to only a few seconds, you may be able to resolve the problem by increasing it to ten seconds, perhaps more if you have a very long distance or slow connection.
-
-### MySQL server has gone away
-
-The most common reason for the MySQL server has gone away error is that the server timed out and closed the connection. In this case, you normally get one of the following error codes (which one you get is operating system-dependent).
-
-| Error Code | Description |
-| -------------------- | --------------------------------------------------------------------------------------------------------------------------- |
-| CR_SERVER_GONE_ERROR | The client couldn't send a question to the server. |
-| CR_SERVER_LOST | The client didn't get an error when writing to the server, but it didn't get a full answer (or any answer) to the question. |
-
-Other common reasons:
-
-* If you send a query to the server that is incorrect or too large. If mysqld receives a packet that is too large or out of order, it assumes that something has gone wrong with the client and closes the connection. If you need big queries (for example, if you are working with big BLOB columns), you can increase the query limit by setting the server's max_allowed_packet variable, which has a default value of 4MB. You may also need to increase the maximum packet size on the client end.
-
-### Too many connections
-
-This means that all available connections are in use by other clients.
-
-This problem occurs commonly on shared hosting, where you are granted the most minimal resources
-
-The number of connections permitted is controlled by the max_connections system variable.
-
-### Table doesn't exist
-
-As the error may hint, the table does not exist, which might suggest your installation is corrupted
diff --git a/content/docs/debugging_connection.md b/content/docs/debugging_connection.md
deleted file mode 100644
index 239ced5..0000000
--- a/content/docs/debugging_connection.md
+++ /dev/null
@@ -1,53 +0,0 @@
-+++
-title = "Debugging Connection"
-description = "Server List & RCON Debugging"
-date = 2018-02-21T20:04:40-05:00
-weight = 23
-draft = false
-bref = "Addresses connection issue on server lists & RCON"
-toc = true
-+++
-
-### Check list
-
-* Your host is not blocking any traffic on your game server port (UDP Incoming & TCP Outgoing)
-
-* Your game server is online to people outside of your network w/o any error on binding
-
-* You can connect to server in-game
-
-* You can use RCON through in-game console, if not view [TCP Error](#tcp-error) below
-
-### Using the debug tool
-
-In SourceBans++'s root directory, there's a connection debug tool named `sb_debug_connection.php`
-
-Edit this section of that file with the corresponding server info
-
-```
-/**
- * Config part
- * Change to IP and port of the gameserver you want to test
- */
-$serverip = "";
-$serverport = ""; // Defaults to 27015 if left empty
-$serverrcon = ""; // Leave empty if you're only testing the serverinfo connection
-```
-
-Once complete, navigate to the file in your browser, and if done properly it will attempt to connect to the specified server.
-
-### UDP Error
-
-* Make sure your host is not blocking UDP Incoming
-
-* If hosting locally, make sure you are port forwarding correctly
-
-* Make sure your game server did not ban your web server's IP using `listip`, if banned: remove it from `cfg/banned_ip.cfg` and using `removeip IP` via RCON
-
-### TCP Error
-
-* Make sure your host is not blocking TCP Outgoing
-
-* Make sure your server is explicitly IP binded, do so using `-ip` launch parameter
-
-* If you are unable to use RCON through in-game console, append `-usercon` to launch parameter
diff --git a/content/docs/discord_forward_setup.md b/content/docs/discord_forward_setup.md
deleted file mode 100644
index 04cdaed..0000000
--- a/content/docs/discord_forward_setup.md
+++ /dev/null
@@ -1,45 +0,0 @@
-+++
-title = "Discord Forward Setup"
-description = "Setting up Discord forward plugin"
-date = 2018-04-02T17:48:49-04:00
-weight = 23
-draft = false
-bref = "Setting up and configuring Discord forward plugin"
-toc = true
-+++
-
-### Prerequisites
-
-* [SteamWorks](http://users.alliedmods.net/~kyles/builds/SteamWorks/)
-* [SMJansson](https://forums.alliedmods.net/showthread.php?t=184604)
-
-
-### Installing
-
-1. Grab the latest `sbpp_discord.smx` from [here](https://github.com/sbpp/discord-forward/releases)
-
-2. Upload the plugin to `addons/sourcemod/plugins`
-
-### Configuring
-
-After loading the plugin once, SourceMod auto-generates `cfg/sourcemod/sbpp_discord.cfg` containing every convar below. Edit that file (or copy the convars to `autoexec.cfg`) and set the webhook URLs you want to use. Leave any hook empty to disable that channel.
-
-#### Webhook endpoints
-
-* `sbpp_discord_banhook` — webhook for ban events
-
-* `sbpp_discord_reporthook` — webhook for in-game reports
-
-* `sbpp_discord_commshook` — webhook for communication blocks (mute/gag)
-
-#### Appearance & links
-
-* `sbpp_discord_username` — username shown on the webhook message (default: `Sourcebans++`)
-
-* `sbpp_discord_pp_url` — URL to a profile picture used by the webhook
-
-* `sbpp_website_url` — base URL of your SourceBans++ web panel; embeds will link admins/players back to it when set
-
-* `sbpp_discord_roleid` — Discord role ID to mention when a report comes in. Leave empty to disable the mention
-
-Please also keep in mind that this only pushes the notifications if action is taken in-game, it has no effect if you — for example — ban someone on the web panel.
diff --git a/content/docs/inquiries.md b/content/docs/inquiries.md
deleted file mode 100644
index 5ff7b2a..0000000
--- a/content/docs/inquiries.md
+++ /dev/null
@@ -1,39 +0,0 @@
-+++
-title = "Inquiries"
-description = "Inquiries & Solutions"
-date = 2018-02-18T14:08:08-05:00
-weight = 21
-draft = false
-bref = "Common inquiries that we have compiled"
-toc = true
-+++
-
-### Plugin Ban player option is missing in SourceMod's admin menu!
-
-Most likely SourceMod's basebans.smx was still loaded when you installed SourceBans' game plugin. The game plugin automatically disables basebans.smx, but your server needs to be restarted for the "Ban player" option to come available.
-
-Some hosters might disallow plugins to move files. Make sure the basebans.smx is in the plugins/disabled folder.
-
-### Web Player list displays "Max Players" instead of all the players
-
-Add `host_players_show 2` to your `server.cfg` or any startup config file
-
-### Web Why is Sourcebans++ not sending email reports to me (the owner)?
-
-This is because, by default, the owner account is not assigned to any permission group.
-
-Navigate to Admin Settings, edit, and assign yourself to an admin group
-
-### Web I accidently locked myself out by having Steam only login, how can I fix this?
-
-Using a database query tool (Ex: PHPMyAdmin), goto `_settings` table and modify `config.enablesteamlogin` setting and set the value to `1`
-
-### Web Why is the webpanel showing me a blank white page?
-
-This is because PHP has encountered a fatal error and cannot show any more of the page.
-
-To show the error message that PHP has produced, you will need to navigate to your web server's log directory and look for PHP's error log (Apache Default: `/var/log/apache2/error.log`)
-
-### Plugin Why does the game plugin error log tell me "Database failure: Could not find database conf "sourcebans"?
-
-You forgot to add the "sourcebans" section to SourceMod's databases.cfg, as instructed in the [quickstart](/docs/quickstart).
diff --git a/content/docs/mariadb.md b/content/docs/mariadb.md
deleted file mode 100644
index 1b1e9d5..0000000
--- a/content/docs/mariadb.md
+++ /dev/null
@@ -1,72 +0,0 @@
-+++
-title = "MariaDB"
-description = "Setting up a MariaDB server on Ubuntu LTS"
-date = 2018-02-18T20:30:47-05:00
-weight = 23
-draft = false
-bref = "This guide will walk you through on setting up a MariaDB server on Ubuntu LTS"
-toc = true
-+++
-
-SourceBans++ requires MariaDB >= 10.0 (or MySQL >= 5.6). The instructions below target current Ubuntu LTS releases (22.04 / 24.04) and install the MariaDB 10.11 LTS series.
-
-### Option A: Install from the Ubuntu repository
-
-Recent Ubuntu LTS releases ship a recent enough MariaDB by default and this is the simplest path:
-
-```
-sudo apt update
-sudo apt install mariadb-server
-```
-
-### Option B: Install from MariaDB's official repository
-
-Use this if you want a newer release than your distro provides. The legacy `apt-key adv` approach is deprecated; use `signed-by` instead.
-
-```
-sudo apt install curl gnupg ca-certificates apt-transport-https
-sudo curl -o /etc/apt/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'
-echo "deb [signed-by=/etc/apt/keyrings/mariadb-keyring.pgp] https://deb.mariadb.org/10.11/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/mariadb.list
-sudo apt update
-sudo apt install mariadb-server
-```
-
-The official [MariaDB Repository Configuration Tool](https://mariadb.org/download/?t=repo-config) can generate the same snippet for any distro/version.
-
-### Setup
-
-Run `sudo mysql_secure_installation`
-
-### Configuring
-
-Skip this section if your web panel and game servers connect to the database from the same host (`localhost`).
-
-1. Navigate to your MariaDB config (Ex: /etc/mysql/mariadb.conf.d/50-server.cnf)
-
-2. Either comment out `bind-address` by prefixing it with a `#`, or set it to `0.0.0.0` (IPv4) or `::` (IPv4 + IPv6) to listen on all interfaces
-
-3. Restart MariaDB via `sudo systemctl restart mariadb`
-
-### Granting Permission
-
-Sign in to MariaDB shell via `sudo mariadb -u root -p` (or `sudo mysql -u root -p`) and enter your password
-
-Run the following, adjusting it to suit your own needs
-
-* Username - The user you wish to create
-
-* Host - The host you wish to whitelist (e.g. `localhost`, an IP, or `%` for any host)
-
-* Password - The password to use for the user creation
-
-```
-CREATE USER 'USERNAME'@'HOST' IDENTIFIED BY 'PASSWORD';
-GRANT ALL PRIVILEGES ON `DATABASENAME`.* TO 'USERNAME'@'HOST';
-FLUSH PRIVILEGES;
-```
-
-The combined `GRANT ... IDENTIFIED BY ...` syntax is removed in MariaDB 10.4+ / MySQL 8+, so create the user first and grant privileges in a second statement. Granting on a specific database (rather than `*.*`) keeps the principle of least privilege.
-
-### Done!
-
-From here on, you are done with setting up a MariaDB server!
diff --git a/content/docs/ports.md b/content/docs/ports.md
deleted file mode 100644
index d2cf262..0000000
--- a/content/docs/ports.md
+++ /dev/null
@@ -1,19 +0,0 @@
-+++
-title = "Ports"
-description = "Required Ports"
-date = 2018-02-23T21:47:03-05:00
-weight = 24
-draft = false
-bref = "Required Ports"
-toc = true
-+++
-
-### Web Panel
-
-* UDP Incoming on game server port
-
-* TCP Outgoing on game server port
-
-### Game
-
-* Server Port ( UDP & TCP )
diff --git a/content/docs/quickstart.md b/content/docs/quickstart.md
deleted file mode 100644
index cb32132..0000000
--- a/content/docs/quickstart.md
+++ /dev/null
@@ -1,117 +0,0 @@
-+++
-title = "Quickstart"
-description = "Setup in no time"
-date = 2018-02-17T20:47:15-05:00
-weight = 20
-draft = false
-bref = "This will be a quick walkthrough of setting up SourceBans++ for the first time"
-toc = true
-+++
-
-### Prerequisites
-
-Before we get started, let's make sure you meet these following requirements:
-
-* Web
-
- * A working MySQL (>= 5.6) or [MariaDB](/docs/mariadb) (>= 10.0) database
-
- * PHP Version >= 8.2
- * `memory_limit` >= 64M
- * GMP extension
- * PDO + `pdo_mysql`, OpenSSL, and XML extensions
-
- * If installing from the `main` (development) branch, [Composer](https://getcomposer.org/) is required to pull web dependencies. Release archives ship with these pre-bundled.
-
-* Game
-
- * SourceMod >= 1.11 (1.12 stable recommended)
-
- * Metamod: Source
-
- If you're using Cloudflare, Rocket Loader must be disabled otherwise SourceBans++ will become unresponsive.
-
- > Note: if you are still on SB++ 1.6.x or older, see the [Updating](/docs/updating) guide before installing — these versions only support PHP < 7.4 and pre-1.11 SourceMod.
-
-### Uploading
-
-* Download the latest release from the release page
-
-* Upload everything that's within `web` folder to either the root of your web server or a folder that you wish to allocate
-
-* Upload everything that's within `game` to the game mod directory (`tf`, `cs`, `dod`, etc)
-
-### Write Permission (Make sure the files is under the web server user)
-
-* `config.php` file is writable (Linux: `sudo chmod 644 config.php`)
-
-* `/demos` folder is writable (Linux: `sudo chmod -R 644 demos`)
-
-* `/themes_c` folder is writable (Linux: `sudo chmod -R 774 themes_c`)
-
-* `/images/games` folder is writable (Linux: `sudo chmod -R 644 /images/games`)
-
-* `/images/maps` folder is writable (Linux: `sudo chmod -R 644 /images/maps`)
-
-### Web Installation
-
-For demonstration purposes, I am going to be using example.com for the rest of the example, you will need to replace it with your own, and it may vary depending if you placed it
-within a directory other than the root directory (Ex: `example.com/sb/`)
-
-Navigate to your Sourcebans++ installer (`example.com/install`) to begin installation
-
-1. Read over the license agreement, check `I have read, and accept the license` and click `Ok` when you are done reading
-
-2. Fill out the information
-
-
- - Server Hostname - Database host, use `localhost` if it's on the same machine, otherwise use the IP or any resolvable records
-
- - Server Port - Database port, by default it runs on `3306`, you will need to change it if the port is difference
-
- - Username - Database username, the user to sign in with
-
- - Password - Database password, the password for the corresponding user
-
- - Database - Database to use, you should create a database if have not already
-
- - Table Prefix - The prefix you want the SourceBans++ tables to use, useful if there are name collisions, otherwise, leave it at default
-
- - Steam API Key - Your Steam API key, which can be obtained here
-
- - SourceBans EMail - The email address to send password reset and/or ban submissions from, leave empty if you don't have one to use and don't plan to use it
-
-3. System check, look over everything and make sure everything is green before continuing
-
-4. Table creation, click `Ok` when a success notification pops up
-
-5. Fill out the information for your personal account, and hit `Ok` when done (Note: Steam ID is your SteamID2 ID)
-
-### Plugin Setup
-
-Navigate to your `addons/sourcemod/configs/` directory and edit databases.cfg file
-
-Append and edit the following
-
-```
-"sourcebans"
- {
- "driver" "default"
- "host" "EDITME_DATABASE_HOST_EDITME"
- "database" "EDITME_DATABASE_EDITME"
- "user" "EDITME_USERNAME_EDITME"
- "pass" "EDITME_PASSWORD_EDITME"
- "port" "3306" // EDIT IF NEEDED
- }
-```
-
-Note: Whilst the webpanel will do its best to generate the above section for you, you should not rely on this being correct. Especially if your webserver (and database server) is on a different host to your game server. Also keep in mind that if your game server has to connect remotely, you may need to allow this with your database configuration. If you have problems here you would usually need to seek help from your webhost, not the SB++ support team.
-
-Save this file and upload the changes as required.
-
-You next need to add the server in the web portal and take note of the ServerID from the SB++ Web Panel. Then navigate to your `addons/sourcemod/configs/sourcebans/` directory and edit sourcebans.cfg and update the "ServerID" parameter near the bottom of the file. Refer to the [Adding Server](/docs/adding_server) docs page for more info.
-
-
-### Final Note
-
-Please take a look at our other docs if you are having difficulty installing
diff --git a/content/docs/removing_default_message.md b/content/docs/removing_default_message.md
deleted file mode 100644
index 3919e4e..0000000
--- a/content/docs/removing_default_message.md
+++ /dev/null
@@ -1,17 +0,0 @@
-+++
-title = "Removing Default Message"
-description = "Removing the default message"
-date = 2018-02-23T21:52:44-05:00
-weight = 24
-draft = false
-bref = "Removing \"Your new SourceBans install SourceBans successfully installed!\""
-toc = true
-+++
-
-### Removal
-
-1. Navigate to Admin Panel -> Webpanel Settings
-
-2. Edit the Intro Text
-
-3. Save Changes and you are done
diff --git a/content/docs/translating.md b/content/docs/translating.md
deleted file mode 100644
index 0ffb767..0000000
--- a/content/docs/translating.md
+++ /dev/null
@@ -1,51 +0,0 @@
-+++
-title = "Translating"
-description = "Translating Web Panel & Plugin"
-date = 2018-02-23T11:58:42-05:00
-weight = 24
-draft = false
-bref = "Fundamental of translating web panel & plugin"
-toc = true
-+++
-
-### Web Panel
-
-1. Navigate to the root directory of your SourceBans++ installation's `themes` folder
-
-2. Make a copy of the `default` theme, rename it to a name of your choosing and navigate to it
-
-3. Modify `theme.conf.php` to reflect the configuration and save
-
-
-
-4. Modify each file ending `.tpl` file
-
-5. Modify the body content of the file
-
-> Note: SourceBans++ 1.7.0+ uses Smarty 5, which dropped the `{php}` tag. Custom themes that previously used `{php}` must switch to the [`{load_template}`](https://github.com/sbpp/sourcebans-pp/blob/main/web/includes/SmartyCustomFunctions.php) tag.
-
-### Plugin
-
-1. Navigate to SourceMod's `translations` directory
-
-2. The files you will need to modify are sbpp_main.phrases.txt, sbpp_comms.phrases.txt, sbpp_sleuth.phrases.txt, sbpp_report.phrases.txt, and sbpp_checker.phrases.txt
-
-3. Within `Phrases` key section, for each sub key sections, append a key value pair, with the two letter language code being the key and the value being the translation (If `#format` kv pair is present, be sure to follow it)
-
-For more information regarding SourceMod translation, view SourceMod's [Translation]() article
diff --git a/content/docs/updating.md b/content/docs/updating.md
deleted file mode 100644
index 71c3b19..0000000
--- a/content/docs/updating.md
+++ /dev/null
@@ -1,59 +0,0 @@
-+++
-title = "Updating"
-description = "Updating SourceBans++"
-date = 2018-02-18T15:49:01-05:00
-weight = 22
-draft = false
-bref = "Simple guide on updating SourceBans++"
-toc = true
-+++
-
-### Downloading
-
-Download the latest zip-archive from the release page
-
-### Web Panel
-
-1. Backup your database in case of corruption
-
-2. Switch back to the default theme if haven't already
-
-3. Upload and overwrite all contents in web to your SourceBans++ installation
-
-4. Delete install directory
-
-5. Navigate to your SourceBans++ website and append updater after it (Ex: example.com/updater, example.com/sb/updater)
-
-6. After it displays Installation up-to-date., delete updater directory and you are done
-
-### Web Panel (Upgrading from 1.6.x or 1.7.0 to 1.8.x)
-
-1.7.0+ requires PHP >= 8.2 (see [Quickstart](/docs/quickstart)) and adds a `SB_SECRET_KEY` value in config.php used by the JWT-based session manager. Existing installs need to populate it before logging in.
-
-1. Make sure your host is on PHP >= 8.2 before uploading the new files
-
-2. Follow the regular [Web Panel](#web-panel) steps above
-
-3. Navigate to example.com/upgrade.php in your browser. The script will append `SB_SECRET_KEY` to config.php and confirm with config.php updated correctly.
-
-4. Delete upgrade.php from your server when done — it can leak sensitive information if left exposed
-
-5. If you use a custom theme, note that Smarty 5 dropped the `{php}` tag — use the [`{load_template}`](https://github.com/sbpp/sourcebans-pp/blob/main/web/includes/SmartyCustomFunctions.php) tag instead
-
-### Plugin
-
-1. Upload and overwrite all contents in game to your root game directory (Ex: tf, cs, etc)
-
-2. Reconfigure the config files in addons/sourcemod/configs/sourcebans/
-
-3. Ensure everything is running smooth, and you are done
-
-### Plugin (Upgrading from version <= 1.5.4.7)
-
-1. Upload and overwrite all contents in game to your root game directory (Ex: tf, cs, etc)
-
-2. Reconfigure the config files in addons/sourcemod/configs/sourcebans/
-
-3. Delete sourcebans.smx, sourcecomms.smx, sbchecker.smx, sb_admcfg.smx, SourceSleuth.smx
-
-4. Ensure everything is running smooth, and you are done
diff --git a/content/faq/_index.md b/content/faq/_index.md
deleted file mode 100644
index 08849fc..0000000
--- a/content/faq/_index.md
+++ /dev/null
@@ -1,23 +0,0 @@
----
-title: "FAQ"
-description: "Frequently Asked Questions"
-date: 2018-02-18T13:50:44-05:00
-draft: false
----
-
-## I'm having difficulty installing SourceBans++, can you help me?
-
-We would love to! But first, we would like you read through our [quickstart]({{< ref "docs/quickstart.md" >}}), [inquiries]({{< ref "docs/inquiries.md" >}}), and other [docs](/docs) first!
-If you are still having problem after that, feel free ask for help in the relevant help channel in our [Discord](https://discord.gg/4Bhj6NU) guild.
-
-## Can I use SourceBans++ without the WebPanel?
-
-At minimum you are required to use the WebPanel to go through the installation and configuration process, and to add all of your game servers to the panel. In theory past this point you could stop using the WebPanel, and SB++ would continue to work, however you would lose access to lots of core functionality like: Adding new Servers, Creating new Admins and Modifying Bans or Handling appeals. It is for this reason we would highly recommend you use the entire package, including the WebPanel, at all times.
-
-## When will SourceBans++ 2.0 be released?
-
-Next Summer in Valve Time™
-
-## I want to contribute!
-
-That's great! You can help by taking a stab at the triaged [issues](https://github.com/sbpp/sourcebans-pp/issues) we have!
diff --git a/layouts/404.html b/layouts/404.html
deleted file mode 100644
index 3fdb417..0000000
--- a/layouts/404.html
+++ /dev/null
@@ -1,69 +0,0 @@
-{{ define "header"}}
-
-{{ end }}
-{{ define "main"}}
-