-
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 25a128d66..000000000
--- a/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2022 Sern
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/README.md b/README.md
index de35e9903..a6e070dd2 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,3 @@
-# Website
+# Website (v2)
-sern's clean, modern and user-friendly web interface.
+sern's clean, modern, and user-friendly web interface. (now built with [Starlight](https://starlight.astro.build/))
diff --git a/astro.config.mjs b/astro.config.mjs
new file mode 100644
index 000000000..eefc0c9dd
--- /dev/null
+++ b/astro.config.mjs
@@ -0,0 +1,165 @@
+import { defineConfig } from "astro/config";
+import starlight from "@astrojs/starlight";
+import starlightBlog from "starlight-blog";
+import tailwind from "@astrojs/tailwind";
+import { createStarlightTypeDocPlugin } from "starlight-typedoc";
+import lunaria from "@lunariajs/starlight";
+import { GITHUB_URL, DISCORD_URL } from "./src/utils/consts";
+import starlightLinksValidator from 'starlight-links-validator';
+import react from "@astrojs/react";
+const [typeDocV3, typeDocV3Sidebar] = createStarlightTypeDocPlugin();
+const [typeDocV4, typeDocV4Sidebar] = createStarlightTypeDocPlugin();
+
+// https://astro.build/config
+export default defineConfig({
+ // TODO: Change this whenever site is deployed to `sern.dev`
+ site: 'https:/deploy-preview-66--sern-docs.netlify.app',
+ integrations: [starlight({
+ title: "sern",
+ lastUpdated: true,
+ defaultLocale: "root",
+ locales: {
+ root: {
+ label: "English",
+ lang: "en"
+ },
+ es: {
+ label: "Español"
+ },
+ tr: {
+ label: "Türkçe"
+ }
+ },
+ social: {
+ github: GITHUB_URL,
+ discord: DISCORD_URL
+ },
+ editLink: {
+ baseUrl: GITHUB_URL + "/website/edit/main/"
+ },
+ components: {
+ Head: "~/overrides/Head.astro",
+ SiteTitle: "~/overrides/SiteTitle.astro",
+ ThemeSelect: "~/overrides/ThemeSelect.astro",
+ Sidebar: "~/overrides/Sidebar.astro",
+ FallbackContentNotice: "~/overrides/FallbackContentNotice.astro"
+ },
+ logo: {
+ src: "~/assets/logo/navbar-icon.png",
+ replacesTitle: true
+ },
+ customCss: ["~/styles/global.css"],
+ sidebar: [
+ {
+ label: "v4",
+ items: [{
+ ...typeDocV4Sidebar,
+ badge: {
+ text: "Generated"
+ }
+ }, {
+ label: "CLI",
+ autogenerate: {
+ directory: "v4/cli"
+ }
+ }, {
+ label: "Reference",
+ autogenerate: {
+ directory: "v4/reference"
+ }
+ }, {
+ label: "Snippets",
+ autogenerate: {
+ directory: "v4/snippets"
+ }
+ }, {
+ label: "Transition",
+ autogenerate: {
+ directory: "v4/transition"
+ }
+ }, {
+ label: "Tools",
+ autogenerate: {
+ directory: "v4/tools"
+ }
+ }]
+ },
+ {
+ label: "v3",
+ items: [{
+ ...typeDocV3Sidebar,
+ badge: {
+ text: "Generated"
+ }
+ }, {
+ label: "CLI",
+ autogenerate: {
+ directory: "v3/cli"
+ }
+ }, {
+ label: "Guide",
+ items: [{
+ label: "Getting Started",
+ autogenerate: {
+ directory: "v3/guide/getting-started"
+ }
+ }, {
+ label: "Walkthrough",
+ autogenerate: {
+ directory: "v3/guide/walkthrough"
+ }
+ }]
+ }]
+ },
+ ],
+ plugins: [starlightBlog({
+ authors: {
+ jacoobes: {
+ name: "jacoobes",
+ title: "Head Dev",
+ url: "https://github.com/jacoobes",
+ picture: "https://github.com/jacoobes.png"
+ },
+ ethan: {
+ name: "Sr Izan",
+ title: "Head Dev",
+ url: "https://github.com/SrIzan10",
+ picture: "https://github.com/SrIzan10.png"
+ },
+ sern: {
+ name: "sern Team",
+ url: GITHUB_URL,
+ picture: "https://github.com/sernbot.png"
+ },
+ murtatrxx: {
+ name: "Murtatrxx",
+ title: "Head Dev",
+ url: "https://github.com/Murtatrxx",
+ picture: "https://github.com/Murtatrxx.png"
+ },
+ duro: {
+ name: "Duro",
+ title: "Developer",
+ url: "https://github.com/DuroCodes",
+ picture: "https://github.com/DuroCodes.png"
+ }
+ }
+ }), typeDocV3({
+ tsconfig: './sern-handler-v3/tsconfig.json',
+ entryPoints: ['./sern-handler-v3/src/index.ts'],
+ output: 'v3/api',
+ sidebar: {
+ collapsed: true
+ }
+ }), typeDocV4({
+ tsconfig: './sern-handler-v4/tsconfig.json',
+ entryPoints: ['./sern-handler-v4/src/index.ts'],
+ output: 'v4/api',
+ sidebar: {
+ collapsed: true
+ }
+ }), lunaria(), starlightLinksValidator({
+ exclude: ['/plugins', '?(../../../..?(/../..))/v{3,4}/api/**/*']
+ })]
+ }), tailwind(), react()]
+});
diff --git a/babel.config.js b/babel.config.js
deleted file mode 100644
index e00595dae..000000000
--- a/babel.config.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = {
- presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
-};
diff --git a/blog/2022-09-28-mdx-blog-post.md b/blog/2022-09-28-mdx-blog-post.md
deleted file mode 100644
index f5ebc5925..000000000
--- a/blog/2022-09-28-mdx-blog-post.md
+++ /dev/null
@@ -1,79 +0,0 @@
----
-slug: 1.2.0
-title: Release 1.2.0
-authors: [jacoobes]
-tags: [release]
----
-
-## Class-based modules
-
-Today we're announcing the ability to create class based modules!
-To get started, install
-```
-npm install @sern/handler@latest
-```
-
-Quick List of changes!
-- [Class based modules](#class-based-modules)
-- [Deprecation Warnings](#deprecation-warnings)
-- [Dependencies update](#dependencies-update)
-
-
-### Class based modules
-Incorporate class based modules into your project instead of the traditional `commandModule` or `eventModule`
-Extend the new [CommandExecutable](docs/api/classes/CommandExecutable) or [EventExecutable](docs/api/classes/EventExecutable)
-```ts title="commands/meaning-of-life.ts"
-import { CommandType, CommandExecutable, type Args, type Context } from '@sern/handler';
-import { publish } from '../plugins/publish.js';
-import { serendipityOnly } from '../plugins/serendipityOnly.js';
-
-export default class extends CommandExecutable {
- type = CommandType.Both as const;
- description = 'What is the meaning of life?'
- override onEvent = [
- serendipityOnly()
- ];
- override plugins = [
- publish(),
- ];
- // highlight-next-line
- execute = async (ctx: Context, args: Args) => {
- await ctx.reply('42')
- };
-}
-```
-:::caution
-
-execute must not be a method of the class. It should be as above, a property on the class!
-
-:::
-
-```ts title="events/guildMemberAdd.ts"
-import { CommandType, EventExecutable, type EventType } from '@sern/handler';
-import type { GuildMember } from 'discord.js'
-
-export default class extends EventExecutable {
- type = EventType.Discord as const;
- // highlight-next-line
- execute = (member: GuildMember) => {
- console.log(member)
- };
-}
-```
-Now, you might ask **why** this feature was added. Simply put, to give flexibility to the developers.
-I believe that you should build your own structures however you might like and customize to your liking.
-In addition, **decorators now unofficially work with modules!**
-Feel free to use TypeScript experimental decorators to augment and customize your classes.
-
-### Deprecation Warnings
-The next update will bring sern v2 with some important features. Here are some things to watch out for.
-
-- [Wrapper#client](docs/api/interfaces/Wrapper) will be deprecated
-- [Wrapper#sernEmitter](docs/api/interfaces/Wrapper) will be deprecated
- - a SernEmitter will be automatically created once Sern#init is called
-- The option to pass in a function or array for [Wrapper#events](docs/api/interfaces/Wrapper) will be deprecated. Only strings are accepted.
-- [Sern#addExternal](docs/api/classes/SernEmitter) will be deprecated in favor of a better way.
-
-### Dependencies Update
-- TypeScript has been updated to 4.8.3
-- Discord.js has been upgraded to 14.5
diff --git a/blog/2022-09-30-mdx-blog-post.md b/blog/2022-09-30-mdx-blog-post.md
deleted file mode 100644
index 1d7aad5a5..000000000
--- a/blog/2022-09-30-mdx-blog-post.md
+++ /dev/null
@@ -1,62 +0,0 @@
----
-slug: getting-started
-title: How to get started with sern!
-authors: [Sr Izan]
-tags: [guides]
----
-
-## Hello everyone!
-
-I'm Sr Izan, your fellow user and contributor.
-
-Today I'm going to show you how to get started with sern and all its cool features.
-
-### Step 1: Install the CLI.
-
-Install the CLI:
-```
-npm i -g @sern/cli
-```
-and then run
-```
-sern init
-```
-:::tip
-You can also run `sern init -y` if you want to use the default options.
-:::
-
-The CLI is written in Typescript and open-sourced on [Github](https://github.com/sern-handler/cli). (thanks [evo](https://github.com/EvolutionX-10)!)
-
-### Step 2: Have some way to store secrets.
-
-Normally you'd need a way to store secrets, and the best way to do that is by installing another package: `dotenv`
-
-just `npm i dotenv` in the project folder and add `require('dotenv').config()` to your import section. Then, when you login, `process.env.TOKEN` (or however you have it named on your `.env` file) should do the trick.
-
-:::caution
-If you're using ESM, configure dotenv with `import 'dotenv/config'` instead of `require('dotenv').config()`.
-:::
-
-### And... that's it?
-
-Yes, that's it. Here's a little FAQ to get you started. You can also join the [Discord](https://sern.dev/discord) for any problems.
-
-### Extra: Video tutorial!
-
-
-
-## FAQ
-
-**Q**: How do I publish a slash command?
-**A**: Install the publish extension. Little video:
-
-
-**Q**: Any snippet VSCode extension?
-**A**: Yeah, just search `sern Snippets` made by a verified publisher called Sr Izan (haha yeah me funny!)
-
-**Q**: HEEEELLLPPPP!!!!
-**A**: Hey, don't panic! We're here to help so, join the [Discord](https://sern.dev/discord). We're trying to get to 100 members!
diff --git a/blog/2023-01-12-mdx-blog-post.md b/blog/2023-01-12-mdx-blog-post.md
deleted file mode 100644
index 586327a2e..000000000
--- a/blog/2023-01-12-mdx-blog-post.md
+++ /dev/null
@@ -1,31 +0,0 @@
----
-slug: 2.5.0
-title: Release 2.5.0
-authors: [jacoobes]
-tags: [release]
----
-
-## 2.5 Release
-
-### Join our [discord](https://sern.dev/discord)
-- Thank you for using sern in your projects. It's only going to get better!
-- I apologize for the sudden small breaking change. After this update, there won't be any for a while.
-Wow! We're increasing our semantic versioning by `+0.3.9`
-What does this mean?
-### Breaking changes
-- [controller](../docs/api/modules#controller) parameter for plugins has been removed
- - You'll need to import it instead
- - This **breaks** old [CommandPlugin](../docs/api/interfaces/CommandPlugin), but **not** old [EventPlugin](../docs/api/interfaces/EventPlugin)
-### Deprecations
-- [CommandPlugin](../docs/api/interfaces/CommandPlugin) and [EventPlugin](../docs/api/interfaces/EventPlugin) have been renamed [InitPlugin](../docs/api/interfaces/InitPlugin) and [ControlPlugin](../docs/api/interfaces/ControlPlugin)
-
-### Reason
-- The naming of plugins was getting too complex. For example, plugin naming evolved into CommandModuleCommandPlugin, CommandModuleEventPlugin and more.
-- I realize that this affects all plugins. I have updated all [plugins](https://github.com/sern-handler/awesome-plugins/pull/68) to match these changes
-- The old way of declaring plugins has been deprecated in favor of newer functions that facilitate and ease typings
- - [CommandControlPlugin](../docs/api/modules#commandcontrolplugin)
- - [CommandInitPlugin](../docs/api/modules#commandinitplugin)
- - [EventControlPlugin](../docs/api/modules#eventcontrolplugin)
- - [EventInitPlugin](../docs/api/modules#eventinitplugin)
- - [DiscordEventControlPlugin](../docs/api/modules#discordeventcontrolplugin)
- This will probably be the last breaking change in a while. Thanks for using sern!
\ No newline at end of file
diff --git a/blog/authors.yml b/blog/authors.yml
deleted file mode 100644
index c522ede2d..000000000
--- a/blog/authors.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-jacoobes:
- name: jacoobes
- title: Head Dev
- url: https://github.com/jacoobes
- image_url: https://github.com/jacoobes.png
-Sr Izan:
- name: Sr Izan
- title: Developer
- url: https://github.com/SrIzan10
- image_url: https://github.com/SrIzan10.png
-sern:
- name: sern Team
- url: https://github.com/sern-handler
- image_url: https://github.com/sernbot.png
-Murtatrxx:
- name: Murtatrxx
- title: Developer
- url: https://github.com/Murtatrxx
- image_url: https://github.com/Murtatrxx.png
-Duro:
- name: Duro
- title: Developer
- url: https://github.com/DuroCodes
- image_url: https://github.com/DuroCodes.png
diff --git a/bun.lockb b/bun.lockb
new file mode 100755
index 000000000..b2aa112ed
Binary files /dev/null and b/bun.lockb differ
diff --git a/components.json b/components.json
new file mode 100644
index 000000000..3445d27fb
--- /dev/null
+++ b/components.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "https://ui.shadcn.com/schema.json",
+ "style": "default",
+ "rsc": false,
+ "tsx": true,
+ "tailwind": {
+ "config": "tailwind.config.mjs",
+ "css": "src/styles/global.css",
+ "baseColor": "neutral",
+ "cssVariables": false,
+ "prefix": ""
+ },
+ "aliases": {
+ "components": "~/components",
+ "utils": "~/utils"
+ }
+}
\ No newline at end of file
diff --git a/docgen.docusaurus.config.js b/docgen.docusaurus.config.js
deleted file mode 100644
index ef37d6f2a..000000000
--- a/docgen.docusaurus.config.js
+++ /dev/null
@@ -1,206 +0,0 @@
-// @ts-check
-// Note: type annotations allow type checking and IDEs autocompletion
-
-const lightCodeTheme = require('prism-react-renderer').themes.nightOwlLight;
-const darkCodeTheme = require('prism-react-renderer').themes.oceanicNext;
-
-/** @type {import('@docusaurus/types').Config} */
-const config = {
- title: 'sern - Handlers. Redefined.',
- tagline: 'With the support of the community made plugins and a powerful CLI, it\'s more than just a handler.',
- url: 'https://sern.dev',
- baseUrl: '/',
- onBrokenLinks: 'ignore',
- onBrokenMarkdownLinks: 'warn',
- favicon: '/img/favicon.ico', // this currently not working
-
- // GitHub pages deployment config.
- // If you aren't using GitHub pages, you don't need these.
- organizationName: 'sern-handler', // Usually your GitHub org/user name.
- projectName: 'website', // Usually your repo name.
- deploymentBranch: 'main',
- trailingSlash: false,
-
- // Even if you don't use internalization, you can use this field to set useful
- // metadata like html lang. For example, if your site is Chinese, you may want
- // to replace "en" with "zh-Hans".
- i18n: {
- defaultLocale: 'en',
- locales: ['en']
- },
- markdown: {
- format: 'detect'
- },
- presets: [
- [
- 'classic',
- /** @type {import('@docusaurus/preset-classic').Options} */
- ({
- docs: {
- sidebarPath: require.resolve('./sidebars.js'),
- editUrl:
- 'https://github.com/sern-handler/website/edit/main/',
- },
- blog: {
- showReadingTime: true,
- // Please change this to your repo.
- // Remove this to remove the "edit this page" links.
- editUrl:
- 'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/',
- blogSidebarCount: 'ALL',
- },
- pages: {
- path: 'src/pages',
- routeBasePath: '/',
- include: ['**/*.{js,jsx,ts,tsx,md,mdx}'],
- exclude: [
- '**/_*.{js,jsx,ts,tsx,md,mdx}',
- '**/_*/**',
- '**/*.test.{js,jsx,ts,tsx}',
- '**/__tests__/**',
- ],
- },
- theme: {
- customCss: require.resolve('./src/css/custom.css'),
- },
- }),
- ],
- ],
-
- themeConfig:
- /** @type {import('@docusaurus/preset-classic').ThemeConfig} */
- ({
- image: 'https://sern.dev/img/logo.png',
- algolia: {
- appId: 'AA9S5J9NYT',
- apiKey: 'ccfe6abc4d12ac6f882565a9d0caafb1',
- indexName: 'sern',
- insights: true,
- container: 'div',
- debug: false,
- contextualSearch: true,
- externalUrlRegex: 'external\\.com|domain\\.com',
- replaceSearchResultPathname: {
- from: '/docs/api',
- to: '/docs/api',
- },
- searchParameters: {},
- searchPagePath: 'search',
- },
- navbar: {
- title: 'Home',
- logo: {
- alt: 'logo logo',
- src: 'img/favicon.ico',
- },
- items: [
- {
- type: 'doc',
- docId: 'intro',
- position: 'left',
- label: 'Docs & Guide',
- },
- { to: '/blog', label: 'Blog', position: 'left' },
- {
- href: 'https://github.com/sern-handler',
- label: 'GitHub',
- position: 'right',
- },
- {
- to: '/plugins',
- label: 'Plugins',
- position: 'left'
- }
- ],
- },
- footer: {
- style: 'dark',
- links: [
- {
- title: 'Information',
- items: [
- {
- label: 'Docs & Guide',
- to: '/docs/intro',
- },
- ],
- },
- {
- title: 'Community',
- items: [
- {
- label: 'Stack Overflow',
- href: 'https://stackoverflow.com/questions/tagged/sern-handler',
- },
- {
- label: 'Discord',
- href: 'https://discord.gg/DwbF5H5JgQ',
- },
- {
- label: 'Open Collective',
- href: 'https://opencollective.com/sern'
- }
- ],
- },
- {
- title: 'More',
- items: [
- {
- label: 'Blog',
- to: '/blog',
- },
- {
- label: 'GitHub',
- href: 'https://github.com/sern-handler',
- },
- ],
- },
- ],
- copyright: `Built with ❤️ by the sern Handler team and its contributors`,
- },
- metadata: [
- { name: 'og:title', content: 'sern - Handlers. Redefined.' },
- { name: 'og:description', content: 'A modular, customizable, fast Discord.js framework to streamline bot development' },
- { name: 'og:url', content: 'https://sern.dev' },
- { name: 'og:type', content: 'website' },
- { name: 'twitter:site', content: '@sern-handler' },
- { property: 'og:image:alt', content: 'sernlogo' },
- { name: 'twitter:title', content: 'sern - Handlers. Redefined.' },
- { name: 'twitter:description', content: 'A modular, customizable, fast Discord.js framework to streamline bot development' },
- { name: 'keywords', content: 'discord, bot, handler, framework, documentation, sern' },
- { name: 'twitter:image', content: 'https://sern.dev/img/logo.png' },
- { name: 'twitter:url', content: 'https://sern.dev' },
- { property: 'og:image:height', content: '512' },
- { property: 'og:image:width', content: '1024' },
- { name: 'theme-color', content: '#F25186' }
- ],
- prism: {
- theme: lightCodeTheme,
- darkTheme: darkCodeTheme,
- },
- }),
- plugins: [
- [
- 'docusaurus-plugin-typedoc',
- {
- //if you're editing website, please change this to your local branch of sern to generate documentation
- entryPoints: ['../sernHandlerV2/src/index.ts'],
- tsconfig: '../sernHandlerV2/tsconfig.json',
- },
- ],
- [
- "@dipakparmar/docusaurus-plugin-umami",
- {
- websiteID: "e82ff65c-b08f-47b5-8e74-5c31cbcec0ad",
- analyticsDomain: "analytics.srizan.dev",
- scriptName: 'ua.js',
- dataAutoTrack: true,
- dataDoNotTrack: true,
- dataCache: true,
- dataDomains: "sern.dev",
- },
- ]
- ]
-};
-
-module.exports = config;
diff --git a/docs/api/_category_.yml b/docs/api/_category_.yml
deleted file mode 100644
index 24a460261..000000000
--- a/docs/api/_category_.yml
+++ /dev/null
@@ -1 +0,0 @@
-label: "API"
\ No newline at end of file
diff --git a/docs/api/classes/CommandExecutable.md b/docs/api/classes/CommandExecutable.md
deleted file mode 100644
index 70471ac4f..000000000
--- a/docs/api/classes/CommandExecutable.md
+++ /dev/null
@@ -1,97 +0,0 @@
----
-id: "CommandExecutable"
-title: "Class: CommandExecutable"
-sidebar_label: "CommandExecutable"
-sidebar_position: 0
-custom_edit_url: null
----
-
-**`Deprecated`**
-
-Will be removed in future
-
-## Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `Type` | extends [`CommandType`](../enums/CommandType.md) = [`CommandType`](../enums/CommandType.md) |
-
-## Constructors
-
-### constructor
-
-• **new CommandExecutable**<`Type`\>(): [`CommandExecutable`](CommandExecutable.md)<`Type`\>
-
-#### Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `Type` | extends [`CommandType`](../enums/CommandType.md) = [`CommandType`](../enums/CommandType.md) |
-
-#### Returns
-
-[`CommandExecutable`](CommandExecutable.md)<`Type`\>
-
-## Properties
-
-### plugins
-
-• **plugins**: [`AnyCommandPlugin`](../modules.md#anycommandplugin)[] = `[]`
-
-#### Defined in
-
-[src/core/modules.ts:80](https://github.com/sern-handler/handler/blob/9d5c6c7/src/core/modules.ts#L80)
-
-___
-
-### type
-
-• `Abstract` **type**: `Type`
-
-#### Defined in
-
-[src/core/modules.ts:79](https://github.com/sern-handler/handler/blob/9d5c6c7/src/core/modules.ts#L79)
-
-___
-
-### \_instance
-
-▪ `Static` `Private` **\_instance**: [`CommandModule`](../modules.md#commandmodule)
-
-#### Defined in
-
-[src/core/modules.ts:81](https://github.com/sern-handler/handler/blob/9d5c6c7/src/core/modules.ts#L81)
-
-## Methods
-
-### execute
-
-▸ **execute**(`...args`): `unknown`
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `...args` | `CommandArgs`<`Type`, [`Control`](../enums/PluginType.md#control)\> |
-
-#### Returns
-
-`unknown`
-
-#### Defined in
-
-[src/core/modules.ts:92](https://github.com/sern-handler/handler/blob/9d5c6c7/src/core/modules.ts#L92)
-
-___
-
-### getInstance
-
-▸ **getInstance**(): [`CommandModule`](../modules.md#commandmodule)
-
-#### Returns
-
-[`CommandModule`](../modules.md#commandmodule)
-
-#### Defined in
-
-[src/core/modules.ts:83](https://github.com/sern-handler/handler/blob/9d5c6c7/src/core/modules.ts#L83)
diff --git a/docs/api/classes/Context.md b/docs/api/classes/Context.md
deleted file mode 100644
index c010674fe..000000000
--- a/docs/api/classes/Context.md
+++ /dev/null
@@ -1,348 +0,0 @@
----
-id: "Context"
-title: "Class: Context"
-sidebar_label: "Context"
-sidebar_position: 0
-custom_edit_url: null
----
-
-**`Since`**
-
-1.0.0
-Provides values shared between
-Message and ChatInputCommandInteraction
-
-## Hierarchy
-
-- `CoreContext`<`Message`, `ChatInputCommandInteraction`\>
-
- ↳ **`Context`**
-
-## Constructors
-
-### constructor
-
-• **new Context**(`ctx`): [`Context`](Context.md)
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `ctx` | `Result`<`Message`<`boolean`\>, `ChatInputCommandInteraction`<`CacheType`\>\> |
-
-#### Returns
-
-[`Context`](Context.md)
-
-#### Overrides
-
-CoreContext\<Message, ChatInputCommandInteraction\>.constructor
-
-#### Defined in
-
-[src/core/structures/context.ts:29](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/context.ts#L29)
-
-## Properties
-
-### ctx
-
-• `Protected` **ctx**: `Result`<`Message`<`boolean`\>, `ChatInputCommandInteraction`<`CacheType`\>\>
-
-#### Inherited from
-
-CoreContext.ctx
-
-#### Defined in
-
-[src/core/structures/context.ts:29](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/context.ts#L29)
-
-## Accessors
-
-### channel
-
-• `get` **channel**(): ``null`` \| `TextBasedChannel`
-
-#### Returns
-
-``null`` \| `TextBasedChannel`
-
-#### Defined in
-
-[src/core/structures/context.ts:39](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/context.ts#L39)
-
-___
-
-### channelId
-
-• `get` **channelId**(): `string`
-
-#### Returns
-
-`string`
-
-#### Defined in
-
-[src/core/structures/context.ts:45](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/context.ts#L45)
-
-___
-
-### client
-
-• `get` **client**(): `Client`<`boolean`\>
-
-#### Returns
-
-`Client`<`boolean`\>
-
-#### Defined in
-
-[src/core/structures/context.ts:91](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/context.ts#L91)
-
-___
-
-### createdTimestamp
-
-• `get` **createdTimestamp**(): `number`
-
-#### Returns
-
-`number`
-
-#### Defined in
-
-[src/core/structures/context.ts:65](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/context.ts#L65)
-
-___
-
-### guild
-
-• `get` **guild**(): ``null`` \| `Guild`
-
-#### Returns
-
-``null`` \| `Guild`
-
-#### Defined in
-
-[src/core/structures/context.ts:71](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/context.ts#L71)
-
-___
-
-### guildId
-
-• `get` **guildId**(): ``null`` \| `string`
-
-#### Returns
-
-``null`` \| `string`
-
-#### Defined in
-
-[src/core/structures/context.ts:77](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/context.ts#L77)
-
-___
-
-### id
-
-• `get` **id**(): `string`
-
-#### Returns
-
-`string`
-
-#### Defined in
-
-[src/core/structures/context.ts:33](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/context.ts#L33)
-
-___
-
-### inGuild
-
-• `get` **inGuild**(): `boolean`
-
-#### Returns
-
-`boolean`
-
-#### Defined in
-
-[src/core/structures/context.ts:97](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/context.ts#L97)
-
-___
-
-### interaction
-
-• `get` **interaction**(): `I`
-
-#### Returns
-
-`I`
-
-#### Inherited from
-
-CoreContext.interaction
-
-#### Defined in
-
-[src/core/structures/core-context.ts:15](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/core-context.ts#L15)
-
-___
-
-### member
-
-• `get` **member**(): ``null`` \| `GuildMember` \| `APIInteractionGuildMember`
-
-#### Returns
-
-``null`` \| `GuildMember` \| `APIInteractionGuildMember`
-
-#### Defined in
-
-[src/core/structures/context.ts:85](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/context.ts#L85)
-
-___
-
-### message
-
-• `get` **message**(): `M`
-
-#### Returns
-
-`M`
-
-#### Inherited from
-
-CoreContext.message
-
-#### Defined in
-
-[src/core/structures/core-context.ts:12](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/core-context.ts#L12)
-
-___
-
-### options
-
-• `get` **options**(): `Omit`<`CommandInteractionOptionResolver`<`CacheType`\>, ``"getMessage"`` \| ``"getFocused"``\>
-
-#### Returns
-
-`Omit`<`CommandInteractionOptionResolver`<`CacheType`\>, ``"getMessage"`` \| ``"getFocused"``\>
-
-#### Overrides
-
-CoreContext.options
-
-#### Defined in
-
-[src/core/structures/context.ts:26](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/context.ts#L26)
-
-___
-
-### user
-
-• `get` **user**(): `User`
-
-If context is holding a message, message.author
-else, interaction.user
-
-#### Returns
-
-`User`
-
-#### Defined in
-
-[src/core/structures/context.ts:55](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/context.ts#L55)
-
-___
-
-### userId
-
-• `get` **userId**(): `string`
-
-#### Returns
-
-`string`
-
-#### Defined in
-
-[src/core/structures/context.ts:61](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/context.ts#L61)
-
-## Methods
-
-### isMessage
-
-▸ **isMessage**(): this is CoreContext, never\>
-
-#### Returns
-
-this is CoreContext, never\>
-
-#### Inherited from
-
-CoreContext.isMessage
-
-#### Defined in
-
-[src/core/structures/core-context.ts:19](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/core-context.ts#L19)
-
-___
-
-### isSlash
-
-▸ **isSlash**(): this is CoreContext\>
-
-#### Returns
-
-this is CoreContext\>
-
-#### Inherited from
-
-CoreContext.isSlash
-
-#### Defined in
-
-[src/core/structures/core-context.ts:23](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/core-context.ts#L23)
-
-___
-
-### reply
-
-▸ **reply**(`content`): `Promise`<`Message`<`boolean`\>\>
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `content` | `ReplyOptions` |
-
-#### Returns
-
-`Promise`<`Message`<`boolean`\>\>
-
-#### Defined in
-
-[src/core/structures/context.ts:103](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/context.ts#L103)
-
-___
-
-### wrap
-
-▸ **wrap**(`wrappable`): [`Context`](Context.md)
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `wrappable` | `Message`<`boolean`\> \| `BaseInteraction`<`CacheType`\> |
-
-#### Returns
-
-[`Context`](Context.md)
-
-#### Overrides
-
-CoreContext.wrap
-
-#### Defined in
-
-[src/core/structures/context.ts:113](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/context.ts#L113)
diff --git a/docs/api/classes/DefaultErrorHandling.md b/docs/api/classes/DefaultErrorHandling.md
deleted file mode 100644
index b2d04f716..000000000
--- a/docs/api/classes/DefaultErrorHandling.md
+++ /dev/null
@@ -1,90 +0,0 @@
----
-id: "DefaultErrorHandling"
-title: "Class: DefaultErrorHandling"
-sidebar_label: "DefaultErrorHandling"
-sidebar_position: 0
-custom_edit_url: null
----
-
-**`Since`**
-
-2.0.0
-Version 4.0.0 will internalize this api. Please refrain from using the defaults!
-
-## Implements
-
-- [`ErrorHandling`](../interfaces/ErrorHandling.md)
-
-## Constructors
-
-### constructor
-
-• **new DefaultErrorHandling**(): [`DefaultErrorHandling`](DefaultErrorHandling.md)
-
-#### Returns
-
-[`DefaultErrorHandling`](DefaultErrorHandling.md)
-
-## Properties
-
-### #keepAlive
-
-• `Private` **#keepAlive**: `number` = `1`
-
-#### Defined in
-
-[src/core/structures/services/error-handling.ts:13](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/services/error-handling.ts#L13)
-
-## Methods
-
-### crash
-
-▸ **crash**(`err`): `never`
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `err` | `Error` |
-
-#### Returns
-
-`never`
-
-**`Deprecated`**
-
-Version 4 will remove this method
-
-#### Implementation of
-
-[ErrorHandling](../interfaces/ErrorHandling.md).[crash](../interfaces/ErrorHandling.md#crash)
-
-#### Defined in
-
-[src/core/structures/services/error-handling.ts:9](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/services/error-handling.ts#L9)
-
-___
-
-### updateAlive
-
-▸ **updateAlive**(`err`): `void`
-
-A function that is called on every throw.
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `err` | `Error` |
-
-#### Returns
-
-`void`
-
-#### Implementation of
-
-[ErrorHandling](../interfaces/ErrorHandling.md).[updateAlive](../interfaces/ErrorHandling.md#updatealive)
-
-#### Defined in
-
-[src/core/structures/services/error-handling.ts:15](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/services/error-handling.ts#L15)
diff --git a/docs/api/classes/DefaultLogging.md b/docs/api/classes/DefaultLogging.md
deleted file mode 100644
index a6b62234e..000000000
--- a/docs/api/classes/DefaultLogging.md
+++ /dev/null
@@ -1,136 +0,0 @@
----
-id: "DefaultLogging"
-title: "Class: DefaultLogging"
-sidebar_label: "DefaultLogging"
-sidebar_position: 0
-custom_edit_url: null
----
-
-**`Since`**
-
-2.0.0
-Version 4.0.0 will internalize this api. Please refrain from using ModuleStore!
-
-## Implements
-
-- [`Logging`](../interfaces/Logging.md)
-
-## Constructors
-
-### constructor
-
-• **new DefaultLogging**(): [`DefaultLogging`](DefaultLogging.md)
-
-#### Returns
-
-[`DefaultLogging`](DefaultLogging.md)
-
-## Methods
-
-### date
-
-▸ **date**(): `Date`
-
-#### Returns
-
-`Date`
-
-#### Defined in
-
-[src/core/structures/services/logger.ts:9](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/services/logger.ts#L9)
-
-___
-
-### debug
-
-▸ **debug**(`payload`): `void`
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `payload` | [`LogPayload`](../modules.md#logpayload) |
-
-#### Returns
-
-`void`
-
-#### Implementation of
-
-[Logging](../interfaces/Logging.md).[debug](../interfaces/Logging.md#debug)
-
-#### Defined in
-
-[src/core/structures/services/logger.ts:10](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/services/logger.ts#L10)
-
-___
-
-### error
-
-▸ **error**(`payload`): `void`
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `payload` | [`LogPayload`](../modules.md#logpayload) |
-
-#### Returns
-
-`void`
-
-#### Implementation of
-
-[Logging](../interfaces/Logging.md).[error](../interfaces/Logging.md#error)
-
-#### Defined in
-
-[src/core/structures/services/logger.ts:14](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/services/logger.ts#L14)
-
-___
-
-### info
-
-▸ **info**(`payload`): `void`
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `payload` | [`LogPayload`](../modules.md#logpayload) |
-
-#### Returns
-
-`void`
-
-#### Implementation of
-
-[Logging](../interfaces/Logging.md).[info](../interfaces/Logging.md#info)
-
-#### Defined in
-
-[src/core/structures/services/logger.ts:18](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/services/logger.ts#L18)
-
-___
-
-### warning
-
-▸ **warning**(`payload`): `void`
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `payload` | [`LogPayload`](../modules.md#logpayload) |
-
-#### Returns
-
-`void`
-
-#### Implementation of
-
-[Logging](../interfaces/Logging.md).[warning](../interfaces/Logging.md#warning)
-
-#### Defined in
-
-[src/core/structures/services/logger.ts:22](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/services/logger.ts#L22)
diff --git a/docs/api/classes/DefaultModuleManager.md b/docs/api/classes/DefaultModuleManager.md
deleted file mode 100644
index cfbbf35fc..000000000
--- a/docs/api/classes/DefaultModuleManager.md
+++ /dev/null
@@ -1,195 +0,0 @@
----
-id: "DefaultModuleManager"
-title: "Class: DefaultModuleManager"
-sidebar_label: "DefaultModuleManager"
-sidebar_position: 0
-custom_edit_url: null
----
-
-**`Since`**
-
-2.0.0
-Version 4.0.0 will internalize this api. Please refrain from using DefaultModuleManager!
-
-## Implements
-
-- [`ModuleManager`](../interfaces/ModuleManager.md)
-
-## Constructors
-
-### constructor
-
-• **new DefaultModuleManager**(`moduleStore`): [`DefaultModuleManager`](DefaultModuleManager.md)
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `moduleStore` | [`CoreModuleStore`](../interfaces/CoreModuleStore.md) |
-
-#### Returns
-
-[`DefaultModuleManager`](DefaultModuleManager.md)
-
-#### Defined in
-
-[src/core/structures/services/module-manager.ts:11](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/services/module-manager.ts#L11)
-
-## Properties
-
-### moduleStore
-
-• `Private` **moduleStore**: [`CoreModuleStore`](../interfaces/CoreModuleStore.md)
-
-#### Defined in
-
-[src/core/structures/services/module-manager.ts:11](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/services/module-manager.ts#L11)
-
-## Methods
-
-### get
-
-▸ **get**(`id`): `undefined` \| `Module`
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `id` | `string` |
-
-#### Returns
-
-`undefined` \| `Module`
-
-#### Implementation of
-
-[ModuleManager](../interfaces/ModuleManager.md).[get](../interfaces/ModuleManager.md#get)
-
-#### Defined in
-
-[src/core/structures/services/module-manager.ts:34](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/services/module-manager.ts#L34)
-
-___
-
-### getByNameCommandType
-
-▸ **getByNameCommandType**<`T`\>(`name`, `commandType`): `undefined` \| [`CommandModuleDefs`](../interfaces/CommandModuleDefs.md)[`T`]
-
-#### Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `T` | extends [`CommandType`](../enums/CommandType.md) |
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `name` | `string` |
-| `commandType` | `T` |
-
-#### Returns
-
-`undefined` \| [`CommandModuleDefs`](../interfaces/CommandModuleDefs.md)[`T`]
-
-#### Implementation of
-
-[ModuleManager](../interfaces/ModuleManager.md).[getByNameCommandType](../interfaces/ModuleManager.md#getbynamecommandtype)
-
-#### Defined in
-
-[src/core/structures/services/module-manager.ts:14](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/services/module-manager.ts#L14)
-
-___
-
-### getMetadata
-
-▸ **getMetadata**(`m`): `CommandMeta`
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `m` | `Module` |
-
-#### Returns
-
-`CommandMeta`
-
-#### Implementation of
-
-[ModuleManager](../interfaces/ModuleManager.md).[getMetadata](../interfaces/ModuleManager.md#getmetadata)
-
-#### Defined in
-
-[src/core/structures/services/module-manager.ts:26](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/services/module-manager.ts#L26)
-
-___
-
-### getPublishableCommands
-
-▸ **getPublishableCommands**(): [`CommandModule`](../modules.md#commandmodule)[]
-
-#### Returns
-
-[`CommandModule`](../modules.md#commandmodule)[]
-
-**`Deprecated`**
-
-#### Implementation of
-
-[ModuleManager](../interfaces/ModuleManager.md).[getPublishableCommands](../interfaces/ModuleManager.md#getpublishablecommands)
-
-#### Defined in
-
-[src/core/structures/services/module-manager.ts:41](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/services/module-manager.ts#L41)
-
-___
-
-### set
-
-▸ **set**(`id`, `path`): `void`
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `id` | `string` |
-| `path` | [`CommandModule`](../modules.md#commandmodule) |
-
-#### Returns
-
-`void`
-
-#### Implementation of
-
-[ModuleManager](../interfaces/ModuleManager.md).[set](../interfaces/ModuleManager.md#set)
-
-#### Defined in
-
-[src/core/structures/services/module-manager.ts:37](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/services/module-manager.ts#L37)
-
-___
-
-### setMetadata
-
-▸ **setMetadata**(`m`, `c`): `void`
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `m` | `Module` |
-| `c` | `CommandMeta` |
-
-#### Returns
-
-`void`
-
-#### Implementation of
-
-[ModuleManager](../interfaces/ModuleManager.md).[setMetadata](../interfaces/ModuleManager.md#setmetadata)
-
-#### Defined in
-
-[src/core/structures/services/module-manager.ts:22](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/services/module-manager.ts#L22)
diff --git a/docs/api/classes/EventExecutable.md b/docs/api/classes/EventExecutable.md
deleted file mode 100644
index b6273ab7b..000000000
--- a/docs/api/classes/EventExecutable.md
+++ /dev/null
@@ -1,97 +0,0 @@
----
-id: "EventExecutable"
-title: "Class: EventExecutable"
-sidebar_label: "EventExecutable"
-sidebar_position: 0
-custom_edit_url: null
----
-
-**`Deprecated`**
-
-Will be removed in future
-
-## Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `Type` | extends [`EventType`](../enums/EventType.md) |
-
-## Constructors
-
-### constructor
-
-• **new EventExecutable**<`Type`\>(): [`EventExecutable`](EventExecutable.md)<`Type`\>
-
-#### Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `Type` | extends [`EventType`](../enums/EventType.md) |
-
-#### Returns
-
-[`EventExecutable`](EventExecutable.md)<`Type`\>
-
-## Properties
-
-### plugins
-
-• **plugins**: [`AnyEventPlugin`](../modules.md#anyeventplugin)[] = `[]`
-
-#### Defined in
-
-[src/core/modules.ts:101](https://github.com/sern-handler/handler/blob/9d5c6c7/src/core/modules.ts#L101)
-
-___
-
-### type
-
-• `Abstract` **type**: `Type`
-
-#### Defined in
-
-[src/core/modules.ts:100](https://github.com/sern-handler/handler/blob/9d5c6c7/src/core/modules.ts#L100)
-
-___
-
-### \_instance
-
-▪ `Static` `Private` **\_instance**: [`EventModule`](../modules.md#eventmodule)
-
-#### Defined in
-
-[src/core/modules.ts:103](https://github.com/sern-handler/handler/blob/9d5c6c7/src/core/modules.ts#L103)
-
-## Methods
-
-### execute
-
-▸ **execute**(`...args`): `unknown`
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `...args` | `EventArgs`<`Type`, [`Control`](../enums/PluginType.md#control)\> |
-
-#### Returns
-
-`unknown`
-
-#### Defined in
-
-[src/core/modules.ts:112](https://github.com/sern-handler/handler/blob/9d5c6c7/src/core/modules.ts#L112)
-
-___
-
-### getInstance
-
-▸ **getInstance**(): [`EventModule`](../modules.md#eventmodule)
-
-#### Returns
-
-[`EventModule`](../modules.md#eventmodule)
-
-#### Defined in
-
-[src/core/modules.ts:104](https://github.com/sern-handler/handler/blob/9d5c6c7/src/core/modules.ts#L104)
diff --git a/docs/api/classes/ModuleStore.md b/docs/api/classes/ModuleStore.md
deleted file mode 100644
index 8f4a2f700..000000000
--- a/docs/api/classes/ModuleStore.md
+++ /dev/null
@@ -1,37 +0,0 @@
----
-id: "ModuleStore"
-title: "Class: ModuleStore"
-sidebar_label: "ModuleStore"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Constructors
-
-### constructor
-
-• **new ModuleStore**(): [`ModuleStore`](ModuleStore.md)
-
-#### Returns
-
-[`ModuleStore`](ModuleStore.md)
-
-## Properties
-
-### commands
-
-• **commands**: `Map`<`string`, `Module`\>
-
-#### Defined in
-
-[src/core/structures/module-store.ts:10](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/module-store.ts#L10)
-
-___
-
-### metadata
-
-• **metadata**: `WeakMap`<`Module`, `CommandMeta`\>
-
-#### Defined in
-
-[src/core/structures/module-store.ts:9](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/module-store.ts#L9)
diff --git a/docs/api/classes/SernEmitter.md b/docs/api/classes/SernEmitter.md
deleted file mode 100644
index ed113259b..000000000
--- a/docs/api/classes/SernEmitter.md
+++ /dev/null
@@ -1,1289 +0,0 @@
----
-id: "SernEmitter"
-title: "Class: SernEmitter"
-sidebar_label: "SernEmitter"
-sidebar_position: 0
-custom_edit_url: null
----
-
-**`Since`**
-
-1.0.0
-
-## Hierarchy
-
-- `EventEmitter`
-
- ↳ **`SernEmitter`**
-
-## Constructors
-
-### constructor
-
-• **new SernEmitter**(): [`SernEmitter`](SernEmitter.md)
-
-#### Returns
-
-[`SernEmitter`](SernEmitter.md)
-
-#### Overrides
-
-EventEmitter.constructor
-
-#### Defined in
-
-[src/core/structures/sern-emitter.ts:10](https://github.com/sern-handler/handler/blob/9d5c6c7/src/core/structures/sern-emitter.ts#L10)
-
-## Properties
-
-### captureRejectionSymbol
-
-▪ `Static` `Readonly` **captureRejectionSymbol**: typeof [`captureRejectionSymbol`](SernEmitter.md#capturerejectionsymbol)
-
-#### Inherited from
-
-EventEmitter.captureRejectionSymbol
-
-#### Defined in
-
-node_modules/@types/node/events.d.ts:357
-
-___
-
-### captureRejections
-
-▪ `Static` **captureRejections**: `boolean`
-
-Sets or gets the default captureRejection value for all emitters.
-
-#### Inherited from
-
-EventEmitter.captureRejections
-
-#### Defined in
-
-node_modules/@types/node/events.d.ts:362
-
-___
-
-### defaultMaxListeners
-
-▪ `Static` **defaultMaxListeners**: `number`
-
-#### Inherited from
-
-EventEmitter.defaultMaxListeners
-
-#### Defined in
-
-node_modules/@types/node/events.d.ts:363
-
-___
-
-### errorMonitor
-
-▪ `Static` `Readonly` **errorMonitor**: typeof [`errorMonitor`](SernEmitter.md#errormonitor)
-
-This symbol shall be used to install a listener for only monitoring `'error'`
-events. Listeners installed using this symbol are called before the regular
-`'error'` listeners are called.
-
-Installing a listener using this symbol does not change the behavior once an
-`'error'` event is emitted, therefore the process will still crash if no
-regular `'error'` listener is installed.
-
-#### Inherited from
-
-EventEmitter.errorMonitor
-
-#### Defined in
-
-node_modules/@types/node/events.d.ts:356
-
-## Methods
-
-### addListener
-
-▸ **addListener**(`eventName`, `listener`): [`SernEmitter`](SernEmitter.md)
-
-Alias for `emitter.on(eventName, listener)`.
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `eventName` | `string` \| `symbol` |
-| `listener` | (...`args`: `any`[]) => `void` |
-
-#### Returns
-
-[`SernEmitter`](SernEmitter.md)
-
-**`Since`**
-
-v0.1.26
-
-#### Inherited from
-
-EventEmitter.addListener
-
-#### Defined in
-
-node_modules/@types/node/events.d.ts:383
-
-___
-
-### emit
-
-▸ **emit**<`T`\>(`eventName`, `...args`): `boolean`
-
-Listening to sern events with on. This event stays on until a crash or a normal exit
-
-#### Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `T` | extends keyof [`SernEventsMapping`](../interfaces/SernEventsMapping.md) |
-
-#### Parameters
-
-| Name | Type | Description |
-| :------ | :------ | :------ |
-| `eventName` | `T` | |
-| `...args` | [`SernEventsMapping`](../interfaces/SernEventsMapping.md)[`T`] | the arguments for emitting the eventName |
-
-#### Returns
-
-`boolean`
-
-#### Overrides
-
-EventEmitter.emit
-
-#### Defined in
-
-[src/core/structures/sern-emitter.ts:40](https://github.com/sern-handler/handler/blob/9d5c6c7/src/core/structures/sern-emitter.ts#L40)
-
-___
-
-### eventNames
-
-▸ **eventNames**(): (`string` \| `symbol`)[]
-
-Returns an array listing the events for which the emitter has registered
-listeners. The values in the array are strings or `Symbol`s.
-
-```js
-const EventEmitter = require('events');
-const myEE = new EventEmitter();
-myEE.on('foo', () => {});
-myEE.on('bar', () => {});
-
-const sym = Symbol('symbol');
-myEE.on(sym, () => {});
-
-console.log(myEE.eventNames());
-// Prints: [ 'foo', 'bar', Symbol(symbol) ]
-```
-
-#### Returns
-
-(`string` \| `symbol`)[]
-
-**`Since`**
-
-v6.0.0
-
-#### Inherited from
-
-EventEmitter.eventNames
-
-#### Defined in
-
-node_modules/@types/node/events.d.ts:702
-
-___
-
-### getMaxListeners
-
-▸ **getMaxListeners**(): `number`
-
-Returns the current max listener value for the `EventEmitter` which is either
-set by `emitter.setMaxListeners(n)` or defaults to [defaultMaxListeners](SernEmitter.md#defaultmaxlisteners).
-
-#### Returns
-
-`number`
-
-**`Since`**
-
-v1.0.0
-
-#### Inherited from
-
-EventEmitter.getMaxListeners
-
-#### Defined in
-
-node_modules/@types/node/events.d.ts:555
-
-___
-
-### listenerCount
-
-▸ **listenerCount**(`eventName`, `listener?`): `number`
-
-Returns the number of listeners listening to the event named `eventName`.
-
-If `listener` is provided, it will return how many times the listener
-is found in the list of the listeners of the event.
-
-#### Parameters
-
-| Name | Type | Description |
-| :------ | :------ | :------ |
-| `eventName` | `string` \| `symbol` | The name of the event being listened for |
-| `listener?` | `Function` | The event handler function |
-
-#### Returns
-
-`number`
-
-**`Since`**
-
-v3.2.0
-
-#### Inherited from
-
-EventEmitter.listenerCount
-
-#### Defined in
-
-node_modules/@types/node/events.d.ts:649
-
-___
-
-### listeners
-
-▸ **listeners**(`eventName`): `Function`[]
-
-Returns a copy of the array of listeners for the event named `eventName`.
-
-```js
-server.on('connection', (stream) => {
- console.log('someone connected!');
-});
-console.log(util.inspect(server.listeners('connection')));
-// Prints: [ [Function] ]
-```
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `eventName` | `string` \| `symbol` |
-
-#### Returns
-
-`Function`[]
-
-**`Since`**
-
-v0.1.26
-
-#### Inherited from
-
-EventEmitter.listeners
-
-#### Defined in
-
-node_modules/@types/node/events.d.ts:568
-
-___
-
-### off
-
-▸ **off**(`eventName`, `listener`): [`SernEmitter`](SernEmitter.md)
-
-Alias for `emitter.removeListener()`.
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `eventName` | `string` \| `symbol` |
-| `listener` | (...`args`: `any`[]) => `void` |
-
-#### Returns
-
-[`SernEmitter`](SernEmitter.md)
-
-**`Since`**
-
-v10.0.0
-
-#### Inherited from
-
-EventEmitter.off
-
-#### Defined in
-
-node_modules/@types/node/events.d.ts:528
-
-___
-
-### on
-
-▸ **on**<`T`\>(`eventName`, `listener`): [`SernEmitter`](SernEmitter.md)
-
-Listening to sern events with on. This event stays on until a crash or a normal exit
-
-#### Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `T` | extends keyof [`SernEventsMapping`](../interfaces/SernEventsMapping.md) |
-
-#### Parameters
-
-| Name | Type | Description |
-| :------ | :------ | :------ |
-| `eventName` | `T` | |
-| `listener` | (...`args`: [`SernEventsMapping`](../interfaces/SernEventsMapping.md)[`T`][]) => `void` | what to do with the data |
-
-#### Returns
-
-[`SernEmitter`](SernEmitter.md)
-
-#### Overrides
-
-EventEmitter.on
-
-#### Defined in
-
-[src/core/structures/sern-emitter.ts:18](https://github.com/sern-handler/handler/blob/9d5c6c7/src/core/structures/sern-emitter.ts#L18)
-
-___
-
-### once
-
-▸ **once**<`T`\>(`eventName`, `listener`): [`SernEmitter`](SernEmitter.md)
-
-Listening to sern events with on. This event stays on until a crash or a normal exit
-
-#### Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `T` | extends keyof [`SernEventsMapping`](../interfaces/SernEventsMapping.md) |
-
-#### Parameters
-
-| Name | Type | Description |
-| :------ | :------ | :------ |
-| `eventName` | `T` | |
-| `listener` | (...`args`: [`SernEventsMapping`](../interfaces/SernEventsMapping.md)[`T`][]) => `void` | what to do with the data |
-
-#### Returns
-
-[`SernEmitter`](SernEmitter.md)
-
-#### Overrides
-
-EventEmitter.once
-
-#### Defined in
-
-[src/core/structures/sern-emitter.ts:29](https://github.com/sern-handler/handler/blob/9d5c6c7/src/core/structures/sern-emitter.ts#L29)
-
-___
-
-### prependListener
-
-▸ **prependListener**(`eventName`, `listener`): [`SernEmitter`](SernEmitter.md)
-
-Adds the `listener` function to the _beginning_ of the listeners array for the
-event named `eventName`. No checks are made to see if the `listener` has
-already been added. Multiple calls passing the same combination of `eventName`and `listener` will result in the `listener` being added, and called, multiple
-times.
-
-```js
-server.prependListener('connection', (stream) => {
- console.log('someone connected!');
-});
-```
-
-Returns a reference to the `EventEmitter`, so that calls can be chained.
-
-#### Parameters
-
-| Name | Type | Description |
-| :------ | :------ | :------ |
-| `eventName` | `string` \| `symbol` | The name of the event. |
-| `listener` | (...`args`: `any`[]) => `void` | The callback function |
-
-#### Returns
-
-[`SernEmitter`](SernEmitter.md)
-
-**`Since`**
-
-v6.0.0
-
-#### Inherited from
-
-EventEmitter.prependListener
-
-#### Defined in
-
-node_modules/@types/node/events.d.ts:667
-
-___
-
-### prependOnceListener
-
-▸ **prependOnceListener**(`eventName`, `listener`): [`SernEmitter`](SernEmitter.md)
-
-Adds a **one-time**`listener` function for the event named `eventName` to the _beginning_ of the listeners array. The next time `eventName` is triggered, this
-listener is removed, and then invoked.
-
-```js
-server.prependOnceListener('connection', (stream) => {
- console.log('Ah, we have our first user!');
-});
-```
-
-Returns a reference to the `EventEmitter`, so that calls can be chained.
-
-#### Parameters
-
-| Name | Type | Description |
-| :------ | :------ | :------ |
-| `eventName` | `string` \| `symbol` | The name of the event. |
-| `listener` | (...`args`: `any`[]) => `void` | The callback function |
-
-#### Returns
-
-[`SernEmitter`](SernEmitter.md)
-
-**`Since`**
-
-v6.0.0
-
-#### Inherited from
-
-EventEmitter.prependOnceListener
-
-#### Defined in
-
-node_modules/@types/node/events.d.ts:683
-
-___
-
-### rawListeners
-
-▸ **rawListeners**(`eventName`): `Function`[]
-
-Returns a copy of the array of listeners for the event named `eventName`,
-including any wrappers (such as those created by `.once()`).
-
-```js
-const emitter = new EventEmitter();
-emitter.once('log', () => console.log('log once'));
-
-// Returns a new Array with a function `onceWrapper` which has a property
-// `listener` which contains the original listener bound above
-const listeners = emitter.rawListeners('log');
-const logFnWrapper = listeners[0];
-
-// Logs "log once" to the console and does not unbind the `once` event
-logFnWrapper.listener();
-
-// Logs "log once" to the console and removes the listener
-logFnWrapper();
-
-emitter.on('log', () => console.log('log persistently'));
-// Will return a new Array with a single function bound by `.on()` above
-const newListeners = emitter.rawListeners('log');
-
-// Logs "log persistently" twice
-newListeners[0]();
-emitter.emit('log');
-```
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `eventName` | `string` \| `symbol` |
-
-#### Returns
-
-`Function`[]
-
-**`Since`**
-
-v9.4.0
-
-#### Inherited from
-
-EventEmitter.rawListeners
-
-#### Defined in
-
-node_modules/@types/node/events.d.ts:598
-
-___
-
-### removeAllListeners
-
-▸ **removeAllListeners**(`event?`): [`SernEmitter`](SernEmitter.md)
-
-Removes all listeners, or those of the specified `eventName`.
-
-It is bad practice to remove listeners added elsewhere in the code,
-particularly when the `EventEmitter` instance was created by some other
-component or module (e.g. sockets or file streams).
-
-Returns a reference to the `EventEmitter`, so that calls can be chained.
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `event?` | `string` \| `symbol` |
-
-#### Returns
-
-[`SernEmitter`](SernEmitter.md)
-
-**`Since`**
-
-v0.1.26
-
-#### Inherited from
-
-EventEmitter.removeAllListeners
-
-#### Defined in
-
-node_modules/@types/node/events.d.ts:539
-
-___
-
-### removeListener
-
-▸ **removeListener**(`eventName`, `listener`): [`SernEmitter`](SernEmitter.md)
-
-Removes the specified `listener` from the listener array for the event named`eventName`.
-
-```js
-const callback = (stream) => {
- console.log('someone connected!');
-};
-server.on('connection', callback);
-// ...
-server.removeListener('connection', callback);
-```
-
-`removeListener()` will remove, at most, one instance of a listener from the
-listener array. If any single listener has been added multiple times to the
-listener array for the specified `eventName`, then `removeListener()` must be
-called multiple times to remove each instance.
-
-Once an event is emitted, all listeners attached to it at the
-time of emitting are called in order. This implies that any`removeListener()` or `removeAllListeners()` calls _after_ emitting and _before_ the last listener finishes execution
-will not remove them from`emit()` in progress. Subsequent events behave as expected.
-
-```js
-const myEmitter = new MyEmitter();
-
-const callbackA = () => {
- console.log('A');
- myEmitter.removeListener('event', callbackB);
-};
-
-const callbackB = () => {
- console.log('B');
-};
-
-myEmitter.on('event', callbackA);
-
-myEmitter.on('event', callbackB);
-
-// callbackA removes listener callbackB but it will still be called.
-// Internal listener array at time of emit [callbackA, callbackB]
-myEmitter.emit('event');
-// Prints:
-// A
-// B
-
-// callbackB is now removed.
-// Internal listener array [callbackA]
-myEmitter.emit('event');
-// Prints:
-// A
-```
-
-Because listeners are managed using an internal array, calling this will
-change the position indices of any listener registered _after_ the listener
-being removed. This will not impact the order in which listeners are called,
-but it means that any copies of the listener array as returned by
-the `emitter.listeners()` method will need to be recreated.
-
-When a single function has been added as a handler multiple times for a single
-event (as in the example below), `removeListener()` will remove the most
-recently added instance. In the example the `once('ping')`listener is removed:
-
-```js
-const ee = new EventEmitter();
-
-function pong() {
- console.log('pong');
-}
-
-ee.on('ping', pong);
-ee.once('ping', pong);
-ee.removeListener('ping', pong);
-
-ee.emit('ping');
-ee.emit('ping');
-```
-
-Returns a reference to the `EventEmitter`, so that calls can be chained.
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `eventName` | `string` \| `symbol` |
-| `listener` | (...`args`: `any`[]) => `void` |
-
-#### Returns
-
-[`SernEmitter`](SernEmitter.md)
-
-**`Since`**
-
-v0.1.26
-
-#### Inherited from
-
-EventEmitter.removeListener
-
-#### Defined in
-
-node_modules/@types/node/events.d.ts:523
-
-___
-
-### setMaxListeners
-
-▸ **setMaxListeners**(`n`): [`SernEmitter`](SernEmitter.md)
-
-By default `EventEmitter`s will print a warning if more than `10` listeners are
-added for a particular event. This is a useful default that helps finding
-memory leaks. The `emitter.setMaxListeners()` method allows the limit to be
-modified for this specific `EventEmitter` instance. The value can be set to`Infinity` (or `0`) to indicate an unlimited number of listeners.
-
-Returns a reference to the `EventEmitter`, so that calls can be chained.
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `n` | `number` |
-
-#### Returns
-
-[`SernEmitter`](SernEmitter.md)
-
-**`Since`**
-
-v0.3.5
-
-#### Inherited from
-
-EventEmitter.setMaxListeners
-
-#### Defined in
-
-node_modules/@types/node/events.d.ts:549
-
-___
-
-### failure
-
-▸ **failure**(`module?`, `reason?`): `Object`
-
-Creates a compliant SernEmitter failure payload
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `module?` | `Module` |
-| `reason?` | `unknown` |
-
-#### Returns
-
-`Object`
-
-| Name | Type |
-| :------ | :------ |
-| `module?` | `AnyModule` |
-| `reason` | `string` \| `Error` |
-| `type` | [`Failure`](../enums/PayloadType.md#failure) |
-
-#### Defined in
-
-[src/core/structures/sern-emitter.ts:59](https://github.com/sern-handler/handler/blob/9d5c6c7/src/core/structures/sern-emitter.ts#L59)
-
-___
-
-### getEventListeners
-
-▸ **getEventListeners**(`emitter`, `name`): `Function`[]
-
-Returns a copy of the array of listeners for the event named `eventName`.
-
-For `EventEmitter`s this behaves exactly the same as calling `.listeners` on
-the emitter.
-
-For `EventTarget`s this is the only way to get the event listeners for the
-event target. This is useful for debugging and diagnostic purposes.
-
-```js
-const { getEventListeners, EventEmitter } = require('events');
-
-{
- const ee = new EventEmitter();
- const listener = () => console.log('Events are fun');
- ee.on('foo', listener);
- getEventListeners(ee, 'foo'); // [listener]
-}
-{
- const et = new EventTarget();
- const listener = () => console.log('Events are fun');
- et.addEventListener('foo', listener);
- getEventListeners(et, 'foo'); // [listener]
-}
-```
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `emitter` | `EventEmitter` \| `_DOMEventTarget` |
-| `name` | `string` \| `symbol` |
-
-#### Returns
-
-`Function`[]
-
-**`Since`**
-
-v15.2.0, v14.17.0
-
-#### Inherited from
-
-EventEmitter.getEventListeners
-
-#### Defined in
-
-node_modules/@types/node/events.d.ts:299
-
-___
-
-### getMaxListeners
-
-▸ **getMaxListeners**(`emitter`): `number`
-
-Returns the currently set max amount of listeners.
-
-For `EventEmitter`s this behaves exactly the same as calling `.getMaxListeners` on
-the emitter.
-
-For `EventTarget`s this is the only way to get the max event listeners for the
-event target. If the number of event handlers on a single EventTarget exceeds
-the max set, the EventTarget will print a warning.
-
-```js
-import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';
-
-{
- const ee = new EventEmitter();
- console.log(getMaxListeners(ee)); // 10
- setMaxListeners(11, ee);
- console.log(getMaxListeners(ee)); // 11
-}
-{
- const et = new EventTarget();
- console.log(getMaxListeners(et)); // 10
- setMaxListeners(11, et);
- console.log(getMaxListeners(et)); // 11
-}
-```
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `emitter` | `EventEmitter` \| `_DOMEventTarget` |
-
-#### Returns
-
-`number`
-
-**`Since`**
-
-v18.17.0
-
-#### Inherited from
-
-EventEmitter.getMaxListeners
-
-#### Defined in
-
-node_modules/@types/node/events.d.ts:328
-
-___
-
-### listenerCount
-
-▸ **listenerCount**(`emitter`, `eventName`): `number`
-
-A class method that returns the number of listeners for the given `eventName`registered on the given `emitter`.
-
-```js
-const { EventEmitter, listenerCount } = require('events');
-const myEmitter = new EventEmitter();
-myEmitter.on('event', () => {});
-myEmitter.on('event', () => {});
-console.log(listenerCount(myEmitter, 'event'));
-// Prints: 2
-```
-
-#### Parameters
-
-| Name | Type | Description |
-| :------ | :------ | :------ |
-| `emitter` | `EventEmitter` | The emitter to query |
-| `eventName` | `string` \| `symbol` | The event name |
-
-#### Returns
-
-`number`
-
-**`Since`**
-
-v0.9.12
-
-**`Deprecated`**
-
-Since v3.2.0 - Use `listenerCount` instead.
-
-#### Inherited from
-
-EventEmitter.listenerCount
-
-#### Defined in
-
-node_modules/@types/node/events.d.ts:271
-
-___
-
-### on
-
-▸ **on**(`emitter`, `eventName`, `options?`): `AsyncIterableIterator`<`any`\>
-
-```js
-const { on, EventEmitter } = require('events');
-
-(async () => {
- const ee = new EventEmitter();
-
- // Emit later on
- process.nextTick(() => {
- ee.emit('foo', 'bar');
- ee.emit('foo', 42);
- });
-
- for await (const event of on(ee, 'foo')) {
- // The execution of this inner block is synchronous and it
- // processes one event at a time (even with await). Do not use
- // if concurrent execution is required.
- console.log(event); // prints ['bar'] [42]
- }
- // Unreachable here
-})();
-```
-
-Returns an `AsyncIterator` that iterates `eventName` events. It will throw
-if the `EventEmitter` emits `'error'`. It removes all listeners when
-exiting the loop. The `value` returned by each iteration is an array
-composed of the emitted event arguments.
-
-An `AbortSignal` can be used to cancel waiting on events:
-
-```js
-const { on, EventEmitter } = require('events');
-const ac = new AbortController();
-
-(async () => {
- const ee = new EventEmitter();
-
- // Emit later on
- process.nextTick(() => {
- ee.emit('foo', 'bar');
- ee.emit('foo', 42);
- });
-
- for await (const event of on(ee, 'foo', { signal: ac.signal })) {
- // The execution of this inner block is synchronous and it
- // processes one event at a time (even with await). Do not use
- // if concurrent execution is required.
- console.log(event); // prints ['bar'] [42]
- }
- // Unreachable here
-})();
-
-process.nextTick(() => ac.abort());
-```
-
-#### Parameters
-
-| Name | Type | Description |
-| :------ | :------ | :------ |
-| `emitter` | `EventEmitter` | - |
-| `eventName` | `string` | The name of the event being listened for |
-| `options?` | `StaticEventEmitterOptions` | - |
-
-#### Returns
-
-`AsyncIterableIterator`<`any`\>
-
-that iterates `eventName` events emitted by the `emitter`
-
-**`Since`**
-
-v13.6.0, v12.16.0
-
-#### Inherited from
-
-EventEmitter.on
-
-#### Defined in
-
-node_modules/@types/node/events.d.ts:254
-
-▸ **on**<`Emitter`, `Events`\>(`eventEmitter`, `eventName`): `AsyncIterableIterator`<`Emitter` extends `Client`<`boolean`\> ? `ClientEvents`[`Events`] : `any`\>
-
-#### Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `Emitter` | extends `__module` |
-| `Events` | extends keyof `ClientEvents` |
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `eventEmitter` | `Emitter` |
-| `eventName` | `Emitter` extends `Client`<`boolean`\> ? `Events` : `string` |
-
-#### Returns
-
-`AsyncIterableIterator`<`Emitter` extends `Client`<`boolean`\> ? `ClientEvents`[`Events`] : `any`\>
-
-#### Inherited from
-
-EventEmitter.on
-
-#### Defined in
-
-node_modules/discord.js/typings/index.d.ts:243
-
-___
-
-### once
-
-▸ **once**(`emitter`, `eventName`, `options?`): `Promise`<`any`[]\>
-
-Creates a `Promise` that is fulfilled when the `EventEmitter` emits the given
-event or that is rejected if the `EventEmitter` emits `'error'` while waiting.
-The `Promise` will resolve with an array of all the arguments emitted to the
-given event.
-
-This method is intentionally generic and works with the web platform [EventTarget](https://dom.spec.whatwg.org/#interface-eventtarget) interface, which has no special`'error'` event
-semantics and does not listen to the `'error'` event.
-
-```js
-const { once, EventEmitter } = require('events');
-
-async function run() {
- const ee = new EventEmitter();
-
- process.nextTick(() => {
- ee.emit('myevent', 42);
- });
-
- const [value] = await once(ee, 'myevent');
- console.log(value);
-
- const err = new Error('kaboom');
- process.nextTick(() => {
- ee.emit('error', err);
- });
-
- try {
- await once(ee, 'myevent');
- } catch (err) {
- console.log('error happened', err);
- }
-}
-
-run();
-```
-
-The special handling of the `'error'` event is only used when `events.once()`is used to wait for another event. If `events.once()` is used to wait for the
-'`error'` event itself, then it is treated as any other kind of event without
-special handling:
-
-```js
-const { EventEmitter, once } = require('events');
-
-const ee = new EventEmitter();
-
-once(ee, 'error')
- .then(([err]) => console.log('ok', err.message))
- .catch((err) => console.log('error', err.message));
-
-ee.emit('error', new Error('boom'));
-
-// Prints: ok boom
-```
-
-An `AbortSignal` can be used to cancel waiting for the event:
-
-```js
-const { EventEmitter, once } = require('events');
-
-const ee = new EventEmitter();
-const ac = new AbortController();
-
-async function foo(emitter, event, signal) {
- try {
- await once(emitter, event, { signal });
- console.log('event emitted!');
- } catch (error) {
- if (error.name === 'AbortError') {
- console.error('Waiting for the event was canceled!');
- } else {
- console.error('There was an error', error.message);
- }
- }
-}
-
-foo(ee, 'foo', ac.signal);
-ac.abort(); // Abort waiting for the event
-ee.emit('foo'); // Prints: Waiting for the event was canceled!
-```
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `emitter` | `_NodeEventTarget` |
-| `eventName` | `string` \| `symbol` |
-| `options?` | `StaticEventEmitterOptions` |
-
-#### Returns
-
-`Promise`<`any`[]\>
-
-**`Since`**
-
-v11.13.0, v10.16.0
-
-#### Inherited from
-
-EventEmitter.once
-
-#### Defined in
-
-node_modules/@types/node/events.d.ts:194
-
-▸ **once**(`emitter`, `eventName`, `options?`): `Promise`<`any`[]\>
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `emitter` | `_DOMEventTarget` |
-| `eventName` | `string` |
-| `options?` | `StaticEventEmitterOptions` |
-
-#### Returns
-
-`Promise`<`any`[]\>
-
-#### Inherited from
-
-EventEmitter.once
-
-#### Defined in
-
-node_modules/@types/node/events.d.ts:195
-
-▸ **once**<`Emitter`, `Event`\>(`eventEmitter`, `eventName`): `Promise`<`Emitter` extends `Client`<`boolean`\> ? `ClientEvents`[`Event`] : `any`[]\>
-
-#### Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `Emitter` | extends `__module` |
-| `Event` | extends keyof `ClientEvents` |
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `eventEmitter` | `Emitter` |
-| `eventName` | `Emitter` extends `Client`<`boolean`\> ? `Event` : `string` |
-
-#### Returns
-
-`Promise`<`Emitter` extends `Client`<`boolean`\> ? `ClientEvents`[`Event`] : `any`[]\>
-
-#### Inherited from
-
-EventEmitter.once
-
-#### Defined in
-
-node_modules/discord.js/typings/index.d.ts:239
-
-___
-
-### payload
-
-▸ **payload**<`T`\>(`type`, `module?`, `reason?`): `T`
-
-#### Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `T` | extends [`Payload`](../modules.md#payload) |
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `type` | [`PayloadType`](../enums/PayloadType.md) |
-| `module?` | `Module` |
-| `reason?` | `unknown` |
-
-#### Returns
-
-`T`
-
-#### Defined in
-
-[src/core/structures/sern-emitter.ts:46](https://github.com/sern-handler/handler/blob/9d5c6c7/src/core/structures/sern-emitter.ts#L46)
-
-___
-
-### setMaxListeners
-
-▸ **setMaxListeners**(`n?`, `...eventTargets`): `void`
-
-```js
-const {
- setMaxListeners,
- EventEmitter
-} = require('events');
-
-const target = new EventTarget();
-const emitter = new EventEmitter();
-
-setMaxListeners(5, target, emitter);
-```
-
-#### Parameters
-
-| Name | Type | Description |
-| :------ | :------ | :------ |
-| `n?` | `number` | A non-negative number. The maximum number of listeners per `EventTarget` event. |
-| `...eventTargets` | (`EventEmitter` \| `_DOMEventTarget`)[] | - |
-
-#### Returns
-
-`void`
-
-**`Since`**
-
-v15.4.0
-
-#### Inherited from
-
-EventEmitter.setMaxListeners
-
-#### Defined in
-
-node_modules/@types/node/events.d.ts:346
-
-___
-
-### success
-
-▸ **success**(`module`): `Object`
-
-Creates a compliant SernEmitter module success payload
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `module` | `Module` |
-
-#### Returns
-
-`Object`
-
-| Name | Type |
-| :------ | :------ |
-| `module` | `AnyModule` |
-| `type` | [`Success`](../enums/PayloadType.md#success) |
-
-#### Defined in
-
-[src/core/structures/sern-emitter.ts:72](https://github.com/sern-handler/handler/blob/9d5c6c7/src/core/structures/sern-emitter.ts#L72)
-
-___
-
-### warning
-
-▸ **warning**(`reason`): `Object`
-
-Creates a compliant SernEmitter module warning payload
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `reason` | `unknown` |
-
-#### Returns
-
-`Object`
-
-| Name | Type |
-| :------ | :------ |
-| `reason` | `string` |
-| `type` | [`Warning`](../enums/PayloadType.md#warning) |
-
-#### Defined in
-
-[src/core/structures/sern-emitter.ts:82](https://github.com/sern-handler/handler/blob/9d5c6c7/src/core/structures/sern-emitter.ts#L82)
diff --git a/docs/api/classes/_category_.yml b/docs/api/classes/_category_.yml
deleted file mode 100644
index 55c7980a4..000000000
--- a/docs/api/classes/_category_.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-label: "Classes"
-position: 3
\ No newline at end of file
diff --git a/docs/api/enums/SernError.md b/docs/api/enums/SernError.md
deleted file mode 100644
index 836104111..000000000
--- a/docs/api/enums/SernError.md
+++ /dev/null
@@ -1,104 +0,0 @@
----
-id: "SernError"
-title: "Enumeration: SernError"
-sidebar_label: "SernError"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Enumeration Members
-
-### InvalidModuleType
-
-• **InvalidModuleType** = ``"Detected an unknown module type"``
-
-Throws when registering an invalid module.
-This means it is undefined or an invalid command type was provided
-
-#### Defined in
-
-[src/handler/structures/errors.ts:9](https://github.com/sern-handler/handler/blob/c1f6906/src/handler/structures/errors.ts#L9)
-
-___
-
-### MismatchEvent
-
-• **MismatchEvent** = ``"You cannot use message when an interaction fired or vice versa"``
-
-A crash that occurs when accessing an invalid property of Context
-
-#### Defined in
-
-[src/handler/structures/errors.ts:29](https://github.com/sern-handler/handler/blob/c1f6906/src/handler/structures/errors.ts#L29)
-
-___
-
-### MismatchModule
-
-• **MismatchModule** = ``"A module type mismatched with event emitted!"``
-
-Attempted to lookup module in command module store. Nothing was found!
-
-#### Defined in
-
-[src/handler/structures/errors.ts:17](https://github.com/sern-handler/handler/blob/c1f6906/src/handler/structures/errors.ts#L17)
-
-___
-
-### MissingRequired
-
-• **MissingRequired** = ``"@sern/client is required but was not found"``
-
-Required Dependency not found
-
-#### Defined in
-
-[src/handler/structures/errors.ts:37](https://github.com/sern-handler/handler/blob/c1f6906/src/handler/structures/errors.ts#L37)
-
-___
-
-### NotSupportedInteraction
-
-• **NotSupportedInteraction** = ``"This interaction is not supported."``
-
-Unsupported interaction at this moment.
-
-#### Defined in
-
-[src/handler/structures/errors.ts:21](https://github.com/sern-handler/handler/blob/c1f6906/src/handler/structures/errors.ts#L21)
-
-___
-
-### NotSupportedYet
-
-• **NotSupportedYet** = ``"This feature is not supported yet"``
-
-Unsupported feature attempted to access at this time
-
-#### Defined in
-
-[src/handler/structures/errors.ts:33](https://github.com/sern-handler/handler/blob/c1f6906/src/handler/structures/errors.ts#L33)
-
-___
-
-### PluginFailure
-
-• **PluginFailure** = ``"A plugin failed to call controller.next()"``
-
-One plugin called `controller.stop()` (end command execution / loading)
-
-#### Defined in
-
-[src/handler/structures/errors.ts:25](https://github.com/sern-handler/handler/blob/c1f6906/src/handler/structures/errors.ts#L25)
-
-___
-
-### UndefinedModule
-
-• **UndefinedModule** = ``"A module could not be detected"``
-
-Attempted to lookup module in command module store. Nothing was found!
-
-#### Defined in
-
-[src/handler/structures/errors.ts:13](https://github.com/sern-handler/handler/blob/c1f6906/src/handler/structures/errors.ts#L13)
diff --git a/docs/api/enums/_category_.yml b/docs/api/enums/_category_.yml
deleted file mode 100644
index 1687a9e03..000000000
--- a/docs/api/enums/_category_.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-label: "Enumerations"
-position: 2
\ No newline at end of file
diff --git a/docs/api/index.md b/docs/api/index.md
deleted file mode 100644
index 560e79ec8..000000000
--- a/docs/api/index.md
+++ /dev/null
@@ -1,76 +0,0 @@
----
-id: "index"
-title: "@sern/handler"
-sidebar_label: "Readme"
-sidebar_position: 0
-custom_edit_url: null
----
-
-
-
-
-
-
Handlers. Redefined.
-
A complete, customizable, typesafe, & reactive framework for discord bots
-
-
-
-
-
-
-
-
-
-
-## Why?
-- For you. A framework that's tailored to your exact needs.
-- Lightweight. Does a lot while being small.
-- Latest features. Support for discord.js v14 and all of its interactions.
-- Start quickly. Plug and play or customize to your liking.
-- works with [bun](https://bun.sh/) and [node](https://nodejs.org/en) out the box!
-- Use it with TypeScript or JavaScript. CommonJS and ESM supported.
-- Active and growing community, always here to help. [Join us](https://sern.dev/discord)
-- Unleash its full potential with a powerful CLI and awesome plugins.
-
-## 📜 Installation
-[Start here!!](https://sern.dev/docs/guide/walkthrough/new-project)
-
-## 👶 Basic Usage
-ping.ts
-
-```ts
-export default commandModule({
- type: CommandType.Slash,
- //Installed plugin to publish to discord api and allow access to owners only.
- plugins: [publish(), ownerOnly()],
- description: 'A ping pong command',
- execute(ctx) {
- ctx.reply('Hello owner of the bot');
- }
-});
-```
-
-
-## 🤖 Bots Using sern
-- [Community Bot](https://github.com/sern-handler/sern-community), the community bot for our [discord server](https://sern.dev/discord).
-- [Vinci](https://github.com/SrIzan10/vinci), the bot for Mara Turing.
-- [Bask](https://github.com/baskbotml/bask), Listen your favorite artists on Discord.
-- [ava](https://github.com/SrIzan10/ava), A discord bot that plays KNGI and Gensokyo Radio.
-- [Murayama](https://github.com/murayamabot/murayama), :pepega:
-- [Protector (WIP)](https://github.com/needhamgary/Protector), Just a simple bot to help enhance a private minecraft server.
-- [SmokinWeed 💨](https://github.com/Peter-MJ-Parker/sern-bud), A fun bot for a small - but growing - server.
-- [Man Nomic](https://github.com/jacoobes/man-nomic), A simple information bot to provide information to the nomic-ai discord community.
-- [Linear-Discord](https://github.com/sern-handler/linear-discord) Display and manage a linear dashboard.
-## 💻 CLI
-
-It is **highly encouraged** to use the [command line interface](https://github.com/sern-handler/cli) for your project. Don't forget to view it.
-
-## 🔗 Links
-
-- [Official Documentation and Guide](https://sern.dev)
-- [Support Server](https://sern.dev/discord)
-
-## 👋 Contribute
-- Read our contribution [guidelines](https://github.com/sern-handler/handler/blob/main/.github/CONTRIBUTING.md) carefully
-- Pull up on [issues](https://github.com/sern-handler/handler/issues) and report bugs
-- All kinds of contributions are welcomed.
diff --git a/docs/api/interfaces/AutocompleteCommand.md b/docs/api/interfaces/AutocompleteCommand.md
deleted file mode 100644
index c34c0f534..000000000
--- a/docs/api/interfaces/AutocompleteCommand.md
+++ /dev/null
@@ -1,55 +0,0 @@
----
-id: "AutocompleteCommand"
-title: "Interface: AutocompleteCommand"
-sidebar_label: "AutocompleteCommand"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Hierarchy
-
-- `Omit`<[`Module`](Module.md), ``"name"`` \| ``"type"`` \| ``"plugins"`` \| ``"description"``\>
-
- ↳ **`AutocompleteCommand`**
-
-## Properties
-
-### execute
-
-• **execute**: (`ctx`: `AutocompleteInteraction`<`CacheType`\>) => `unknown`
-
-#### Type declaration
-
-▸ (`ctx`): `unknown`
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `ctx` | `AutocompleteInteraction`<`CacheType`\> |
-
-##### Returns
-
-`unknown`
-
-#### Overrides
-
-Omit.execute
-
-#### Defined in
-
-[src/types/module.ts:111](https://github.com/sern-handler/handler/blob/c1f6906/src/types/module.ts#L111)
-
-___
-
-### onEvent
-
-• **onEvent**: [`ControlPlugin`](ControlPlugin.md)<`any`[]\>[]
-
-#### Overrides
-
-Omit.onEvent
-
-#### Defined in
-
-[src/types/module.ts:110](https://github.com/sern-handler/handler/blob/c1f6906/src/types/module.ts#L110)
diff --git a/docs/api/interfaces/AutocompletePlugin.md b/docs/api/interfaces/AutocompletePlugin.md
deleted file mode 100644
index 0d8099250..000000000
--- a/docs/api/interfaces/AutocompletePlugin.md
+++ /dev/null
@@ -1,88 +0,0 @@
----
-id: "AutocompletePlugin"
-title: "Interface: AutocompletePlugin"
-sidebar_label: "AutocompletePlugin"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Hierarchy
-
-- [`Plugin`](Plugin.md)
-
- ↳ **`AutocompletePlugin`**
-
-## Properties
-
-### description
-
-• `Optional` **description**: `string`
-
-**`Deprecated`**
-
-will be removed in the next update
-
-#### Inherited from
-
-[Plugin](Plugin.md).[description](Plugin.md#description)
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:33](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L33)
-
-___
-
-### execute
-
-• **execute**: (`autocmp`: `AutocompleteInteraction`<`CacheType`\>, `controlller`: [`Controller`](Controller.md)) => `Awaitable`<`Result`<`void`, `void`\>\>
-
-#### Type declaration
-
-▸ (`autocmp`, `controlller`): `Awaitable`<`Result`<`void`, `void`\>\>
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `autocmp` | `AutocompleteInteraction`<`CacheType`\> |
-| `controlller` | [`Controller`](Controller.md) |
-
-##### Returns
-
-`Awaitable`<`Result`<`void`, `void`\>\>
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:73](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L73)
-
-___
-
-### name
-
-• `Optional` **name**: `string`
-
-**`Deprecated`**
-
-will be removed in the next update
-
-#### Inherited from
-
-[Plugin](Plugin.md).[name](Plugin.md#name)
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:31](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L31)
-
-___
-
-### type
-
-• **type**: [`Event`](../enums/PluginType.md#event)
-
-#### Overrides
-
-[Plugin](Plugin.md).[type](Plugin.md#type)
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:72](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L72)
diff --git a/docs/api/interfaces/BothCommand.md b/docs/api/interfaces/BothCommand.md
deleted file mode 100644
index be911b9fd..000000000
--- a/docs/api/interfaces/BothCommand.md
+++ /dev/null
@@ -1,132 +0,0 @@
----
-id: "BothCommand"
-title: "Interface: BothCommand"
-sidebar_label: "BothCommand"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Hierarchy
-
-- `Module`
-
- ↳ **`BothCommand`**
-
-## Properties
-
-### alias
-
-• `Optional` **alias**: `string`[]
-
-#### Defined in
-
-[src/types/core-modules.ts:125](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L125)
-
-___
-
-### description
-
-• **description**: `string`
-
-#### Overrides
-
-Module.description
-
-#### Defined in
-
-[src/types/core-modules.ts:126](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L126)
-
-___
-
-### execute
-
-• **execute**: (`ctx`: [`Context`](../classes/Context.md), `args`: [`Args`](../modules.md#args)) => `unknown`
-
-#### Type declaration
-
-▸ (`ctx`, `args`): `unknown`
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `ctx` | [`Context`](../classes/Context.md) |
-| `args` | [`Args`](../modules.md#args) |
-
-##### Returns
-
-`unknown`
-
-#### Overrides
-
-Module.execute
-
-#### Defined in
-
-[src/types/core-modules.ts:128](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L128)
-
-___
-
-### name
-
-• `Optional` **name**: `string`
-
-#### Inherited from
-
-Module.name
-
-#### Defined in
-
-[src/types/core-modules.ts:33](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L33)
-
-___
-
-### onEvent
-
-• **onEvent**: [`ControlPlugin`](ControlPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.onEvent
-
-#### Defined in
-
-[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L34)
-
-___
-
-### options
-
-• `Optional` **options**: [`SernOptionsData`](../modules.md#sernoptionsdata)[]
-
-#### Defined in
-
-[src/types/core-modules.ts:127](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L127)
-
-___
-
-### plugins
-
-• **plugins**: [`InitPlugin`](InitPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.plugins
-
-#### Defined in
-
-[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L35)
-
-___
-
-### type
-
-• **type**: [`Both`](../enums/CommandType.md#both)
-
-#### Overrides
-
-Module.type
-
-#### Defined in
-
-[src/types/core-modules.ts:124](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L124)
diff --git a/docs/api/interfaces/ButtonCommand.md b/docs/api/interfaces/ButtonCommand.md
deleted file mode 100644
index 318cf4d10..000000000
--- a/docs/api/interfaces/ButtonCommand.md
+++ /dev/null
@@ -1,111 +0,0 @@
----
-id: "ButtonCommand"
-title: "Interface: ButtonCommand"
-sidebar_label: "ButtonCommand"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Hierarchy
-
-- `Module`
-
- ↳ **`ButtonCommand`**
-
-## Properties
-
-### description
-
-• `Optional` **description**: `string`
-
-#### Inherited from
-
-Module.description
-
-#### Defined in
-
-[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L36)
-
-___
-
-### execute
-
-• **execute**: (`ctx`: `ButtonInteraction`<`CacheType`\>) => `unknown`
-
-#### Type declaration
-
-▸ (`ctx`): `unknown`
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `ctx` | `ButtonInteraction`<`CacheType`\> |
-
-##### Returns
-
-`unknown`
-
-#### Overrides
-
-Module.execute
-
-#### Defined in
-
-[src/types/core-modules.ts:65](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L65)
-
-___
-
-### name
-
-• `Optional` **name**: `string`
-
-#### Inherited from
-
-Module.name
-
-#### Defined in
-
-[src/types/core-modules.ts:33](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L33)
-
-___
-
-### onEvent
-
-• **onEvent**: [`ControlPlugin`](ControlPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.onEvent
-
-#### Defined in
-
-[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L34)
-
-___
-
-### plugins
-
-• **plugins**: [`InitPlugin`](InitPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.plugins
-
-#### Defined in
-
-[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L35)
-
-___
-
-### type
-
-• **type**: [`Button`](../enums/CommandType.md#button)
-
-#### Overrides
-
-Module.type
-
-#### Defined in
-
-[src/types/core-modules.ts:64](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L64)
diff --git a/docs/api/interfaces/ChannelSelectCommand.md b/docs/api/interfaces/ChannelSelectCommand.md
deleted file mode 100644
index c8fb4facb..000000000
--- a/docs/api/interfaces/ChannelSelectCommand.md
+++ /dev/null
@@ -1,111 +0,0 @@
----
-id: "ChannelSelectCommand"
-title: "Interface: ChannelSelectCommand"
-sidebar_label: "ChannelSelectCommand"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Hierarchy
-
-- `Module`
-
- ↳ **`ChannelSelectCommand`**
-
-## Properties
-
-### description
-
-• `Optional` **description**: `string`
-
-#### Inherited from
-
-Module.description
-
-#### Defined in
-
-[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L36)
-
-___
-
-### execute
-
-• **execute**: (`ctx`: `ChannelSelectMenuInteraction`<`CacheType`\>) => `unknown`
-
-#### Type declaration
-
-▸ (`ctx`): `unknown`
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `ctx` | `ChannelSelectMenuInteraction`<`CacheType`\> |
-
-##### Returns
-
-`unknown`
-
-#### Overrides
-
-Module.execute
-
-#### Defined in
-
-[src/types/core-modules.ts:75](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L75)
-
-___
-
-### name
-
-• `Optional` **name**: `string`
-
-#### Inherited from
-
-Module.name
-
-#### Defined in
-
-[src/types/core-modules.ts:33](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L33)
-
-___
-
-### onEvent
-
-• **onEvent**: [`ControlPlugin`](ControlPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.onEvent
-
-#### Defined in
-
-[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L34)
-
-___
-
-### plugins
-
-• **plugins**: [`InitPlugin`](InitPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.plugins
-
-#### Defined in
-
-[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L35)
-
-___
-
-### type
-
-• **type**: [`ChannelSelect`](../enums/CommandType.md#channelselect)
-
-#### Overrides
-
-Module.type
-
-#### Defined in
-
-[src/types/core-modules.ts:74](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L74)
diff --git a/docs/api/interfaces/CommandError.Response.md b/docs/api/interfaces/CommandError.Response.md
deleted file mode 100644
index db0d40ea7..000000000
--- a/docs/api/interfaces/CommandError.Response.md
+++ /dev/null
@@ -1,45 +0,0 @@
----
-id: "CommandError.Response"
-title: "Interface: Response"
-sidebar_label: "Response"
-custom_edit_url: null
----
-
-[CommandError](../namespaces/CommandError.md).Response
-
-## Properties
-
-### body
-
-• `Optional` **body**: `ReplyOptions`
-
-#### Defined in
-
-[src/core/structures/command-error.ts:6](https://github.com/sern-handler/handler/blob/504cdee/src/core/structures/command-error.ts#L6)
-
-___
-
-### log
-
-• `Optional` **log**: `Object`
-
-#### Type declaration
-
-| Name | Type |
-| :------ | :------ |
-| `message` | `unknown` |
-| `type` | keyof [`Logging`](Logging.md)<`unknown`\> |
-
-#### Defined in
-
-[src/core/structures/command-error.ts:7](https://github.com/sern-handler/handler/blob/504cdee/src/core/structures/command-error.ts#L7)
-
-___
-
-### type
-
-• **type**: ``"fail"`` \| ``"continue"``
-
-#### Defined in
-
-[src/core/structures/command-error.ts:5](https://github.com/sern-handler/handler/blob/504cdee/src/core/structures/command-error.ts#L5)
diff --git a/docs/api/interfaces/CommandModuleDefs.md b/docs/api/interfaces/CommandModuleDefs.md
deleted file mode 100644
index 531e7b456..000000000
--- a/docs/api/interfaces/CommandModuleDefs.md
+++ /dev/null
@@ -1,127 +0,0 @@
----
-id: "CommandModuleDefs"
-title: "Interface: CommandModuleDefs"
-sidebar_label: "CommandModuleDefs"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Properties
-
-### 1
-
-• **1**: [`TextCommand`](TextCommand.md)
-
-#### Defined in
-
-[src/types/core-modules.ts:150](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L150)
-
-___
-
-### 1024
-
-• **1024**: [`ChannelSelectCommand`](ChannelSelectCommand.md)
-
-#### Defined in
-
-[src/types/core-modules.ts:158](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L158)
-
-___
-
-### 128
-
-• **128**: [`UserSelectCommand`](UserSelectCommand.md)
-
-#### Defined in
-
-[src/types/core-modules.ts:160](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L160)
-
-___
-
-### 16
-
-• **16**: [`ButtonCommand`](ButtonCommand.md)
-
-#### Defined in
-
-[src/types/core-modules.ts:155](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L155)
-
-___
-
-### 2
-
-• **2**: [`SlashCommand`](SlashCommand.md)
-
-#### Defined in
-
-[src/types/core-modules.ts:151](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L151)
-
-___
-
-### 256
-
-• **256**: [`RoleSelectCommand`](RoleSelectCommand.md)
-
-#### Defined in
-
-[src/types/core-modules.ts:157](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L157)
-
-___
-
-### 3
-
-• **3**: [`BothCommand`](BothCommand.md)
-
-#### Defined in
-
-[src/types/core-modules.ts:152](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L152)
-
-___
-
-### 32
-
-• **32**: [`StringSelectCommand`](StringSelectCommand.md)
-
-#### Defined in
-
-[src/types/core-modules.ts:156](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L156)
-
-___
-
-### 4
-
-• **4**: [`ContextMenuUser`](ContextMenuUser.md)
-
-#### Defined in
-
-[src/types/core-modules.ts:154](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L154)
-
-___
-
-### 512
-
-• **512**: [`MentionableSelectCommand`](MentionableSelectCommand.md)
-
-#### Defined in
-
-[src/types/core-modules.ts:159](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L159)
-
-___
-
-### 64
-
-• **64**: [`ModalSubmitCommand`](ModalSubmitCommand.md)
-
-#### Defined in
-
-[src/types/core-modules.ts:161](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L161)
-
-___
-
-### 8
-
-• **8**: [`ContextMenuMsg`](ContextMenuMsg.md)
-
-#### Defined in
-
-[src/types/core-modules.ts:153](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L153)
diff --git a/docs/api/interfaces/CommandPlugin.md b/docs/api/interfaces/CommandPlugin.md
deleted file mode 100644
index 7180038c5..000000000
--- a/docs/api/interfaces/CommandPlugin.md
+++ /dev/null
@@ -1,72 +0,0 @@
----
-id: "CommandPlugin"
-title: "Interface: CommandPlugin"
-sidebar_label: "CommandPlugin"
-sidebar_position: 0
-custom_edit_url: null
----
-
-**`Deprecated`**
-
-Use the newer helper functions and import { controller } from '@sern/handler'
-
-## Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `T` | extends [`CommandType`](../enums/CommandType.md) = [`CommandType`](../enums/CommandType.md) |
-
-## Properties
-
-### description
-
-• `Optional` **description**: `string`
-
-#### Defined in
-
-[src/types/plugin.ts:51](https://github.com/sern-handler/handler/blob/c1f6906/src/types/plugin.ts#L51)
-
-___
-
-### execute
-
-• **execute**: (`m`: [`InitArgs`](InitArgs.md)<[`Processed`](../modules.md#processed)<[`CommandModule`](../modules.md#commandmodule)\>\>, `controller?`: [`Deprecated`](../modules.md#deprecated)<``"Please import controller instead"``\>) => [`PluginResult`](../modules.md#pluginresult)
-
-#### Type declaration
-
-▸ (`m`, `controller?`): [`PluginResult`](../modules.md#pluginresult)
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `m` | [`InitArgs`](InitArgs.md)<[`Processed`](../modules.md#processed)<[`CommandModule`](../modules.md#commandmodule)\>\> |
-| `controller?` | [`Deprecated`](../modules.md#deprecated)<``"Please import controller instead"``\> |
-
-##### Returns
-
-[`PluginResult`](../modules.md#pluginresult)
-
-#### Defined in
-
-[src/types/plugin.ts:53](https://github.com/sern-handler/handler/blob/c1f6906/src/types/plugin.ts#L53)
-
-___
-
-### name
-
-• `Optional` **name**: `string`
-
-#### Defined in
-
-[src/types/plugin.ts:50](https://github.com/sern-handler/handler/blob/c1f6906/src/types/plugin.ts#L50)
-
-___
-
-### type
-
-• **type**: [`Init`](../enums/PluginType.md#init)
-
-#### Defined in
-
-[src/types/plugin.ts:52](https://github.com/sern-handler/handler/blob/c1f6906/src/types/plugin.ts#L52)
diff --git a/docs/api/interfaces/ContextMenuMsg.md b/docs/api/interfaces/ContextMenuMsg.md
deleted file mode 100644
index f2d19bf34..000000000
--- a/docs/api/interfaces/ContextMenuMsg.md
+++ /dev/null
@@ -1,111 +0,0 @@
----
-id: "ContextMenuMsg"
-title: "Interface: ContextMenuMsg"
-sidebar_label: "ContextMenuMsg"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Hierarchy
-
-- `Module`
-
- ↳ **`ContextMenuMsg`**
-
-## Properties
-
-### description
-
-• `Optional` **description**: `string`
-
-#### Inherited from
-
-Module.description
-
-#### Defined in
-
-[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L36)
-
-___
-
-### execute
-
-• **execute**: (`ctx`: `MessageContextMenuCommandInteraction`<`CacheType`\>) => `unknown`
-
-#### Type declaration
-
-▸ (`ctx`): `unknown`
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `ctx` | `MessageContextMenuCommandInteraction`<`CacheType`\> |
-
-##### Returns
-
-`unknown`
-
-#### Overrides
-
-Module.execute
-
-#### Defined in
-
-[src/types/core-modules.ts:60](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L60)
-
-___
-
-### name
-
-• `Optional` **name**: `string`
-
-#### Inherited from
-
-Module.name
-
-#### Defined in
-
-[src/types/core-modules.ts:33](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L33)
-
-___
-
-### onEvent
-
-• **onEvent**: [`ControlPlugin`](ControlPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.onEvent
-
-#### Defined in
-
-[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L34)
-
-___
-
-### plugins
-
-• **plugins**: [`InitPlugin`](InitPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.plugins
-
-#### Defined in
-
-[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L35)
-
-___
-
-### type
-
-• **type**: [`CtxMsg`](../enums/CommandType.md#ctxmsg)
-
-#### Overrides
-
-Module.type
-
-#### Defined in
-
-[src/types/core-modules.ts:59](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L59)
diff --git a/docs/api/interfaces/ContextMenuUser.md b/docs/api/interfaces/ContextMenuUser.md
deleted file mode 100644
index 34cf36b2d..000000000
--- a/docs/api/interfaces/ContextMenuUser.md
+++ /dev/null
@@ -1,111 +0,0 @@
----
-id: "ContextMenuUser"
-title: "Interface: ContextMenuUser"
-sidebar_label: "ContextMenuUser"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Hierarchy
-
-- `Module`
-
- ↳ **`ContextMenuUser`**
-
-## Properties
-
-### description
-
-• `Optional` **description**: `string`
-
-#### Inherited from
-
-Module.description
-
-#### Defined in
-
-[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L36)
-
-___
-
-### execute
-
-• **execute**: (`ctx`: `UserContextMenuCommandInteraction`<`CacheType`\>) => `unknown`
-
-#### Type declaration
-
-▸ (`ctx`): `unknown`
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `ctx` | `UserContextMenuCommandInteraction`<`CacheType`\> |
-
-##### Returns
-
-`unknown`
-
-#### Overrides
-
-Module.execute
-
-#### Defined in
-
-[src/types/core-modules.ts:55](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L55)
-
-___
-
-### name
-
-• `Optional` **name**: `string`
-
-#### Inherited from
-
-Module.name
-
-#### Defined in
-
-[src/types/core-modules.ts:33](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L33)
-
-___
-
-### onEvent
-
-• **onEvent**: [`ControlPlugin`](ControlPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.onEvent
-
-#### Defined in
-
-[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L34)
-
-___
-
-### plugins
-
-• **plugins**: [`InitPlugin`](InitPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.plugins
-
-#### Defined in
-
-[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L35)
-
-___
-
-### type
-
-• **type**: [`CtxUser`](../enums/CommandType.md#ctxuser)
-
-#### Overrides
-
-Module.type
-
-#### Defined in
-
-[src/types/core-modules.ts:54](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L54)
diff --git a/docs/api/interfaces/ControlPlugin.md b/docs/api/interfaces/ControlPlugin.md
deleted file mode 100644
index e2efb88e6..000000000
--- a/docs/api/interfaces/ControlPlugin.md
+++ /dev/null
@@ -1,47 +0,0 @@
----
-id: "ControlPlugin"
-title: "Interface: ControlPlugin"
-sidebar_label: "ControlPlugin"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `Args` | extends `any`[] = `any`[] |
-
-## Properties
-
-### execute
-
-• **execute**: (...`args`: `Args`) => [`PluginResult`](../modules.md#pluginresult)
-
-#### Type declaration
-
-▸ (`...args`): [`PluginResult`](../modules.md#pluginresult)
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `...args` | `Args` |
-
-##### Returns
-
-[`PluginResult`](../modules.md#pluginresult)
-
-#### Defined in
-
-[src/types/core-plugin.ts:73](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-plugin.ts#L73)
-
-___
-
-### type
-
-• **type**: [`Control`](../enums/PluginType.md#control)
-
-#### Defined in
-
-[src/types/core-plugin.ts:72](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-plugin.ts#L72)
diff --git a/docs/api/interfaces/Controller.md b/docs/api/interfaces/Controller.md
deleted file mode 100644
index ae09fe58b..000000000
--- a/docs/api/interfaces/Controller.md
+++ /dev/null
@@ -1,43 +0,0 @@
----
-id: "Controller"
-title: "Interface: Controller"
-sidebar_label: "Controller"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Properties
-
-### next
-
-• **next**: () => `Ok`<`void`\>
-
-#### Type declaration
-
-▸ (): `Ok`<`void`\>
-
-##### Returns
-
-`Ok`<`void`\>
-
-#### Defined in
-
-[src/types/core-plugin.ts:59](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-plugin.ts#L59)
-
-___
-
-### stop
-
-• **stop**: () => `Err`<`void`\>
-
-#### Type declaration
-
-▸ (): `Err`<`void`\>
-
-##### Returns
-
-`Err`<`void`\>
-
-#### Defined in
-
-[src/types/core-plugin.ts:60](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-plugin.ts#L60)
diff --git a/docs/api/interfaces/CoreDependencies.md b/docs/api/interfaces/CoreDependencies.md
deleted file mode 100644
index 2d16bdfdc..000000000
--- a/docs/api/interfaces/CoreDependencies.md
+++ /dev/null
@@ -1,119 +0,0 @@
----
-id: "CoreDependencies"
-title: "Interface: CoreDependencies"
-sidebar_label: "CoreDependencies"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Properties
-
-### @sern/client
-
-• **@sern/client**: () => [`Emitter`](Emitter.md)
-
-#### Type declaration
-
-▸ (): [`Emitter`](Emitter.md)
-
-##### Returns
-
-[`Emitter`](Emitter.md)
-
-#### Defined in
-
-[src/types/ioc.ts:28](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/ioc.ts#L28)
-
-___
-
-### @sern/emitter
-
-• **@sern/emitter**: () => [`Emitter`](Emitter.md)
-
-#### Type declaration
-
-▸ (): [`Emitter`](Emitter.md)
-
-##### Returns
-
-[`Emitter`](Emitter.md)
-
-#### Defined in
-
-[src/types/ioc.ts:29](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/ioc.ts#L29)
-
-___
-
-### @sern/errors
-
-• **@sern/errors**: () => [`ErrorHandling`](ErrorHandling.md)
-
-#### Type declaration
-
-▸ (): [`ErrorHandling`](ErrorHandling.md)
-
-##### Returns
-
-[`ErrorHandling`](ErrorHandling.md)
-
-#### Defined in
-
-[src/types/ioc.ts:36](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/ioc.ts#L36)
-
-___
-
-### @sern/logger
-
-• `Optional` **@sern/logger**: () => [`Logging`](Logging.md)<`unknown`\>
-
-#### Type declaration
-
-▸ (): [`Logging`](Logging.md)<`unknown`\>
-
-##### Returns
-
-[`Logging`](Logging.md)<`unknown`\>
-
-#### Defined in
-
-[src/types/ioc.ts:37](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/ioc.ts#L37)
-
-___
-
-### @sern/modules
-
-• **@sern/modules**: () => [`ModuleManager`](ModuleManager.md)
-
-#### Type declaration
-
-▸ (): [`ModuleManager`](ModuleManager.md)
-
-##### Returns
-
-[`ModuleManager`](ModuleManager.md)
-
-#### Defined in
-
-[src/types/ioc.ts:35](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/ioc.ts#L35)
-
-___
-
-### @sern/store
-
-• **@sern/store**: () => [`CoreModuleStore`](CoreModuleStore.md)
-
-**`Deprecated`**
-
-Will be removed and turned internal
-
-#### Type declaration
-
-▸ (): [`CoreModuleStore`](CoreModuleStore.md)
-
-##### Returns
-
-[`CoreModuleStore`](CoreModuleStore.md)
-
-#### Defined in
-
-[src/types/ioc.ts:34](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/ioc.ts#L34)
diff --git a/docs/api/interfaces/CoreModuleStore.md b/docs/api/interfaces/CoreModuleStore.md
deleted file mode 100644
index b1254cd18..000000000
--- a/docs/api/interfaces/CoreModuleStore.md
+++ /dev/null
@@ -1,29 +0,0 @@
----
-id: "CoreModuleStore"
-title: "Interface: CoreModuleStore"
-sidebar_label: "CoreModuleStore"
-sidebar_position: 0
-custom_edit_url: null
----
-
-Represents a core module store that stores IDs mapped to file paths.
-
-## Properties
-
-### commands
-
-• **commands**: `Map`<`string`, `Module`\>
-
-#### Defined in
-
-[src/core/contracts/module-store.ts:7](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/contracts/module-store.ts#L7)
-
-___
-
-### metadata
-
-• **metadata**: `WeakMap`<`Module`, `CommandMeta`\>
-
-#### Defined in
-
-[src/core/contracts/module-store.ts:8](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/contracts/module-store.ts#L8)
diff --git a/docs/api/interfaces/Dependencies.md b/docs/api/interfaces/Dependencies.md
deleted file mode 100644
index e48fe6a23..000000000
--- a/docs/api/interfaces/Dependencies.md
+++ /dev/null
@@ -1,67 +0,0 @@
----
-id: "Dependencies"
-title: "Interface: Dependencies"
-sidebar_label: "Dependencies"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Properties
-
-### @sern/client
-
-• **@sern/client**: [`Singleton`](../modules.md#singleton)<`__module`\>
-
-#### Defined in
-
-[src/types/handler.ts:40](https://github.com/sern-handler/handler/blob/c1f6906/src/types/handler.ts#L40)
-
-___
-
-### @sern/emitter
-
-• **@sern/emitter**: [`Singleton`](../modules.md#singleton)<[`SernEmitter`](../classes/SernEmitter.md)\>
-
-#### Defined in
-
-[src/types/handler.ts:42](https://github.com/sern-handler/handler/blob/c1f6906/src/types/handler.ts#L42)
-
-___
-
-### @sern/errors
-
-• **@sern/errors**: [`Singleton`](../modules.md#singleton)<[`ErrorHandling`](ErrorHandling.md)\>
-
-#### Defined in
-
-[src/types/handler.ts:45](https://github.com/sern-handler/handler/blob/c1f6906/src/types/handler.ts#L45)
-
-___
-
-### @sern/logger
-
-• `Optional` **@sern/logger**: [`Singleton`](../modules.md#singleton)<[`Logging`](Logging.md)<`unknown`\>\>
-
-#### Defined in
-
-[src/types/handler.ts:41](https://github.com/sern-handler/handler/blob/c1f6906/src/types/handler.ts#L41)
-
-___
-
-### @sern/modules
-
-• **@sern/modules**: [`Singleton`](../modules.md#singleton)<[`ModuleManager`](ModuleManager.md)\>
-
-#### Defined in
-
-[src/types/handler.ts:44](https://github.com/sern-handler/handler/blob/c1f6906/src/types/handler.ts#L44)
-
-___
-
-### @sern/store
-
-• **@sern/store**: [`Singleton`](../modules.md#singleton)<[`ModuleStore`](../classes/ModuleStore.md)\>
-
-#### Defined in
-
-[src/types/handler.ts:43](https://github.com/sern-handler/handler/blob/c1f6906/src/types/handler.ts#L43)
diff --git a/docs/api/interfaces/DependencyConfiguration.md b/docs/api/interfaces/DependencyConfiguration.md
deleted file mode 100644
index d86d315ce..000000000
--- a/docs/api/interfaces/DependencyConfiguration.md
+++ /dev/null
@@ -1,47 +0,0 @@
----
-id: "DependencyConfiguration"
-title: "Interface: DependencyConfiguration"
-sidebar_label: "DependencyConfiguration"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `T` | extends [`Dependencies`](Dependencies.md) |
-
-## Properties
-
-### build
-
-• **build**: (`root`: `Container`<`Omit`<[`Dependencies`](Dependencies.md), ``"@sern/client"``\>, {}\>) => `Container`<`T`, {}\>
-
-#### Type declaration
-
-▸ (`root`): `Container`<`T`, {}\>
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `root` | `Container`<`Omit`<[`Dependencies`](Dependencies.md), ``"@sern/client"``\>, {}\> |
-
-##### Returns
-
-`Container`<`T`, {}\>
-
-#### Defined in
-
-[src/types/handler.ts:68](https://github.com/sern-handler/handler/blob/c1f6906/src/types/handler.ts#L68)
-
-___
-
-### exclude
-
-• `Optional` **exclude**: `Set`<``"@sern/logger"``\>
-
-#### Defined in
-
-[src/types/handler.ts:67](https://github.com/sern-handler/handler/blob/c1f6906/src/types/handler.ts#L67)
diff --git a/docs/api/interfaces/DiscordEmitterPlugin.md b/docs/api/interfaces/DiscordEmitterPlugin.md
deleted file mode 100644
index b648a4c09..000000000
--- a/docs/api/interfaces/DiscordEmitterPlugin.md
+++ /dev/null
@@ -1,90 +0,0 @@
----
-id: "DiscordEmitterPlugin"
-title: "Interface: DiscordEmitterPlugin"
-sidebar_label: "DiscordEmitterPlugin"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Hierarchy
-
-- [`Plugin`](Plugin.md)
-
- ↳ **`DiscordEmitterPlugin`**
-
-## Properties
-
-### description
-
-• `Optional` **description**: `string`
-
-**`Deprecated`**
-
-will be removed in the next update
-
-#### Inherited from
-
-[Plugin](Plugin.md).[description](Plugin.md#description)
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:33](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L33)
-
-___
-
-### execute
-
-• **execute**: (`payload`: { `absPath`: `string` ; `mod`: `DiscordEventCommand` & { `name`: `string` } }, `controller`: [`Controller`](Controller.md)) => `Awaitable`<`Result`<`void`, `void`\>\>
-
-#### Type declaration
-
-▸ (`payload`, `controller`): `Awaitable`<`Result`<`void`, `void`\>\>
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `payload` | `Object` |
-| `payload.absPath` | `string` |
-| `payload.mod` | `DiscordEventCommand` & { `name`: `string` } |
-| `controller` | [`Controller`](Controller.md) |
-
-##### Returns
-
-`Awaitable`<`Result`<`void`, `void`\>\>
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:49](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L49)
-
-___
-
-### name
-
-• `Optional` **name**: `string`
-
-**`Deprecated`**
-
-will be removed in the next update
-
-#### Inherited from
-
-[Plugin](Plugin.md).[name](Plugin.md#name)
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:31](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L31)
-
-___
-
-### type
-
-• **type**: [`Command`](../enums/PluginType.md#command)
-
-#### Overrides
-
-[Plugin](Plugin.md).[type](Plugin.md#type)
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:48](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L48)
diff --git a/docs/api/interfaces/DiscordEventCommand.md b/docs/api/interfaces/DiscordEventCommand.md
deleted file mode 100644
index 1ce42ccb6..000000000
--- a/docs/api/interfaces/DiscordEventCommand.md
+++ /dev/null
@@ -1,113 +0,0 @@
----
-id: "DiscordEventCommand"
-title: "Interface: DiscordEventCommand"
-sidebar_label: "DiscordEventCommand"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `T` | extends keyof `ClientEvents` = keyof `ClientEvents` |
-
-## Hierarchy
-
-- `Module`
-
- ↳ **`DiscordEventCommand`**
-
-## Properties
-
-### description
-
-• `Optional` **description**: `string`
-
-#### Inherited from
-
-Module.description
-
-#### Defined in
-
-[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L36)
-
-___
-
-### name
-
-• `Optional` **name**: `T`
-
-#### Overrides
-
-Module.name
-
-#### Defined in
-
-[src/types/core-modules.ts:106](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L106)
-
-___
-
-### onEvent
-
-• **onEvent**: [`ControlPlugin`](ControlPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.onEvent
-
-#### Defined in
-
-[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L34)
-
-___
-
-### plugins
-
-• **plugins**: [`InitPlugin`](InitPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.plugins
-
-#### Defined in
-
-[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L35)
-
-___
-
-### type
-
-• **type**: [`Discord`](../enums/EventType.md#discord)
-
-#### Overrides
-
-Module.type
-
-#### Defined in
-
-[src/types/core-modules.ts:107](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L107)
-
-## Methods
-
-### execute
-
-▸ **execute**(`...args`): `unknown`
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `...args` | `ClientEvents`[`T`] |
-
-#### Returns
-
-`unknown`
-
-#### Overrides
-
-Module.execute
-
-#### Defined in
-
-[src/types/core-modules.ts:108](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L108)
diff --git a/docs/api/interfaces/DiscordEventPlugin.md b/docs/api/interfaces/DiscordEventPlugin.md
deleted file mode 100644
index 760fdfa7b..000000000
--- a/docs/api/interfaces/DiscordEventPlugin.md
+++ /dev/null
@@ -1,94 +0,0 @@
----
-id: "DiscordEventPlugin"
-title: "Interface: DiscordEventPlugin"
-sidebar_label: "DiscordEventPlugin"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `T` | extends keyof `ClientEvents` = keyof `ClientEvents` |
-
-## Hierarchy
-
-- [`Plugin`](Plugin.md)
-
- ↳ **`DiscordEventPlugin`**
-
-## Properties
-
-### description
-
-• `Optional` **description**: `string`
-
-**`Deprecated`**
-
-will be removed in the next update
-
-#### Inherited from
-
-[Plugin](Plugin.md).[description](Plugin.md#description)
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:33](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L33)
-
-___
-
-### execute
-
-• **execute**: (`args`: `ClientEvents`[`T`], `controller`: [`Controller`](Controller.md)) => `Awaitable`<`Result`<`void`, `void`\>\>
-
-#### Type declaration
-
-▸ (`args`, `controller`): `Awaitable`<`Result`<`void`, `void`\>\>
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `args` | `ClientEvents`[`T`] |
-| `controller` | [`Controller`](Controller.md) |
-
-##### Returns
-
-`Awaitable`<`Result`<`void`, `void`\>\>
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:105](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L105)
-
-___
-
-### name
-
-• `Optional` **name**: `T`
-
-**`Deprecated`**
-
-will be removed in the next update
-
-#### Overrides
-
-[Plugin](Plugin.md).[name](Plugin.md#name)
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:103](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L103)
-
-___
-
-### type
-
-• **type**: [`Event`](../enums/PluginType.md#event)
-
-#### Overrides
-
-[Plugin](Plugin.md).[type](Plugin.md#type)
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:104](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L104)
diff --git a/docs/api/interfaces/Disposable.md b/docs/api/interfaces/Disposable.md
deleted file mode 100644
index 398ba206b..000000000
--- a/docs/api/interfaces/Disposable.md
+++ /dev/null
@@ -1,24 +0,0 @@
----
-id: "Disposable"
-title: "Interface: Disposable"
-sidebar_label: "Disposable"
-sidebar_position: 0
-custom_edit_url: null
----
-
-Represents a Disposable contract.
-Let dependencies implement this to dispose and cleanup.
-
-## Methods
-
-### dispose
-
-▸ **dispose**(): `unknown`
-
-#### Returns
-
-`unknown`
-
-#### Defined in
-
-[src/core/contracts/hooks.ts:15](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/contracts/hooks.ts#L15)
diff --git a/docs/api/interfaces/Emitter.md b/docs/api/interfaces/Emitter.md
deleted file mode 100644
index caee8164c..000000000
--- a/docs/api/interfaces/Emitter.md
+++ /dev/null
@@ -1,70 +0,0 @@
----
-id: "Emitter"
-title: "Interface: Emitter"
-sidebar_label: "Emitter"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Methods
-
-### addListener
-
-▸ **addListener**(`eventName`, `listener`): `this`
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `eventName` | `string` \| `symbol` |
-| `listener` | `AnyFunction` |
-
-#### Returns
-
-`this`
-
-#### Defined in
-
-[src/core/contracts/emitter.ts:6](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/contracts/emitter.ts#L6)
-
-___
-
-### emit
-
-▸ **emit**(`eventName`, `...payload`): `boolean`
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `eventName` | `string` \| `symbol` |
-| `...payload` | `any`[] |
-
-#### Returns
-
-`boolean`
-
-#### Defined in
-
-[src/core/contracts/emitter.ts:8](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/contracts/emitter.ts#L8)
-
-___
-
-### removeListener
-
-▸ **removeListener**(`eventName`, `listener`): `this`
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `eventName` | `string` \| `symbol` |
-| `listener` | `AnyFunction` |
-
-#### Returns
-
-`this`
-
-#### Defined in
-
-[src/core/contracts/emitter.ts:7](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/contracts/emitter.ts#L7)
diff --git a/docs/api/interfaces/ErrorHandling.md b/docs/api/interfaces/ErrorHandling.md
deleted file mode 100644
index 9af719987..000000000
--- a/docs/api/interfaces/ErrorHandling.md
+++ /dev/null
@@ -1,61 +0,0 @@
----
-id: "ErrorHandling"
-title: "Interface: ErrorHandling"
-sidebar_label: "ErrorHandling"
-sidebar_position: 0
-custom_edit_url: null
----
-
-**`Since`**
-
-2.0.0
-
-## Implemented by
-
-- [`DefaultErrorHandling`](../classes/DefaultErrorHandling.md)
-
-## Methods
-
-### crash
-
-▸ **crash**(`err`): `never`
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `err` | `Error` |
-
-#### Returns
-
-`never`
-
-**`Deprecated`**
-
-Version 4 will remove this method
-
-#### Defined in
-
-[src/core/contracts/error-handling.ts:9](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/contracts/error-handling.ts#L9)
-
-___
-
-### updateAlive
-
-▸ **updateAlive**(`error`): `void`
-
-A function that is called on every throw.
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `error` | `Error` |
-
-#### Returns
-
-`void`
-
-#### Defined in
-
-[src/core/contracts/error-handling.ts:14](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/contracts/error-handling.ts#L14)
diff --git a/docs/api/interfaces/EventModuleDefs.md b/docs/api/interfaces/EventModuleDefs.md
deleted file mode 100644
index f69de89be..000000000
--- a/docs/api/interfaces/EventModuleDefs.md
+++ /dev/null
@@ -1,37 +0,0 @@
----
-id: "EventModuleDefs"
-title: "Interface: EventModuleDefs"
-sidebar_label: "EventModuleDefs"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Properties
-
-### 1
-
-• **1**: [`DiscordEventCommand`](DiscordEventCommand.md)
-
-#### Defined in
-
-[src/types/core-modules.ts:166](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L166)
-
-___
-
-### 2
-
-• **2**: [`SernEventCommand`](SernEventCommand.md)
-
-#### Defined in
-
-[src/types/core-modules.ts:165](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L165)
-
-___
-
-### 3
-
-• **3**: [`ExternalEventCommand`](ExternalEventCommand.md)
-
-#### Defined in
-
-[src/types/core-modules.ts:167](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L167)
diff --git a/docs/api/interfaces/EventPlugin.md b/docs/api/interfaces/EventPlugin.md
deleted file mode 100644
index 8f2889fd8..000000000
--- a/docs/api/interfaces/EventPlugin.md
+++ /dev/null
@@ -1,72 +0,0 @@
----
-id: "EventPlugin"
-title: "Interface: EventPlugin"
-sidebar_label: "EventPlugin"
-sidebar_position: 0
-custom_edit_url: null
----
-
-**`Deprecated`**
-
-Use the newer helper functions
-
-## Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `T` | extends [`CommandType`](../enums/CommandType.md) |
-
-## Properties
-
-### description
-
-• `Optional` **description**: `string`
-
-#### Defined in
-
-[src/types/plugin.ts:64](https://github.com/sern-handler/handler/blob/c1f6906/src/types/plugin.ts#L64)
-
-___
-
-### execute
-
-• **execute**: (`args`: [`CommandArgs`](../modules.md#commandargs)<`T`, [`Event`](../enums/PluginType.md#event)\>, `controller?`: [`Controller`](Controller.md)) => [`PluginResult`](../modules.md#pluginresult)
-
-#### Type declaration
-
-▸ (`args`, `controller?`): [`PluginResult`](../modules.md#pluginresult)
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `args` | [`CommandArgs`](../modules.md#commandargs)<`T`, [`Event`](../enums/PluginType.md#event)\> |
-| `controller?` | [`Controller`](Controller.md) |
-
-##### Returns
-
-[`PluginResult`](../modules.md#pluginresult)
-
-#### Defined in
-
-[src/types/plugin.ts:66](https://github.com/sern-handler/handler/blob/c1f6906/src/types/plugin.ts#L66)
-
-___
-
-### name
-
-• `Optional` **name**: `string`
-
-#### Defined in
-
-[src/types/plugin.ts:63](https://github.com/sern-handler/handler/blob/c1f6906/src/types/plugin.ts#L63)
-
-___
-
-### type
-
-• **type**: [`Event`](../enums/PluginType.md#event)
-
-#### Defined in
-
-[src/types/plugin.ts:65](https://github.com/sern-handler/handler/blob/c1f6906/src/types/plugin.ts#L65)
diff --git a/docs/api/interfaces/ExternalEmitterPlugin.md b/docs/api/interfaces/ExternalEmitterPlugin.md
deleted file mode 100644
index d63f5baca..000000000
--- a/docs/api/interfaces/ExternalEmitterPlugin.md
+++ /dev/null
@@ -1,90 +0,0 @@
----
-id: "ExternalEmitterPlugin"
-title: "Interface: ExternalEmitterPlugin"
-sidebar_label: "ExternalEmitterPlugin"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Hierarchy
-
-- [`Plugin`](Plugin.md)
-
- ↳ **`ExternalEmitterPlugin`**
-
-## Properties
-
-### description
-
-• `Optional` **description**: `string`
-
-**`Deprecated`**
-
-will be removed in the next update
-
-#### Inherited from
-
-[Plugin](Plugin.md).[description](Plugin.md#description)
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:33](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L33)
-
-___
-
-### execute
-
-• **execute**: (`payload`: { `absPath`: `string` ; `mod`: `ExternalEventCommand` & { `name`: `string` } }, `controller`: [`Controller`](Controller.md)) => `Awaitable`<`Result`<`void`, `void`\>\>
-
-#### Type declaration
-
-▸ (`payload`, `controller`): `Awaitable`<`Result`<`void`, `void`\>\>
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `payload` | `Object` |
-| `payload.absPath` | `string` |
-| `payload.mod` | `ExternalEventCommand` & { `name`: `string` } |
-| `controller` | [`Controller`](Controller.md) |
-
-##### Returns
-
-`Awaitable`<`Result`<`void`, `void`\>\>
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:57](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L57)
-
-___
-
-### name
-
-• `Optional` **name**: `string`
-
-**`Deprecated`**
-
-will be removed in the next update
-
-#### Inherited from
-
-[Plugin](Plugin.md).[name](Plugin.md#name)
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:31](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L31)
-
-___
-
-### type
-
-• **type**: [`Command`](../enums/PluginType.md#command)
-
-#### Overrides
-
-[Plugin](Plugin.md).[type](Plugin.md#type)
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:56](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L56)
diff --git a/docs/api/interfaces/ExternalEventCommand.md b/docs/api/interfaces/ExternalEventCommand.md
deleted file mode 100644
index 647738982..000000000
--- a/docs/api/interfaces/ExternalEventCommand.md
+++ /dev/null
@@ -1,117 +0,0 @@
----
-id: "ExternalEventCommand"
-title: "Interface: ExternalEventCommand"
-sidebar_label: "ExternalEventCommand"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Hierarchy
-
-- `Module`
-
- ↳ **`ExternalEventCommand`**
-
-## Properties
-
-### description
-
-• `Optional` **description**: `string`
-
-#### Inherited from
-
-Module.description
-
-#### Defined in
-
-[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L36)
-
-___
-
-### emitter
-
-• **emitter**: keyof `Dependencies`
-
-#### Defined in
-
-[src/types/core-modules.ts:48](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L48)
-
-___
-
-### name
-
-• `Optional` **name**: `string`
-
-#### Overrides
-
-Module.name
-
-#### Defined in
-
-[src/types/core-modules.ts:47](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L47)
-
-___
-
-### onEvent
-
-• **onEvent**: [`ControlPlugin`](ControlPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.onEvent
-
-#### Defined in
-
-[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L34)
-
-___
-
-### plugins
-
-• **plugins**: [`InitPlugin`](InitPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.plugins
-
-#### Defined in
-
-[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L35)
-
-___
-
-### type
-
-• **type**: [`External`](../enums/EventType.md#external)
-
-#### Overrides
-
-Module.type
-
-#### Defined in
-
-[src/types/core-modules.ts:49](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L49)
-
-## Methods
-
-### execute
-
-▸ **execute**(`...args`): `unknown`
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `...args` | `unknown`[] |
-
-#### Returns
-
-`unknown`
-
-#### Overrides
-
-Module.execute
-
-#### Defined in
-
-[src/types/core-modules.ts:50](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L50)
diff --git a/docs/api/interfaces/ExternalEventPlugin.md b/docs/api/interfaces/ExternalEventPlugin.md
deleted file mode 100644
index 4f1cf7ead..000000000
--- a/docs/api/interfaces/ExternalEventPlugin.md
+++ /dev/null
@@ -1,88 +0,0 @@
----
-id: "ExternalEventPlugin"
-title: "Interface: ExternalEventPlugin"
-sidebar_label: "ExternalEventPlugin"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Hierarchy
-
-- [`Plugin`](Plugin.md)
-
- ↳ **`ExternalEventPlugin`**
-
-## Properties
-
-### description
-
-• `Optional` **description**: `string`
-
-**`Deprecated`**
-
-will be removed in the next update
-
-#### Inherited from
-
-[Plugin](Plugin.md).[description](Plugin.md#description)
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:33](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L33)
-
-___
-
-### execute
-
-• **execute**: (`args`: `unknown`[], `controller`: [`Controller`](Controller.md)) => `Awaitable`<`Result`<`void`, `void`\>\>
-
-#### Type declaration
-
-▸ (`args`, `controller`): `Awaitable`<`Result`<`void`, `void`\>\>
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `args` | `unknown`[] |
-| `controller` | [`Controller`](Controller.md) |
-
-##### Returns
-
-`Awaitable`<`Result`<`void`, `void`\>\>
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:99](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L99)
-
-___
-
-### name
-
-• `Optional` **name**: `string`
-
-**`Deprecated`**
-
-will be removed in the next update
-
-#### Inherited from
-
-[Plugin](Plugin.md).[name](Plugin.md#name)
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:31](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L31)
-
-___
-
-### type
-
-• **type**: [`Event`](../enums/PluginType.md#event)
-
-#### Overrides
-
-[Plugin](Plugin.md).[type](Plugin.md#type)
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:98](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L98)
diff --git a/docs/api/interfaces/InitArgs.md b/docs/api/interfaces/InitArgs.md
deleted file mode 100644
index edfbcceb4..000000000
--- a/docs/api/interfaces/InitArgs.md
+++ /dev/null
@@ -1,33 +0,0 @@
----
-id: "InitArgs"
-title: "Interface: InitArgs"
-sidebar_label: "InitArgs"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `T` | extends [`Processed`](../modules.md#processed)<[`Module`](Module.md)\> |
-
-## Properties
-
-### absPath
-
-• **absPath**: `string`
-
-#### Defined in
-
-[src/handler/plugins/args.ts:107](https://github.com/sern-handler/handler/blob/c1f6906/src/handler/plugins/args.ts#L107)
-
-___
-
-### module
-
-• **module**: `T`
-
-#### Defined in
-
-[src/handler/plugins/args.ts:106](https://github.com/sern-handler/handler/blob/c1f6906/src/handler/plugins/args.ts#L106)
diff --git a/docs/api/interfaces/InitPlugin.md b/docs/api/interfaces/InitPlugin.md
deleted file mode 100644
index 3b3e59cc0..000000000
--- a/docs/api/interfaces/InitPlugin.md
+++ /dev/null
@@ -1,47 +0,0 @@
----
-id: "InitPlugin"
-title: "Interface: InitPlugin"
-sidebar_label: "InitPlugin"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `Args` | extends `any`[] = `any`[] |
-
-## Properties
-
-### execute
-
-• **execute**: (...`args`: `Args`) => [`PluginResult`](../modules.md#pluginresult)
-
-#### Type declaration
-
-▸ (`...args`): [`PluginResult`](../modules.md#pluginresult)
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `...args` | `Args` |
-
-##### Returns
-
-[`PluginResult`](../modules.md#pluginresult)
-
-#### Defined in
-
-[src/types/core-plugin.ts:69](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-plugin.ts#L69)
-
-___
-
-### type
-
-• **type**: [`Init`](../enums/PluginType.md#init)
-
-#### Defined in
-
-[src/types/core-plugin.ts:68](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-plugin.ts#L68)
diff --git a/docs/api/interfaces/Logging.md b/docs/api/interfaces/Logging.md
deleted file mode 100644
index fc135af63..000000000
--- a/docs/api/interfaces/Logging.md
+++ /dev/null
@@ -1,101 +0,0 @@
----
-id: "Logging"
-title: "Interface: Logging"
-sidebar_label: "Logging"
-sidebar_position: 0
-custom_edit_url: null
----
-
-**`Since`**
-
-2.0.0
-
-## Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `T` | `unknown` |
-
-## Implemented by
-
-- [`DefaultLogging`](../classes/DefaultLogging.md)
-
-## Methods
-
-### debug
-
-▸ **debug**(`payload`): `void`
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `payload` | [`LogPayload`](../modules.md#logpayload)<`T`\> |
-
-#### Returns
-
-`void`
-
-#### Defined in
-
-[src/core/contracts/logging.ts:8](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/contracts/logging.ts#L8)
-
-___
-
-### error
-
-▸ **error**(`payload`): `void`
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `payload` | [`LogPayload`](../modules.md#logpayload)<`T`\> |
-
-#### Returns
-
-`void`
-
-#### Defined in
-
-[src/core/contracts/logging.ts:5](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/contracts/logging.ts#L5)
-
-___
-
-### info
-
-▸ **info**(`payload`): `void`
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `payload` | [`LogPayload`](../modules.md#logpayload)<`T`\> |
-
-#### Returns
-
-`void`
-
-#### Defined in
-
-[src/core/contracts/logging.ts:7](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/contracts/logging.ts#L7)
-
-___
-
-### warning
-
-▸ **warning**(`payload`): `void`
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `payload` | [`LogPayload`](../modules.md#logpayload)<`T`\> |
-
-#### Returns
-
-`void`
-
-#### Defined in
-
-[src/core/contracts/logging.ts:6](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/contracts/logging.ts#L6)
diff --git a/docs/api/interfaces/MentionableSelectCommand.md b/docs/api/interfaces/MentionableSelectCommand.md
deleted file mode 100644
index 4581bb9ae..000000000
--- a/docs/api/interfaces/MentionableSelectCommand.md
+++ /dev/null
@@ -1,111 +0,0 @@
----
-id: "MentionableSelectCommand"
-title: "Interface: MentionableSelectCommand"
-sidebar_label: "MentionableSelectCommand"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Hierarchy
-
-- `Module`
-
- ↳ **`MentionableSelectCommand`**
-
-## Properties
-
-### description
-
-• `Optional` **description**: `string`
-
-#### Inherited from
-
-Module.description
-
-#### Defined in
-
-[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L36)
-
-___
-
-### execute
-
-• **execute**: (`ctx`: `MentionableSelectMenuInteraction`<`CacheType`\>) => `unknown`
-
-#### Type declaration
-
-▸ (`ctx`): `unknown`
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `ctx` | `MentionableSelectMenuInteraction`<`CacheType`\> |
-
-##### Returns
-
-`unknown`
-
-#### Overrides
-
-Module.execute
-
-#### Defined in
-
-[src/types/core-modules.ts:85](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L85)
-
-___
-
-### name
-
-• `Optional` **name**: `string`
-
-#### Inherited from
-
-Module.name
-
-#### Defined in
-
-[src/types/core-modules.ts:33](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L33)
-
-___
-
-### onEvent
-
-• **onEvent**: [`ControlPlugin`](ControlPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.onEvent
-
-#### Defined in
-
-[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L34)
-
-___
-
-### plugins
-
-• **plugins**: [`InitPlugin`](InitPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.plugins
-
-#### Defined in
-
-[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L35)
-
-___
-
-### type
-
-• **type**: [`MentionableSelect`](../enums/CommandType.md#mentionableselect)
-
-#### Overrides
-
-Module.type
-
-#### Defined in
-
-[src/types/core-modules.ts:84](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L84)
diff --git a/docs/api/interfaces/ModalSubmitCommand.md b/docs/api/interfaces/ModalSubmitCommand.md
deleted file mode 100644
index 1e56ab7b8..000000000
--- a/docs/api/interfaces/ModalSubmitCommand.md
+++ /dev/null
@@ -1,111 +0,0 @@
----
-id: "ModalSubmitCommand"
-title: "Interface: ModalSubmitCommand"
-sidebar_label: "ModalSubmitCommand"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Hierarchy
-
-- `Module`
-
- ↳ **`ModalSubmitCommand`**
-
-## Properties
-
-### description
-
-• `Optional` **description**: `string`
-
-#### Inherited from
-
-Module.description
-
-#### Defined in
-
-[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L36)
-
-___
-
-### execute
-
-• **execute**: (`ctx`: `ModalSubmitInteraction`<`CacheType`\>) => `unknown`
-
-#### Type declaration
-
-▸ (`ctx`): `unknown`
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `ctx` | `ModalSubmitInteraction`<`CacheType`\> |
-
-##### Returns
-
-`unknown`
-
-#### Overrides
-
-Module.execute
-
-#### Defined in
-
-[src/types/core-modules.ts:95](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L95)
-
-___
-
-### name
-
-• `Optional` **name**: `string`
-
-#### Inherited from
-
-Module.name
-
-#### Defined in
-
-[src/types/core-modules.ts:33](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L33)
-
-___
-
-### onEvent
-
-• **onEvent**: [`ControlPlugin`](ControlPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.onEvent
-
-#### Defined in
-
-[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L34)
-
-___
-
-### plugins
-
-• **plugins**: [`InitPlugin`](InitPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.plugins
-
-#### Defined in
-
-[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L35)
-
-___
-
-### type
-
-• **type**: [`Modal`](../enums/CommandType.md#modal)
-
-#### Overrides
-
-Module.type
-
-#### Defined in
-
-[src/types/core-modules.ts:94](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L94)
diff --git a/docs/api/interfaces/Module.md b/docs/api/interfaces/Module.md
deleted file mode 100644
index f85410570..000000000
--- a/docs/api/interfaces/Module.md
+++ /dev/null
@@ -1,115 +0,0 @@
----
-id: "Module"
-title: "Interface: Module"
-sidebar_label: "Module"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Hierarchy
-
-- **`Module`**
-
- ↳ [`TextCommand`](TextCommand.md)
-
- ↳ [`SlashCommand`](SlashCommand.md)
-
- ↳ [`BothCommand`](BothCommand.md)
-
- ↳ [`ContextMenuUser`](ContextMenuUser.md)
-
- ↳ [`ContextMenuMsg`](ContextMenuMsg.md)
-
- ↳ [`ButtonCommand`](ButtonCommand.md)
-
- ↳ [`StringSelectCommand`](StringSelectCommand.md)
-
- ↳ [`ChannelSelectCommand`](ChannelSelectCommand.md)
-
- ↳ [`RoleSelectCommand`](RoleSelectCommand.md)
-
- ↳ [`MentionableSelectCommand`](MentionableSelectCommand.md)
-
- ↳ [`UserSelectCommand`](UserSelectCommand.md)
-
- ↳ [`ModalSubmitCommand`](ModalSubmitCommand.md)
-
- ↳ [`SernEventCommand`](SernEventCommand.md)
-
- ↳ [`DiscordEventCommand`](DiscordEventCommand.md)
-
- ↳ [`ExternalEventCommand`](ExternalEventCommand.md)
-
-## Properties
-
-### description
-
-• `Optional` **description**: `string`
-
-#### Defined in
-
-[src/types/module.ts:38](https://github.com/sern-handler/handler/blob/c1f6906/src/types/module.ts#L38)
-
-___
-
-### execute
-
-• **execute**: (...`args`: `any`[]) => `any`
-
-#### Type declaration
-
-▸ (...`args`): `any`
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `...args` | `any`[] |
-
-##### Returns
-
-`any`
-
-#### Defined in
-
-[src/types/module.ts:39](https://github.com/sern-handler/handler/blob/c1f6906/src/types/module.ts#L39)
-
-___
-
-### name
-
-• `Optional` **name**: `string`
-
-#### Defined in
-
-[src/types/module.ts:35](https://github.com/sern-handler/handler/blob/c1f6906/src/types/module.ts#L35)
-
-___
-
-### onEvent
-
-• **onEvent**: [`ControlPlugin`](ControlPlugin.md)<`any`[]\>[]
-
-#### Defined in
-
-[src/types/module.ts:36](https://github.com/sern-handler/handler/blob/c1f6906/src/types/module.ts#L36)
-
-___
-
-### plugins
-
-• **plugins**: [`InitPlugin`](InitPlugin.md)<`any`[]\>[]
-
-#### Defined in
-
-[src/types/module.ts:37](https://github.com/sern-handler/handler/blob/c1f6906/src/types/module.ts#L37)
-
-___
-
-### type
-
-• **type**: [`CommandType`](../enums/CommandType.md) \| [`EventType`](../enums/EventType.md)
-
-#### Defined in
-
-[src/types/module.ts:34](https://github.com/sern-handler/handler/blob/c1f6906/src/types/module.ts#L34)
diff --git a/docs/api/interfaces/ModuleManager.md b/docs/api/interfaces/ModuleManager.md
deleted file mode 100644
index 9354a527e..000000000
--- a/docs/api/interfaces/ModuleManager.md
+++ /dev/null
@@ -1,155 +0,0 @@
----
-id: "ModuleManager"
-title: "Interface: ModuleManager"
-sidebar_label: "ModuleManager"
-sidebar_position: 0
-custom_edit_url: null
----
-
-**`Since`**
-
-2.0.0
- - direct access to the module manager will be removed in version 4
-
-## Hierarchy
-
-- `MetadataAccess`
-
- ↳ **`ModuleManager`**
-
-## Implemented by
-
-- [`DefaultModuleManager`](../classes/DefaultModuleManager.md)
-
-## Methods
-
-### get
-
-▸ **get**(`id`): `undefined` \| `Module`
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `id` | `string` |
-
-#### Returns
-
-`undefined` \| `Module`
-
-#### Defined in
-
-[src/core/contracts/module-manager.ts:19](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/contracts/module-manager.ts#L19)
-
-___
-
-### getByNameCommandType
-
-▸ **getByNameCommandType**<`T`\>(`name`, `commandType`): `undefined` \| [`CommandModuleDefs`](CommandModuleDefs.md)[`T`]
-
-#### Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `T` | extends [`CommandType`](../enums/CommandType.md) |
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `name` | `string` |
-| `commandType` | `T` |
-
-#### Returns
-
-`undefined` \| [`CommandModuleDefs`](CommandModuleDefs.md)[`T`]
-
-#### Defined in
-
-[src/core/contracts/module-manager.ts:30](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/contracts/module-manager.ts#L30)
-
-___
-
-### getMetadata
-
-▸ **getMetadata**(`m`): `undefined` \| `CommandMeta`
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `m` | `Module` |
-
-#### Returns
-
-`undefined` \| `CommandMeta`
-
-#### Inherited from
-
-MetadataAccess.getMetadata
-
-#### Defined in
-
-[src/core/contracts/module-manager.ts:10](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/contracts/module-manager.ts#L10)
-
-___
-
-### getPublishableCommands
-
-▸ **getPublishableCommands**(): [`CommandModule`](../modules.md#commandmodule)[]
-
-#### Returns
-
-[`CommandModule`](../modules.md#commandmodule)[]
-
-**`Deprecated`**
-
-#### Defined in
-
-[src/core/contracts/module-manager.ts:25](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/contracts/module-manager.ts#L25)
-
-___
-
-### set
-
-▸ **set**(`id`, `path`): `void`
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `id` | `string` |
-| `path` | `Module` |
-
-#### Returns
-
-`void`
-
-#### Defined in
-
-[src/core/contracts/module-manager.ts:21](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/contracts/module-manager.ts#L21)
-
-___
-
-### setMetadata
-
-▸ **setMetadata**(`m`, `c`): `void`
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `m` | `Module` |
-| `c` | `CommandMeta` |
-
-#### Returns
-
-`void`
-
-#### Inherited from
-
-MetadataAccess.setMetadata
-
-#### Defined in
-
-[src/core/contracts/module-manager.ts:11](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/contracts/module-manager.ts#L11)
diff --git a/docs/api/interfaces/Plugin.md b/docs/api/interfaces/Plugin.md
deleted file mode 100644
index bfb48f172..000000000
--- a/docs/api/interfaces/Plugin.md
+++ /dev/null
@@ -1,47 +0,0 @@
----
-id: "Plugin"
-title: "Interface: Plugin"
-sidebar_label: "Plugin"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `Args` | extends `any`[] = `any`[] |
-
-## Properties
-
-### execute
-
-• **execute**: (...`args`: `Args`) => [`PluginResult`](../modules.md#pluginresult)
-
-#### Type declaration
-
-▸ (`...args`): [`PluginResult`](../modules.md#pluginresult)
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `...args` | `Args` |
-
-##### Returns
-
-[`PluginResult`](../modules.md#pluginresult)
-
-#### Defined in
-
-[src/types/core-plugin.ts:64](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-plugin.ts#L64)
-
-___
-
-### type
-
-• **type**: [`PluginType`](../enums/PluginType.md)
-
-#### Defined in
-
-[src/types/core-plugin.ts:63](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-plugin.ts#L63)
diff --git a/docs/api/interfaces/Presence.Result.md b/docs/api/interfaces/Presence.Result.md
deleted file mode 100644
index 82818ccf3..000000000
--- a/docs/api/interfaces/Presence.Result.md
+++ /dev/null
@@ -1,82 +0,0 @@
----
-id: "Presence.Result"
-title: "Interface: Result"
-sidebar_label: "Result"
-custom_edit_url: null
----
-
-[Presence](../namespaces/Presence.md).Result
-
-## Properties
-
-### activities
-
-• `Optional` **activities**: `ActivitiesOptions`[]
-
-#### Defined in
-
-[src/core/presences.ts:11](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/presences.ts#L11)
-
-___
-
-### afk
-
-• `Optional` **afk**: `boolean`
-
-#### Defined in
-
-[src/core/presences.ts:10](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/presences.ts#L10)
-
-___
-
-### onRepeat
-
-• `Optional` **onRepeat**: (`previous`: [`Result`](Presence.Result.md)) => [`Result`](Presence.Result.md)
-
-#### Type declaration
-
-▸ (`previous`): [`Result`](Presence.Result.md)
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `previous` | [`Result`](Presence.Result.md) |
-
-##### Returns
-
-[`Result`](Presence.Result.md)
-
-#### Defined in
-
-[src/core/presences.ts:14](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/presences.ts#L14)
-
-___
-
-### repeat
-
-• `Optional` **repeat**: `number` \| [[`Emitter`](Emitter.md), `string`]
-
-#### Defined in
-
-[src/core/presences.ts:13](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/presences.ts#L13)
-
-___
-
-### shardId
-
-• `Optional` **shardId**: `number`[]
-
-#### Defined in
-
-[src/core/presences.ts:12](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/presences.ts#L12)
-
-___
-
-### status
-
-• `Optional` **status**: `Status`
-
-#### Defined in
-
-[src/core/presences.ts:9](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/presences.ts#L9)
diff --git a/docs/api/interfaces/RoleSelectCommand.md b/docs/api/interfaces/RoleSelectCommand.md
deleted file mode 100644
index e2b3fa3d3..000000000
--- a/docs/api/interfaces/RoleSelectCommand.md
+++ /dev/null
@@ -1,111 +0,0 @@
----
-id: "RoleSelectCommand"
-title: "Interface: RoleSelectCommand"
-sidebar_label: "RoleSelectCommand"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Hierarchy
-
-- `Module`
-
- ↳ **`RoleSelectCommand`**
-
-## Properties
-
-### description
-
-• `Optional` **description**: `string`
-
-#### Inherited from
-
-Module.description
-
-#### Defined in
-
-[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L36)
-
-___
-
-### execute
-
-• **execute**: (`ctx`: `RoleSelectMenuInteraction`<`CacheType`\>) => `unknown`
-
-#### Type declaration
-
-▸ (`ctx`): `unknown`
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `ctx` | `RoleSelectMenuInteraction`<`CacheType`\> |
-
-##### Returns
-
-`unknown`
-
-#### Overrides
-
-Module.execute
-
-#### Defined in
-
-[src/types/core-modules.ts:80](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L80)
-
-___
-
-### name
-
-• `Optional` **name**: `string`
-
-#### Inherited from
-
-Module.name
-
-#### Defined in
-
-[src/types/core-modules.ts:33](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L33)
-
-___
-
-### onEvent
-
-• **onEvent**: [`ControlPlugin`](ControlPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.onEvent
-
-#### Defined in
-
-[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L34)
-
-___
-
-### plugins
-
-• **plugins**: [`InitPlugin`](InitPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.plugins
-
-#### Defined in
-
-[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L35)
-
-___
-
-### type
-
-• **type**: [`RoleSelect`](../enums/CommandType.md#roleselect)
-
-#### Overrides
-
-Module.type
-
-#### Defined in
-
-[src/types/core-modules.ts:79](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L79)
diff --git a/docs/api/interfaces/SernAutocompleteData.md b/docs/api/interfaces/SernAutocompleteData.md
deleted file mode 100644
index 9a76ea3b0..000000000
--- a/docs/api/interfaces/SernAutocompleteData.md
+++ /dev/null
@@ -1,113 +0,0 @@
----
-id: "SernAutocompleteData"
-title: "Interface: SernAutocompleteData"
-sidebar_label: "SernAutocompleteData"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Hierarchy
-
-- `Omit`<`BaseApplicationCommandOptionsData`, ``"autocomplete"``\>
-
- ↳ **`SernAutocompleteData`**
-
-## Properties
-
-### autocomplete
-
-• **autocomplete**: ``true``
-
-#### Defined in
-
-[src/types/core-modules.ts:172](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L172)
-
-___
-
-### command
-
-• **command**: `AutocompleteCommand`
-
-#### Defined in
-
-[src/types/core-modules.ts:177](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L177)
-
-___
-
-### description
-
-• **description**: `string`
-
-#### Inherited from
-
-Omit.description
-
-#### Defined in
-
-node_modules/discord.js/typings/index.d.ts:4493
-
-___
-
-### descriptionLocalizations
-
-• `Optional` **descriptionLocalizations**: `Partial`<`Record`<``"id"`` \| ``"en-US"`` \| ``"en-GB"`` \| ``"bg"`` \| ``"zh-CN"`` \| ``"zh-TW"`` \| ``"hr"`` \| ``"cs"`` \| ``"da"`` \| ``"nl"`` \| ``"fi"`` \| ``"fr"`` \| ``"de"`` \| ``"el"`` \| ``"hi"`` \| ``"hu"`` \| ``"it"`` \| ``"ja"`` \| ``"ko"`` \| ``"lt"`` \| ``"no"`` \| ``"pl"`` \| ``"pt-BR"`` \| ``"ro"`` \| ``"ru"`` \| ``"es-ES"`` \| ``"sv-SE"`` \| ``"th"`` \| ``"tr"`` \| ``"uk"`` \| ``"vi"``, ``null`` \| `string`\>\>
-
-#### Inherited from
-
-Omit.descriptionLocalizations
-
-#### Defined in
-
-node_modules/discord.js/typings/index.d.ts:4494
-
-___
-
-### name
-
-• **name**: `string`
-
-#### Inherited from
-
-Omit.name
-
-#### Defined in
-
-node_modules/discord.js/typings/index.d.ts:4491
-
-___
-
-### nameLocalizations
-
-• `Optional` **nameLocalizations**: `Partial`<`Record`<``"id"`` \| ``"en-US"`` \| ``"en-GB"`` \| ``"bg"`` \| ``"zh-CN"`` \| ``"zh-TW"`` \| ``"hr"`` \| ``"cs"`` \| ``"da"`` \| ``"nl"`` \| ``"fi"`` \| ``"fr"`` \| ``"de"`` \| ``"el"`` \| ``"hi"`` \| ``"hu"`` \| ``"it"`` \| ``"ja"`` \| ``"ko"`` \| ``"lt"`` \| ``"no"`` \| ``"pl"`` \| ``"pt-BR"`` \| ``"ro"`` \| ``"ru"`` \| ``"es-ES"`` \| ``"sv-SE"`` \| ``"th"`` \| ``"tr"`` \| ``"uk"`` \| ``"vi"``, ``null`` \| `string`\>\>
-
-#### Inherited from
-
-Omit.nameLocalizations
-
-#### Defined in
-
-node_modules/discord.js/typings/index.d.ts:4492
-
-___
-
-### required
-
-• `Optional` **required**: `boolean`
-
-#### Inherited from
-
-Omit.required
-
-#### Defined in
-
-node_modules/discord.js/typings/index.d.ts:4495
-
-___
-
-### type
-
-• **type**: `String` \| `Integer` \| `Number`
-
-#### Defined in
-
-[src/types/core-modules.ts:173](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L173)
diff --git a/docs/api/interfaces/SernEmitterPlugin.md b/docs/api/interfaces/SernEmitterPlugin.md
deleted file mode 100644
index da7978109..000000000
--- a/docs/api/interfaces/SernEmitterPlugin.md
+++ /dev/null
@@ -1,90 +0,0 @@
----
-id: "SernEmitterPlugin"
-title: "Interface: SernEmitterPlugin"
-sidebar_label: "SernEmitterPlugin"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Hierarchy
-
-- [`Plugin`](Plugin.md)
-
- ↳ **`SernEmitterPlugin`**
-
-## Properties
-
-### description
-
-• `Optional` **description**: `string`
-
-**`Deprecated`**
-
-will be removed in the next update
-
-#### Inherited from
-
-[Plugin](Plugin.md).[description](Plugin.md#description)
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:33](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L33)
-
-___
-
-### execute
-
-• **execute**: (`payload`: { `absPath`: `string` ; `mod`: `SernEventCommand` & { `name`: `string` } }, `controller`: [`Controller`](Controller.md)) => `Awaitable`<`Result`<`void`, `void`\>\>
-
-#### Type declaration
-
-▸ (`payload`, `controller`): `Awaitable`<`Result`<`void`, `void`\>\>
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `payload` | `Object` |
-| `payload.absPath` | `string` |
-| `payload.mod` | `SernEventCommand` & { `name`: `string` } |
-| `controller` | [`Controller`](Controller.md) |
-
-##### Returns
-
-`Awaitable`<`Result`<`void`, `void`\>\>
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:65](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L65)
-
-___
-
-### name
-
-• `Optional` **name**: `string`
-
-**`Deprecated`**
-
-will be removed in the next update
-
-#### Inherited from
-
-[Plugin](Plugin.md).[name](Plugin.md#name)
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:31](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L31)
-
-___
-
-### type
-
-• **type**: [`Command`](../enums/PluginType.md#command)
-
-#### Overrides
-
-[Plugin](Plugin.md).[type](Plugin.md#type)
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:64](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L64)
diff --git a/docs/api/interfaces/SernEventCommand.md b/docs/api/interfaces/SernEventCommand.md
deleted file mode 100644
index 0f7c7acb6..000000000
--- a/docs/api/interfaces/SernEventCommand.md
+++ /dev/null
@@ -1,113 +0,0 @@
----
-id: "SernEventCommand"
-title: "Interface: SernEventCommand"
-sidebar_label: "SernEventCommand"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `T` | extends keyof [`SernEventsMapping`](SernEventsMapping.md) = keyof [`SernEventsMapping`](SernEventsMapping.md) |
-
-## Hierarchy
-
-- `Module`
-
- ↳ **`SernEventCommand`**
-
-## Properties
-
-### description
-
-• `Optional` **description**: `string`
-
-#### Inherited from
-
-Module.description
-
-#### Defined in
-
-[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L36)
-
-___
-
-### name
-
-• `Optional` **name**: `T`
-
-#### Overrides
-
-Module.name
-
-#### Defined in
-
-[src/types/core-modules.ts:42](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L42)
-
-___
-
-### onEvent
-
-• **onEvent**: [`ControlPlugin`](ControlPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.onEvent
-
-#### Defined in
-
-[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L34)
-
-___
-
-### plugins
-
-• **plugins**: [`InitPlugin`](InitPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.plugins
-
-#### Defined in
-
-[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L35)
-
-___
-
-### type
-
-• **type**: [`Sern`](../enums/EventType.md#sern)
-
-#### Overrides
-
-Module.type
-
-#### Defined in
-
-[src/types/core-modules.ts:43](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L43)
-
-## Methods
-
-### execute
-
-▸ **execute**(`...args`): `unknown`
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `...args` | [`SernEventsMapping`](SernEventsMapping.md)[`T`] |
-
-#### Returns
-
-`unknown`
-
-#### Overrides
-
-Module.execute
-
-#### Defined in
-
-[src/types/core-modules.ts:44](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L44)
diff --git a/docs/api/interfaces/SernEventPlugin.md b/docs/api/interfaces/SernEventPlugin.md
deleted file mode 100644
index a19ce00ac..000000000
--- a/docs/api/interfaces/SernEventPlugin.md
+++ /dev/null
@@ -1,94 +0,0 @@
----
-id: "SernEventPlugin"
-title: "Interface: SernEventPlugin"
-sidebar_label: "SernEventPlugin"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `T` | extends keyof [`SernEventsMapping`](../modules.md#serneventsmapping) = keyof [`SernEventsMapping`](../modules.md#serneventsmapping) |
-
-## Hierarchy
-
-- [`Plugin`](Plugin.md)
-
- ↳ **`SernEventPlugin`**
-
-## Properties
-
-### description
-
-• `Optional` **description**: `string`
-
-**`Deprecated`**
-
-will be removed in the next update
-
-#### Inherited from
-
-[Plugin](Plugin.md).[description](Plugin.md#description)
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:33](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L33)
-
-___
-
-### execute
-
-• **execute**: (`args`: [`SernEventsMapping`](../modules.md#serneventsmapping)[`T`], `controller`: [`Controller`](Controller.md)) => `Awaitable`<`Result`<`void`, `void`\>\>
-
-#### Type declaration
-
-▸ (`args`, `controller`): `Awaitable`<`Result`<`void`, `void`\>\>
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `args` | [`SernEventsMapping`](../modules.md#serneventsmapping)[`T`] |
-| `controller` | [`Controller`](Controller.md) |
-
-##### Returns
-
-`Awaitable`<`Result`<`void`, `void`\>\>
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:91](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L91)
-
-___
-
-### name
-
-• `Optional` **name**: `T`
-
-**`Deprecated`**
-
-will be removed in the next update
-
-#### Overrides
-
-[Plugin](Plugin.md).[name](Plugin.md#name)
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:89](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L89)
-
-___
-
-### type
-
-• **type**: [`Event`](../enums/PluginType.md#event)
-
-#### Overrides
-
-[Plugin](Plugin.md).[type](Plugin.md#type)
-
-#### Defined in
-
-[src/handler/plugins/plugin.ts:90](https://github.com/sern-handler/handler/blob/3daacfc/src/handler/plugins/plugin.ts#L90)
diff --git a/docs/api/interfaces/SernEventsMapping.md b/docs/api/interfaces/SernEventsMapping.md
deleted file mode 100644
index 5f444fac1..000000000
--- a/docs/api/interfaces/SernEventsMapping.md
+++ /dev/null
@@ -1,57 +0,0 @@
----
-id: "SernEventsMapping"
-title: "Interface: SernEventsMapping"
-sidebar_label: "SernEventsMapping"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Properties
-
-### error
-
-• **error**: [\{ `module?`: `AnyModule` ; `reason`: `string` \| `Error` ; `type`: [`Failure`](../enums/PayloadType.md#failure) }]
-
-#### Defined in
-
-[src/types/utility.ts:21](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/utility.ts#L21)
-
-___
-
-### module.activate
-
-• **module.activate**: [[`Payload`](../modules.md#payload)]
-
-#### Defined in
-
-[src/types/utility.ts:20](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/utility.ts#L20)
-
-___
-
-### module.register
-
-• **module.register**: [[`Payload`](../modules.md#payload)]
-
-#### Defined in
-
-[src/types/utility.ts:19](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/utility.ts#L19)
-
-___
-
-### modulesLoaded
-
-• **modulesLoaded**: [undefined?]
-
-#### Defined in
-
-[src/types/utility.ts:23](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/utility.ts#L23)
-
-___
-
-### warning
-
-• **warning**: [[`Payload`](../modules.md#payload)]
-
-#### Defined in
-
-[src/types/utility.ts:22](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/utility.ts#L22)
diff --git a/docs/api/interfaces/SernSubCommandData.md b/docs/api/interfaces/SernSubCommandData.md
deleted file mode 100644
index 811f0ef12..000000000
--- a/docs/api/interfaces/SernSubCommandData.md
+++ /dev/null
@@ -1,107 +0,0 @@
----
-id: "SernSubCommandData"
-title: "Interface: SernSubCommandData"
-sidebar_label: "SernSubCommandData"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Hierarchy
-
-- `APIApplicationCommandOptionBase`<`ApplicationCommandOptionType.Subcommand`\>
-
- ↳ **`SernSubCommandData`**
-
-## Properties
-
-### description
-
-• **description**: `string`
-
-#### Inherited from
-
-APIApplicationCommandOptionBase.description
-
-#### Defined in
-
-node_modules/discord-api-types/payloads/v10/_interactions/_applicationCommands/_chatInput/base.d.ts:7
-
-___
-
-### description\_localizations
-
-• `Optional` **description\_localizations**: ``null`` \| `Partial`<`Record`<``"id"`` \| ``"en-US"`` \| ``"en-GB"`` \| ``"bg"`` \| ``"zh-CN"`` \| ``"zh-TW"`` \| ``"hr"`` \| ``"cs"`` \| ``"da"`` \| ``"nl"`` \| ``"fi"`` \| ``"fr"`` \| ``"de"`` \| ``"el"`` \| ``"hi"`` \| ``"hu"`` \| ``"it"`` \| ``"ja"`` \| ``"ko"`` \| ``"lt"`` \| ``"no"`` \| ``"pl"`` \| ``"pt-BR"`` \| ``"ro"`` \| ``"ru"`` \| ``"es-ES"`` \| ``"sv-SE"`` \| ``"th"`` \| ``"tr"`` \| ``"uk"`` \| ``"vi"``, ``null`` \| `string`\>\>
-
-#### Inherited from
-
-APIApplicationCommandOptionBase.description\_localizations
-
-#### Defined in
-
-node_modules/discord-api-types/payloads/v10/_interactions/_applicationCommands/_chatInput/base.d.ts:8
-
-___
-
-### name
-
-• **name**: `string`
-
-#### Inherited from
-
-APIApplicationCommandOptionBase.name
-
-#### Defined in
-
-node_modules/discord-api-types/payloads/v10/_interactions/_applicationCommands/_chatInput/base.d.ts:5
-
-___
-
-### name\_localizations
-
-• `Optional` **name\_localizations**: ``null`` \| `Partial`<`Record`<``"id"`` \| ``"en-US"`` \| ``"en-GB"`` \| ``"bg"`` \| ``"zh-CN"`` \| ``"zh-TW"`` \| ``"hr"`` \| ``"cs"`` \| ``"da"`` \| ``"nl"`` \| ``"fi"`` \| ``"fr"`` \| ``"de"`` \| ``"el"`` \| ``"hi"`` \| ``"hu"`` \| ``"it"`` \| ``"ja"`` \| ``"ko"`` \| ``"lt"`` \| ``"no"`` \| ``"pl"`` \| ``"pt-BR"`` \| ``"ro"`` \| ``"ru"`` \| ``"es-ES"`` \| ``"sv-SE"`` \| ``"th"`` \| ``"tr"`` \| ``"uk"`` \| ``"vi"``, ``null`` \| `string`\>\>
-
-#### Inherited from
-
-APIApplicationCommandOptionBase.name\_localizations
-
-#### Defined in
-
-node_modules/discord-api-types/payloads/v10/_interactions/_applicationCommands/_chatInput/base.d.ts:6
-
-___
-
-### options
-
-• `Optional` **options**: [`SernOptionsData`](../modules.md#sernoptionsdata)[]
-
-#### Defined in
-
-[src/types/core-modules.ts:209](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L209)
-
-___
-
-### required
-
-• `Optional` **required**: `boolean`
-
-#### Inherited from
-
-APIApplicationCommandOptionBase.required
-
-#### Defined in
-
-node_modules/discord-api-types/payloads/v10/_interactions/_applicationCommands/_chatInput/base.d.ts:9
-
-___
-
-### type
-
-• **type**: `Subcommand`
-
-#### Overrides
-
-APIApplicationCommandOptionBase.type
-
-#### Defined in
-
-[src/types/core-modules.ts:208](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L208)
diff --git a/docs/api/interfaces/SernSubCommandGroupData.md b/docs/api/interfaces/SernSubCommandGroupData.md
deleted file mode 100644
index 187a2d574..000000000
--- a/docs/api/interfaces/SernSubCommandGroupData.md
+++ /dev/null
@@ -1,117 +0,0 @@
----
-id: "SernSubCommandGroupData"
-title: "Interface: SernSubCommandGroupData"
-sidebar_label: "SernSubCommandGroupData"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Hierarchy
-
-- `BaseApplicationCommandOptionsData`
-
- ↳ **`SernSubCommandGroupData`**
-
-## Properties
-
-### autocomplete
-
-• `Optional` **autocomplete**: `undefined`
-
-#### Inherited from
-
-BaseApplicationCommandOptionsData.autocomplete
-
-#### Defined in
-
-node_modules/discord.js/typings/index.d.ts:4496
-
-___
-
-### description
-
-• **description**: `string`
-
-#### Inherited from
-
-BaseApplicationCommandOptionsData.description
-
-#### Defined in
-
-node_modules/discord.js/typings/index.d.ts:4493
-
-___
-
-### descriptionLocalizations
-
-• `Optional` **descriptionLocalizations**: `Partial`<`Record`<``"id"`` \| ``"en-US"`` \| ``"en-GB"`` \| ``"bg"`` \| ``"zh-CN"`` \| ``"zh-TW"`` \| ``"hr"`` \| ``"cs"`` \| ``"da"`` \| ``"nl"`` \| ``"fi"`` \| ``"fr"`` \| ``"de"`` \| ``"el"`` \| ``"hi"`` \| ``"hu"`` \| ``"it"`` \| ``"ja"`` \| ``"ko"`` \| ``"lt"`` \| ``"no"`` \| ``"pl"`` \| ``"pt-BR"`` \| ``"ro"`` \| ``"ru"`` \| ``"es-ES"`` \| ``"sv-SE"`` \| ``"th"`` \| ``"tr"`` \| ``"uk"`` \| ``"vi"``, ``null`` \| `string`\>\>
-
-#### Inherited from
-
-BaseApplicationCommandOptionsData.descriptionLocalizations
-
-#### Defined in
-
-node_modules/discord.js/typings/index.d.ts:4494
-
-___
-
-### name
-
-• **name**: `string`
-
-#### Inherited from
-
-BaseApplicationCommandOptionsData.name
-
-#### Defined in
-
-node_modules/discord.js/typings/index.d.ts:4491
-
-___
-
-### nameLocalizations
-
-• `Optional` **nameLocalizations**: `Partial`<`Record`<``"id"`` \| ``"en-US"`` \| ``"en-GB"`` \| ``"bg"`` \| ``"zh-CN"`` \| ``"zh-TW"`` \| ``"hr"`` \| ``"cs"`` \| ``"da"`` \| ``"nl"`` \| ``"fi"`` \| ``"fr"`` \| ``"de"`` \| ``"el"`` \| ``"hi"`` \| ``"hu"`` \| ``"it"`` \| ``"ja"`` \| ``"ko"`` \| ``"lt"`` \| ``"no"`` \| ``"pl"`` \| ``"pt-BR"`` \| ``"ro"`` \| ``"ru"`` \| ``"es-ES"`` \| ``"sv-SE"`` \| ``"th"`` \| ``"tr"`` \| ``"uk"`` \| ``"vi"``, ``null`` \| `string`\>\>
-
-#### Inherited from
-
-BaseApplicationCommandOptionsData.nameLocalizations
-
-#### Defined in
-
-node_modules/discord.js/typings/index.d.ts:4492
-
-___
-
-### options
-
-• `Optional` **options**: [`SernSubCommandData`](SernSubCommandData.md)[]
-
-#### Defined in
-
-[src/types/core-modules.ts:214](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L214)
-
-___
-
-### required
-
-• `Optional` **required**: `boolean`
-
-#### Inherited from
-
-BaseApplicationCommandOptionsData.required
-
-#### Defined in
-
-node_modules/discord.js/typings/index.d.ts:4495
-
-___
-
-### type
-
-• **type**: `SubcommandGroup`
-
-#### Defined in
-
-[src/types/core-modules.ts:213](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L213)
diff --git a/docs/api/interfaces/SlashCommand.md b/docs/api/interfaces/SlashCommand.md
deleted file mode 100644
index 9702a2679..000000000
--- a/docs/api/interfaces/SlashCommand.md
+++ /dev/null
@@ -1,122 +0,0 @@
----
-id: "SlashCommand"
-title: "Interface: SlashCommand"
-sidebar_label: "SlashCommand"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Hierarchy
-
-- `Module`
-
- ↳ **`SlashCommand`**
-
-## Properties
-
-### description
-
-• **description**: `string`
-
-#### Overrides
-
-Module.description
-
-#### Defined in
-
-[src/types/core-modules.ts:118](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L118)
-
-___
-
-### execute
-
-• **execute**: (`ctx`: [`Context`](../classes/Context.md), `args`: [``"slash"``, [`SlashOptions`](../modules.md#slashoptions)]) => `unknown`
-
-#### Type declaration
-
-▸ (`ctx`, `args`): `unknown`
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `ctx` | [`Context`](../classes/Context.md) |
-| `args` | [``"slash"``, [`SlashOptions`](../modules.md#slashoptions)] |
-
-##### Returns
-
-`unknown`
-
-#### Overrides
-
-Module.execute
-
-#### Defined in
-
-[src/types/core-modules.ts:120](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L120)
-
-___
-
-### name
-
-• `Optional` **name**: `string`
-
-#### Inherited from
-
-Module.name
-
-#### Defined in
-
-[src/types/core-modules.ts:33](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L33)
-
-___
-
-### onEvent
-
-• **onEvent**: [`ControlPlugin`](ControlPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.onEvent
-
-#### Defined in
-
-[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L34)
-
-___
-
-### options
-
-• `Optional` **options**: [`SernOptionsData`](../modules.md#sernoptionsdata)[]
-
-#### Defined in
-
-[src/types/core-modules.ts:119](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L119)
-
-___
-
-### plugins
-
-• **plugins**: [`InitPlugin`](InitPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.plugins
-
-#### Defined in
-
-[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L35)
-
-___
-
-### type
-
-• **type**: [`Slash`](../enums/CommandType.md#slash)
-
-#### Overrides
-
-Module.type
-
-#### Defined in
-
-[src/types/core-modules.ts:117](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L117)
diff --git a/docs/api/interfaces/StringSelectCommand.md b/docs/api/interfaces/StringSelectCommand.md
deleted file mode 100644
index da3a1fbb2..000000000
--- a/docs/api/interfaces/StringSelectCommand.md
+++ /dev/null
@@ -1,111 +0,0 @@
----
-id: "StringSelectCommand"
-title: "Interface: StringSelectCommand"
-sidebar_label: "StringSelectCommand"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Hierarchy
-
-- `Module`
-
- ↳ **`StringSelectCommand`**
-
-## Properties
-
-### description
-
-• `Optional` **description**: `string`
-
-#### Inherited from
-
-Module.description
-
-#### Defined in
-
-[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L36)
-
-___
-
-### execute
-
-• **execute**: (`ctx`: `StringSelectMenuInteraction`<`CacheType`\>) => `unknown`
-
-#### Type declaration
-
-▸ (`ctx`): `unknown`
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `ctx` | `StringSelectMenuInteraction`<`CacheType`\> |
-
-##### Returns
-
-`unknown`
-
-#### Overrides
-
-Module.execute
-
-#### Defined in
-
-[src/types/core-modules.ts:70](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L70)
-
-___
-
-### name
-
-• `Optional` **name**: `string`
-
-#### Inherited from
-
-Module.name
-
-#### Defined in
-
-[src/types/core-modules.ts:33](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L33)
-
-___
-
-### onEvent
-
-• **onEvent**: [`ControlPlugin`](ControlPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.onEvent
-
-#### Defined in
-
-[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L34)
-
-___
-
-### plugins
-
-• **plugins**: [`InitPlugin`](InitPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.plugins
-
-#### Defined in
-
-[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L35)
-
-___
-
-### type
-
-• **type**: [`StringSelect`](../enums/CommandType.md#stringselect)
-
-#### Overrides
-
-Module.type
-
-#### Defined in
-
-[src/types/core-modules.ts:69](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L69)
diff --git a/docs/api/interfaces/TextCommand.md b/docs/api/interfaces/TextCommand.md
deleted file mode 100644
index 8797f8480..000000000
--- a/docs/api/interfaces/TextCommand.md
+++ /dev/null
@@ -1,122 +0,0 @@
----
-id: "TextCommand"
-title: "Interface: TextCommand"
-sidebar_label: "TextCommand"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Hierarchy
-
-- `Module`
-
- ↳ **`TextCommand`**
-
-## Properties
-
-### alias
-
-• `Optional` **alias**: `string`[]
-
-#### Defined in
-
-[src/types/core-modules.ts:112](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L112)
-
-___
-
-### description
-
-• `Optional` **description**: `string`
-
-#### Inherited from
-
-Module.description
-
-#### Defined in
-
-[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L36)
-
-___
-
-### execute
-
-• **execute**: (`ctx`: [`Context`](../classes/Context.md), `args`: [``"text"``, `string`[]]) => `unknown`
-
-#### Type declaration
-
-▸ (`ctx`, `args`): `unknown`
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `ctx` | [`Context`](../classes/Context.md) |
-| `args` | [``"text"``, `string`[]] |
-
-##### Returns
-
-`unknown`
-
-#### Overrides
-
-Module.execute
-
-#### Defined in
-
-[src/types/core-modules.ts:113](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L113)
-
-___
-
-### name
-
-• `Optional` **name**: `string`
-
-#### Inherited from
-
-Module.name
-
-#### Defined in
-
-[src/types/core-modules.ts:33](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L33)
-
-___
-
-### onEvent
-
-• **onEvent**: [`ControlPlugin`](ControlPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.onEvent
-
-#### Defined in
-
-[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L34)
-
-___
-
-### plugins
-
-• **plugins**: [`InitPlugin`](InitPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.plugins
-
-#### Defined in
-
-[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L35)
-
-___
-
-### type
-
-• **type**: [`Text`](../enums/CommandType.md#text)
-
-#### Overrides
-
-Module.type
-
-#### Defined in
-
-[src/types/core-modules.ts:111](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L111)
diff --git a/docs/api/interfaces/UserSelectCommand.md b/docs/api/interfaces/UserSelectCommand.md
deleted file mode 100644
index de2ea6bf0..000000000
--- a/docs/api/interfaces/UserSelectCommand.md
+++ /dev/null
@@ -1,111 +0,0 @@
----
-id: "UserSelectCommand"
-title: "Interface: UserSelectCommand"
-sidebar_label: "UserSelectCommand"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Hierarchy
-
-- `Module`
-
- ↳ **`UserSelectCommand`**
-
-## Properties
-
-### description
-
-• `Optional` **description**: `string`
-
-#### Inherited from
-
-Module.description
-
-#### Defined in
-
-[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L36)
-
-___
-
-### execute
-
-• **execute**: (`ctx`: `UserSelectMenuInteraction`<`CacheType`\>) => `unknown`
-
-#### Type declaration
-
-▸ (`ctx`): `unknown`
-
-##### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `ctx` | `UserSelectMenuInteraction`<`CacheType`\> |
-
-##### Returns
-
-`unknown`
-
-#### Overrides
-
-Module.execute
-
-#### Defined in
-
-[src/types/core-modules.ts:90](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L90)
-
-___
-
-### name
-
-• `Optional` **name**: `string`
-
-#### Inherited from
-
-Module.name
-
-#### Defined in
-
-[src/types/core-modules.ts:33](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L33)
-
-___
-
-### onEvent
-
-• **onEvent**: [`ControlPlugin`](ControlPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.onEvent
-
-#### Defined in
-
-[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L34)
-
-___
-
-### plugins
-
-• **plugins**: [`InitPlugin`](InitPlugin.md)<`any`[]\>[]
-
-#### Inherited from
-
-Module.plugins
-
-#### Defined in
-
-[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L35)
-
-___
-
-### type
-
-• **type**: [`UserSelect`](../enums/CommandType.md#userselect)
-
-#### Overrides
-
-Module.type
-
-#### Defined in
-
-[src/types/core-modules.ts:89](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L89)
diff --git a/docs/api/interfaces/Wrapper.md b/docs/api/interfaces/Wrapper.md
deleted file mode 100644
index 4ab92f50e..000000000
--- a/docs/api/interfaces/Wrapper.md
+++ /dev/null
@@ -1,69 +0,0 @@
----
-id: "Wrapper"
-title: "Interface: Wrapper"
-sidebar_label: "Wrapper"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Properties
-
-### commands
-
-• **commands**: `string`
-
-#### Defined in
-
-[src/types/core.ts:9](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core.ts#L9)
-
-___
-
-### containerConfig
-
-• `Optional` **containerConfig**: `Object`
-
-#### Type declaration
-
-| Name | Type |
-| :------ | :------ |
-| `get` | (...`keys`: keyof `Dependencies`[]) => `unknown`[] |
-
-#### Defined in
-
-[src/types/core.ts:20](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core.ts#L20)
-
-___
-
-### defaultPrefix
-
-• `Optional` **defaultPrefix**: `string`
-
-#### Defined in
-
-[src/types/core.ts:10](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core.ts#L10)
-
-___
-
-### events
-
-• `Optional` **events**: `string`
-
-#### Defined in
-
-[src/types/core.ts:11](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core.ts#L11)
-
-___
-
-### mode
-
-• `Optional` **mode**: `string`
-
-Overload to enable mode in case developer does not use a .env file.
-
-**`Deprecated`**
-
-- https://github.com/sern-handler/handler/pull/325
-
-#### Defined in
-
-[src/types/core.ts:16](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core.ts#L16)
diff --git a/docs/api/interfaces/_category_.yml b/docs/api/interfaces/_category_.yml
deleted file mode 100644
index 43bec88cf..000000000
--- a/docs/api/interfaces/_category_.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-label: "Interfaces"
-position: 4
\ No newline at end of file
diff --git a/docs/api/modules.md b/docs/api/modules.md
deleted file mode 100644
index 7389ff280..000000000
--- a/docs/api/modules.md
+++ /dev/null
@@ -1,734 +0,0 @@
----
-id: "modules"
-title: "@sern/handler"
-sidebar_label: "Exports"
-sidebar_position: 0.5
-custom_edit_url: null
----
-
-## Namespaces
-
-- [Presence](namespaces/Presence.md)
-- [Sern](namespaces/Sern.md)
-
-## Enumerations
-
-- [CommandType](enums/CommandType.md)
-- [EventType](enums/EventType.md)
-- [PayloadType](enums/PayloadType.md)
-- [PluginType](enums/PluginType.md)
-
-## Classes
-
-- [Context](classes/Context.md)
-- [DefaultErrorHandling](classes/DefaultErrorHandling.md)
-- [DefaultLogging](classes/DefaultLogging.md)
-- [DefaultModuleManager](classes/DefaultModuleManager.md)
-- [ModuleStore](classes/ModuleStore.md)
-
-## Interfaces
-
-- [BothCommand](interfaces/BothCommand.md)
-- [ButtonCommand](interfaces/ButtonCommand.md)
-- [ChannelSelectCommand](interfaces/ChannelSelectCommand.md)
-- [CommandModuleDefs](interfaces/CommandModuleDefs.md)
-- [ContextMenuMsg](interfaces/ContextMenuMsg.md)
-- [ContextMenuUser](interfaces/ContextMenuUser.md)
-- [ControlPlugin](interfaces/ControlPlugin.md)
-- [Controller](interfaces/Controller.md)
-- [CoreDependencies](interfaces/CoreDependencies.md)
-- [CoreModuleStore](interfaces/CoreModuleStore.md)
-- [DiscordEventCommand](interfaces/DiscordEventCommand.md)
-- [Disposable](interfaces/Disposable.md)
-- [Emitter](interfaces/Emitter.md)
-- [ErrorHandling](interfaces/ErrorHandling.md)
-- [EventModuleDefs](interfaces/EventModuleDefs.md)
-- [ExternalEventCommand](interfaces/ExternalEventCommand.md)
-- [Init](interfaces/Init.md)
-- [InitPlugin](interfaces/InitPlugin.md)
-- [Logging](interfaces/Logging.md)
-- [MentionableSelectCommand](interfaces/MentionableSelectCommand.md)
-- [ModalSubmitCommand](interfaces/ModalSubmitCommand.md)
-- [ModuleManager](interfaces/ModuleManager.md)
-- [Plugin](interfaces/Plugin.md)
-- [RoleSelectCommand](interfaces/RoleSelectCommand.md)
-- [SernAutocompleteData](interfaces/SernAutocompleteData.md)
-- [SernEventCommand](interfaces/SernEventCommand.md)
-- [SernEventsMapping](interfaces/SernEventsMapping.md)
-- [SernSubCommandData](interfaces/SernSubCommandData.md)
-- [SernSubCommandGroupData](interfaces/SernSubCommandGroupData.md)
-- [SlashCommand](interfaces/SlashCommand.md)
-- [StringSelectCommand](interfaces/StringSelectCommand.md)
-- [TextCommand](interfaces/TextCommand.md)
-- [UserSelectCommand](interfaces/UserSelectCommand.md)
-- [Wrapper](interfaces/Wrapper.md)
-
-## Type Aliases
-
-### AnyCommandPlugin
-
-Ƭ **AnyCommandPlugin**: [`ControlPlugin`](interfaces/ControlPlugin.md) \| [`InitPlugin`](interfaces/InitPlugin.md)<[`InitArgs`<`Processed`<[`CommandModule`](modules.md#commandmodule)\>\>]\>
-
-#### Defined in
-
-[src/types/core-plugin.ts:76](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-plugin.ts#L76)
-
-___
-
-### AnyEventPlugin
-
-Ƭ **AnyEventPlugin**: [`ControlPlugin`](interfaces/ControlPlugin.md) \| [`InitPlugin`](interfaces/InitPlugin.md)<[`InitArgs`<`Processed`<[`EventModule`](modules.md#eventmodule)\>\>]\>
-
-#### Defined in
-
-[src/types/core-plugin.ts:77](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-plugin.ts#L77)
-
-___
-
-### Args
-
-Ƭ **Args**: `ParseType`<\{ `slash`: [`SlashOptions`](modules.md#slashoptions) ; `text`: `string`[] }\>
-
-#### Defined in
-
-[src/types/utility.ts:16](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/utility.ts#L16)
-
-___
-
-### CommandModule
-
-Ƭ **CommandModule**: [`TextCommand`](interfaces/TextCommand.md) \| [`SlashCommand`](interfaces/SlashCommand.md) \| [`BothCommand`](interfaces/BothCommand.md) \| [`ContextMenuUser`](interfaces/ContextMenuUser.md) \| [`ContextMenuMsg`](interfaces/ContextMenuMsg.md) \| [`ButtonCommand`](interfaces/ButtonCommand.md) \| [`StringSelectCommand`](interfaces/StringSelectCommand.md) \| [`MentionableSelectCommand`](interfaces/MentionableSelectCommand.md) \| [`UserSelectCommand`](interfaces/UserSelectCommand.md) \| [`ChannelSelectCommand`](interfaces/ChannelSelectCommand.md) \| [`RoleSelectCommand`](interfaces/RoleSelectCommand.md) \| [`ModalSubmitCommand`](interfaces/ModalSubmitCommand.md)
-
-#### Defined in
-
-[src/types/core-modules.ts:132](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L132)
-
-___
-
-### EventModule
-
-Ƭ **EventModule**: [`DiscordEventCommand`](interfaces/DiscordEventCommand.md) \| [`SernEventCommand`](interfaces/SernEventCommand.md) \| [`ExternalEventCommand`](interfaces/ExternalEventCommand.md)
-
-#### Defined in
-
-[src/types/core-modules.ts:131](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L131)
-
-___
-
-### Initializable
-
-Ƭ **Initializable**<`T`\>: `T`
-
-Type to annotate that something is initializable.
-If T has an init method, this will be called.
-
-#### Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `T` | extends [`Init`](interfaces/Init.md) |
-
-#### Defined in
-
-[src/types/ioc.ts:17](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/ioc.ts#L17)
-
-___
-
-### LogPayload
-
-Ƭ **LogPayload**<`T`\>: `Object`
-
-#### Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `T` | `unknown` |
-
-#### Type declaration
-
-| Name | Type |
-| :------ | :------ |
-| `message` | `T` |
-
-#### Defined in
-
-[src/core/contracts/logging.ts:11](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/contracts/logging.ts#L11)
-
-___
-
-### Payload
-
-Ƭ **Payload**: \{ `module`: `AnyModule` ; `type`: [`Success`](enums/PayloadType.md#success) } \| \{ `module?`: `AnyModule` ; `reason`: `string` \| `Error` ; `type`: [`Failure`](enums/PayloadType.md#failure) } \| \{ `module`: `undefined` ; `reason`: `string` ; `type`: [`Warning`](enums/PayloadType.md#warning) }
-
-#### Defined in
-
-[src/types/utility.ts:26](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/utility.ts#L26)
-
-___
-
-### PluginResult
-
-Ƭ **PluginResult**: `Awaitable`<`VoidResult`\>
-
-#### Defined in
-
-[src/types/core-plugin.ts:51](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-plugin.ts#L51)
-
-___
-
-### SernOptionsData
-
-Ƭ **SernOptionsData**: [`SernSubCommandData`](interfaces/SernSubCommandData.md) \| [`SernSubCommandGroupData`](interfaces/SernSubCommandGroupData.md) \| `APIApplicationCommandBasicOption` \| [`SernAutocompleteData`](interfaces/SernAutocompleteData.md)
-
-Type that replaces autocomplete with [SernAutocompleteData](interfaces/SernAutocompleteData.md)
-
-#### Defined in
-
-[src/types/core-modules.ts:200](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/core-modules.ts#L200)
-
-___
-
-### Singleton
-
-Ƭ **Singleton**<`T`\>: () => `T`
-
-Type to annotate that something is a singleton.
-T is created once and lazily.
-
-#### Type parameters
-
-| Name |
-| :------ |
-| `T` |
-
-#### Type declaration
-
-▸ (): `T`
-
-##### Returns
-
-`T`
-
-#### Defined in
-
-[src/types/ioc.ts:7](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/ioc.ts#L7)
-
-___
-
-### SlashOptions
-
-Ƭ **SlashOptions**: `Omit`<`CommandInteractionOptionResolver`, ``"getMessage"`` \| ``"getFocused"``\>
-
-#### Defined in
-
-[src/types/utility.ts:14](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/utility.ts#L14)
-
-___
-
-### Transient
-
-Ƭ **Transient**<`T`\>: () => () => `T`
-
-Type to annotate that something is transient.
-Every time this is called, a new object is created
-
-#### Type parameters
-
-| Name |
-| :------ |
-| `T` |
-
-#### Type declaration
-
-▸ (): () => `T`
-
-##### Returns
-
-`fn`
-
-▸ (): `T`
-
-##### Returns
-
-`T`
-
-#### Defined in
-
-[src/types/ioc.ts:12](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/types/ioc.ts#L12)
-
-## Variables
-
-### controller
-
-• `Const` **controller**: `Object`
-
-**`Since`**
-
-1.0.0
-The object passed into every plugin to control a command's behavior
-
-#### Type declaration
-
-| Name | Type |
-| :------ | :------ |
-| `next` | () => `OkImpl`<`void`\> |
-| `stop` | () => `ErrImpl`<`void`\> |
-
-#### Defined in
-
-[src/core/create-plugins.ts:69](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/create-plugins.ts#L69)
-
-## Functions
-
-### CommandControlPlugin
-
-▸ **CommandControlPlugin**<`I`\>(`execute`): [`Plugin`](interfaces/Plugin.md)<`unknown`[]\>
-
-#### Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `I` | extends [`CommandType`](enums/CommandType.md) |
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `execute` | (...`args`: `CommandArgs`<`I`, [`Control`](enums/PluginType.md#control)\>) => [`PluginResult`](modules.md#pluginresult) |
-
-#### Returns
-
-[`Plugin`](interfaces/Plugin.md)<`unknown`[]\>
-
-**`Since`**
-
-2.5.0
-@__PURE__
-
-#### Defined in
-
-[src/core/create-plugins.ts:37](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/create-plugins.ts#L37)
-
-___
-
-### CommandInitPlugin
-
-▸ **CommandInitPlugin**<`I`\>(`execute`): [`Plugin`](interfaces/Plugin.md)<`unknown`[]\>
-
-#### Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `I` | extends [`CommandType`](enums/CommandType.md) |
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `execute` | (...`args`: `CommandArgs`<`I`, [`Init`](enums/PluginType.md#init)\>) => [`PluginResult`](modules.md#pluginresult) |
-
-#### Returns
-
-[`Plugin`](interfaces/Plugin.md)<`unknown`[]\>
-
-**`Since`**
-
-2.5.0
-@__PURE__
-
-#### Defined in
-
-[src/core/create-plugins.ts:28](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/create-plugins.ts#L28)
-
-___
-
-### DiscordEventControlPlugin
-
-▸ **DiscordEventControlPlugin**<`T`\>(`name`, `execute`): [`Plugin`](interfaces/Plugin.md)<`unknown`[]\>
-
-#### Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `T` | extends keyof `ClientEvents` |
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `name` | `T` |
-| `execute` | (...`args`: `ClientEvents`[`T`]) => [`PluginResult`](modules.md#pluginresult) |
-
-#### Returns
-
-[`Plugin`](interfaces/Plugin.md)<`unknown`[]\>
-
-**`Since`**
-
-2.5.0
-
-**`Experimental`**
-
-A specialized function for creating control plugins with discord.js ClientEvents.
-Will probably be moved one day!
-
-#### Defined in
-
-[src/core/create-plugins.ts:58](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/create-plugins.ts#L58)
-
-___
-
-### EventControlPlugin
-
-▸ **EventControlPlugin**<`I`\>(`execute`): [`Plugin`](interfaces/Plugin.md)<`unknown`[]\>
-
-#### Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `I` | extends [`EventType`](enums/EventType.md) |
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `execute` | (...`args`: `EventArgs`<`I`, [`Control`](enums/PluginType.md#control)\>) => [`PluginResult`](modules.md#pluginresult) |
-
-#### Returns
-
-[`Plugin`](interfaces/Plugin.md)<`unknown`[]\>
-
-**`Since`**
-
-2.5.0
-@__PURE__
-
-#### Defined in
-
-[src/core/create-plugins.ts:46](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/create-plugins.ts#L46)
-
-___
-
-### EventInitPlugin
-
-▸ **EventInitPlugin**<`I`\>(`execute`): [`Plugin`](interfaces/Plugin.md)<`unknown`[]\>
-
-#### Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `I` | extends [`EventType`](enums/EventType.md) |
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `execute` | (...`args`: `EventArgs`<`I`, [`Init`](enums/PluginType.md#init)\>) => [`PluginResult`](modules.md#pluginresult) |
-
-#### Returns
-
-[`Plugin`](interfaces/Plugin.md)<`unknown`[]\>
-
-**`Since`**
-
-2.5.0
-@__PURE__
-
-#### Defined in
-
-[src/core/create-plugins.ts:19](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/create-plugins.ts#L19)
-
-___
-
-### Service
-
-▸ **Service**<`T`\>(`key`): `NonNullable`<`UnpackFunction`<`Partial`<`Dependencies`\>[`T`]\>\>
-
-The new Service api, a cleaner alternative to useContainer
-To obtain intellisense, ensure a .d.ts file exists in the root of compilation.
-Usually our scaffolding tool takes care of this.
-Note: this method only works AFTER your container has been initiated
-
-#### Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `T` | extends keyof `Dependencies` |
-
-#### Parameters
-
-| Name | Type | Description |
-| :------ | :------ | :------ |
-| `key` | `T` | a key that corresponds to a dependency registered. |
-
-#### Returns
-
-`NonNullable`<`UnpackFunction`<`Partial`<`Dependencies`\>[`T`]\>\>
-
-**`Since`**
-
-3.0.0
-
-**`Example`**
-
-```ts
-const client = Service('@sern/client');
-```
-
-#### Defined in
-
-[src/core/ioc/dependency-injection.ts:37](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/ioc/dependency-injection.ts#L37)
-
-___
-
-### Services
-
-▸ **Services**<`T`\>(`...keys`): `IntoDependencies`<`T`\>
-
-#### Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `T` | extends keyof `Dependencies`[] |
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `...keys` | [...T[]] |
-
-#### Returns
-
-`IntoDependencies`<`T`\>
-
-array of dependencies, in the same order of keys provided
-
-**`Since`**
-
-3.0.0
-The plural version of [Service](modules.md#service)
-
-#### Defined in
-
-[src/core/ioc/dependency-injection.ts:47](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/ioc/dependency-injection.ts#L47)
-
-___
-
-### commandModule
-
-▸ **commandModule**(`mod`): [`CommandModule`](modules.md#commandmodule)
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `mod` | `InputCommand` |
-
-#### Returns
-
-[`CommandModule`](modules.md#commandmodule)
-
-**`Since`**
-
-1.0.0 The wrapper function to define command modules for sern
-
-#### Defined in
-
-[src/core/modules.ts:19](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/modules.ts#L19)
-
-___
-
-### discordEvent
-
-▸ **discordEvent**<`T`\>(`mod`): [`EventModule`](modules.md#eventmodule)
-
-Create event modules from discord.js client events,
-This is an [eventModule](modules.md#eventmodule-1) for discord events,
-where typings can be very bad.
-
-#### Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `T` | extends keyof `ClientEvents` |
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `mod` | `Object` |
-| `mod.execute` | (...`args`: `ClientEvents`[`T`]) => `unknown` |
-| `mod.name` | `T` |
-| `mod.plugins?` | [`AnyEventPlugin`](modules.md#anyeventplugin)[] |
-
-#### Returns
-
-[`EventModule`](modules.md#eventmodule)
-
-**`Experimental`**
-
-#### Defined in
-
-[src/core/modules.ts:47](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/modules.ts#L47)
-
-___
-
-### eventModule
-
-▸ **eventModule**(`mod`): [`EventModule`](modules.md#eventmodule)
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `mod` | `InputEvent` |
-
-#### Returns
-
-[`EventModule`](modules.md#eventmodule)
-
-**`Since`**
-
-1.0.0
-The wrapper function to define event modules for sern
-
-#### Defined in
-
-[src/core/modules.ts:32](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/modules.ts#L32)
-
-___
-
-### makeDependencies
-
-▸ **makeDependencies**<`T`\>(`conf`): `Promise`<(...`keys`: [...V[]]) => `IntoDependencies`<`V`\>\>
-
-#### Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `T` | extends `Dependencies` |
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `conf` | `ValidDependencyConfig` |
-
-#### Returns
-
-`Promise`<(...`keys`: [...V[]]) => `IntoDependencies`<`V`\>\>
-
-#### Defined in
-
-[src/core/ioc/base.ts:144](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/ioc/base.ts#L144)
-
-___
-
-### makePlugin
-
-▸ **makePlugin**<`V`\>(`type`, `execute`): [`Plugin`](interfaces/Plugin.md)<`V`\>
-
-#### Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `V` | extends `unknown`[] |
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `type` | [`PluginType`](enums/PluginType.md) |
-| `execute` | (...`args`: `any`[]) => `any` |
-
-#### Returns
-
-[`Plugin`](interfaces/Plugin.md)<`V`\>
-
-#### Defined in
-
-[src/core/create-plugins.ts:6](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/create-plugins.ts#L6)
-
-___
-
-### single
-
-▸ **single**<`T`\>(`cb`): () => `T`
-
-@__PURE__
-
-#### Type parameters
-
-| Name |
-| :------ |
-| `T` |
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `cb` | () => `T` |
-
-#### Returns
-
-`fn`
-
-▸ (): `T`
-
-##### Returns
-
-`T`
-
-**`Since`**
-
-2.0.0.
-Creates a singleton object.
-
-#### Defined in
-
-[src/core/ioc/dependency-injection.ts:11](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/ioc/dependency-injection.ts#L11)
-
-___
-
-### transient
-
-▸ **transient**<`T`\>(`cb`): () => () => `T`
-
-@__PURE__
-
-#### Type parameters
-
-| Name |
-| :------ |
-| `T` |
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `cb` | () => () => `T` |
-
-#### Returns
-
-`fn`
-
-▸ (): () => `T`
-
-##### Returns
-
-`fn`
-
-▸ (): `T`
-
-##### Returns
-
-`T`
-
-**`Since`**
-
-2.0.0
-Creates a transient object
-
-#### Defined in
-
-[src/core/ioc/dependency-injection.ts:21](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/ioc/dependency-injection.ts#L21)
diff --git a/docs/api/namespaces/CommandError.md b/docs/api/namespaces/CommandError.md
deleted file mode 100644
index 8849ae0bf..000000000
--- a/docs/api/namespaces/CommandError.md
+++ /dev/null
@@ -1,31 +0,0 @@
----
-id: "CommandError"
-title: "Namespace: CommandError"
-sidebar_label: "CommandError"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Interfaces
-
-- [Response](../interfaces/CommandError.Response.md)
-
-## Functions
-
-### of
-
-▸ **of**(): `Object`
-
-#### Returns
-
-`Object`
-
-| Name | Type |
-| :------ | :------ |
-| `log` | (`type`: keyof [`Logging`](../interfaces/Logging.md)<`unknown`\>, `message`: `T`) => `Record`<`PropertyKey`, `unknown`\> |
-| `reply` | (`bodyContent`: `ReplyOptions`) => `Record`<`PropertyKey`, `unknown`\> |
-| `status` | (`p`: ``"fail"`` \| ``"continue"``) => `Record`<`PropertyKey`, `unknown`\> |
-
-#### Defined in
-
-[src/core/structures/command-error.ts:10](https://github.com/sern-handler/handler/blob/504cdee/src/core/structures/command-error.ts#L10)
diff --git a/docs/api/namespaces/Presence.md b/docs/api/namespaces/Presence.md
deleted file mode 100644
index be0b74794..000000000
--- a/docs/api/namespaces/Presence.md
+++ /dev/null
@@ -1,93 +0,0 @@
----
-id: "Presence"
-title: "Namespace: Presence"
-sidebar_label: "Presence"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Interfaces
-
-- [Result](../interfaces/Presence.Result.md)
-
-## Type Aliases
-
-### Config
-
-Ƭ **Config**<`T`\>: `Object`
-
-#### Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `T` | extends keyof `Dependencies`[] |
-
-#### Type declaration
-
-| Name | Type |
-| :------ | :------ |
-| `execute` | (...`v`: `IntoDependencies`<`T`\>) => [`Result`](../interfaces/Presence.Result.md) |
-| `inject?` | [...T] |
-
-#### Defined in
-
-[src/core/presences.ts:17](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/presences.ts#L17)
-
-## Functions
-
-### module
-
-▸ **module**<`T`\>(`conf`): [`Config`](Presence.md#config)<`T`\>
-
-A small wrapper to provide type inference.
-Create a Presence module which **MUST** be put in a file called presence.(language-extension)
-adjacent to the file where **Sern.init** is CALLED.
-
-#### Type parameters
-
-| Name | Type |
-| :------ | :------ |
-| `T` | extends keyof `Dependencies`[] |
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `conf` | [`Config`](Presence.md#config)<`T`\> |
-
-#### Returns
-
-[`Config`](Presence.md#config)<`T`\>
-
-#### Defined in
-
-[src/core/presences.ts:28](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/presences.ts#L28)
-
-___
-
-### of
-
-▸ **of**(`root`): `Object`
-
-Create a Presence body which can be either:
-- once, the presence is activated only once.
-- repeated, per cycle or event, the presence can be changed.
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `root` | `Omit`<[`Result`](../interfaces/Presence.Result.md), ``"repeat"`` \| ``"onRepeat"``\> |
-
-#### Returns
-
-`Object`
-
-| Name | Type | Description |
-| :------ | :------ | :------ |
-| `once` | () => `Omit`<[`Result`](../interfaces/Presence.Result.md), ``"repeat"`` \| ``"onRepeat"``\> | - |
-| `repeated` | (`onRepeat`: `PresenceReduce`, `repeat`: `number` \| [[`Emitter`](../interfaces/Emitter.md), `string`]) => \{ `activities?`: `ActivitiesOptions`[] ; `afk?`: `boolean` ; `onRepeat`: `PresenceReduce` ; `repeat`: `number` \| [[`Emitter`](../interfaces/Emitter.md), `string`] ; `shardId?`: `number`[] ; `status?`: `Status` } | - |
-
-#### Defined in
-
-[src/core/presences.ts:37](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/presences.ts#L37)
diff --git a/docs/api/namespaces/Sern.md b/docs/api/namespaces/Sern.md
deleted file mode 100644
index 2ef5a95e6..000000000
--- a/docs/api/namespaces/Sern.md
+++ /dev/null
@@ -1,40 +0,0 @@
----
-id: "Sern"
-title: "Namespace: Sern"
-sidebar_label: "Sern"
-sidebar_position: 0
-custom_edit_url: null
----
-
-## Functions
-
-### init
-
-▸ **init**(`maybeWrapper`): `void`
-
-#### Parameters
-
-| Name | Type |
-| :------ | :------ |
-| `maybeWrapper` | [`Wrapper`](../interfaces/Wrapper.md) \| ``"file"`` |
-
-#### Returns
-
-`void`
-
-**`Since`**
-
-1.0.0
-
-**`Example`**
-
-```ts title="src/index.ts"
-Sern.init({
- commands: 'dist/commands',
- events: 'dist/events',
-})
-```
-
-#### Defined in
-
-[src/sern.ts:26](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/sern.ts#L26)
diff --git a/docs/api/namespaces/_category_.yml b/docs/api/namespaces/_category_.yml
deleted file mode 100644
index 1833bbb58..000000000
--- a/docs/api/namespaces/_category_.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-label: "Namespaces"
-position: 1
\ No newline at end of file
diff --git a/docs/cli/build.md b/docs/cli/build.md
deleted file mode 100644
index 8a41a628e..000000000
--- a/docs/cli/build.md
+++ /dev/null
@@ -1,211 +0,0 @@
-```sh
-Usage: sern build [options]
-
-Build your bot
-
-Options:
- -f --format [fmt] The module system of your application. `cjs` or `esm` (default: "esm")
- -m --mode [mode] the mode for sern to build in. `production` or `development` (default: "development")
- -W --suppress-warnings suppress experimental warning
- -p --project [filePath] build with this sern.build file
- -h, --help display help for command
-```
-
-## Guiding Principles
-
-When designing the `sern build` command, our aim was to make building bot applications as simple as possible for the majority of developers. The setup process has been streamlined, and most of the configuration details have been handled for you. Here are some key points to keep in mind:
-
-1. **Minimal Configuration**: In the vast majority (99%) of use cases, developers do not need to configure the bot application building process. We believe that simplicity is key, so only a few decisions need to be made on the developer's end.
-
-2. **Optimal Defaults**: We've chosen sensible defaults. This means you can get started without getting bogged down by complex, unneeded configurations.
-
-3. **Finetuned for production bots**: Our CLI leverages an opinionated build solution powered by esbuild. This ensures that bots are built without issues and can be shipped easily.
-
-## Experimental Features
-
-Both the `sern build` and `sern publish` commands are marked as experimental. While they might not be completely stable, they are designed to work for the majority of users. We appreciate any feedback in helping us make these features even better.
-
-## Features
-
-The `sern build` command comes equipped with a range of features designed to enhance your development process. Here's a glimpse of what it offers:
-
-- **esbuild Integration**: our CLI takes inspiration from the efficiency of SvelteKit, ensuring your bot application is built effectively and with type safety. Leverage the [esbuild plugin ecosystem](https://github.com/esbuild/community-plugins).
-
-- **Zero Configuration**: Building your bot application without additional configuration. The CLI handles most of the setup for you.
-
-- **Experimental Image Support**: We've introduced experimental support for top-level imports of PNG and JPG files, making it easier to include images in your bot application.
-
-- **Compile Time Constants**: Customize your build with constants such as \_\_DEV\_\_, \_\_PROD\_\_, allowing you to tailor your application to different production stages.
-
-- **Development and Production Modes**: The CLI supports both development and production modes, enabling you to tailor your bot application for different stages of development.
-
-
-- **Type-safe `process.env`**: The CLI generates a type-safe `process.env`, reducing potential errors.
-## Implicits
-- command line arguments take precendence over sern.build configuration file
-- default build format is ESM
-- defineVersion = true
-- __DEV__ AND __PROD__ constants are configured.
-- only a [few tsconfig options](https://esbuild.github.io/content-types/#tsconfig-json) are respected.
-### sern.build.js
-- For any extra configuration you may need
-- the cli was intentionally made to be installed globally, and we can't provide typings at a project level. If you need typings, here they are:
-```ts
-type BuildOptions = {
- /**
- * Define __VERSION__
- * This option is a quick switch to defining the __VERSION__ constant which will be a string of the version provided in
- * cwd's package.json
- */
- defineVersion?: boolean
- /**
- * default = esm
- */
- format?: 'cjs' | 'esm'
- /**
- * extra esbuild plugins to build with sern.
- */
- esbuildPlugins?: esbuild.Plugin[]
- /**
- * https://esbuild.github.io/api/#drop-labels
- **/
- dropLabels?: string[]
- /**
- * https://esbuild.github.io/api/#define
- **/
- define?: Record
- /**
- * Path to tsconfig
- **/
- tsconfig?: string;
- /**
- * default = 'development'
- */
- mode: 'production' | 'development',
- /**
- * will search for env file. If none exists,
- * default to .env.
- */
- env?: string
-}
-```
-
-## Usage
-```
-sern build
-```
-(that was easy)
-
-## Adapting older projects
-- Change your tsconfig.json to extend our generated one.
-
-```json
-{
- // highlight-start
- "extends": "./.sern/tsconfig.json",
- // highlight-end
- "compilerOptions" : {
- //all of your old fields
- }
-}
-```
-## In depth
-We use the `define` and `drop labels` api in C style macros to have easy development stage differences.
-[Here](https://esbuild.github.io/api/#drop-labels) is the esbuild full API documentation
-### drop labels
-
-```sh
-# mode is set to production
-sern build
-```
-
-
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
-
-
-
-
-```ts
-__DEV__: console.log('This is for production only')
-__PROD__: console.log('This is for either mode')
-```
-
-
-
-
-
-```sh
-# mode is set to production
-sern build
-```
-
-
-
-
-
-
-```ts
-__PROD__ console.log('This is for either mode')
-```
-
-
-
-
-
-### constants
-sern builds with three default constants. \_\_DEV\_\_, \_\_PROD\_\_, \_\_VERSION\_\_.
-
-
-
-
-
-```sh
-sern build
-```
-
-
-
-
-
-```ts
-if(__PROD__) {
- console.log('Bot version: ' + __VERSION__)
-}
-```
-
-
-
-
-
-Full esbuild documentation [here](https://esbuild.github.io/api/#define)
-Add more to the `define` field in build options (only availible with a `sern.build` file at the moment.
-
-### process.env
-We generate your process.env with `dotenv` and generate typings for process.env. Less hassle!
-
-
-
-
-
-```sh
-DISCORD_TOKEN=
-```
-```ts
-process.env.DISCORD_TOKEN // string | undefined (not typesafe :()
-```
-
-
-
-
-
-```sh
-sern build
-```
-```ts
-process.env.DISCORD_TOKEN // string (typesafe :))
-```
-
-
-
-
diff --git a/docs/cli/clear.md b/docs/cli/clear.md
deleted file mode 100644
index f2e0cef8e..000000000
--- a/docs/cli/clear.md
+++ /dev/null
@@ -1,28 +0,0 @@
-```sh
-Usage: sern commands clear [options]
-
-Clear and reset commands-data-remote.json and the api
-
-Options:
- -y, --yes Say yes to all prompts
- -e, --env [path] Supply a path to a .env
- -h, --help display help for command
-```
-## Implicits
-- Automatically reads a .env in the working directory. For seamless integration, your .env file should look like this:
-```txt title=".env"
-DISCORD_TOKEN=
-APPLICATION_ID=
-NODE_ENV=
-```
-- Calls the discord API with the [PUT route](https://discord.com/developers/docs/interactions/application-commands#bulk-overwrite-global-application-commands) with an EMPTY array, essentially setting all registered commands to nothing.
-
-- Optionally override an .env path as a command line argument as well. **CLI arguments take precedence.**
-If you do not know how to obtain either of these credentials, [click here](https://github.com/reactiflux/discord-irc/wiki/Creating-a-discord-bot-&-getting-a-token)
-
-- Automatically confirm with the **-y** flag.
-
-## Features
-- Clears all application data and sern-commands-data.json
-
-
diff --git a/docs/cli/extra.md b/docs/cli/extra.md
deleted file mode 100644
index 8acf89110..000000000
--- a/docs/cli/extra.md
+++ /dev/null
@@ -1,11 +0,0 @@
-
-```sh
-Usage: sern extra [options]
-
-Easy way to add extra things in your sern project
-
-Options:
- -h, --help display help for command
-```
-
-This command is pretty straightfoward. Install utilities into your application. Assumes you have a sern.config.json.
diff --git a/docs/cli/publish.md b/docs/cli/publish.md
deleted file mode 100644
index cd75b4f25..000000000
--- a/docs/cli/publish.md
+++ /dev/null
@@ -1,102 +0,0 @@
-```sh
-Usage: sern commands publish [options] [path]
-
-New way to manage your slash commands
-
-Arguments:
- path path with respect to current working directory that will locate all published files
-
-Options:
- -i, --import [scriptPath...] Prerequire a script to load into publisher
- -t, --token [token]
- --appId [applicationId]
- -h, --help display help for command
-```
-## Implicits
-- Automatically reads a .env in the working directory. For seamless integration, your .env file should look like this:
-```txt title=".env"
-DISCORD_TOKEN=
-APPLICATION_ID=
-NODE_ENV=
-```
-- Calls the discord API with the [PUT route](https://discord.com/developers/docs/interactions/application-commands#bulk-overwrite-global-application-commands). Wherever your commands directory is located, publish will override the existing application commands at Discord. Existing commands do not count towards the command limit creation daily.
-
-You may pass these in as command line arguments as well. **CLI arguments take precedence.**
-If you do not know how to obtain either of these credentials, [click here](https://github.com/reactiflux/discord-irc/wiki/Creating-a-discord-bot-&-getting-a-token)
-
-## Usage
-
-
-
-
-## Features
-- Automatically syncs api with your command base
-- generates JSON file of output (**.sern/command-data-remote.json**)
-- supports publishing direct esm typescript files
-- commonjs + javascript users need to compile first and then run sern publish on the dist/ output
-- prerequire scripts.
-- supports a configuration that is the same as the original publish plugin.
-
-
-Each command file can have an extra config that follows `ValidPublishOptions`:
-## Config
-```ts
-
-type ValidMemberPermissions =
- | PermissionFlagBits //discord.js enum
- | PermissionFlagBits[] //array of discord.js enum
- | string //must be a stringified number
- | bigint
-
-interface PublishConfig {
- guildIds?: string[];
- dmPermission?: boolean;
- defaultMemberPermissions: ValidMemberPermissions;
-}
-type ValidPublishOptions =
- | PublishConfig
- | (absPath: string, module: CommandModule) => PublishConfig
-```
-In other words, you can export a function or object.
-
-## Prerequiring
-Is there a [service](../guide/walkthrough/services) that is required at the top level of a command?
-- Create an ES6 script anywhere:
-
-```ts title="scripts/prerequire.mjs"
-import { makeDependencies, single, Service } from '@sern/handler'
-import { Client } from 'discord.js'
-
-await makeDependencies({
- build: (root) =>
- root.add({ "@sern/client": single(() => new Client(...options)) }),
-});
-
-await Service('@sern/client').login()
-```
-This will create a container for publishing. (as of 0.6.0, client is required or this will crash)
-
-### Example: command published in guild
-
-#### Script ran:
-```
-sern commands publish -i ./scripts/prerequire.mjs
-```
-```ts title=src/commands/ping.ts
-import { commandModule, Service, CommandType } from '@sern/handler'
-
-const client = Service('@sern/client');
-
-export const config = {
- guildIds: ["889026545715400705"]
-}
-
-export default commandModule( {
- type: CommandType.Slash
- description: `${client.user.username}'s ping`,
- execute: (ctx) => {
- ctx.reply('pong')
- }
-})
-
-```
diff --git a/docs/guide/.nojekyll b/docs/guide/.nojekyll
deleted file mode 100644
index e69de29bb..000000000
diff --git a/docs/guide/README.md b/docs/guide/README.md
deleted file mode 100644
index 143ac13ad..000000000
--- a/docs/guide/README.md
+++ /dev/null
@@ -1,30 +0,0 @@
-# Introduction
-
-Welcome to our official guide. This guide will go through all the core features of the framework.
-- 💖 Thank you for choosing sern to be your framework!
-
-- Teaching the discord.js library and / or Javascript / Typescript is out of scope of this project, so the documentation assumes you already know these elements.
- - [discord.js](https://discord.js.org/#/)
- - [javascript](https://nodejs.dev/en/learn/)
- - [typescript](https://www.typescriptlang.org/docs/)
-
-- discord.js v14 is the only supported library at the moment
-
-## You will learn
-* [sern's goal](walkthrough/goal.md)
-* How to use sern with the [CLI](walkthrough/cli.md)
-* [Your first command](walkthrough/first-command.md)
-* [The Context class](walkthrough/first-command.md#context-class)
-* [Autocomplete](walkthrough/autocomplete.md)
-* [Services](walkthrough/services.md)
-* [dependency injection](walkthrough/dependency-injection.md)
-### Working with plugins
-* [Plugins](walkthrough/plugins.md)
- - [Init Plugins](walkthrough/plugins.md#command-plugins)
- - [Control Plugins](walkthrough/plugins.md#event-plugins)
-### Events
-* [The SernEmitter class](walkthrough/sern-emitter.md)
-* [Your first event](walkthrough/first-event.md)
-
-### Good to know
-* [sern.config.json](walkthrough/good-to-know.md)
diff --git a/docs/guide/getting-started/_category_.yml b/docs/guide/getting-started/_category_.yml
deleted file mode 100644
index 1bdda27b0..000000000
--- a/docs/guide/getting-started/_category_.yml
+++ /dev/null
@@ -1 +0,0 @@
-label: Getting Started
diff --git a/docs/guide/getting-started/choose-ide.md b/docs/guide/getting-started/choose-ide.md
deleted file mode 100644
index 759eef3c0..000000000
--- a/docs/guide/getting-started/choose-ide.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Choosing an IDE
-
-Choosing an IDE is a matter of personal preference. They make programming easier. The following are some
-suggestions for choosing an IDE:
-
-* [Visual Studio Code](https://code.visualstudio.com)
- * we have an [snippet extension](https://marketplace.visualstudio.com/items?itemName=SrIzan.sern-snippets) to help automate development :)
-* [Sublime Text](https://www.sublimetext.com/)
-* [NotePad++](https://notepad-plus-plus.org/)
-* [nvim](https://neovim.io/) (chad)
-
diff --git a/docs/guide/getting-started/preparing.md b/docs/guide/getting-started/preparing.md
deleted file mode 100644
index e30ab7709..000000000
--- a/docs/guide/getting-started/preparing.md
+++ /dev/null
@@ -1,14 +0,0 @@
-
-# Preparing to Code
-
-After installing an IDE, you need to install node.
-
-[Click to download the LTS version of node right here](https://nodejs.org/en/download/).
-
-After you downloaded node you will need:
-
-#### [Discord token](https://github.com/reactiflux/discord-irc/wiki/Creating-a-discord-bot-&-getting-a-token)
-
-
-CONTINUE 🤓
-
diff --git a/docs/guide/walkthrough/_category_.yml b/docs/guide/walkthrough/_category_.yml
deleted file mode 100644
index 0dd9d588f..000000000
--- a/docs/guide/walkthrough/_category_.yml
+++ /dev/null
@@ -1 +0,0 @@
-label: Walkthrough
diff --git a/docs/guide/walkthrough/autocomplete.md b/docs/guide/walkthrough/autocomplete.md
deleted file mode 100644
index 60e3ce8f4..000000000
--- a/docs/guide/walkthrough/autocomplete.md
+++ /dev/null
@@ -1,45 +0,0 @@
----
-sidebar_position: 7
----
-
-# Autocomplete
-
-
-Autocomplete is a special interaction where it can happen on multiple options on a single command. We've handled this with a simple
-tree search algorithm in a nested options tree.
-
-## Example
-
-```ts title="src/commands/cheese.ts" {11-18}
-export default commandModule({
- type: CommandType.Slash,
- description: "show me cheese",
- options: [
- {
- name: "list",
- type: ApplicationCommandOptionType.String,
- description: "pick a cheese to show",
- required: true,
- autocomplete: true,
- command: {
- onEvent: [],
- execute: (ctx) => {
- const focus = ctx.options.getFocused();
- ctx.respond(['gouda', 'parmesan', 'harvati']
- .map((cheese) => ({ name: cheese, value: cheese })));
- }
- }
- }
- ],
- execute: (ctx, [, args]) => {
- const cheese = args.getString('list', true);
- ctx.reply('selected cheese');
- }
-})
-
-
-```
-
-Sern will handle autocomplete interactions at arbitrary depths and subcommand levels.
-
-
diff --git a/docs/guide/walkthrough/cli.md b/docs/guide/walkthrough/cli.md
deleted file mode 100644
index a78041c90..000000000
--- a/docs/guide/walkthrough/cli.md
+++ /dev/null
@@ -1,34 +0,0 @@
----
-sidebar_position: 2
----
-
-# CLI
-
-Setting up the [CLI](https://github.com/sern-handler/cli) is easy.
-The cli is your plug to the sern ecosystem. This will allow you to install plugins with ease, install extra utilities, and much more.
-If you haven't yet:
-```sh
-npm install -g @sern/cli
-```
-
-- To install [plugins](plugins.md) maintained by the community [repository](https://github.com/sern-handler/awesome-plugins),
-
-```
-sern plugins
-```
-:::info
-Make sure to have a correct [sern.config.json](./good-to-know.md#sernconfigjson)
-:::
-
-
-This will display a menu selection of all installable plugins.
-
-**Note**: You must have a [sern.config.json](good-to-know.md) to use this command.
-If you want to view plugins, visit the repository linked above.
-
-- To install extra utilities into your project
-```
-sern extra
-```
-
-We have a more in depth [guide](../../cli/README.md) of the CLI
diff --git a/docs/guide/walkthrough/conclusion.md b/docs/guide/walkthrough/conclusion.md
deleted file mode 100644
index 76e71b299..000000000
--- a/docs/guide/walkthrough/conclusion.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-sidebar_position: 9
----
-
-# Conclusion
-If you reached this far, thank you for reading! We hope you have learned the necessities you need
-to create a bot with the sern framework. If you have any other questions, bugs, feature requests, concerns, please join our
-[community server](https://sern.dev/discord), and we'll be glad to answer your questions.
-
-
-
diff --git a/docs/guide/walkthrough/dependency-injection.md b/docs/guide/walkthrough/dependency-injection.md
deleted file mode 100644
index 9533ece14..000000000
--- a/docs/guide/walkthrough/dependency-injection.md
+++ /dev/null
@@ -1,110 +0,0 @@
----
-sidebar_position: 7
----
-
-# Dependency Injection
-
-:::warning
-This contains version 2 code. Please view [transitioning to v3](./transition)
-:::
-
-Since version 2.0.0, dependency injection, thanks to [iti](https://github.com/molszanski/iti), is a feature to customize your bot's utilities and structures.
-
-Minimal setup for any project.
-
-```ts
-const client = new Client({
- ...options
-})
-Sern.makeDependencies({
- build: root =>
- root.add({
- '@sern/client': single(() => client)
- })
-})
-
-```
-For any typescript project, you'll need to add an interface to get intellisense and typings.
-```typescript
-interface MyDependencies extends Dependencies {
- '@sern/client': Singleton
-}
-```
-Full Dependency Injection setup
-```typescript
-const client = new Client({
- ...options
-})
-
-interface MyDependencies extends Dependencies {
- '@sern/client': Singleton
-}
-
-export const useContainer = Sern.makeDependencies({
- build: root =>
- root.add({
- '@sern/client': single(() => client)
- })
-})
-
-```
-Everything else is handled. However, you may want customize things.
-
-## Adding dependencies to root
-Each sern built dependency must implement its contracts.
- - `@sern/logger`: Log data. [Logging](../../api/interfaces/Logging)
- - `@sern/errors`: Handling errors and lifetime. [ErrorHandling](../../api/interfaces/ErrorHandling)
- - `@sern/modules`: Managing all command modules. [ModuleManager](../../api/interfaces/ModuleManager)
- - `@sern/emitter`: is the key to emit events and occurences in a project. [SernEmitter](../../api/classes/SernEmitter)
-
-
- You may also add disposers so that when the application crashes, the targeted dependency calls that function.
-
- ```typescript
-export const useContainer = Sern.makeDependencies({
- build: root =>
- root.add({
- '@sern/client': single(() => client)
- })
- .addDisposer({ '@sern/client': client => client.destroy() })
-})
-
- ```
-
-:::tip
-Below is v3 api.
-:::
-
-## Init
-Do you need to perform intializing behavor for a dependency?
-
-```ts
-import { Init } from '@sern/handler';
-class Database implements Init {
- init() {
- await this.connect()
- console.log('Connected');
- }
-}
-
-```
-
-Modify you Dependencies interface:
-```ts title="src/dependencies.d.ts"
-import type { Initializable } from '@sern/handler'
-
-interface Dependencies extends CoreDependencies {
- database: Initializable
-}
-
-```
-Make sure its been added:
-```ts title="src/index.ts"
-await makeDependencies({
- build: root => root
- .add({ database => new Database() })
-})
-```
-
-
-
diff --git a/docs/guide/walkthrough/first-command.md b/docs/guide/walkthrough/first-command.md
deleted file mode 100644
index a965ba24d..000000000
--- a/docs/guide/walkthrough/first-command.md
+++ /dev/null
@@ -1,120 +0,0 @@
----
-sidebar_position: 4
----
-
-# First Command
-
-We will dissect a basic command.
-If you installed a new project via the cli, This is the `ping` command located in src/commands folder.
-
-:::tip
-TLDR: command modules are discord bot commands. There are many types, and each one will correspond to an event from discord.
-For example, CommandType.Slash commands will listen to slash command interactions.
-:::
-
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
-
-
-
-
-```js
-const { CommandType, commandModule } = require('@sern/handler');
-
-export default commandModule({
- type: CommandType.Both,
- plugins: [],
- description: 'A ping command',
- // alias : [],
- execute: async (ctx, args) => {
- await ctx.reply('Pong 🏓');
- },
-})
-```
-
-
-
-
-```ts
-import { commandModule, CommandType } from '@sern/handler';
-
-export default commandModule({
- type: CommandType.Both,
- plugins: [],
- description: 'A ping command',
- // alias : [],
- execute: async (ctx, args) => {
- await ctx.reply({ content: 'Pong 🏓' });
- },
-});
-
-```
-
-
-
-
-
-
-To view what each of these properties mean in depth, visit the [official documentation](https://sern.dev/docs/api/enums/CommandType).
-### Types of command modules
-Every command module `type` is part of an enum. This field allows type inference for the rest of a module's fields.
-All the command types can be found in the [official documentation](https://sern.dev/docs/api/enums/CommandType)!
-
So, lets say you want to make a command module that listens to modals.
-
-**Note**: Keep in mind you'll need to send a modal with a custom id `dm-me`. This example below is the response to a modal being sent.
-
-
-
-
-
-```javascript
-const { CommandType, commandModule } = require('@sern/handler');
-exports.default = commandModule({
- name: 'dm-me',
- type: CommandType.Modal,
- async execute (modal) {
- const value = modal.fields.getTextInputValue('message');
- modal.client.users.fetch('182326315813306368').then( u =>
- u.send(value + ` from ${modal.user}`)
- );
- modal.reply( { ephemeral:true, content: 'Sent' })
- }
-});
-```
-
-
-
-
-```typescript
-import { commandModule, CommandType } from '@sern/handler';
-export default commandModule({
- name: 'dm-me',
- type: CommandType.Modal,
- async execute (modal) {
- const value = modal.fields.getTextInputValue('message');
- modal.client.users.fetch('182326315813306368').then( u =>
- u.send(value + ` from ${modal.user}`)
- );
- modal.reply( { ephemeral:true, content: 'Sent' })
- }
-});
-```
-
-
-
-
-
-
-Commands are straight forward. Keep in mind, every other property on the commandModule object is
-optional **except** the type and execute function.
-
-# Context class
-The provided Context class helps with modules of `CommandType.Both` (A mixture of slash / legacy commands).
-
-The Context class is passed into modules with type:
-- `CommandType.Both`
-- `CommandType.Slash`
-- `CommandType.Text`
-
-This data structure helps interop between legacy commands and slash commands with ease.
-
diff --git a/docs/guide/walkthrough/first-event.md b/docs/guide/walkthrough/first-event.md
deleted file mode 100644
index 178400b59..000000000
--- a/docs/guide/walkthrough/first-event.md
+++ /dev/null
@@ -1,76 +0,0 @@
----
-sidebar_position: 5
----
-
-# First Event Module
-We will dissect a basic event module.
-
-:::tip
-TLDR: event modules are event listeners. there are three types EventType.Discord, EventType.Sern, EventType.External
-:::
-
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
-
-
-
-
-```javascript
-exports.default = eventModule({
- type: EventType.Sern,
- plugins : [],
- name: 'module.activate',
- execute(event) {
- console.log(event);
- }
-})
-```
-
-
-
-
-```typescript
-export default eventModule({
- type: EventType.Sern,
- plugins : [],
- name: 'module.activate', //name of event.
- execute(event) {
- console.log(event);
- }
-})
-```
-
-
-
-
-
-Like command modules, the `type` property denotes what kind of event it is, which
-can be found [here](https://sern.dev/docs/api/enums/EventType).
-
-To view what each of these properties mean in depth, visit the [official documentation](https://sern.dev/docs/api/enums/EventType).
-
-## External
-
-In version 2 & 3, any dependency that you have passed into makeDependencies can be registered here as well.
-
-```ts title="src/index.ts"
-await makeDependencies({
- build: root => root.add({
- eventlistener: single(() => new EventEmitter())
- })
-})
-```
-
-```ts title="events/myevent.ts"
-export default eventModule({
- type: EventType.External,
- emitter: 'eventlistener',
- execute: (args) => {
- console.log('Got event from eventlistener: ', args);
- }
-
-})
-
-```
-
-
diff --git a/docs/guide/walkthrough/goal.md b/docs/guide/walkthrough/goal.md
deleted file mode 100644
index 0ca832e10..000000000
--- a/docs/guide/walkthrough/goal.md
+++ /dev/null
@@ -1,51 +0,0 @@
----
-sidebar_position: 1
----
-
-
-
-# Goal
-
-This walkthrough will be written in [TypeScript](https://www.typescriptlang.org/) but will have JavaScript snippets throughout.
-
-# Make robust, modular, bots
-
-- *Modularity*: sern is built with modularity in mind. You can swap pieces and parts easily.
-- *Familiar*: commands and structures are similar to classic v12 handlers and the official discord.js command handler guide, while packing many features
-- *Concise*: Too much code is a liability. with sern, write less for more 🤯
-
-
-### Using @sapphire/framework
-```ts title="commands/ping.ts" showLineNumbers
-import { Command } from '@sapphire/framework'
-import type { CommandInteraction } from 'discord.js'
-
-export class PingCommand extends Command {
- public constructor(context: Command.Context) {
- super(context, {
- description: 'Pong!',
- chatInputCommand: {
- register: true,
- },
- })
- }
- public async chatInputRun(interaction: CommandInteraction) {
- await interaction.reply('Pong!')
- }
-}
-```
-### Using @sern/handler
-```ts title="commands/ping.ts" showLineNumbers
-import { commandModule, CommandType } from '@sern/handler'
-import { publish } from '../plugins';
-
-export default commandModule({
- type: CommandType.Both,
- plugins: [publish()],
- description: 'Pong!',
- execute: (ctx, args) => {
- await ctx.reply('Pong!')
- }
-})
-```
-Keep in mind the above example acts as both a slash command AND text command
diff --git a/docs/guide/walkthrough/good-to-know.md b/docs/guide/walkthrough/good-to-know.md
deleted file mode 100644
index e69f72201..000000000
--- a/docs/guide/walkthrough/good-to-know.md
+++ /dev/null
@@ -1,24 +0,0 @@
----
-sidebar_position: 9
----
-
-# Good to know
-
-## sern.config.json
-
A sern.config.json, although not necessary, allows your project to communicate with our cli.
+ )
+})
+CarouselContent.displayName = "CarouselContent"
+
+const CarouselItem = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => {
+ const { orientation } = useCarousel()
+
+ return (
+
+ )
+})
+CarouselItem.displayName = "CarouselItem"
+
+const CarouselPrevious = React.forwardRef<
+ HTMLButtonElement,
+ React.ComponentProps
+>(({ className, variant = "outline", size = "icon", ...props }, ref) => {
+ const { orientation, scrollPrev, canScrollPrev } = useCarousel()
+
+ return (
+
+ )
+})
+CarouselPrevious.displayName = "CarouselPrevious"
+
+const CarouselNext = React.forwardRef<
+ HTMLButtonElement,
+ React.ComponentProps
+>(({ className, variant = "outline", size = "icon", ...props }, ref) => {
+ const { orientation, scrollNext, canScrollNext } = useCarousel()
+
+ return (
+
+ )
+})
+CarouselNext.displayName = "CarouselNext"
+
+export {
+ type CarouselApi,
+ Carousel,
+ CarouselContent,
+ CarouselItem,
+ CarouselPrevious,
+ CarouselNext,
+}
diff --git a/src/content.ts b/src/content.ts
new file mode 100644
index 000000000..1094e98b4
--- /dev/null
+++ b/src/content.ts
@@ -0,0 +1,3 @@
+import { getCollection } from "astro:content";
+
+export const allPages = await getCollection("docs");
diff --git a/src/content/config.ts b/src/content/config.ts
new file mode 100644
index 000000000..0f83f1ca6
--- /dev/null
+++ b/src/content/config.ts
@@ -0,0 +1,7 @@
+import { defineCollection } from "astro:content";
+import { docsSchema } from "@astrojs/starlight/schema";
+import { blogSchema } from "starlight-blog/schema";
+
+export const collections = {
+ docs: defineCollection({ schema: docsSchema({ extend: blogSchema() }) }),
+};
diff --git a/src/content/docs/blog/1.2.0.mdx b/src/content/docs/blog/1.2.0.mdx
new file mode 100644
index 000000000..7fd49f12b
--- /dev/null
+++ b/src/content/docs/blog/1.2.0.mdx
@@ -0,0 +1,86 @@
+---
+slug: blog/1.2.0
+title: Release 1.2.0
+authors: [jacoobes]
+tags: [release]
+date: 2022-09-28
+---
+
+## Class-based modules
+
+Today we're announcing the ability to create class based modules!
+To get started, install
+
+import PackageManagers from '~/components/PackageManagers.astro';
+
+
+
+Quick List of changes!
+
+- [Class-based modules](#class-based-modules-1)
+ - [Deprecation Warnings](#deprecation-warnings)
+ - [Dependencies Update](#dependencies-update)
+
+### Class based modules
+
+Incorporate class based modules into your project instead of the traditional `commandModule` or `eventModule`
+Extend the new `CommandExecutable` or `EventExecutable`
+
+```ts title="commands/meaning-of-life.ts" {15}
+import {
+ CommandType,
+ CommandExecutable,
+ type Args,
+ type Context,
+} from "@sern/handler";
+import { publish } from "../plugins/publish.js";
+import { serendipityOnly } from "../plugins/serendipityOnly.js";
+
+export default class extends CommandExecutable {
+ type = CommandType.Both as const;
+ description = "What is the meaning of life?";
+ override onEvent = [serendipityOnly()];
+ override plugins = [publish()];
+ execute = async (ctx: Context, args: Args) => {
+ await ctx.reply("42");
+ };
+}
+```
+
+:::caution
+
+execute must not be a method of the class. It should be as above, a property on the class!
+
+:::
+
+```ts title="events/guildMemberAdd.ts" {6}
+import { CommandType, EventExecutable, type EventType } from "@sern/handler";
+import type { GuildMember } from "discord.js";
+
+export default class extends EventExecutable {
+ type = EventType.Discord as const;
+ execute = (member: GuildMember) => {
+ console.log(member);
+ };
+}
+```
+
+Now, you might ask **why** this feature was added. Simply put, to give flexibility to the developers.
+I believe that you should build your own structures however you might like and customize to your liking.
+In addition, **decorators now unofficially work with modules!**
+Feel free to use TypeScript experimental decorators to augment and customize your classes.
+
+### Deprecation Warnings
+
+The next update will bring sern v2 with some important features. Here are some things to watch out for.
+
+- [Wrapper#client](/v3/api/interfaces/wrapper) will be deprecated
+- [Wrapper#sernEmitter](/v3/api/interfaces/wrapper) will be deprecated
+ - a SernEmitter will be automatically created once Sern#init is called
+- The option to pass in a function or array for [Wrapper#events](/v3/api/interfaces/wrapper) will be deprecated. Only strings are accepted.
+- `Sern#addExternal` will be deprecated in favor of a better way.
+
+### Dependencies Update
+
+- TypeScript has been updated to 4.8.3
+- Discord.js has been upgraded to 14.5
diff --git a/blog/2022-12-13-mdx-blog-post.md b/src/content/docs/blog/2.0.0.md
similarity index 68%
rename from blog/2022-12-13-mdx-blog-post.md
rename to src/content/docs/blog/2.0.0.md
index 30588296d..f092564b9 100644
--- a/blog/2022-12-13-mdx-blog-post.md
+++ b/src/content/docs/blog/2.0.0.md
@@ -1,45 +1,51 @@
---
-slug: 2.0.0
+slug: blog/2.0.0
title: Release 2.0.0
authors: [jacoobes]
tags: [release]
+date: 2022-12-13
---
## 2.0 Release
+
Join our [discord](https://sern.dev/discord)!
Wow! We're finally increasing our semantic versioning by +`1.7.9.`
What does this mean?
### Plugin Support for Event Modules
-You can now use plugins for event modules. Previous version would throw an error if the
+
+You can now use plugins for event modules. Previous version would throw an error if the
`plugins` field was populated.
-```typescript
-export function commandPlTest() : SernEmitterPlugin {
- return {
- type: PluginType.Command,
- execute: ({ mod}, controller) => {
- if(mod.name === 'module.register') {
- console.log('Event Module created correctly')
- return controller.next()
- }
- console.log('event name is wrong')
- return controller.stop()
- }
- }
+```typescript
+export function commandPlTest(): SernEmitterPlugin {
+ return {
+ type: PluginType.Command,
+ execute: ({ mod }, controller) => {
+ if (mod.name === "module.register") {
+ console.log("Event Module created correctly");
+ return controller.next();
+ }
+ console.log("event name is wrong");
+ return controller.stop();
+ },
+ };
}
```
-Applying this plugin to some `eventModule`:
+
+Applying this plugin to some `eventModule`:
+
```typescript
export default eventModule({
- name: 'error',
- type: EventType.Sern,
- plugins: [commandPlTest()],
- execute(m) {
- console.log(m)
- },
-})
+ name: "error",
+ type: EventType.Sern,
+ plugins: [commandPlTest()],
+ execute(m) {
+ console.log(m);
+ },
+});
```
+
## Dependency Injection and Decoupling
The powerful npm package `iti` decouples sern even more.
@@ -47,57 +53,63 @@ Decoupling data structures with the Inversion of Control pattern separates data
and make sern even more customizable than before.
### How do I start?
+
```typescript title="src/index.ts"
//With typescript, you can customize / augment your typings.
interface MyDependencies extends Dependencies {
- '@sern/client' : Singleton;
- '@sern/logger' : Singleton
+ "@sern/client": Singleton;
+ "@sern/logger": Singleton;
}
export const useContainer = Sern.makeDependencies({
-// exclude: new Set(['@sern/logger']), don't autofill optional dependencies
- build: root => root
- .add({ '@sern/client': single(client) })
- .add({ '@sern/logger': single(new DefaultLogging()) })
+ // exclude: new Set(['@sern/logger']), don't autofill optional dependencies
+ build: (root) =>
+ root
+ .add({ "@sern/client": single(client) })
+ .add({ "@sern/logger": single(new DefaultLogging()) }),
});
Sern.init({
- defaultPrefix: '!', // removing defaultPrefix will shut down text commands
- commands: 'src/commands',
- // events: 'src/events' (optional),
- containerConfig : {
- get: useContainer //pass in your dependency getter here
- }
+ defaultPrefix: "!", // removing defaultPrefix will shut down text commands
+ commands: "src/commands",
+ // events: 'src/events' (optional),
+ containerConfig: {
+ get: useContainer, //pass in your dependency getter here
+ },
});
-
```
-Using the `Sern#makeDependencies` function, inject your dependencies.
+
+Using the `Sern#makeDependencies` function, inject your dependencies.
We'll use specific dependencies that are created with the `@sern/keyword`
key.
Using typescript to display all `keywords` and what they represent:
+
```typescript
export interface Dependencies {
- '@sern/client': Singleton; //Discord Client
- '@sern/logger'?: Singleton; //Logger
- '@sern/emitter': Singleton; //SernEmitter
- '@sern/store' : Singleton; //Stores all Command Modules
- '@sern/modules' : Singleton; //Manages Modules
- '@sern/errors': Singleton; //A Lifetime / Crash Handler
+ "@sern/client": Singleton; //Discord Client
+ "@sern/logger"?: Singleton; //Logger
+ "@sern/emitter": Singleton; //SernEmitter
+ "@sern/store": Singleton; //Stores all Command Modules
+ "@sern/modules": Singleton; //Manages Modules
+ "@sern/errors": Singleton; //A Lifetime / Crash Handler
}
```
+
:::danger
Sern#addExternal has been deprecated and removed in favor of Sern#makeDependencies
:::
-At the moment, one optional dependency, `@sern/logger`, exists. If not added explicitly,
+
+At the moment, one optional dependency, `@sern/logger`, exists. If not added explicitly,
we'll **autofill** with a [DefaultLogger](https://sern.dev/docs/api/classes/defaultlogging).
:::tip
-If you don't want a logger, add it to the
+If you don't want a logger, add it to the
`exclude` field while composing dependencies.
:::
Use your generated dependency getter `useContainer` (use whatever name you want), access them
from anywhere.
+
:::note
the function [useContainerRaw](https://sern.dev/docs/api/modules#usecontainerraw) is provided for direct access to dependencies and the internal
data structure. Use this wisely as no guarantees are made and crashes can happen.
@@ -106,24 +118,30 @@ data structure. Use this wisely as no guarantees are made and crashes can happen
The `build` field follows [createContainer](https://itijs.org/docs/quick-start#usage) function call.
## New CommandTypes
+
2.0 includes all the new role select menus. `CommandType.MenuSelect` has been renamed into
`CommandType.StringSelect`. The remaining SelectMenus are
`CommandType.RoleSelect`, `CommandType.ChannelSelect`, `CommandType.UserSelect`, `CommandType.MentionableSelect`
+
```typescript title="commands/roleselect.ts"
export default commandModule({
- type: CommandType.RoleSelect,
- execute(ctx) {
- ctx.reply('role select')
- },
-})
+ type: CommandType.RoleSelect,
+ execute(ctx) {
+ ctx.reply("role select");
+ },
+});
```
+
In addition, commandModules with ContextMenus have been renamed.
+
```diff
-- CommandType.MenuUser, CommandType.MenuMsg
+- CommandType.MenuUser, CommandType.MenuMsg
+ CommandType.CtxUser, CommandType.CtxMsg
```
+
## Typings Simplification
-Pre 2.0:
+
+Pre 2.0:
Post 2.0:
@@ -131,12 +149,14 @@ Post 2.0:
CommandPlugin and EventPlugin typings have also been static'ified, transformed from types to interfaces
+
## Breaking Changes
+
All deprecation warnings from previous versions have taken effect, and are removed in 2.0.
-```diff
+```diff lang="ts" showLineNumbers=false
- type Module = EventModule | CommandModule
+ type AnyModule = EventModule | CommandModule
@@ -144,7 +164,9 @@ All deprecation warnings from previous versions have taken effect, and are remov
- args: Parameters[number],
- ) => unknown;
```
+
Override type has been removed due to redundancy
+
```diff
- discord.js : 14.5
+ discord.js : 14.7
@@ -152,7 +174,8 @@ Override type has been removed due to redundancy
-typescript: 4.7
+ typescript: 4.9
```
-```diff
+
+```diff lang="ts" showLineNumbers=false
+ interface Wrapper {
+ readonly defaultPrefix?: string;
+ readonly commands: string;
@@ -173,19 +196,22 @@ Override type has been removed due to redundancy
- | (() => { mod: EventModule; absPath: string }[]);
-}
```
-```diff
+
+```diff lang="ts" showLineNumbers=false
+ DefaultLogger
+ DefaultModuleManager
+ SernEmitter
+ DefaultErrorHandling
+ type Singleton = () => T
-+ type Transient = () => () => T;
++ type Transient = () => () => T;
+ type LogPayload = { message: T }
+ export const single = () => T
+ export const many = () => () => T
```
+
Including the previous section, some names to symbols and data structures were altered to
be better represented. view [changelog](/404.html)
## Context refactoring
-The context data structure has been internally altered to represent its dynamics better.
+
+The context data structure has been internally altered to represent its dynamics better.
diff --git a/src/content/docs/blog/2.5.0.md b/src/content/docs/blog/2.5.0.md
new file mode 100644
index 000000000..26c497392
--- /dev/null
+++ b/src/content/docs/blog/2.5.0.md
@@ -0,0 +1,39 @@
+---
+slug: blog/2.5.0
+title: Release 2.5.0
+authors: [jacoobes]
+tags: [release]
+date: 2023-01-12
+---
+
+## 2.5 Release
+
+### Join our [discord](https://sern.dev/discord)
+
+- Thank you for using sern in your projects. It's only going to get better!
+- I apologize for the sudden small breaking change. After this update, there won't be any for a while.
+ Wow! We're increasing our semantic versioning by `+0.3.9`
+ What does this mean?
+
+### Breaking changes
+
+- `controller` parameter for plugins has been removed
+ - You'll need to import it instead
+ - This **breaks** old `CommandPlugin`, but **not** old `EventPlugin`
+
+### Deprecations
+
+- `CommandPlugin` and `EventPlugin` have been renamed to [InitPlugin](/v3/api/interfaces/initplugin) and [ControlPlugin](/v3/api/interfaces/controlplugin), respectively
+
+### Reason
+
+- The naming of plugins was getting too complex. For example, plugin naming evolved into CommandModuleCommandPlugin, CommandModuleEventPlugin and more.
+- I realize that this affects all plugins. I have updated all [plugins](https://github.com/sern-handler/awesome-plugins/pull/68) to match these changes
+- The old way of declaring plugins has been deprecated in favor of newer functions that facilitate and ease typings
+ - [CommandControlPlugin](/v3/api/functions/commandcontrolplugin)
+ - [CommandInitPlugin](/v3/api/functions/commandinitplugin)
+ - [EventControlPlugin](/v3/api/functions/eventcontrolplugin)
+ - [EventInitPlugin](/v3/api/functions/eventinitplugin)
+ - [DiscordEventControlPlugin](/v3/api/functions/discordeventcontrolplugin)
+
+This will probably be the last breaking change in a while. Thanks for using sern!
diff --git a/blog/2023-06-18-mdx-blog-post.md b/src/content/docs/blog/3.0.0.md
similarity index 54%
rename from blog/2023-06-18-mdx-blog-post.md
rename to src/content/docs/blog/3.0.0.md
index 4bcbc5fcd..e79b03db1 100644
--- a/blog/2023-06-18-mdx-blog-post.md
+++ b/src/content/docs/blog/3.0.0.md
@@ -1,8 +1,9 @@
---
-slug: 3.0.0
+slug: blog/3.0.0
title: Release 3.0.0
authors: [jacoobes]
tags: [release]
+date: 2023-06-18
---
## 3.0 Release
@@ -12,20 +13,22 @@ tags: [release]
### Features
#### Dependency Management
+
- `Service` API (recommended to use this over useContainer hooks)
- - Dependencies type must be globally augmented in order for Services api to function properly
+ - Dependencies type must be globally augmented in order for Services api to function properly
- new methods on ModuleManager
- - getPublishableCommands()
-- Init Hooks
- - implement starting behavior for dependencies
- - To enforce and type check this, use the `Initializable` type when making your Dependencies type!
+ - getPublishableCommands()
+- Init Hooks
+ - implement starting behavior for dependencies
+ - To enforce and type check this, use the `Initializable` type when making your Dependencies type!
- Emitter interface
- - More generic interface to define any event emitter
- - You can now swap out the SernEmitter with whatever emitter now.
-```ts
+ - More generic interface to define any event emitter
+ - You can now swap out the SernEmitter with whatever emitter now.
+
+```ts
class DatabaseService implements Init {
//some hypothetical database
- _pgsql : database()
+ _pgsql : database()
async init() {
await _pgsql.load()
@@ -33,70 +36,74 @@ class DatabaseService implements Init {
}
-await makeDependencies({
+await makeDependencies({
build: root => root.add({
db: new DatabaseService() //will be init'ed automatically
})
})
```
+
- new SernEmitter event `modulesLoaded` , which allows users to customize behavior after all modules are loaded!
+
```ts
-
export default eventModule({
- name: 'modulesLoaded',
- type: EventType.Sern,
- execute: () => {
- console.log('All modules loaded')
- }
-})
-
-
+ name: "modulesLoaded",
+ type: EventType.Sern,
+ execute: () => {
+ console.log("All modules loaded");
+ },
+});
```
#### Quality of Life
+
- faster module loading
- - I utilize async generators for reading files now. A lot faster than the first iteration.
+ - I utilize async generators for reading files now. A lot faster than the first iteration.
- better error handling
- Less boilerplate
- - Services api cleans up v2 boilerplate
+ - Services api cleans up v2 boilerplate
- class modules devex got upgraded and work better than before
- automatically ignore any files not ending in (mts, cts, mjs, cjs, ts, js)
- - ignore commands and events with `!` prefix on filename or directory (ie: `!filename.ts` or `!directory` will be ignored by sern)
+
+ - ignore commands and events with `!` prefix on filename or directory (ie: `!filename.ts` or `!directory` will be ignored by sern)
- `Service` API (recommended to use this over useContainer hooks)
- - Dependencies type must be globally augmented in order for Services api to function properly
+ - Dependencies type must be globally augmented in order for Services api to function properly
- Less boilerplate
- new methods on ModuleManager
- automatically ignore any files not ending in (mts, cts, mjs, cjs, ts, js)
- - ignore commands / events with `!` prefix on filename or directory (ie: `!filename.ts` or `!directory`)
+ - ignore commands / events with `!` prefix on filename or directory (ie: `!filename.ts` or `!directory`)
- new SernEmitter event `modulesLoaded` , which allows users to customize behavior after all modules are loaded!
-- Init Hooks
- - implement starting behavior for dependencies
+- Init Hooks
+ - implement starting behavior for dependencies
### Experimental
-- Experimental things may be subject to removal, need feedback and are not guaranteed stable
-- dev / prod mode
- - sern will behave differently depending on mode set
-- init sern from `file` option
- - reads from local sern.config.json
-```js
-Sern.init('file');
+- Experimental things may be subject to removal, need feedback and are not guaranteed stable
+- dev / prod mode
+ - sern will behave differently depending on mode set
+- init sern from `file` option
+ - reads from local sern.config.json
+
+```js
+Sern.init("file");
```
+
### Breaking changes
+
- Sern.makeDependencies -> makeDependencies
- - it is asynchronous and top level function now. Make sure to await it before initing for proper synchronization.
-- module store and manager internally changed, so those using them may recieve breaking changes
+ - it is asynchronous and top level function now. Make sure to await it before initing for proper synchronization.
+- module store and manager internally changed, so those using them may recieve breaking changes
- BaseOptions type removed
-```diff
+```diff lang="ts" showLineNumbers=false
- Sern.makeDependencies({ build: () => {} })
+ await makeDependencies({ build: () => {} })
```
### Deprecations
+
- Removed all previous marked deprecations in v3
- ModuleStore will be removed as a dependency in v4. The only way to access modules should be through ModuleManager
- Default Dependencies will be made internal in the v4. Users should only have access to its interface / contract
-
diff --git a/blog/2023-7-4-mdx-blog-post.md b/src/content/docs/blog/new-logo.md
similarity index 77%
rename from blog/2023-7-4-mdx-blog-post.md
rename to src/content/docs/blog/new-logo.md
index 0288cc5b2..d0ac6c5f9 100644
--- a/blog/2023-7-4-mdx-blog-post.md
+++ b/src/content/docs/blog/new-logo.md
@@ -1,8 +1,9 @@
---
-slug: newlogo
+slug: blog/new-logo
title: New logo!
authors: [sern]
tags: [branding]
+date: 2023-07-04
---
Hey everyone! Today we have very special news for you all: We're changing our logo!
@@ -15,20 +16,23 @@ And here we are!
# Who did our new branding?
-[Ropox](https://github.com/Murtatrxx)!
+[Ropox](https://github.com/Murtatrxx)!
+
Bro's the GOAT. This website is maintained by him, the domain costs are funded by him and also he started brainstorming how the logo would be on paper:
-
+
+
And there it all clicked:
-
+
+
seren tried by the way!
-
+
# Anyways, here it is:
-
+
Pretty nice!
By the way, we have animations and variations on the way, so make sure to stay updated in the [discord server](https://sern.dev/discord)!
-# Finally, from the entire sern team, thank you for sticking around ❤️
\ No newline at end of file
+# Finally, from the entire sern team, thank you for sticking around ❤️
diff --git a/blog/2024-02-23-mdx-blog-post.md b/src/content/docs/blog/railway-deploy.md
similarity index 91%
rename from blog/2024-02-23-mdx-blog-post.md
rename to src/content/docs/blog/railway-deploy.md
index c163a56b6..c24576a77 100644
--- a/blog/2024-02-23-mdx-blog-post.md
+++ b/src/content/docs/blog/railway-deploy.md
@@ -1,13 +1,14 @@
---
-slug: railway-deploy
+slug: blog/railway-deploy
title: Deploying sern with Railway
-authors: [Duro]
+authors: [duro]
tags: [guides]
+date: 2024-02-23
---
In this guide, I'll be showing you how to deploy your sern bot with [Railway](https://railway.app/).
-This guide assumes you have a sern bot already set up and ready to deploy. If you don't, you can follow the [Getting Started](/blog/getting-started) guide to set up your bot.
+This guide assumes you have a sern bot already set up and ready to deploy. If you don't, you can follow the [walkthrough](/v3/guide/walkthrough/new-project) to set up your bot.
## GitHub Repository
diff --git a/src/content/docs/index.mdx b/src/content/docs/index.mdx
new file mode 100644
index 000000000..238da1f88
--- /dev/null
+++ b/src/content/docs/index.mdx
@@ -0,0 +1,35 @@
+---
+title: Create your dream Discord bot.
+template: splash
+description: sern is a framework for building Discord bots; Better DX and an ecosystem of packages & plugins.
+hero:
+ tagline: sern is a framework for building Discord bots; Better DX and an ecosystem of packages & plugins.
+ image:
+ file: ~/assets/logo/sern-logo.svg
+ actions:
+ - text: npm create @sern/bot
+ link: /v4/reference/getting-started
+ icon: right-arrow
+ variant: primary
+---
+
+import { Card, CardGrid } from "@astrojs/starlight/components";
+import CommunityShowcase from "~/components/CommunityShowcase.astro";
+
+
Showcase
+
+
+
+
Features
+
+
+
+ Take apart, build, or customize code with ease to create robust bots.
+
+
+ Commands are significantly smaller than other competitors. Write impactful, concise code.
+
+
+ Code like a traditional command framework. The API is simple and resembles classic v12 command handlers.
+
+
diff --git a/src/content/docs/v3/api/README.md b/src/content/docs/v3/api/README.md
new file mode 100644
index 000000000..cef9bd57f
--- /dev/null
+++ b/src/content/docs/v3/api/README.md
@@ -0,0 +1,96 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "@sern/handler"
+---
+
+## Namespaces
+
+- [Presence](/v3/api/namespaces/presence/readme/)
+- [Sern](/v3/api/namespaces/sern/readme/)
+
+## Enumerations
+
+- [CommandType](/v3/api/enumerations/commandtype/)
+- [EventType](/v3/api/enumerations/eventtype/)
+- [PayloadType](/v3/api/enumerations/payloadtype/)
+- [PluginType](/v3/api/enumerations/plugintype/)
+
+## Classes
+
+- [Context](/v3/api/classes/context/)
+- [ModuleStore](/v3/api/classes/modulestore/)
+
+## Interfaces
+
+- [BothCommand](/v3/api/interfaces/bothcommand/)
+- [ButtonCommand](/v3/api/interfaces/buttoncommand/)
+- [ChannelSelectCommand](/v3/api/interfaces/channelselectcommand/)
+- [CommandModuleDefs](/v3/api/interfaces/commandmoduledefs/)
+- [ContextMenuMsg](/v3/api/interfaces/contextmenumsg/)
+- [ContextMenuUser](/v3/api/interfaces/contextmenuuser/)
+- [ControlPlugin](/v3/api/interfaces/controlplugin/)
+- [Controller](/v3/api/interfaces/controller/)
+- [CoreDependencies](/v3/api/interfaces/coredependencies/)
+- [CoreModuleStore](/v3/api/interfaces/coremodulestore/)
+- [DiscordEventCommand](/v3/api/interfaces/discordeventcommand/)
+- [Disposable](/v3/api/interfaces/disposable/)
+- [Emitter](/v3/api/interfaces/emitter/)
+- [ErrorHandling](/v3/api/interfaces/errorhandling/)
+- [EventModuleDefs](/v3/api/interfaces/eventmoduledefs/)
+- [ExternalEventCommand](/v3/api/interfaces/externaleventcommand/)
+- [Init](/v3/api/interfaces/init/)
+- [InitPlugin](/v3/api/interfaces/initplugin/)
+- [Logging](/v3/api/interfaces/logging/)
+- [MentionableSelectCommand](/v3/api/interfaces/mentionableselectcommand/)
+- [ModalSubmitCommand](/v3/api/interfaces/modalsubmitcommand/)
+- [Plugin](/v3/api/interfaces/plugin/)
+- [RoleSelectCommand](/v3/api/interfaces/roleselectcommand/)
+- [SernAutocompleteData](/v3/api/interfaces/sernautocompletedata/)
+- [SernEventCommand](/v3/api/interfaces/serneventcommand/)
+- [SernEventsMapping](/v3/api/interfaces/serneventsmapping/)
+- [SernSubCommandData](/v3/api/interfaces/sernsubcommanddata/)
+- [SernSubCommandGroupData](/v3/api/interfaces/sernsubcommandgroupdata/)
+- [SlashCommand](/v3/api/interfaces/slashcommand/)
+- [StringSelectCommand](/v3/api/interfaces/stringselectcommand/)
+- [TextCommand](/v3/api/interfaces/textcommand/)
+- [UserSelectCommand](/v3/api/interfaces/userselectcommand/)
+- [Wrapper](/v3/api/interfaces/wrapper/)
+
+## Type Aliases
+
+- [AnyCommandPlugin](/v3/api/type-aliases/anycommandplugin/)
+- [AnyEventPlugin](/v3/api/type-aliases/anyeventplugin/)
+- [Args](/v3/api/type-aliases/args/)
+- [CommandModule](/v3/api/type-aliases/commandmodule/)
+- [EventModule](/v3/api/type-aliases/eventmodule/)
+- [Initializable](/v3/api/type-aliases/initializable/)
+- [LogPayload](/v3/api/type-aliases/logpayload/)
+- [Payload](/v3/api/type-aliases/payload/)
+- [PluginResult](/v3/api/type-aliases/pluginresult/)
+- [SernOptionsData](/v3/api/type-aliases/sernoptionsdata/)
+- [Singleton](/v3/api/type-aliases/singleton/)
+- [SlashOptions](/v3/api/type-aliases/slashoptions/)
+- [Transient](/v3/api/type-aliases/transient/)
+
+## Variables
+
+- [controller](/v3/api/variables/controller/)
+
+## Functions
+
+- [CommandControlPlugin](/v3/api/functions/commandcontrolplugin/)
+- [CommandInitPlugin](/v3/api/functions/commandinitplugin/)
+- [DiscordEventControlPlugin](/v3/api/functions/discordeventcontrolplugin/)
+- [EventControlPlugin](/v3/api/functions/eventcontrolplugin/)
+- [EventInitPlugin](/v3/api/functions/eventinitplugin/)
+- [Service](/v3/api/functions/service/)
+- [Services](/v3/api/functions/services/)
+- [commandModule](/v3/api/functions/commandmodule/)
+- [discordEvent](/v3/api/functions/discordevent/)
+- [eventModule](/v3/api/functions/eventmodule/)
+- [makeDependencies](/v3/api/functions/makedependencies/)
+- [makePlugin](/v3/api/functions/makeplugin/)
+- [single](/v3/api/functions/single/)
+- [transient](/v3/api/functions/transient/)
diff --git a/src/content/docs/v3/api/classes/Context.md b/src/content/docs/v3/api/classes/Context.md
new file mode 100644
index 000000000..9a2ff09a1
--- /dev/null
+++ b/src/content/docs/v3/api/classes/Context.md
@@ -0,0 +1,291 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Context"
+---
+
+## Since
+
+1.0.0
+Provides values shared between
+Message and ChatInputCommandInteraction
+
+## Extends
+
+- `CoreContext`\<`Message`, `ChatInputCommandInteraction`\>
+
+## Accessors
+
+### channel
+
+> `get` **channel**(): `null` \| `TextBasedChannel`
+
+#### Returns
+
+`null` \| `TextBasedChannel`
+
+#### Source
+
+[src/core/structures/context.ts:39](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/context.ts#L39)
+
+***
+
+### channelId
+
+> `get` **channelId**(): `string`
+
+#### Returns
+
+`string`
+
+#### Source
+
+[src/core/structures/context.ts:45](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/context.ts#L45)
+
+***
+
+### client
+
+> `get` **client**(): `Client`\<`boolean`\>
+
+#### Returns
+
+`Client`\<`boolean`\>
+
+#### Source
+
+[src/core/structures/context.ts:91](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/context.ts#L91)
+
+***
+
+### createdTimestamp
+
+> `get` **createdTimestamp**(): `number`
+
+#### Returns
+
+`number`
+
+#### Source
+
+[src/core/structures/context.ts:65](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/context.ts#L65)
+
+***
+
+### guild
+
+> `get` **guild**(): `null` \| `Guild`
+
+#### Returns
+
+`null` \| `Guild`
+
+#### Source
+
+[src/core/structures/context.ts:71](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/context.ts#L71)
+
+***
+
+### guildId
+
+> `get` **guildId**(): `null` \| `string`
+
+#### Returns
+
+`null` \| `string`
+
+#### Source
+
+[src/core/structures/context.ts:77](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/context.ts#L77)
+
+***
+
+### id
+
+> `get` **id**(): `string`
+
+#### Returns
+
+`string`
+
+#### Source
+
+[src/core/structures/context.ts:33](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/context.ts#L33)
+
+***
+
+### inGuild
+
+> `get` **inGuild**(): `boolean`
+
+#### Returns
+
+`boolean`
+
+#### Source
+
+[src/core/structures/context.ts:97](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/context.ts#L97)
+
+***
+
+### interaction
+
+> `get` **interaction**(): `I`
+
+#### Returns
+
+`I`
+
+#### Source
+
+[src/core/structures/core-context.ts:15](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/core-context.ts#L15)
+
+***
+
+### member
+
+> `get` **member**(): `null` \| `GuildMember` \| `APIInteractionGuildMember`
+
+#### Returns
+
+`null` \| `GuildMember` \| `APIInteractionGuildMember`
+
+#### Source
+
+[src/core/structures/context.ts:85](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/context.ts#L85)
+
+***
+
+### message
+
+> `get` **message**(): `M`
+
+#### Returns
+
+`M`
+
+#### Source
+
+[src/core/structures/core-context.ts:12](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/core-context.ts#L12)
+
+***
+
+### options
+
+> `get` **options**(): `Omit`\<`CommandInteractionOptionResolver`\<`CacheType`\>, `"getMessage"` \| `"getFocused"`\>
+
+#### Returns
+
+`Omit`\<`CommandInteractionOptionResolver`\<`CacheType`\>, `"getMessage"` \| `"getFocused"`\>
+
+#### Source
+
+[src/core/structures/context.ts:26](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/context.ts#L26)
+
+***
+
+### user
+
+> `get` **user**(): `User`
+
+If context is holding a message, message.author
+else, interaction.user
+
+#### Returns
+
+`User`
+
+#### Source
+
+[src/core/structures/context.ts:55](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/context.ts#L55)
+
+***
+
+### userId
+
+> `get` **userId**(): `string`
+
+#### Returns
+
+`string`
+
+#### Source
+
+[src/core/structures/context.ts:61](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/context.ts#L61)
+
+## Methods
+
+### isMessage()
+
+> **isMessage**(): `this is CoreContext, never>`
+
+#### Returns
+
+`this is CoreContext, never>`
+
+#### Inherited from
+
+`CoreContext.isMessage`
+
+#### Source
+
+[src/core/structures/core-context.ts:19](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/core-context.ts#L19)
+
+***
+
+### isSlash()
+
+> **isSlash**(): `this is CoreContext>`
+
+#### Returns
+
+`this is CoreContext>`
+
+#### Inherited from
+
+`CoreContext.isSlash`
+
+#### Source
+
+[src/core/structures/core-context.ts:23](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/core-context.ts#L23)
+
+***
+
+### reply()
+
+> **reply**(`content`): `Promise`\<`Message`\<`boolean`\>\>
+
+#### Parameters
+
+• **content**: `ReplyOptions`
+
+#### Returns
+
+`Promise`\<`Message`\<`boolean`\>\>
+
+#### Source
+
+[src/core/structures/context.ts:103](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/context.ts#L103)
+
+***
+
+### wrap()
+
+> `static` **wrap**(`wrappable`): [`Context`](/v3/api/classes/context/)
+
+#### Parameters
+
+• **wrappable**: `Message`\<`boolean`\> \| `BaseInteraction`\<`CacheType`\>
+
+#### Returns
+
+[`Context`](/v3/api/classes/context/)
+
+#### Overrides
+
+`CoreContext.wrap`
+
+#### Source
+
+[src/core/structures/context.ts:113](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/context.ts#L113)
diff --git a/src/content/docs/v3/api/classes/ModuleStore.md b/src/content/docs/v3/api/classes/ModuleStore.md
new file mode 100644
index 000000000..46d76524e
--- /dev/null
+++ b/src/content/docs/v3/api/classes/ModuleStore.md
@@ -0,0 +1,36 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "ModuleStore"
+---
+
+## Constructors
+
+### new ModuleStore()
+
+> **new ModuleStore**(): [`ModuleStore`](/v3/api/classes/modulestore/)
+
+#### Returns
+
+[`ModuleStore`](/v3/api/classes/modulestore/)
+
+## Properties
+
+### commands
+
+> **commands**: `Map`\<`string`, `Module`\>
+
+#### Source
+
+[src/core/structures/module-store.ts:10](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/module-store.ts#L10)
+
+***
+
+### metadata
+
+> **metadata**: `WeakMap`\<`Module`, `CommandMeta`\>
+
+#### Source
+
+[src/core/structures/module-store.ts:9](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/module-store.ts#L9)
diff --git a/docs/api/enums/CommandType.md b/src/content/docs/v3/api/enumerations/CommandType.md
similarity index 51%
rename from docs/api/enums/CommandType.md
rename to src/content/docs/v3/api/enumerations/CommandType.md
index 0683378ff..c03ffe693 100644
--- a/docs/api/enums/CommandType.md
+++ b/src/content/docs/v3/api/enumerations/CommandType.md
@@ -1,17 +1,16 @@
---
-id: "CommandType"
-title: "Enumeration: CommandType"
-sidebar_label: "CommandType"
-sidebar_position: 0
-custom_edit_url: null
+editUrl: false
+next: false
+prev: false
+title: "CommandType"
---
-**`Since`**
+## Since
1.0.0
A bitfield that discriminates command modules
-**`Example`**
+## Example
```ts
export default commandModule({
@@ -28,118 +27,118 @@ export default commandModule({
### Both
-• **Both** = ``3``
+> **Both**: `3`
-#### Defined in
+#### Source
-[src/core/structures/enums.ts:20](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/enums.ts#L20)
+[src/core/structures/enums.ts:20](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/enums.ts#L20)
-___
+***
### Button
-• **Button** = ``16``
+> **Button**: `16`
-#### Defined in
+#### Source
-[src/core/structures/enums.ts:23](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/enums.ts#L23)
+[src/core/structures/enums.ts:23](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/enums.ts#L23)
-___
+***
### ChannelSelect
-• **ChannelSelect** = ``1024``
+> **ChannelSelect**: `1024`
-#### Defined in
+#### Source
-[src/core/structures/enums.ts:29](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/enums.ts#L29)
+[src/core/structures/enums.ts:29](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/enums.ts#L29)
-___
+***
### CtxMsg
-• **CtxMsg** = ``8``
+> **CtxMsg**: `8`
-#### Defined in
+#### Source
-[src/core/structures/enums.ts:22](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/enums.ts#L22)
+[src/core/structures/enums.ts:22](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/enums.ts#L22)
-___
+***
### CtxUser
-• **CtxUser** = ``4``
+> **CtxUser**: `4`
-#### Defined in
+#### Source
-[src/core/structures/enums.ts:21](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/enums.ts#L21)
+[src/core/structures/enums.ts:21](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/enums.ts#L21)
-___
+***
### MentionableSelect
-• **MentionableSelect** = ``512``
+> **MentionableSelect**: `512`
-#### Defined in
+#### Source
-[src/core/structures/enums.ts:28](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/enums.ts#L28)
+[src/core/structures/enums.ts:28](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/enums.ts#L28)
-___
+***
### Modal
-• **Modal** = ``64``
+> **Modal**: `64`
-#### Defined in
+#### Source
-[src/core/structures/enums.ts:25](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/enums.ts#L25)
+[src/core/structures/enums.ts:25](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/enums.ts#L25)
-___
+***
### RoleSelect
-• **RoleSelect** = ``256``
+> **RoleSelect**: `256`
-#### Defined in
+#### Source
-[src/core/structures/enums.ts:27](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/enums.ts#L27)
+[src/core/structures/enums.ts:27](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/enums.ts#L27)
-___
+***
### Slash
-• **Slash** = ``2``
+> **Slash**: `2`
-#### Defined in
+#### Source
-[src/core/structures/enums.ts:19](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/enums.ts#L19)
+[src/core/structures/enums.ts:19](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/enums.ts#L19)
-___
+***
### StringSelect
-• **StringSelect** = ``32``
+> **StringSelect**: `32`
-#### Defined in
+#### Source
-[src/core/structures/enums.ts:24](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/enums.ts#L24)
+[src/core/structures/enums.ts:24](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/enums.ts#L24)
-___
+***
### Text
-• **Text** = ``1``
+> **Text**: `1`
-#### Defined in
+#### Source
-[src/core/structures/enums.ts:18](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/enums.ts#L18)
+[src/core/structures/enums.ts:18](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/enums.ts#L18)
-___
+***
### UserSelect
-• **UserSelect** = ``128``
+> **UserSelect**: `128`
-#### Defined in
+#### Source
-[src/core/structures/enums.ts:26](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/enums.ts#L26)
+[src/core/structures/enums.ts:26](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/enums.ts#L26)
diff --git a/docs/api/enums/EventType.md b/src/content/docs/v3/api/enumerations/EventType.md
similarity index 63%
rename from docs/api/enums/EventType.md
rename to src/content/docs/v3/api/enumerations/EventType.md
index 7736b7231..d5b4bd175 100644
--- a/docs/api/enums/EventType.md
+++ b/src/content/docs/v3/api/enumerations/EventType.md
@@ -1,14 +1,13 @@
---
-id: "EventType"
-title: "Enumeration: EventType"
-sidebar_label: "EventType"
-sidebar_position: 0
-custom_edit_url: null
+editUrl: false
+next: false
+prev: false
+title: "EventType"
---
A bitfield that discriminates event modules
-**`Example`**
+## Example
```ts
export default eventModule({
@@ -25,35 +24,35 @@ export default eventModule({
### Discord
-• **Discord** = ``1``
+> **Discord**: `1`
The EventType for handling discord events
-#### Defined in
+#### Source
-[src/core/structures/enums.ts:51](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/enums.ts#L51)
+[src/core/structures/enums.ts:51](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/enums.ts#L51)
-___
+***
### External
-• **External** = ``3``
+> **External**: `3`
The EventType for handling external events.
Could be for example, `process` events, database events
-#### Defined in
+#### Source
-[src/core/structures/enums.ts:60](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/enums.ts#L60)
+[src/core/structures/enums.ts:60](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/enums.ts#L60)
-___
+***
### Sern
-• **Sern** = ``2``
+> **Sern**: `2`
The EventType for handling sern events
-#### Defined in
+#### Source
-[src/core/structures/enums.ts:55](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/enums.ts#L55)
+[src/core/structures/enums.ts:55](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/enums.ts#L55)
diff --git a/docs/api/enums/PayloadType.md b/src/content/docs/v3/api/enumerations/PayloadType.md
similarity index 51%
rename from docs/api/enums/PayloadType.md
rename to src/content/docs/v3/api/enumerations/PayloadType.md
index 43ca390bb..5a8701eee 100644
--- a/docs/api/enums/PayloadType.md
+++ b/src/content/docs/v3/api/enumerations/PayloadType.md
@@ -1,43 +1,42 @@
---
-id: "PayloadType"
-title: "Enumeration: PayloadType"
-sidebar_label: "PayloadType"
-sidebar_position: 0
-custom_edit_url: null
+editUrl: false
+next: false
+prev: false
+title: "PayloadType"
---
## Enumeration Members
### Failure
-• **Failure** = ``"failure"``
+> **Failure**: `"failure"`
The PayloadType for a SernEmitter failure event
-#### Defined in
+#### Source
-[src/core/structures/enums.ts:98](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/enums.ts#L98)
+[src/core/structures/enums.ts:98](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/enums.ts#L98)
-___
+***
### Success
-• **Success** = ``"success"``
+> **Success**: `"success"`
The PayloadType for a SernEmitter success event
-#### Defined in
+#### Source
-[src/core/structures/enums.ts:94](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/enums.ts#L94)
+[src/core/structures/enums.ts:94](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/enums.ts#L94)
-___
+***
### Warning
-• **Warning** = ``"warning"``
+> **Warning**: `"warning"`
The PayloadType for a SernEmitter warning event
-#### Defined in
+#### Source
-[src/core/structures/enums.ts:102](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/enums.ts#L102)
+[src/core/structures/enums.ts:102](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/enums.ts#L102)
diff --git a/docs/api/enums/PluginType.md b/src/content/docs/v3/api/enumerations/PluginType.md
similarity index 62%
rename from docs/api/enums/PluginType.md
rename to src/content/docs/v3/api/enumerations/PluginType.md
index 268de9928..65afa5828 100644
--- a/docs/api/enums/PluginType.md
+++ b/src/content/docs/v3/api/enumerations/PluginType.md
@@ -1,14 +1,13 @@
---
-id: "PluginType"
-title: "Enumeration: PluginType"
-sidebar_label: "PluginType"
-sidebar_position: 0
-custom_edit_url: null
+editUrl: false
+next: false
+prev: false
+title: "PluginType"
---
A bitfield that discriminates plugins
-**`Example`**
+## Example
```ts
export default function myPlugin() : EventPlugin {
@@ -24,22 +23,22 @@ export default function myPlugin() : EventPlugin {
### Control
-• **Control** = ``2``
+> **Control**: `2`
The PluginType for EventPlugins
-#### Defined in
+#### Source
-[src/core/structures/enums.ts:85](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/enums.ts#L85)
+[src/core/structures/enums.ts:85](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/enums.ts#L85)
-___
+***
### Init
-• **Init** = ``1``
+> **Init**: `1`
The PluginType for InitPlugins
-#### Defined in
+#### Source
-[src/core/structures/enums.ts:81](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/structures/enums.ts#L81)
+[src/core/structures/enums.ts:81](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/structures/enums.ts#L81)
diff --git a/src/content/docs/v3/api/functions/CommandControlPlugin.md b/src/content/docs/v3/api/functions/CommandControlPlugin.md
new file mode 100644
index 000000000..50728f539
--- /dev/null
+++ b/src/content/docs/v3/api/functions/CommandControlPlugin.md
@@ -0,0 +1,29 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "CommandControlPlugin"
+---
+
+> **CommandControlPlugin**\<`I`\>(`execute`): [`Plugin`](/v3/api/interfaces/plugin/)\<`unknown`[]\>
+
+## Type parameters
+
+• **I** *extends* [`CommandType`](/v3/api/enumerations/commandtype/)
+
+## Parameters
+
+• **execute**
+
+## Returns
+
+[`Plugin`](/v3/api/interfaces/plugin/)\<`unknown`[]\>
+
+## Since
+
+2.5.0
+@__PURE__
+
+## Source
+
+[src/core/create-plugins.ts:37](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/create-plugins.ts#L37)
diff --git a/src/content/docs/v3/api/functions/CommandInitPlugin.md b/src/content/docs/v3/api/functions/CommandInitPlugin.md
new file mode 100644
index 000000000..773cbfdfb
--- /dev/null
+++ b/src/content/docs/v3/api/functions/CommandInitPlugin.md
@@ -0,0 +1,29 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "CommandInitPlugin"
+---
+
+> **CommandInitPlugin**\<`I`\>(`execute`): [`Plugin`](/v3/api/interfaces/plugin/)\<`unknown`[]\>
+
+## Type parameters
+
+• **I** *extends* [`CommandType`](/v3/api/enumerations/commandtype/)
+
+## Parameters
+
+• **execute**
+
+## Returns
+
+[`Plugin`](/v3/api/interfaces/plugin/)\<`unknown`[]\>
+
+## Since
+
+2.5.0
+@__PURE__
+
+## Source
+
+[src/core/create-plugins.ts:28](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/create-plugins.ts#L28)
diff --git a/src/content/docs/v3/api/functions/DiscordEventControlPlugin.md b/src/content/docs/v3/api/functions/DiscordEventControlPlugin.md
new file mode 100644
index 000000000..6b43e87bd
--- /dev/null
+++ b/src/content/docs/v3/api/functions/DiscordEventControlPlugin.md
@@ -0,0 +1,35 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "DiscordEventControlPlugin"
+---
+
+> **DiscordEventControlPlugin**\<`T`\>(`name`, `execute`): [`Plugin`](/v3/api/interfaces/plugin/)\<`unknown`[]\>
+
+## Type parameters
+
+• **T** *extends* keyof `ClientEvents`
+
+## Parameters
+
+• **name**: `T`
+
+• **execute**
+
+## Returns
+
+[`Plugin`](/v3/api/interfaces/plugin/)\<`unknown`[]\>
+
+## Since
+
+2.5.0
+
+## Experimental
+
+A specialized function for creating control plugins with discord.js ClientEvents.
+Will probably be moved one day!
+
+## Source
+
+[src/core/create-plugins.ts:58](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/create-plugins.ts#L58)
diff --git a/src/content/docs/v3/api/functions/EventControlPlugin.md b/src/content/docs/v3/api/functions/EventControlPlugin.md
new file mode 100644
index 000000000..483e65303
--- /dev/null
+++ b/src/content/docs/v3/api/functions/EventControlPlugin.md
@@ -0,0 +1,29 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "EventControlPlugin"
+---
+
+> **EventControlPlugin**\<`I`\>(`execute`): [`Plugin`](/v3/api/interfaces/plugin/)\<`unknown`[]\>
+
+## Type parameters
+
+• **I** *extends* [`EventType`](/v3/api/enumerations/eventtype/)
+
+## Parameters
+
+• **execute**
+
+## Returns
+
+[`Plugin`](/v3/api/interfaces/plugin/)\<`unknown`[]\>
+
+## Since
+
+2.5.0
+@__PURE__
+
+## Source
+
+[src/core/create-plugins.ts:46](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/create-plugins.ts#L46)
diff --git a/src/content/docs/v3/api/functions/EventInitPlugin.md b/src/content/docs/v3/api/functions/EventInitPlugin.md
new file mode 100644
index 000000000..f75353259
--- /dev/null
+++ b/src/content/docs/v3/api/functions/EventInitPlugin.md
@@ -0,0 +1,29 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "EventInitPlugin"
+---
+
+> **EventInitPlugin**\<`I`\>(`execute`): [`Plugin`](/v3/api/interfaces/plugin/)\<`unknown`[]\>
+
+## Type parameters
+
+• **I** *extends* [`EventType`](/v3/api/enumerations/eventtype/)
+
+## Parameters
+
+• **execute**
+
+## Returns
+
+[`Plugin`](/v3/api/interfaces/plugin/)\<`unknown`[]\>
+
+## Since
+
+2.5.0
+@__PURE__
+
+## Source
+
+[src/core/create-plugins.ts:19](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/create-plugins.ts#L19)
diff --git a/src/content/docs/v3/api/functions/Service.md b/src/content/docs/v3/api/functions/Service.md
new file mode 100644
index 000000000..ca6b17330
--- /dev/null
+++ b/src/content/docs/v3/api/functions/Service.md
@@ -0,0 +1,41 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Service"
+---
+
+> **Service**\<`T`\>(`key`): `NonNullable`\<`UnpackFunction`\<`Partial`\<`Dependencies`\>\[`T`\]\>\>
+
+The new Service api, a cleaner alternative to useContainer
+To obtain intellisense, ensure a .d.ts file exists in the root of compilation.
+Usually our scaffolding tool takes care of this.
+Note: this method only works AFTER your container has been initiated
+
+## Type parameters
+
+• **T** *extends* keyof `Dependencies`
+
+## Parameters
+
+• **key**: `T`
+
+a key that corresponds to a dependency registered.
+
+## Returns
+
+`NonNullable`\<`UnpackFunction`\<`Partial`\<`Dependencies`\>\[`T`\]\>\>
+
+## Since
+
+3.0.0
+
+## Example
+
+```ts
+const client = Service('@sern/client');
+```
+
+## Source
+
+[src/core/ioc/dependency-injection.ts:37](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/ioc/dependency-injection.ts#L37)
diff --git a/src/content/docs/v3/api/functions/Services.md b/src/content/docs/v3/api/functions/Services.md
new file mode 100644
index 000000000..fc4d07dff
--- /dev/null
+++ b/src/content/docs/v3/api/functions/Services.md
@@ -0,0 +1,31 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Services"
+---
+
+> **Services**\<`T`\>(...`keys`): `IntoDependencies`\<`T`\>
+
+## Type parameters
+
+• **T** *extends* keyof `Dependencies`[]
+
+## Parameters
+
+• ...**keys**: [`...T[]`]
+
+## Returns
+
+`IntoDependencies`\<`T`\>
+
+array of dependencies, in the same order of keys provided
+
+## Since
+
+3.0.0
+The plural version of [Service](../../../../../../v3/api/functions/service)
+
+## Source
+
+[src/core/ioc/dependency-injection.ts:47](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/ioc/dependency-injection.ts#L47)
diff --git a/src/content/docs/v3/api/functions/commandModule.md b/src/content/docs/v3/api/functions/commandModule.md
new file mode 100644
index 000000000..5cba5d6fd
--- /dev/null
+++ b/src/content/docs/v3/api/functions/commandModule.md
@@ -0,0 +1,24 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "commandModule"
+---
+
+> **commandModule**(`mod`): [`CommandModule`](/v3/api/type-aliases/commandmodule/)
+
+## Parameters
+
+• **mod**: `InputCommand`
+
+## Returns
+
+[`CommandModule`](/v3/api/type-aliases/commandmodule/)
+
+## Since
+
+1.0.0 The wrapper function to define command modules for sern
+
+## Source
+
+[src/core/modules.ts:19](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/modules.ts#L19)
diff --git a/src/content/docs/v3/api/functions/discordEvent.md b/src/content/docs/v3/api/functions/discordEvent.md
new file mode 100644
index 000000000..189b9c942
--- /dev/null
+++ b/src/content/docs/v3/api/functions/discordEvent.md
@@ -0,0 +1,36 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "discordEvent"
+---
+
+> **discordEvent**\<`T`\>(`mod`): [`EventModule`](/v3/api/type-aliases/eventmodule/)
+
+Create event modules from discord.js client events,
+This is an [eventModule](../../../../../../v3/api/functions/eventmodule) for discord events,
+where typings can be very bad.
+
+## Type parameters
+
+• **T** *extends* keyof `ClientEvents`
+
+## Parameters
+
+• **mod**
+
+• **mod.execute**
+
+• **mod.name**: `T`
+
+• **mod.plugins?**: [`AnyEventPlugin`](/v3/api/type-aliases/anyeventplugin/)[]
+
+## Returns
+
+[`EventModule`](/v3/api/type-aliases/eventmodule/)
+
+## Experimental
+
+## Source
+
+[src/core/modules.ts:47](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/modules.ts#L47)
diff --git a/src/content/docs/v3/api/functions/eventModule.md b/src/content/docs/v3/api/functions/eventModule.md
new file mode 100644
index 000000000..f42703bb1
--- /dev/null
+++ b/src/content/docs/v3/api/functions/eventModule.md
@@ -0,0 +1,25 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "eventModule"
+---
+
+> **eventModule**(`mod`): [`EventModule`](/v3/api/type-aliases/eventmodule/)
+
+## Parameters
+
+• **mod**: `InputEvent`
+
+## Returns
+
+[`EventModule`](/v3/api/type-aliases/eventmodule/)
+
+## Since
+
+1.0.0
+The wrapper function to define event modules for sern
+
+## Source
+
+[src/core/modules.ts:32](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/modules.ts#L32)
diff --git a/src/content/docs/v3/api/functions/makeDependencies.md b/src/content/docs/v3/api/functions/makeDependencies.md
new file mode 100644
index 000000000..182cb8b52
--- /dev/null
+++ b/src/content/docs/v3/api/functions/makeDependencies.md
@@ -0,0 +1,24 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "makeDependencies"
+---
+
+> **makeDependencies**\<`T`\>(`conf`): `Promise`\<\<`V`\>(...`keys`) => `IntoDependencies`\<`V`\>\>
+
+## Type parameters
+
+• **T** *extends* `Dependencies`
+
+## Parameters
+
+• **conf**: `ValidDependencyConfig`
+
+## Returns
+
+`Promise`\<\<`V`\>(...`keys`) => `IntoDependencies`\<`V`\>\>
+
+## Source
+
+[src/core/ioc/base.ts:144](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/ioc/base.ts#L144)
diff --git a/src/content/docs/v3/api/functions/makePlugin.md b/src/content/docs/v3/api/functions/makePlugin.md
new file mode 100644
index 000000000..178174f30
--- /dev/null
+++ b/src/content/docs/v3/api/functions/makePlugin.md
@@ -0,0 +1,26 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "makePlugin"
+---
+
+> **makePlugin**\<`V`\>(`type`, `execute`): [`Plugin`](/v3/api/interfaces/plugin/)\<`V`\>
+
+## Type parameters
+
+• **V** *extends* `unknown`[]
+
+## Parameters
+
+• **type**: [`PluginType`](/v3/api/enumerations/plugintype/)
+
+• **execute**
+
+## Returns
+
+[`Plugin`](/v3/api/interfaces/plugin/)\<`V`\>
+
+## Source
+
+[src/core/create-plugins.ts:6](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/create-plugins.ts#L6)
diff --git a/src/content/docs/v3/api/functions/single.md b/src/content/docs/v3/api/functions/single.md
new file mode 100644
index 000000000..46e65461e
--- /dev/null
+++ b/src/content/docs/v3/api/functions/single.md
@@ -0,0 +1,35 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "single"
+---
+
+> **single**\<`T`\>(`cb`): () => `T`
+
+@__PURE__
+
+## Type parameters
+
+• **T**
+
+## Parameters
+
+• **cb**
+
+## Returns
+
+`Function`
+
+### Returns
+
+`T`
+
+## Since
+
+2.0.0.
+Creates a singleton object.
+
+## Source
+
+[src/core/ioc/dependency-injection.ts:11](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/ioc/dependency-injection.ts#L11)
diff --git a/src/content/docs/v3/api/functions/transient.md b/src/content/docs/v3/api/functions/transient.md
new file mode 100644
index 000000000..ed1f0cba7
--- /dev/null
+++ b/src/content/docs/v3/api/functions/transient.md
@@ -0,0 +1,39 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "transient"
+---
+
+> **transient**\<`T`\>(`cb`): () => () => `T`
+
+@__PURE__
+
+## Type parameters
+
+• **T**
+
+## Parameters
+
+• **cb**
+
+## Returns
+
+`Function`
+
+### Returns
+
+`Function`
+
+#### Returns
+
+`T`
+
+## Since
+
+2.0.0
+Creates a transient object
+
+## Source
+
+[src/core/ioc/dependency-injection.ts:21](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/ioc/dependency-injection.ts#L21)
diff --git a/src/content/docs/v3/api/interfaces/BothCommand.md b/src/content/docs/v3/api/interfaces/BothCommand.md
new file mode 100644
index 000000000..f3f0dd1df
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/BothCommand.md
@@ -0,0 +1,124 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "BothCommand"
+---
+
+## Extends
+
+- `Module`
+
+## Properties
+
+### alias?
+
+> `optional` **alias**: `string`[]
+
+#### Source
+
+[src/types/core-modules.ts:125](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L125)
+
+***
+
+### description
+
+> **description**: `string`
+
+#### Overrides
+
+`Module.description`
+
+#### Source
+
+[src/types/core-modules.ts:126](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L126)
+
+***
+
+### execute()
+
+> **execute**: (`ctx`, `args`) => `unknown`
+
+#### Parameters
+
+• **ctx**: [`Context`](/v3/api/classes/context/)
+
+• **args**: [`Args`](/v3/api/type-aliases/args/)
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+`Module.execute`
+
+#### Source
+
+[src/types/core-modules.ts:128](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L128)
+
+***
+
+### name?
+
+> `optional` **name**: `string`
+
+#### Inherited from
+
+`Module.name`
+
+#### Source
+
+[src/types/core-modules.ts:33](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L33)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v3/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.onEvent`
+
+#### Source
+
+[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L34)
+
+***
+
+### options?
+
+> `optional` **options**: [`SernOptionsData`](/v3/api/type-aliases/sernoptionsdata/)[]
+
+#### Source
+
+[src/types/core-modules.ts:127](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L127)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v3/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.plugins`
+
+#### Source
+
+[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L35)
+
+***
+
+### type
+
+> **type**: [`Both`](/v3/api/enumerations/commandtype/#both)
+
+#### Overrides
+
+`Module.type`
+
+#### Source
+
+[src/types/core-modules.ts:124](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L124)
diff --git a/src/content/docs/v3/api/interfaces/ButtonCommand.md b/src/content/docs/v3/api/interfaces/ButtonCommand.md
new file mode 100644
index 000000000..560089489
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/ButtonCommand.md
@@ -0,0 +1,102 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "ButtonCommand"
+---
+
+## Extends
+
+- `Module`
+
+## Properties
+
+### description?
+
+> `optional` **description**: `string`
+
+#### Inherited from
+
+`Module.description`
+
+#### Source
+
+[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L36)
+
+***
+
+### execute()
+
+> **execute**: (`ctx`) => `unknown`
+
+#### Parameters
+
+• **ctx**: `ButtonInteraction`\<`CacheType`\>
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+`Module.execute`
+
+#### Source
+
+[src/types/core-modules.ts:65](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L65)
+
+***
+
+### name?
+
+> `optional` **name**: `string`
+
+#### Inherited from
+
+`Module.name`
+
+#### Source
+
+[src/types/core-modules.ts:33](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L33)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v3/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.onEvent`
+
+#### Source
+
+[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L34)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v3/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.plugins`
+
+#### Source
+
+[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L35)
+
+***
+
+### type
+
+> **type**: [`Button`](/v3/api/enumerations/commandtype/#button)
+
+#### Overrides
+
+`Module.type`
+
+#### Source
+
+[src/types/core-modules.ts:64](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L64)
diff --git a/src/content/docs/v3/api/interfaces/ChannelSelectCommand.md b/src/content/docs/v3/api/interfaces/ChannelSelectCommand.md
new file mode 100644
index 000000000..09a80229e
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/ChannelSelectCommand.md
@@ -0,0 +1,102 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "ChannelSelectCommand"
+---
+
+## Extends
+
+- `Module`
+
+## Properties
+
+### description?
+
+> `optional` **description**: `string`
+
+#### Inherited from
+
+`Module.description`
+
+#### Source
+
+[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L36)
+
+***
+
+### execute()
+
+> **execute**: (`ctx`) => `unknown`
+
+#### Parameters
+
+• **ctx**: `ChannelSelectMenuInteraction`\<`CacheType`\>
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+`Module.execute`
+
+#### Source
+
+[src/types/core-modules.ts:75](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L75)
+
+***
+
+### name?
+
+> `optional` **name**: `string`
+
+#### Inherited from
+
+`Module.name`
+
+#### Source
+
+[src/types/core-modules.ts:33](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L33)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v3/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.onEvent`
+
+#### Source
+
+[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L34)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v3/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.plugins`
+
+#### Source
+
+[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L35)
+
+***
+
+### type
+
+> **type**: [`ChannelSelect`](/v3/api/enumerations/commandtype/#channelselect)
+
+#### Overrides
+
+`Module.type`
+
+#### Source
+
+[src/types/core-modules.ts:74](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L74)
diff --git a/src/content/docs/v3/api/interfaces/CommandModuleDefs.md b/src/content/docs/v3/api/interfaces/CommandModuleDefs.md
new file mode 100644
index 000000000..08d3b7786
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/CommandModuleDefs.md
@@ -0,0 +1,126 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "CommandModuleDefs"
+---
+
+## Properties
+
+### 1
+
+> **1**: [`TextCommand`](/v3/api/interfaces/textcommand/)
+
+#### Source
+
+[src/types/core-modules.ts:150](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L150)
+
+***
+
+### 1024
+
+> **1024**: [`ChannelSelectCommand`](/v3/api/interfaces/channelselectcommand/)
+
+#### Source
+
+[src/types/core-modules.ts:158](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L158)
+
+***
+
+### 128
+
+> **128**: [`UserSelectCommand`](/v3/api/interfaces/userselectcommand/)
+
+#### Source
+
+[src/types/core-modules.ts:160](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L160)
+
+***
+
+### 16
+
+> **16**: [`ButtonCommand`](/v3/api/interfaces/buttoncommand/)
+
+#### Source
+
+[src/types/core-modules.ts:155](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L155)
+
+***
+
+### 2
+
+> **2**: [`SlashCommand`](/v3/api/interfaces/slashcommand/)
+
+#### Source
+
+[src/types/core-modules.ts:151](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L151)
+
+***
+
+### 256
+
+> **256**: [`RoleSelectCommand`](/v3/api/interfaces/roleselectcommand/)
+
+#### Source
+
+[src/types/core-modules.ts:157](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L157)
+
+***
+
+### 3
+
+> **3**: [`BothCommand`](/v3/api/interfaces/bothcommand/)
+
+#### Source
+
+[src/types/core-modules.ts:152](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L152)
+
+***
+
+### 32
+
+> **32**: [`StringSelectCommand`](/v3/api/interfaces/stringselectcommand/)
+
+#### Source
+
+[src/types/core-modules.ts:156](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L156)
+
+***
+
+### 4
+
+> **4**: [`ContextMenuUser`](/v3/api/interfaces/contextmenuuser/)
+
+#### Source
+
+[src/types/core-modules.ts:154](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L154)
+
+***
+
+### 512
+
+> **512**: [`MentionableSelectCommand`](/v3/api/interfaces/mentionableselectcommand/)
+
+#### Source
+
+[src/types/core-modules.ts:159](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L159)
+
+***
+
+### 64
+
+> **64**: [`ModalSubmitCommand`](/v3/api/interfaces/modalsubmitcommand/)
+
+#### Source
+
+[src/types/core-modules.ts:161](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L161)
+
+***
+
+### 8
+
+> **8**: [`ContextMenuMsg`](/v3/api/interfaces/contextmenumsg/)
+
+#### Source
+
+[src/types/core-modules.ts:153](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L153)
diff --git a/src/content/docs/v3/api/interfaces/ContextMenuMsg.md b/src/content/docs/v3/api/interfaces/ContextMenuMsg.md
new file mode 100644
index 000000000..be4126f2b
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/ContextMenuMsg.md
@@ -0,0 +1,102 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "ContextMenuMsg"
+---
+
+## Extends
+
+- `Module`
+
+## Properties
+
+### description?
+
+> `optional` **description**: `string`
+
+#### Inherited from
+
+`Module.description`
+
+#### Source
+
+[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L36)
+
+***
+
+### execute()
+
+> **execute**: (`ctx`) => `unknown`
+
+#### Parameters
+
+• **ctx**: `MessageContextMenuCommandInteraction`\<`CacheType`\>
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+`Module.execute`
+
+#### Source
+
+[src/types/core-modules.ts:60](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L60)
+
+***
+
+### name?
+
+> `optional` **name**: `string`
+
+#### Inherited from
+
+`Module.name`
+
+#### Source
+
+[src/types/core-modules.ts:33](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L33)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v3/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.onEvent`
+
+#### Source
+
+[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L34)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v3/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.plugins`
+
+#### Source
+
+[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L35)
+
+***
+
+### type
+
+> **type**: [`CtxMsg`](/v3/api/enumerations/commandtype/#ctxmsg)
+
+#### Overrides
+
+`Module.type`
+
+#### Source
+
+[src/types/core-modules.ts:59](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L59)
diff --git a/src/content/docs/v3/api/interfaces/ContextMenuUser.md b/src/content/docs/v3/api/interfaces/ContextMenuUser.md
new file mode 100644
index 000000000..9eed44742
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/ContextMenuUser.md
@@ -0,0 +1,102 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "ContextMenuUser"
+---
+
+## Extends
+
+- `Module`
+
+## Properties
+
+### description?
+
+> `optional` **description**: `string`
+
+#### Inherited from
+
+`Module.description`
+
+#### Source
+
+[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L36)
+
+***
+
+### execute()
+
+> **execute**: (`ctx`) => `unknown`
+
+#### Parameters
+
+• **ctx**: `UserContextMenuCommandInteraction`\<`CacheType`\>
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+`Module.execute`
+
+#### Source
+
+[src/types/core-modules.ts:55](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L55)
+
+***
+
+### name?
+
+> `optional` **name**: `string`
+
+#### Inherited from
+
+`Module.name`
+
+#### Source
+
+[src/types/core-modules.ts:33](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L33)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v3/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.onEvent`
+
+#### Source
+
+[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L34)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v3/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.plugins`
+
+#### Source
+
+[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L35)
+
+***
+
+### type
+
+> **type**: [`CtxUser`](/v3/api/enumerations/commandtype/#ctxuser)
+
+#### Overrides
+
+`Module.type`
+
+#### Source
+
+[src/types/core-modules.ts:54](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L54)
diff --git a/src/content/docs/v3/api/interfaces/ControlPlugin.md b/src/content/docs/v3/api/interfaces/ControlPlugin.md
new file mode 100644
index 000000000..cc83d6dd0
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/ControlPlugin.md
@@ -0,0 +1,38 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "ControlPlugin"
+---
+
+## Type parameters
+
+• **Args** *extends* `any`[] = `any`[]
+
+## Properties
+
+### execute()
+
+> **execute**: (...`args`) => [`PluginResult`](/v3/api/type-aliases/pluginresult/)
+
+#### Parameters
+
+• ...**args**: `Args`
+
+#### Returns
+
+[`PluginResult`](/v3/api/type-aliases/pluginresult/)
+
+#### Source
+
+[src/types/core-plugin.ts:73](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-plugin.ts#L73)
+
+***
+
+### type
+
+> **type**: [`Control`](/v3/api/enumerations/plugintype/#control)
+
+#### Source
+
+[src/types/core-plugin.ts:72](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-plugin.ts#L72)
diff --git a/src/content/docs/v3/api/interfaces/Controller.md b/src/content/docs/v3/api/interfaces/Controller.md
new file mode 100644
index 000000000..3df6dc02b
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/Controller.md
@@ -0,0 +1,34 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Controller"
+---
+
+## Properties
+
+### next()
+
+> **next**: () => `Ok`\<`void`\>
+
+#### Returns
+
+`Ok`\<`void`\>
+
+#### Source
+
+[src/types/core-plugin.ts:59](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-plugin.ts#L59)
+
+***
+
+### stop()
+
+> **stop**: () => `Err`\<`void`\>
+
+#### Returns
+
+`Err`\<`void`\>
+
+#### Source
+
+[src/types/core-plugin.ts:60](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-plugin.ts#L60)
diff --git a/src/content/docs/v3/api/interfaces/CoreDependencies.md b/src/content/docs/v3/api/interfaces/CoreDependencies.md
new file mode 100644
index 000000000..7083dad8f
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/CoreDependencies.md
@@ -0,0 +1,94 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "CoreDependencies"
+---
+
+## Properties
+
+### @sern/client()
+
+> **@sern/client**: () => [`Emitter`](/v3/api/interfaces/emitter/)
+
+#### Returns
+
+[`Emitter`](/v3/api/interfaces/emitter/)
+
+#### Source
+
+[src/types/ioc.ts:28](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/ioc.ts#L28)
+
+***
+
+### @sern/emitter()
+
+> **@sern/emitter**: () => [`Emitter`](/v3/api/interfaces/emitter/)
+
+#### Returns
+
+[`Emitter`](/v3/api/interfaces/emitter/)
+
+#### Source
+
+[src/types/ioc.ts:29](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/ioc.ts#L29)
+
+***
+
+### @sern/errors()
+
+> **@sern/errors**: () => [`ErrorHandling`](/v3/api/interfaces/errorhandling/)
+
+#### Returns
+
+[`ErrorHandling`](/v3/api/interfaces/errorhandling/)
+
+#### Source
+
+[src/types/ioc.ts:36](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/ioc.ts#L36)
+
+***
+
+### @sern/logger()?
+
+> `optional` **@sern/logger**: () => [`Logging`](/v3/api/interfaces/logging/)\<`unknown`\>
+
+#### Returns
+
+[`Logging`](/v3/api/interfaces/logging/)\<`unknown`\>
+
+#### Source
+
+[src/types/ioc.ts:37](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/ioc.ts#L37)
+
+***
+
+### @sern/modules()
+
+> **@sern/modules**: () => `ModuleManager`
+
+#### Returns
+
+`ModuleManager`
+
+#### Source
+
+[src/types/ioc.ts:35](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/ioc.ts#L35)
+
+***
+
+### ~~@sern/store()~~
+
+> **@sern/store**: () => [`CoreModuleStore`](/v3/api/interfaces/coremodulestore/)
+
+:::caution[Deprecated]
+Will be removed and turned internal
+:::
+
+#### Returns
+
+[`CoreModuleStore`](/v3/api/interfaces/coremodulestore/)
+
+#### Source
+
+[src/types/ioc.ts:34](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/ioc.ts#L34)
diff --git a/src/content/docs/v3/api/interfaces/CoreModuleStore.md b/src/content/docs/v3/api/interfaces/CoreModuleStore.md
new file mode 100644
index 000000000..e8a88923a
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/CoreModuleStore.md
@@ -0,0 +1,28 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "CoreModuleStore"
+---
+
+Represents a core module store that stores IDs mapped to file paths.
+
+## Properties
+
+### commands
+
+> **commands**: `Map`\<`string`, `Module`\>
+
+#### Source
+
+[src/core/contracts/module-store.ts:7](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/contracts/module-store.ts#L7)
+
+***
+
+### metadata
+
+> **metadata**: `WeakMap`\<`Module`, `CommandMeta`\>
+
+#### Source
+
+[src/core/contracts/module-store.ts:8](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/contracts/module-store.ts#L8)
diff --git a/src/content/docs/v3/api/interfaces/DiscordEventCommand.md b/src/content/docs/v3/api/interfaces/DiscordEventCommand.md
new file mode 100644
index 000000000..2f8ac80b4
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/DiscordEventCommand.md
@@ -0,0 +1,106 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "DiscordEventCommand"
+---
+
+## Extends
+
+- `Module`
+
+## Type parameters
+
+• **T** *extends* keyof `ClientEvents` = keyof `ClientEvents`
+
+## Properties
+
+### description?
+
+> `optional` **description**: `string`
+
+#### Inherited from
+
+`Module.description`
+
+#### Source
+
+[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L36)
+
+***
+
+### name?
+
+> `optional` **name**: `T`
+
+#### Overrides
+
+`Module.name`
+
+#### Source
+
+[src/types/core-modules.ts:106](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L106)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v3/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.onEvent`
+
+#### Source
+
+[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L34)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v3/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.plugins`
+
+#### Source
+
+[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L35)
+
+***
+
+### type
+
+> **type**: [`Discord`](/v3/api/enumerations/eventtype/#discord)
+
+#### Overrides
+
+`Module.type`
+
+#### Source
+
+[src/types/core-modules.ts:107](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L107)
+
+## Methods
+
+### execute()
+
+> **execute**(...`args`): `unknown`
+
+#### Parameters
+
+• ...**args**: `ClientEvents`\[`T`\]
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+`Module.execute`
+
+#### Source
+
+[src/types/core-modules.ts:108](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L108)
diff --git a/src/content/docs/v3/api/interfaces/Disposable.md b/src/content/docs/v3/api/interfaces/Disposable.md
new file mode 100644
index 000000000..55556c63d
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/Disposable.md
@@ -0,0 +1,23 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Disposable"
+---
+
+Represents a Disposable contract.
+Let dependencies implement this to dispose and cleanup.
+
+## Methods
+
+### dispose()
+
+> **dispose**(): `unknown`
+
+#### Returns
+
+`unknown`
+
+#### Source
+
+[src/core/contracts/hooks.ts:15](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/contracts/hooks.ts#L15)
diff --git a/src/content/docs/v3/api/interfaces/Emitter.md b/src/content/docs/v3/api/interfaces/Emitter.md
new file mode 100644
index 000000000..6e0e0c6ff
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/Emitter.md
@@ -0,0 +1,66 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Emitter"
+---
+
+## Methods
+
+### addListener()
+
+> **addListener**(`eventName`, `listener`): `this`
+
+#### Parameters
+
+• **eventName**: `string` \| `symbol`
+
+• **listener**: `AnyFunction`
+
+#### Returns
+
+`this`
+
+#### Source
+
+[src/core/contracts/emitter.ts:6](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/contracts/emitter.ts#L6)
+
+***
+
+### emit()
+
+> **emit**(`eventName`, ...`payload`): `boolean`
+
+#### Parameters
+
+• **eventName**: `string` \| `symbol`
+
+• ...**payload**: `any`[]
+
+#### Returns
+
+`boolean`
+
+#### Source
+
+[src/core/contracts/emitter.ts:8](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/contracts/emitter.ts#L8)
+
+***
+
+### removeListener()
+
+> **removeListener**(`eventName`, `listener`): `this`
+
+#### Parameters
+
+• **eventName**: `string` \| `symbol`
+
+• **listener**: `AnyFunction`
+
+#### Returns
+
+`this`
+
+#### Source
+
+[src/core/contracts/emitter.ts:7](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/contracts/emitter.ts#L7)
diff --git a/src/content/docs/v3/api/interfaces/ErrorHandling.md b/src/content/docs/v3/api/interfaces/ErrorHandling.md
new file mode 100644
index 000000000..c1a652389
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/ErrorHandling.md
@@ -0,0 +1,52 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "ErrorHandling"
+---
+
+## Since
+
+2.0.0
+
+## Methods
+
+### ~~crash()~~
+
+> **crash**(`err`): `never`
+
+:::caution[Deprecated]
+Version 4 will remove this method
+:::
+
+#### Parameters
+
+• **err**: `Error`
+
+#### Returns
+
+`never`
+
+#### Source
+
+[src/core/contracts/error-handling.ts:9](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/contracts/error-handling.ts#L9)
+
+***
+
+### updateAlive()
+
+> **updateAlive**(`error`): `void`
+
+A function that is called on every throw.
+
+#### Parameters
+
+• **error**: `Error`
+
+#### Returns
+
+`void`
+
+#### Source
+
+[src/core/contracts/error-handling.ts:14](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/contracts/error-handling.ts#L14)
diff --git a/src/content/docs/v3/api/interfaces/EventModuleDefs.md b/src/content/docs/v3/api/interfaces/EventModuleDefs.md
new file mode 100644
index 000000000..44d4723d4
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/EventModuleDefs.md
@@ -0,0 +1,36 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "EventModuleDefs"
+---
+
+## Properties
+
+### 1
+
+> **1**: [`DiscordEventCommand`](/v3/api/interfaces/discordeventcommand/)\
+
+#### Source
+
+[src/types/core-modules.ts:166](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L166)
+
+***
+
+### 2
+
+> **2**: [`SernEventCommand`](/v3/api/interfaces/serneventcommand/)\
+
+#### Source
+
+[src/types/core-modules.ts:165](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L165)
+
+***
+
+### 3
+
+> **3**: [`ExternalEventCommand`](/v3/api/interfaces/externaleventcommand/)
+
+#### Source
+
+[src/types/core-modules.ts:167](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L167)
diff --git a/src/content/docs/v3/api/interfaces/ExternalEventCommand.md b/src/content/docs/v3/api/interfaces/ExternalEventCommand.md
new file mode 100644
index 000000000..2c5666e79
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/ExternalEventCommand.md
@@ -0,0 +1,112 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "ExternalEventCommand"
+---
+
+## Extends
+
+- `Module`
+
+## Properties
+
+### description?
+
+> `optional` **description**: `string`
+
+#### Inherited from
+
+`Module.description`
+
+#### Source
+
+[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L36)
+
+***
+
+### emitter
+
+> **emitter**: keyof `Dependencies`
+
+#### Source
+
+[src/types/core-modules.ts:48](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L48)
+
+***
+
+### name?
+
+> `optional` **name**: `string`
+
+#### Overrides
+
+`Module.name`
+
+#### Source
+
+[src/types/core-modules.ts:47](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L47)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v3/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.onEvent`
+
+#### Source
+
+[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L34)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v3/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.plugins`
+
+#### Source
+
+[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L35)
+
+***
+
+### type
+
+> **type**: [`External`](/v3/api/enumerations/eventtype/#external)
+
+#### Overrides
+
+`Module.type`
+
+#### Source
+
+[src/types/core-modules.ts:49](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L49)
+
+## Methods
+
+### execute()
+
+> **execute**(...`args`): `unknown`
+
+#### Parameters
+
+• ...**args**: `unknown`[]
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+`Module.execute`
+
+#### Source
+
+[src/types/core-modules.ts:50](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L50)
diff --git a/docs/api/interfaces/Init.md b/src/content/docs/v3/api/interfaces/Init.md
similarity index 51%
rename from docs/api/interfaces/Init.md
rename to src/content/docs/v3/api/interfaces/Init.md
index abe74fcd1..eeff6b130 100644
--- a/docs/api/interfaces/Init.md
+++ b/src/content/docs/v3/api/interfaces/Init.md
@@ -1,9 +1,8 @@
---
-id: "Init"
-title: "Interface: Init"
-sidebar_label: "Init"
-sidebar_position: 0
-custom_edit_url: null
+editUrl: false
+next: false
+prev: false
+title: "Init"
---
Represents an initialization contract.
@@ -11,14 +10,14 @@ Let dependencies implement this to initiate some logic.
## Methods
-### init
+### init()
-▸ **init**(): `unknown`
+> **init**(): `unknown`
#### Returns
`unknown`
-#### Defined in
+#### Source
-[src/core/contracts/hooks.ts:7](https://github.com/sern-handler/handler/blob/91b3768e376cfe22ec37d8ab44f4e4a4dfe8a1e8/src/core/contracts/hooks.ts#L7)
+[src/core/contracts/hooks.ts:7](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/contracts/hooks.ts#L7)
diff --git a/src/content/docs/v3/api/interfaces/InitPlugin.md b/src/content/docs/v3/api/interfaces/InitPlugin.md
new file mode 100644
index 000000000..d824f6946
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/InitPlugin.md
@@ -0,0 +1,38 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "InitPlugin"
+---
+
+## Type parameters
+
+• **Args** *extends* `any`[] = `any`[]
+
+## Properties
+
+### execute()
+
+> **execute**: (...`args`) => [`PluginResult`](/v3/api/type-aliases/pluginresult/)
+
+#### Parameters
+
+• ...**args**: `Args`
+
+#### Returns
+
+[`PluginResult`](/v3/api/type-aliases/pluginresult/)
+
+#### Source
+
+[src/types/core-plugin.ts:69](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-plugin.ts#L69)
+
+***
+
+### type
+
+> **type**: [`Init`](/v3/api/enumerations/plugintype/#init)
+
+#### Source
+
+[src/types/core-plugin.ts:68](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-plugin.ts#L68)
diff --git a/src/content/docs/v3/api/interfaces/Logging.md b/src/content/docs/v3/api/interfaces/Logging.md
new file mode 100644
index 000000000..f15b2721b
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/Logging.md
@@ -0,0 +1,86 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Logging"
+---
+
+## Since
+
+2.0.0
+
+## Type parameters
+
+• **T** = `unknown`
+
+## Methods
+
+### debug()
+
+> **debug**(`payload`): `void`
+
+#### Parameters
+
+• **payload**: [`LogPayload`](/v3/api/type-aliases/logpayload/)\<`T`\>
+
+#### Returns
+
+`void`
+
+#### Source
+
+[src/core/contracts/logging.ts:8](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/contracts/logging.ts#L8)
+
+***
+
+### error()
+
+> **error**(`payload`): `void`
+
+#### Parameters
+
+• **payload**: [`LogPayload`](/v3/api/type-aliases/logpayload/)\<`T`\>
+
+#### Returns
+
+`void`
+
+#### Source
+
+[src/core/contracts/logging.ts:5](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/contracts/logging.ts#L5)
+
+***
+
+### info()
+
+> **info**(`payload`): `void`
+
+#### Parameters
+
+• **payload**: [`LogPayload`](/v3/api/type-aliases/logpayload/)\<`T`\>
+
+#### Returns
+
+`void`
+
+#### Source
+
+[src/core/contracts/logging.ts:7](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/contracts/logging.ts#L7)
+
+***
+
+### warning()
+
+> **warning**(`payload`): `void`
+
+#### Parameters
+
+• **payload**: [`LogPayload`](/v3/api/type-aliases/logpayload/)\<`T`\>
+
+#### Returns
+
+`void`
+
+#### Source
+
+[src/core/contracts/logging.ts:6](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/contracts/logging.ts#L6)
diff --git a/src/content/docs/v3/api/interfaces/MentionableSelectCommand.md b/src/content/docs/v3/api/interfaces/MentionableSelectCommand.md
new file mode 100644
index 000000000..1cbe57f28
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/MentionableSelectCommand.md
@@ -0,0 +1,102 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "MentionableSelectCommand"
+---
+
+## Extends
+
+- `Module`
+
+## Properties
+
+### description?
+
+> `optional` **description**: `string`
+
+#### Inherited from
+
+`Module.description`
+
+#### Source
+
+[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L36)
+
+***
+
+### execute()
+
+> **execute**: (`ctx`) => `unknown`
+
+#### Parameters
+
+• **ctx**: `MentionableSelectMenuInteraction`\<`CacheType`\>
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+`Module.execute`
+
+#### Source
+
+[src/types/core-modules.ts:85](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L85)
+
+***
+
+### name?
+
+> `optional` **name**: `string`
+
+#### Inherited from
+
+`Module.name`
+
+#### Source
+
+[src/types/core-modules.ts:33](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L33)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v3/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.onEvent`
+
+#### Source
+
+[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L34)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v3/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.plugins`
+
+#### Source
+
+[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L35)
+
+***
+
+### type
+
+> **type**: [`MentionableSelect`](/v3/api/enumerations/commandtype/#mentionableselect)
+
+#### Overrides
+
+`Module.type`
+
+#### Source
+
+[src/types/core-modules.ts:84](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L84)
diff --git a/src/content/docs/v3/api/interfaces/ModalSubmitCommand.md b/src/content/docs/v3/api/interfaces/ModalSubmitCommand.md
new file mode 100644
index 000000000..5f0ea6e56
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/ModalSubmitCommand.md
@@ -0,0 +1,102 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "ModalSubmitCommand"
+---
+
+## Extends
+
+- `Module`
+
+## Properties
+
+### description?
+
+> `optional` **description**: `string`
+
+#### Inherited from
+
+`Module.description`
+
+#### Source
+
+[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L36)
+
+***
+
+### execute()
+
+> **execute**: (`ctx`) => `unknown`
+
+#### Parameters
+
+• **ctx**: `ModalSubmitInteraction`\<`CacheType`\>
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+`Module.execute`
+
+#### Source
+
+[src/types/core-modules.ts:95](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L95)
+
+***
+
+### name?
+
+> `optional` **name**: `string`
+
+#### Inherited from
+
+`Module.name`
+
+#### Source
+
+[src/types/core-modules.ts:33](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L33)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v3/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.onEvent`
+
+#### Source
+
+[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L34)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v3/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.plugins`
+
+#### Source
+
+[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L35)
+
+***
+
+### type
+
+> **type**: [`Modal`](/v3/api/enumerations/commandtype/#modal)
+
+#### Overrides
+
+`Module.type`
+
+#### Source
+
+[src/types/core-modules.ts:94](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L94)
diff --git a/src/content/docs/v3/api/interfaces/Plugin.md b/src/content/docs/v3/api/interfaces/Plugin.md
new file mode 100644
index 000000000..3bae18bad
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/Plugin.md
@@ -0,0 +1,38 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Plugin"
+---
+
+## Type parameters
+
+• **Args** *extends* `any`[] = `any`[]
+
+## Properties
+
+### execute()
+
+> **execute**: (...`args`) => [`PluginResult`](/v3/api/type-aliases/pluginresult/)
+
+#### Parameters
+
+• ...**args**: `Args`
+
+#### Returns
+
+[`PluginResult`](/v3/api/type-aliases/pluginresult/)
+
+#### Source
+
+[src/types/core-plugin.ts:64](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-plugin.ts#L64)
+
+***
+
+### type
+
+> **type**: [`PluginType`](/v3/api/enumerations/plugintype/)
+
+#### Source
+
+[src/types/core-plugin.ts:63](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-plugin.ts#L63)
diff --git a/src/content/docs/v3/api/interfaces/RoleSelectCommand.md b/src/content/docs/v3/api/interfaces/RoleSelectCommand.md
new file mode 100644
index 000000000..75c74648d
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/RoleSelectCommand.md
@@ -0,0 +1,102 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "RoleSelectCommand"
+---
+
+## Extends
+
+- `Module`
+
+## Properties
+
+### description?
+
+> `optional` **description**: `string`
+
+#### Inherited from
+
+`Module.description`
+
+#### Source
+
+[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L36)
+
+***
+
+### execute()
+
+> **execute**: (`ctx`) => `unknown`
+
+#### Parameters
+
+• **ctx**: `RoleSelectMenuInteraction`\<`CacheType`\>
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+`Module.execute`
+
+#### Source
+
+[src/types/core-modules.ts:80](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L80)
+
+***
+
+### name?
+
+> `optional` **name**: `string`
+
+#### Inherited from
+
+`Module.name`
+
+#### Source
+
+[src/types/core-modules.ts:33](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L33)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v3/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.onEvent`
+
+#### Source
+
+[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L34)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v3/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.plugins`
+
+#### Source
+
+[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L35)
+
+***
+
+### type
+
+> **type**: [`RoleSelect`](/v3/api/enumerations/commandtype/#roleselect)
+
+#### Overrides
+
+`Module.type`
+
+#### Source
+
+[src/types/core-modules.ts:79](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L79)
diff --git a/src/content/docs/v3/api/interfaces/SernAutocompleteData.md b/src/content/docs/v3/api/interfaces/SernAutocompleteData.md
new file mode 100644
index 000000000..f636f6c64
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/SernAutocompleteData.md
@@ -0,0 +1,110 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "SernAutocompleteData"
+---
+
+## Extends
+
+- `Omit`\<`BaseApplicationCommandOptionsData`, `"autocomplete"`\>
+
+## Properties
+
+### autocomplete
+
+> **autocomplete**: `true`
+
+#### Source
+
+[src/types/core-modules.ts:172](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L172)
+
+***
+
+### command
+
+> **command**: `AutocompleteCommand`
+
+#### Source
+
+[src/types/core-modules.ts:177](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L177)
+
+***
+
+### description
+
+> **description**: `string`
+
+#### Inherited from
+
+`Omit.description`
+
+#### Source
+
+node\_modules/discord.js/typings/index.d.ts:4715
+
+***
+
+### descriptionLocalizations?
+
+> `optional` **descriptionLocalizations**: `Partial`\<`Record`\<`"id"` \| `"en-US"` \| `"en-GB"` \| `"bg"` \| `"zh-CN"` \| `"zh-TW"` \| `"hr"` \| `"cs"` \| `"da"` \| `"nl"` \| `"fi"` \| `"fr"` \| `"de"` \| `"el"` \| `"hi"` \| `"hu"` \| `"it"` \| `"ja"` \| `"ko"` \| `"lt"` \| `"no"` \| `"pl"` \| `"pt-BR"` \| `"ro"` \| `"ru"` \| `"es-ES"` \| `"es-419"` \| `"sv-SE"` \| `"th"` \| `"tr"` \| `"uk"` \| `"vi"`, `null` \| `string`\>\>
+
+#### Inherited from
+
+`Omit.descriptionLocalizations`
+
+#### Source
+
+node\_modules/discord.js/typings/index.d.ts:4716
+
+***
+
+### name
+
+> **name**: `string`
+
+#### Inherited from
+
+`Omit.name`
+
+#### Source
+
+node\_modules/discord.js/typings/index.d.ts:4713
+
+***
+
+### nameLocalizations?
+
+> `optional` **nameLocalizations**: `Partial`\<`Record`\<`"id"` \| `"en-US"` \| `"en-GB"` \| `"bg"` \| `"zh-CN"` \| `"zh-TW"` \| `"hr"` \| `"cs"` \| `"da"` \| `"nl"` \| `"fi"` \| `"fr"` \| `"de"` \| `"el"` \| `"hi"` \| `"hu"` \| `"it"` \| `"ja"` \| `"ko"` \| `"lt"` \| `"no"` \| `"pl"` \| `"pt-BR"` \| `"ro"` \| `"ru"` \| `"es-ES"` \| `"es-419"` \| `"sv-SE"` \| `"th"` \| `"tr"` \| `"uk"` \| `"vi"`, `null` \| `string`\>\>
+
+#### Inherited from
+
+`Omit.nameLocalizations`
+
+#### Source
+
+node\_modules/discord.js/typings/index.d.ts:4714
+
+***
+
+### required?
+
+> `optional` **required**: `boolean`
+
+#### Inherited from
+
+`Omit.required`
+
+#### Source
+
+node\_modules/discord.js/typings/index.d.ts:4717
+
+***
+
+### type
+
+> **type**: `String` \| `Integer` \| `Number`
+
+#### Source
+
+[src/types/core-modules.ts:173](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L173)
diff --git a/src/content/docs/v3/api/interfaces/SernEventCommand.md b/src/content/docs/v3/api/interfaces/SernEventCommand.md
new file mode 100644
index 000000000..788b80488
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/SernEventCommand.md
@@ -0,0 +1,106 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "SernEventCommand"
+---
+
+## Extends
+
+- `Module`
+
+## Type parameters
+
+• **T** *extends* keyof [`SernEventsMapping`](/v3/api/interfaces/serneventsmapping/) = keyof [`SernEventsMapping`](/v3/api/interfaces/serneventsmapping/)
+
+## Properties
+
+### description?
+
+> `optional` **description**: `string`
+
+#### Inherited from
+
+`Module.description`
+
+#### Source
+
+[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L36)
+
+***
+
+### name?
+
+> `optional` **name**: `T`
+
+#### Overrides
+
+`Module.name`
+
+#### Source
+
+[src/types/core-modules.ts:42](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L42)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v3/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.onEvent`
+
+#### Source
+
+[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L34)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v3/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.plugins`
+
+#### Source
+
+[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L35)
+
+***
+
+### type
+
+> **type**: [`Sern`](/v3/api/enumerations/eventtype/#sern)
+
+#### Overrides
+
+`Module.type`
+
+#### Source
+
+[src/types/core-modules.ts:43](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L43)
+
+## Methods
+
+### execute()
+
+> **execute**(...`args`): `unknown`
+
+#### Parameters
+
+• ...**args**: [`SernEventsMapping`](/v3/api/interfaces/serneventsmapping/)\[`T`\]
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+`Module.execute`
+
+#### Source
+
+[src/types/core-modules.ts:44](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L44)
diff --git a/src/content/docs/v3/api/interfaces/SernEventsMapping.md b/src/content/docs/v3/api/interfaces/SernEventsMapping.md
new file mode 100644
index 000000000..c8daa49d1
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/SernEventsMapping.md
@@ -0,0 +1,56 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "SernEventsMapping"
+---
+
+## Properties
+
+### error
+
+> **error**: [`object`]
+
+#### Source
+
+[src/types/utility.ts:21](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/utility.ts#L21)
+
+***
+
+### module.activate
+
+> **module.activate**: [[`Payload`](/v3/api/type-aliases/payload/)]
+
+#### Source
+
+[src/types/utility.ts:20](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/utility.ts#L20)
+
+***
+
+### module.register
+
+> **module.register**: [[`Payload`](/v3/api/type-aliases/payload/)]
+
+#### Source
+
+[src/types/utility.ts:19](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/utility.ts#L19)
+
+***
+
+### modulesLoaded
+
+> **modulesLoaded**: [`undefined?`]
+
+#### Source
+
+[src/types/utility.ts:23](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/utility.ts#L23)
+
+***
+
+### warning
+
+> **warning**: [[`Payload`](/v3/api/type-aliases/payload/)]
+
+#### Source
+
+[src/types/utility.ts:22](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/utility.ts#L22)
diff --git a/src/content/docs/v3/api/interfaces/SernSubCommandData.md b/src/content/docs/v3/api/interfaces/SernSubCommandData.md
new file mode 100644
index 000000000..cfee85fc8
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/SernSubCommandData.md
@@ -0,0 +1,104 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "SernSubCommandData"
+---
+
+## Extends
+
+- `APIApplicationCommandOptionBase`\<`ApplicationCommandOptionType.Subcommand`\>
+
+## Properties
+
+### description
+
+> **description**: `string`
+
+#### Inherited from
+
+`APIApplicationCommandOptionBase.description`
+
+#### Source
+
+node\_modules/discord-api-types/payloads/v10/\_interactions/\_applicationCommands/\_chatInput/base.d.ts:7
+
+***
+
+### description\_localizations?
+
+> `optional` **description\_localizations**: `null` \| `Partial`\<`Record`\<`"id"` \| `"en-US"` \| `"en-GB"` \| `"bg"` \| `"zh-CN"` \| `"zh-TW"` \| `"hr"` \| `"cs"` \| `"da"` \| `"nl"` \| `"fi"` \| `"fr"` \| `"de"` \| `"el"` \| `"hi"` \| `"hu"` \| `"it"` \| `"ja"` \| `"ko"` \| `"lt"` \| `"no"` \| `"pl"` \| `"pt-BR"` \| `"ro"` \| `"ru"` \| `"es-ES"` \| `"es-419"` \| `"sv-SE"` \| `"th"` \| `"tr"` \| `"uk"` \| `"vi"`, `null` \| `string`\>\>
+
+#### Inherited from
+
+`APIApplicationCommandOptionBase.description_localizations`
+
+#### Source
+
+node\_modules/discord-api-types/payloads/v10/\_interactions/\_applicationCommands/\_chatInput/base.d.ts:8
+
+***
+
+### name
+
+> **name**: `string`
+
+#### Inherited from
+
+`APIApplicationCommandOptionBase.name`
+
+#### Source
+
+node\_modules/discord-api-types/payloads/v10/\_interactions/\_applicationCommands/\_chatInput/base.d.ts:5
+
+***
+
+### name\_localizations?
+
+> `optional` **name\_localizations**: `null` \| `Partial`\<`Record`\<`"id"` \| `"en-US"` \| `"en-GB"` \| `"bg"` \| `"zh-CN"` \| `"zh-TW"` \| `"hr"` \| `"cs"` \| `"da"` \| `"nl"` \| `"fi"` \| `"fr"` \| `"de"` \| `"el"` \| `"hi"` \| `"hu"` \| `"it"` \| `"ja"` \| `"ko"` \| `"lt"` \| `"no"` \| `"pl"` \| `"pt-BR"` \| `"ro"` \| `"ru"` \| `"es-ES"` \| `"es-419"` \| `"sv-SE"` \| `"th"` \| `"tr"` \| `"uk"` \| `"vi"`, `null` \| `string`\>\>
+
+#### Inherited from
+
+`APIApplicationCommandOptionBase.name_localizations`
+
+#### Source
+
+node\_modules/discord-api-types/payloads/v10/\_interactions/\_applicationCommands/\_chatInput/base.d.ts:6
+
+***
+
+### options?
+
+> `optional` **options**: [`SernOptionsData`](/v3/api/type-aliases/sernoptionsdata/)[]
+
+#### Source
+
+[src/types/core-modules.ts:209](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L209)
+
+***
+
+### required?
+
+> `optional` **required**: `boolean`
+
+#### Inherited from
+
+`APIApplicationCommandOptionBase.required`
+
+#### Source
+
+node\_modules/discord-api-types/payloads/v10/\_interactions/\_applicationCommands/\_chatInput/base.d.ts:9
+
+***
+
+### type
+
+> **type**: `Subcommand`
+
+#### Overrides
+
+`APIApplicationCommandOptionBase.type`
+
+#### Source
+
+[src/types/core-modules.ts:208](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L208)
diff --git a/src/content/docs/v3/api/interfaces/SernSubCommandGroupData.md b/src/content/docs/v3/api/interfaces/SernSubCommandGroupData.md
new file mode 100644
index 000000000..6d1b8da33
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/SernSubCommandGroupData.md
@@ -0,0 +1,114 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "SernSubCommandGroupData"
+---
+
+## Extends
+
+- `BaseApplicationCommandOptionsData`
+
+## Properties
+
+### autocomplete?
+
+> `optional` **autocomplete**: `undefined`
+
+#### Inherited from
+
+`BaseApplicationCommandOptionsData.autocomplete`
+
+#### Source
+
+node\_modules/discord.js/typings/index.d.ts:4718
+
+***
+
+### description
+
+> **description**: `string`
+
+#### Inherited from
+
+`BaseApplicationCommandOptionsData.description`
+
+#### Source
+
+node\_modules/discord.js/typings/index.d.ts:4715
+
+***
+
+### descriptionLocalizations?
+
+> `optional` **descriptionLocalizations**: `Partial`\<`Record`\<`"id"` \| `"en-US"` \| `"en-GB"` \| `"bg"` \| `"zh-CN"` \| `"zh-TW"` \| `"hr"` \| `"cs"` \| `"da"` \| `"nl"` \| `"fi"` \| `"fr"` \| `"de"` \| `"el"` \| `"hi"` \| `"hu"` \| `"it"` \| `"ja"` \| `"ko"` \| `"lt"` \| `"no"` \| `"pl"` \| `"pt-BR"` \| `"ro"` \| `"ru"` \| `"es-ES"` \| `"es-419"` \| `"sv-SE"` \| `"th"` \| `"tr"` \| `"uk"` \| `"vi"`, `null` \| `string`\>\>
+
+#### Inherited from
+
+`BaseApplicationCommandOptionsData.descriptionLocalizations`
+
+#### Source
+
+node\_modules/discord.js/typings/index.d.ts:4716
+
+***
+
+### name
+
+> **name**: `string`
+
+#### Inherited from
+
+`BaseApplicationCommandOptionsData.name`
+
+#### Source
+
+node\_modules/discord.js/typings/index.d.ts:4713
+
+***
+
+### nameLocalizations?
+
+> `optional` **nameLocalizations**: `Partial`\<`Record`\<`"id"` \| `"en-US"` \| `"en-GB"` \| `"bg"` \| `"zh-CN"` \| `"zh-TW"` \| `"hr"` \| `"cs"` \| `"da"` \| `"nl"` \| `"fi"` \| `"fr"` \| `"de"` \| `"el"` \| `"hi"` \| `"hu"` \| `"it"` \| `"ja"` \| `"ko"` \| `"lt"` \| `"no"` \| `"pl"` \| `"pt-BR"` \| `"ro"` \| `"ru"` \| `"es-ES"` \| `"es-419"` \| `"sv-SE"` \| `"th"` \| `"tr"` \| `"uk"` \| `"vi"`, `null` \| `string`\>\>
+
+#### Inherited from
+
+`BaseApplicationCommandOptionsData.nameLocalizations`
+
+#### Source
+
+node\_modules/discord.js/typings/index.d.ts:4714
+
+***
+
+### options?
+
+> `optional` **options**: [`SernSubCommandData`](/v3/api/interfaces/sernsubcommanddata/)[]
+
+#### Source
+
+[src/types/core-modules.ts:214](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L214)
+
+***
+
+### required?
+
+> `optional` **required**: `boolean`
+
+#### Inherited from
+
+`BaseApplicationCommandOptionsData.required`
+
+#### Source
+
+node\_modules/discord.js/typings/index.d.ts:4717
+
+***
+
+### type
+
+> **type**: `SubcommandGroup`
+
+#### Source
+
+[src/types/core-modules.ts:213](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L213)
diff --git a/src/content/docs/v3/api/interfaces/SlashCommand.md b/src/content/docs/v3/api/interfaces/SlashCommand.md
new file mode 100644
index 000000000..2c6a065c1
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/SlashCommand.md
@@ -0,0 +1,114 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "SlashCommand"
+---
+
+## Extends
+
+- `Module`
+
+## Properties
+
+### description
+
+> **description**: `string`
+
+#### Overrides
+
+`Module.description`
+
+#### Source
+
+[src/types/core-modules.ts:118](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L118)
+
+***
+
+### execute()
+
+> **execute**: (`ctx`, `args`) => `unknown`
+
+#### Parameters
+
+• **ctx**: [`Context`](/v3/api/classes/context/)
+
+• **args**: [`"slash"`, [`SlashOptions`](/v3/api/type-aliases/slashoptions/)]
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+`Module.execute`
+
+#### Source
+
+[src/types/core-modules.ts:120](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L120)
+
+***
+
+### name?
+
+> `optional` **name**: `string`
+
+#### Inherited from
+
+`Module.name`
+
+#### Source
+
+[src/types/core-modules.ts:33](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L33)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v3/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.onEvent`
+
+#### Source
+
+[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L34)
+
+***
+
+### options?
+
+> `optional` **options**: [`SernOptionsData`](/v3/api/type-aliases/sernoptionsdata/)[]
+
+#### Source
+
+[src/types/core-modules.ts:119](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L119)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v3/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.plugins`
+
+#### Source
+
+[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L35)
+
+***
+
+### type
+
+> **type**: [`Slash`](/v3/api/enumerations/commandtype/#slash)
+
+#### Overrides
+
+`Module.type`
+
+#### Source
+
+[src/types/core-modules.ts:117](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L117)
diff --git a/src/content/docs/v3/api/interfaces/StringSelectCommand.md b/src/content/docs/v3/api/interfaces/StringSelectCommand.md
new file mode 100644
index 000000000..9b0f744cd
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/StringSelectCommand.md
@@ -0,0 +1,102 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "StringSelectCommand"
+---
+
+## Extends
+
+- `Module`
+
+## Properties
+
+### description?
+
+> `optional` **description**: `string`
+
+#### Inherited from
+
+`Module.description`
+
+#### Source
+
+[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L36)
+
+***
+
+### execute()
+
+> **execute**: (`ctx`) => `unknown`
+
+#### Parameters
+
+• **ctx**: `StringSelectMenuInteraction`\<`CacheType`\>
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+`Module.execute`
+
+#### Source
+
+[src/types/core-modules.ts:70](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L70)
+
+***
+
+### name?
+
+> `optional` **name**: `string`
+
+#### Inherited from
+
+`Module.name`
+
+#### Source
+
+[src/types/core-modules.ts:33](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L33)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v3/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.onEvent`
+
+#### Source
+
+[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L34)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v3/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.plugins`
+
+#### Source
+
+[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L35)
+
+***
+
+### type
+
+> **type**: [`StringSelect`](/v3/api/enumerations/commandtype/#stringselect)
+
+#### Overrides
+
+`Module.type`
+
+#### Source
+
+[src/types/core-modules.ts:69](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L69)
diff --git a/src/content/docs/v3/api/interfaces/TextCommand.md b/src/content/docs/v3/api/interfaces/TextCommand.md
new file mode 100644
index 000000000..25b4c7e0a
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/TextCommand.md
@@ -0,0 +1,114 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "TextCommand"
+---
+
+## Extends
+
+- `Module`
+
+## Properties
+
+### alias?
+
+> `optional` **alias**: `string`[]
+
+#### Source
+
+[src/types/core-modules.ts:112](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L112)
+
+***
+
+### description?
+
+> `optional` **description**: `string`
+
+#### Inherited from
+
+`Module.description`
+
+#### Source
+
+[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L36)
+
+***
+
+### execute()
+
+> **execute**: (`ctx`, `args`) => `unknown`
+
+#### Parameters
+
+• **ctx**: [`Context`](/v3/api/classes/context/)
+
+• **args**: [`"text"`, `string`[]]
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+`Module.execute`
+
+#### Source
+
+[src/types/core-modules.ts:113](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L113)
+
+***
+
+### name?
+
+> `optional` **name**: `string`
+
+#### Inherited from
+
+`Module.name`
+
+#### Source
+
+[src/types/core-modules.ts:33](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L33)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v3/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.onEvent`
+
+#### Source
+
+[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L34)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v3/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.plugins`
+
+#### Source
+
+[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L35)
+
+***
+
+### type
+
+> **type**: [`Text`](/v3/api/enumerations/commandtype/#text)
+
+#### Overrides
+
+`Module.type`
+
+#### Source
+
+[src/types/core-modules.ts:111](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L111)
diff --git a/src/content/docs/v3/api/interfaces/UserSelectCommand.md b/src/content/docs/v3/api/interfaces/UserSelectCommand.md
new file mode 100644
index 000000000..4ef240496
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/UserSelectCommand.md
@@ -0,0 +1,102 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "UserSelectCommand"
+---
+
+## Extends
+
+- `Module`
+
+## Properties
+
+### description?
+
+> `optional` **description**: `string`
+
+#### Inherited from
+
+`Module.description`
+
+#### Source
+
+[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L36)
+
+***
+
+### execute()
+
+> **execute**: (`ctx`) => `unknown`
+
+#### Parameters
+
+• **ctx**: `UserSelectMenuInteraction`\<`CacheType`\>
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+`Module.execute`
+
+#### Source
+
+[src/types/core-modules.ts:90](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L90)
+
+***
+
+### name?
+
+> `optional` **name**: `string`
+
+#### Inherited from
+
+`Module.name`
+
+#### Source
+
+[src/types/core-modules.ts:33](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L33)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v3/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.onEvent`
+
+#### Source
+
+[src/types/core-modules.ts:34](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L34)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v3/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+`Module.plugins`
+
+#### Source
+
+[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L35)
+
+***
+
+### type
+
+> **type**: [`UserSelect`](/v3/api/enumerations/commandtype/#userselect)
+
+#### Overrides
+
+`Module.type`
+
+#### Source
+
+[src/types/core-modules.ts:89](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L89)
diff --git a/src/content/docs/v3/api/interfaces/Wrapper.md b/src/content/docs/v3/api/interfaces/Wrapper.md
new file mode 100644
index 000000000..3716dd84a
--- /dev/null
+++ b/src/content/docs/v3/api/interfaces/Wrapper.md
@@ -0,0 +1,74 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Wrapper"
+---
+
+## Properties
+
+### commands
+
+> **commands**: `string`
+
+#### Source
+
+[src/types/core.ts:9](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core.ts#L9)
+
+***
+
+### containerConfig?
+
+> `optional` **containerConfig**: `object`
+
+#### get()
+
+> **get**: (...`keys`) => `unknown`[]
+
+##### Parameters
+
+• ...**keys**: keyof `Dependencies`[]
+
+##### Returns
+
+`unknown`[]
+
+#### Source
+
+[src/types/core.ts:20](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core.ts#L20)
+
+***
+
+### defaultPrefix?
+
+> `optional` **defaultPrefix**: `string`
+
+#### Source
+
+[src/types/core.ts:10](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core.ts#L10)
+
+***
+
+### events?
+
+> `optional` **events**: `string`
+
+#### Source
+
+[src/types/core.ts:11](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core.ts#L11)
+
+***
+
+### ~~mode?~~
+
+> `optional` **mode**: `string`
+
+Overload to enable mode in case developer does not use a .env file.
+
+:::caution[Deprecated]
+- https://github.com/sern-handler/handler/pull/325
+:::
+
+#### Source
+
+[src/types/core.ts:16](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core.ts#L16)
diff --git a/src/content/docs/v3/api/namespaces/Presence/functions/module.md b/src/content/docs/v3/api/namespaces/Presence/functions/module.md
new file mode 100644
index 000000000..2b7a73169
--- /dev/null
+++ b/src/content/docs/v3/api/namespaces/Presence/functions/module.md
@@ -0,0 +1,28 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "module"
+---
+
+> **module**\<`T`\>(`conf`): [`Config`](/v3/api/namespaces/presence/type-aliases/config/)\<`T`\>
+
+A small wrapper to provide type inference.
+Create a Presence module which **MUST** be put in a file called presence.(language-extension)
+adjacent to the file where **Sern.init** is CALLED.
+
+## Type parameters
+
+• **T** *extends* keyof `Dependencies`[]
+
+## Parameters
+
+• **conf**: [`Config`](/v3/api/namespaces/presence/type-aliases/config/)\<`T`\>
+
+## Returns
+
+[`Config`](/v3/api/namespaces/presence/type-aliases/config/)\<`T`\>
+
+## Source
+
+[src/core/presences.ts:28](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/presences.ts#L28)
diff --git a/src/content/docs/v3/api/namespaces/Presence/functions/of.md b/src/content/docs/v3/api/namespaces/Presence/functions/of.md
new file mode 100644
index 000000000..69a871411
--- /dev/null
+++ b/src/content/docs/v3/api/namespaces/Presence/functions/of.md
@@ -0,0 +1,97 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "of"
+---
+
+> **of**(`root`): `object`
+
+Create a Presence body which can be either:
+- once, the presence is activated only once.
+- repeated, per cycle or event, the presence can be changed.
+
+## Parameters
+
+• **root**: `Omit`\<[`Result`](/v3/api/namespaces/presence/interfaces/result/), `"repeat"` \| `"onRepeat"`\>
+
+## Returns
+
+`object`
+
+### once()
+
+> **once**: () => `Omit`\<[`Result`](/v3/api/namespaces/presence/interfaces/result/), `"repeat"` \| `"onRepeat"`\>
+
+#### Example
+
+```ts
+Presence
+ .of({
+ activities: [
+ { name: "Chilling out" }
+ ]
+ })
+ .once() // Sets the presence once, with what's provided in '.of()'
+```
+
+#### Returns
+
+`Omit`\<[`Result`](/v3/api/namespaces/presence/interfaces/result/), `"repeat"` \| `"onRepeat"`\>
+
+### repeated()
+
+> **repeated**: (`onRepeat`, `repeat`) => `object`
+
+#### Example
+
+```ts
+Presence
+ .of({
+ activities: [{ name: "deez nuts" }]
+ }) //starts the presence with "deez nuts".
+ .repeated(prev => {
+ return {
+ afk: true,
+ activities: prev.activities?.map(s => ({ ...s, name: s.name+"s" }))
+ };
+ }, 10000)) //every 10 s, the callback sets the presence to the returned one.
+```
+
+#### Parameters
+
+• **onRepeat**: `PresenceReduce`
+
+• **repeat**: `number` \| [[`Emitter`](/v3/api/interfaces/emitter/), `string`]
+
+#### Returns
+
+`object`
+
+##### activities?
+
+> `optional` **activities**: `ActivitiesOptions`[]
+
+##### afk?
+
+> `optional` **afk**: `boolean`
+
+##### onRepeat
+
+> **onRepeat**: `PresenceReduce`
+
+##### repeat
+
+> **repeat**: `number` \| [[`Emitter`](/v3/api/interfaces/emitter/), `string`]
+
+##### shardId?
+
+> `optional` **shardId**: `number`[]
+
+##### status?
+
+> `optional` **status**: `Status`
+
+## Source
+
+[src/core/presences.ts:37](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/presences.ts#L37)
diff --git a/src/content/docs/v3/api/namespaces/Presence/interfaces/Result.md b/src/content/docs/v3/api/namespaces/Presence/interfaces/Result.md
new file mode 100644
index 000000000..7a06246e3
--- /dev/null
+++ b/src/content/docs/v3/api/namespaces/Presence/interfaces/Result.md
@@ -0,0 +1,74 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Result"
+---
+
+## Properties
+
+### activities?
+
+> `optional` **activities**: `ActivitiesOptions`[]
+
+#### Source
+
+[src/core/presences.ts:11](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/presences.ts#L11)
+
+***
+
+### afk?
+
+> `optional` **afk**: `boolean`
+
+#### Source
+
+[src/core/presences.ts:10](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/presences.ts#L10)
+
+***
+
+### onRepeat()?
+
+> `optional` **onRepeat**: (`previous`) => [`Result`](/v3/api/namespaces/presence/interfaces/result/)
+
+#### Parameters
+
+• **previous**: [`Result`](/v3/api/namespaces/presence/interfaces/result/)
+
+#### Returns
+
+[`Result`](/v3/api/namespaces/presence/interfaces/result/)
+
+#### Source
+
+[src/core/presences.ts:14](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/presences.ts#L14)
+
+***
+
+### repeat?
+
+> `optional` **repeat**: `number` \| [[`Emitter`](/v3/api/interfaces/emitter/), `string`]
+
+#### Source
+
+[src/core/presences.ts:13](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/presences.ts#L13)
+
+***
+
+### shardId?
+
+> `optional` **shardId**: `number`[]
+
+#### Source
+
+[src/core/presences.ts:12](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/presences.ts#L12)
+
+***
+
+### status?
+
+> `optional` **status**: `Status`
+
+#### Source
+
+[src/core/presences.ts:9](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/presences.ts#L9)
diff --git a/src/content/docs/v3/api/namespaces/Presence/type-aliases/Config.md b/src/content/docs/v3/api/namespaces/Presence/type-aliases/Config.md
new file mode 100644
index 000000000..eb43cec90
--- /dev/null
+++ b/src/content/docs/v3/api/namespaces/Presence/type-aliases/Config.md
@@ -0,0 +1,34 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Config"
+---
+
+> **Config**\<`T`\>: `object`
+
+## Type parameters
+
+• **T** *extends* keyof `Dependencies`[]
+
+## Type declaration
+
+### execute()
+
+> **execute**: (...`v`) => [`Result`](/v3/api/namespaces/presence/interfaces/result/)
+
+#### Parameters
+
+• ...**v**: `IntoDependencies`\<`T`\>
+
+#### Returns
+
+[`Result`](/v3/api/namespaces/presence/interfaces/result/)
+
+### inject?
+
+> `optional` **inject**: [`...T`]
+
+## Source
+
+[src/core/presences.ts:17](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/presences.ts#L17)
diff --git a/src/content/docs/v3/api/namespaces/Sern/functions/init.md b/src/content/docs/v3/api/namespaces/Sern/functions/init.md
new file mode 100644
index 000000000..b4a88e952
--- /dev/null
+++ b/src/content/docs/v3/api/namespaces/Sern/functions/init.md
@@ -0,0 +1,36 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "init"
+---
+
+> **init**(`maybeWrapper`): `void`
+
+## Parameters
+
+• **maybeWrapper**: [`Wrapper`](/v3/api/interfaces/wrapper/) \| `"file"`
+
+Options to pass into sern.
+Function to start the handler up
+
+## Returns
+
+`void`
+
+## Since
+
+1.0.0
+
+## Example
+
+```ts title="src/index.ts"
+Sern.init({
+ commands: 'dist/commands',
+ events: 'dist/events',
+})
+```
+
+## Source
+
+[src/sern.ts:26](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/sern.ts#L26)
diff --git a/src/content/docs/v3/api/type-aliases/AnyCommandPlugin.md b/src/content/docs/v3/api/type-aliases/AnyCommandPlugin.md
new file mode 100644
index 000000000..c8f9203b0
--- /dev/null
+++ b/src/content/docs/v3/api/type-aliases/AnyCommandPlugin.md
@@ -0,0 +1,12 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "AnyCommandPlugin"
+---
+
+> **AnyCommandPlugin**: [`ControlPlugin`](/v3/api/interfaces/controlplugin/) \| [`InitPlugin`](/v3/api/interfaces/initplugin/)\<[`InitArgs`\<`Processed`\<[`CommandModule`](/v3/api/type-aliases/commandmodule/)\>\>]\>
+
+## Source
+
+[src/types/core-plugin.ts:76](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-plugin.ts#L76)
diff --git a/src/content/docs/v3/api/type-aliases/AnyEventPlugin.md b/src/content/docs/v3/api/type-aliases/AnyEventPlugin.md
new file mode 100644
index 000000000..a743b00a3
--- /dev/null
+++ b/src/content/docs/v3/api/type-aliases/AnyEventPlugin.md
@@ -0,0 +1,12 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "AnyEventPlugin"
+---
+
+> **AnyEventPlugin**: [`ControlPlugin`](/v3/api/interfaces/controlplugin/) \| [`InitPlugin`](/v3/api/interfaces/initplugin/)\<[`InitArgs`\<`Processed`\<[`EventModule`](/v3/api/type-aliases/eventmodule/)\>\>]\>
+
+## Source
+
+[src/types/core-plugin.ts:77](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-plugin.ts#L77)
diff --git a/src/content/docs/v3/api/type-aliases/Args.md b/src/content/docs/v3/api/type-aliases/Args.md
new file mode 100644
index 000000000..40914b8c5
--- /dev/null
+++ b/src/content/docs/v3/api/type-aliases/Args.md
@@ -0,0 +1,22 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Args"
+---
+
+> **Args**: `ParseType`\<`object`\>
+
+## Type declaration
+
+### slash
+
+> **slash**: [`SlashOptions`](/v3/api/type-aliases/slashoptions/)
+
+### text
+
+> **text**: `string`[]
+
+## Source
+
+[src/types/utility.ts:16](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/utility.ts#L16)
diff --git a/src/content/docs/v3/api/type-aliases/CommandModule.md b/src/content/docs/v3/api/type-aliases/CommandModule.md
new file mode 100644
index 000000000..12b2a2356
--- /dev/null
+++ b/src/content/docs/v3/api/type-aliases/CommandModule.md
@@ -0,0 +1,12 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "CommandModule"
+---
+
+> **CommandModule**: [`TextCommand`](/v3/api/interfaces/textcommand/) \| [`SlashCommand`](/v3/api/interfaces/slashcommand/) \| [`BothCommand`](/v3/api/interfaces/bothcommand/) \| [`ContextMenuUser`](/v3/api/interfaces/contextmenuuser/) \| [`ContextMenuMsg`](/v3/api/interfaces/contextmenumsg/) \| [`ButtonCommand`](/v3/api/interfaces/buttoncommand/) \| [`StringSelectCommand`](/v3/api/interfaces/stringselectcommand/) \| [`MentionableSelectCommand`](/v3/api/interfaces/mentionableselectcommand/) \| [`UserSelectCommand`](/v3/api/interfaces/userselectcommand/) \| [`ChannelSelectCommand`](/v3/api/interfaces/channelselectcommand/) \| [`RoleSelectCommand`](/v3/api/interfaces/roleselectcommand/) \| [`ModalSubmitCommand`](/v3/api/interfaces/modalsubmitcommand/)
+
+## Source
+
+[src/types/core-modules.ts:132](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L132)
diff --git a/src/content/docs/v3/api/type-aliases/EventModule.md b/src/content/docs/v3/api/type-aliases/EventModule.md
new file mode 100644
index 000000000..f1cbc9db1
--- /dev/null
+++ b/src/content/docs/v3/api/type-aliases/EventModule.md
@@ -0,0 +1,12 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "EventModule"
+---
+
+> **EventModule**: [`DiscordEventCommand`](/v3/api/interfaces/discordeventcommand/) \| [`SernEventCommand`](/v3/api/interfaces/serneventcommand/) \| [`ExternalEventCommand`](/v3/api/interfaces/externaleventcommand/)
+
+## Source
+
+[src/types/core-modules.ts:131](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L131)
diff --git a/src/content/docs/v3/api/type-aliases/Initializable.md b/src/content/docs/v3/api/type-aliases/Initializable.md
new file mode 100644
index 000000000..5d521a48e
--- /dev/null
+++ b/src/content/docs/v3/api/type-aliases/Initializable.md
@@ -0,0 +1,19 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Initializable"
+---
+
+> **Initializable**\<`T`\>: `T`
+
+Type to annotate that something is initializable.
+If T has an init method, this will be called.
+
+## Type parameters
+
+• **T** *extends* [`Init`](/v3/api/interfaces/init/)
+
+## Source
+
+[src/types/ioc.ts:17](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/ioc.ts#L17)
diff --git a/src/content/docs/v3/api/type-aliases/LogPayload.md b/src/content/docs/v3/api/type-aliases/LogPayload.md
new file mode 100644
index 000000000..c899c7a37
--- /dev/null
+++ b/src/content/docs/v3/api/type-aliases/LogPayload.md
@@ -0,0 +1,22 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "LogPayload"
+---
+
+> **LogPayload**\<`T`\>: `object`
+
+## Type parameters
+
+• **T** = `unknown`
+
+## Type declaration
+
+### message
+
+> **message**: `T`
+
+## Source
+
+[src/core/contracts/logging.ts:11](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/contracts/logging.ts#L11)
diff --git a/src/content/docs/v3/api/type-aliases/Payload.md b/src/content/docs/v3/api/type-aliases/Payload.md
new file mode 100644
index 000000000..772bd03b7
--- /dev/null
+++ b/src/content/docs/v3/api/type-aliases/Payload.md
@@ -0,0 +1,12 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Payload"
+---
+
+> **Payload**: `object` \| `object` \| `object`
+
+## Source
+
+[src/types/utility.ts:26](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/utility.ts#L26)
diff --git a/src/content/docs/v3/api/type-aliases/PluginResult.md b/src/content/docs/v3/api/type-aliases/PluginResult.md
new file mode 100644
index 000000000..e502aed2d
--- /dev/null
+++ b/src/content/docs/v3/api/type-aliases/PluginResult.md
@@ -0,0 +1,12 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "PluginResult"
+---
+
+> **PluginResult**: `Awaitable`\<`VoidResult`\>
+
+## Source
+
+[src/types/core-plugin.ts:51](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-plugin.ts#L51)
diff --git a/src/content/docs/v3/api/type-aliases/SernOptionsData.md b/src/content/docs/v3/api/type-aliases/SernOptionsData.md
new file mode 100644
index 000000000..a38e7fe9d
--- /dev/null
+++ b/src/content/docs/v3/api/type-aliases/SernOptionsData.md
@@ -0,0 +1,14 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "SernOptionsData"
+---
+
+> **SernOptionsData**: [`SernSubCommandData`](/v3/api/interfaces/sernsubcommanddata/) \| [`SernSubCommandGroupData`](/v3/api/interfaces/sernsubcommandgroupdata/) \| `APIApplicationCommandBasicOption` \| [`SernAutocompleteData`](/v3/api/interfaces/sernautocompletedata/)
+
+Type that replaces autocomplete with [SernAutocompleteData](../../../../../../v3/api/interfaces/sernautocompletedata)
+
+## Source
+
+[src/types/core-modules.ts:200](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/core-modules.ts#L200)
diff --git a/src/content/docs/v3/api/type-aliases/Singleton.md b/src/content/docs/v3/api/type-aliases/Singleton.md
new file mode 100644
index 000000000..69177587c
--- /dev/null
+++ b/src/content/docs/v3/api/type-aliases/Singleton.md
@@ -0,0 +1,23 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Singleton"
+---
+
+> **Singleton**\<`T`\>: () => `T`
+
+Type to annotate that something is a singleton.
+T is created once and lazily.
+
+## Type parameters
+
+• **T**
+
+## Returns
+
+`T`
+
+## Source
+
+[src/types/ioc.ts:7](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/ioc.ts#L7)
diff --git a/src/content/docs/v3/api/type-aliases/SlashOptions.md b/src/content/docs/v3/api/type-aliases/SlashOptions.md
new file mode 100644
index 000000000..88763a6f3
--- /dev/null
+++ b/src/content/docs/v3/api/type-aliases/SlashOptions.md
@@ -0,0 +1,12 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "SlashOptions"
+---
+
+> **SlashOptions**: `Omit`\<`CommandInteractionOptionResolver`, `"getMessage"` \| `"getFocused"`\>
+
+## Source
+
+[src/types/utility.ts:14](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/utility.ts#L14)
diff --git a/src/content/docs/v3/api/type-aliases/Transient.md b/src/content/docs/v3/api/type-aliases/Transient.md
new file mode 100644
index 000000000..fcb10c3cc
--- /dev/null
+++ b/src/content/docs/v3/api/type-aliases/Transient.md
@@ -0,0 +1,27 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Transient"
+---
+
+> **Transient**\<`T`\>: () => () => `T`
+
+Type to annotate that something is transient.
+Every time this is called, a new object is created
+
+## Type parameters
+
+• **T**
+
+## Returns
+
+`Function`
+
+### Returns
+
+`T`
+
+## Source
+
+[src/types/ioc.ts:12](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/types/ioc.ts#L12)
diff --git a/src/content/docs/v3/api/variables/controller.md b/src/content/docs/v3/api/variables/controller.md
new file mode 100644
index 000000000..c73d51275
--- /dev/null
+++ b/src/content/docs/v3/api/variables/controller.md
@@ -0,0 +1,35 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "controller"
+---
+
+> `const` **controller**: `object`
+
+## Since
+
+1.0.0
+The object passed into every plugin to control a command's behavior
+
+## Type declaration
+
+### next()
+
+> **next**: () => `OkImpl`\<`void`\> = `ok`
+
+#### Returns
+
+`OkImpl`\<`void`\>
+
+### stop()
+
+> **stop**: () => `ErrImpl`\<`void`\> = `err`
+
+#### Returns
+
+`ErrImpl`\<`void`\>
+
+## Source
+
+[src/core/create-plugins.ts:69](https://github.com/sern-handler/handler/blob/04c4625bfa2f746935f4a8cee62b77cdffd86684/src/core/create-plugins.ts#L69)
diff --git a/docs/cli/README.md b/src/content/docs/v3/cli/about.mdx
similarity index 59%
rename from docs/cli/README.md
rename to src/content/docs/v3/cli/about.mdx
index 2afcb8236..2a6ce41ee 100644
--- a/docs/cli/README.md
+++ b/src/content/docs/v3/cli/about.mdx
@@ -1,9 +1,13 @@
-# CLI
+---
+title: About the CLI
+description: The CLI is your pocketknife for discord bot development. It'll have all features necessary for developing and shipping to production.
+---
Publish commands to the API, install plugins, and use other tools provided by our cli.
The CLI is your pocketknife for discord bot development. It'll have all features necessary for developing and shipping to production.
-```
+
+```ansi
Usage: sern [options] [command]
@@ -13,16 +17,17 @@ Usage: sern [options] [command]
|___/\___|_| |_| |_|
Welcome!
- If you're new to sern, run npm create @sern/bot for an interactive setup to your new bot project!
- If you have any ideas, suggestions, bug reports, kindly join our support server: https://sern.dev/discord
+ If you're new to [36msern[0m, run [35mnpm create @sern/bot[0m for an interactive setup to your new bot project!
+
+ [33mIf you have any ideas, suggestions, bug reports, kindly join our support server: https://sern.dev/discord[0m
Options:
-v, --version output the version number
-h, --help display help for command
Commands:
- init [options] Quickest way to scaffold a new project [DEPRECATED]
+ init [options] Quickest way to scaffold a new project [93m[DEPRECATED][0m
plugins [options] Install plugins from https://github.com/sern-handler/awesome-plugins
extra Easy way to add extra things in your sern project
commands Defacto way to manage your slash commands
diff --git a/src/content/docs/v3/cli/build.mdx b/src/content/docs/v3/cli/build.mdx
new file mode 100644
index 000000000..69ae88987
--- /dev/null
+++ b/src/content/docs/v3/cli/build.mdx
@@ -0,0 +1,208 @@
+---
+title: Build
+description: Build your bot using the sern CLI tool
+---
+
+```sh
+Usage: sern build [options]
+
+Build your bot
+
+Options:
+ -f --format [fmt] The module system of your application. `cjs` or `esm` (default: "esm")
+ -m --mode [mode] the mode for sern to build in. `production` or `development` (default: "development")
+ -W --suppress-warnings suppress experimental warning
+ -p --project [filePath] build with this sern.build file
+ -h, --help display help for command
+```
+
+## Guiding Principles
+
+When designing the `sern build` command, our aim was to make building bot applications as simple as possible for the majority of developers. The setup process has been streamlined, and most of the configuration details have been handled for you.
+
+Here are some key points to keep in mind:
+
+import { Steps } from '@astrojs/starlight/components';
+
+
+1. **Minimal Configuration**: In the vast majority (99%) of use cases, developers do not need to configure the bot application building process. We believe that simplicity is key, so only a few decisions need to be made on the developer's end.
+
+2. **Optimal Defaults**: We've chosen sensible defaults. This means you can get started without getting bogged down by complex, unneeded configurations.
+
+3. **Finetuned for production bots**: Our CLI leverages an opinionated build solution powered by esbuild. This ensures that bots are built without issues and can be shipped easily.
+
+
+## Experimental Features
+
+Both the `sern build` and `sern publish` commands are marked as experimental. While they might not be completely stable, they are designed to work for the majority of users. We appreciate any feedback in helping us make these features even better.
+
+## Features
+
+The `sern build` command comes equipped with a range of features designed to enhance your development process. Here's a glimpse of what it offers:
+
+- **esbuild Integration**: our CLI takes inspiration from the efficiency of SvelteKit, ensuring your bot application is built effectively and with type safety. Leverage the [esbuild plugin ecosystem](https://github.com/esbuild/community-plugins).
+
+- **Zero Configuration**: Building your bot application without additional configuration. The CLI handles most of the setup for you.
+
+- **Experimental Image Support**: We've introduced experimental support for top-level imports of PNG and JPG files, making it easier to include images in your bot application.
+
+- **Compile Time Constants**: Customize your build with constants such as `__DEV__`, `__PROD__`, allowing you to tailor your application to different production stages.
+
+- **Development and Production Modes**: The CLI supports both development and production modes, enabling you to tailor your bot application for different stages of development.
+
+- **Type-safe `process.env`**: The CLI generates a type-safe `process.env`, reducing potential errors.
+
+## Implicits
+
+- Command line arguments take precendence over `sern.build` configuration file
+- Default build format is ESM
+- `defineVersion = true`
+- `__DEV__` AND `__PROD__` constants are configured.
+- Only a [few tsconfig options](https://esbuild.github.io/content-types/#tsconfig-json) are respected.
+
+### `sern.build.js`
+
+The `sern.build.js` file is for any extra configuration you may need, such as adding esbuild plugins.
+
+The CLI was intentionally made to be installed globally, and we can't provide typings at a project level. If you need typings, here they are:
+
+```ts
+type BuildOptions = {
+ /**
+ * Define __VERSION__
+ * This option is a quick switch to defining the __VERSION__ constant which will be a string of the version provided in
+ * cwd's package.json
+ */
+ defineVersion?: boolean;
+ /**
+ * default = esm
+ */
+ format?: "cjs" | "esm";
+ /**
+ * extra esbuild plugins to build with sern.
+ */
+ esbuildPlugins?: esbuild.Plugin[];
+ /**
+ * https://esbuild.github.io/api/#drop-labels
+ **/
+ dropLabels?: string[];
+ /**
+ * https://esbuild.github.io/api/#define
+ **/
+ define?: Record;
+ /**
+ * Path to tsconfig
+ **/
+ tsconfig?: string;
+ /**
+ * default = 'development'
+ */
+ mode: "production" | "development";
+ /**
+ * will search for env file. If none exists,
+ * default to .env.
+ */
+ env?: string;
+};
+```
+
+## Usage
+
+```sh
+sern build
+```
+
+(that was easy)
+
+## Adapting Older Projects
+
+Change your `tsconfig.json` to extend our generated one, `./.sern/tsconfig.json`.
+
+```json {2}
+{
+ "extends": "./.sern/tsconfig.json",
+ "compilerOptions": {
+ // all of your old fields
+ }
+}
+```
+
+## In Depth
+
+We use the `define` and `drop labels` API in C style macros to have easy development stage differences. [Here](https://esbuild.github.io/api/#drop-labels) is the esbuild full API documentation
+
+### Drop Labels
+
+```sh
+# mode is set to production
+sern build
+```
+
+import { Tabs, TabItem } from '@astrojs/starlight/components';
+
+
+
+ ```ts
+ __DEV__: console.log("This is for production only");
+ __PROD__: console.log("This is for either mode");
+ ```
+
+
+ ```sh
+ # mode is set to production
+ sern build
+ ```
+
+
+ ```ts
+ __PROD__ console.log('This is for either mode')
+ ```
+
+
+
+### Constants
+
+sern builds with three default constants. `__DEV__`, `__PROD__`, `__VERSION__`, where `__VERSION__` is the version in your build options, or `package.json` if unspecified.
+
+
+
+ ```sh
+ sern build
+ ```
+
+
+ ```ts
+ if (__PROD__) {
+ console.log("Bot version: " + __VERSION__);
+ }
+ ```
+
+
+
+Full esbuild documentation [here](https://esbuild.github.io/api/#define). Add more to the `define` field in build options (only availible with a `sern.build` file at the moment)
+
+### `process.env`
+
+We generate your process.env with `dotenv` and generate typings for process.env. Less hassle!
+
+
+
+ ```sh frame="none"
+ DISCORD_TOKEN=
+ ```
+
+ ```ts
+ process.env.DISCORD_TOKEN; // string | undefined (not typesafe :()
+ ```
+
+
+
+ ```sh
+ sern build
+ ```
+
+ ```ts
+ process.env.DISCORD_TOKEN; // string (typesafe :))
+ ```
+
+
diff --git a/src/content/docs/v3/cli/clear.mdx b/src/content/docs/v3/cli/clear.mdx
new file mode 100644
index 000000000..b833358d5
--- /dev/null
+++ b/src/content/docs/v3/cli/clear.mdx
@@ -0,0 +1,39 @@
+---
+title: Clear
+description: Clear and reset your commands, both globally and per guild
+---
+
+```sh
+Usage: sern commands clear [options]
+
+Clear and reset commands-data-remote.json and the api
+
+Options:
+ -y, --yes Say yes to all prompts
+ -e, --env [path] Supply a path to a .env
+ -h, --help display help for command
+```
+
+## Introduction
+
+The clear command is a utility that resets all of your commands. It's useful if you accidentally publish the wrong command, such as publishing a guild command globally.
+
+The clear command works by sending an empty array via the [`PUT`](https://discord.com/developers/docs/interactions/application-commands#bulk-overwrite-global-application-commands) route to the Discord API, for each guild and globally.
+
+To use this command, ensure you have a proper `.env` file in your root directory:
+
+```sh title=".env"
+DISCORD_TOKEN=
+NODE_ENV=
+```
+
+## Usage
+
+```sh
+sern commands clear
+```
+
+## Notes
+
+- The clear command will prompt you to confirm the action. You can bypass this by using the `-y` flag.
+- The clear command will automatically read a `.env` file in the working directory. If you need to override this, you can use the `-e` flag to supply a path to a different `.env` file.
diff --git a/src/content/docs/v3/cli/extra.mdx b/src/content/docs/v3/cli/extra.mdx
new file mode 100644
index 000000000..96fdc10e8
--- /dev/null
+++ b/src/content/docs/v3/cli/extra.mdx
@@ -0,0 +1,27 @@
+---
+title: Extra
+description: Add extra features to your sern project
+---
+
+```sh
+Usage: sern extra [options]
+
+Easy way to add extra things in your sern project
+
+Options:
+ -h, --help display help for command
+```
+
+## Introduction
+
+This command is pretty straightfoward. Install utilities into your application, assuming you have a `sern.config.json`.
+
+You can use this command to install things such as a `Dockerfile`
+
+## Usage
+
+```ansi frame
+[33m❯[0m sern extra
+[90m# Choose which extra feature from the prompt, such as this:[0m
+[33m✔[0m What extra feature do you want to add? [90m›[0m Dockerfile (TypeScript)
+```
diff --git a/src/content/docs/v3/cli/publish.mdx b/src/content/docs/v3/cli/publish.mdx
new file mode 100644
index 000000000..e19887d8e
--- /dev/null
+++ b/src/content/docs/v3/cli/publish.mdx
@@ -0,0 +1,131 @@
+---
+title: Publish
+description: Publish your commands to Discord
+---
+
+```sh
+Usage: sern commands publish [options] [path]
+
+New way to manage your slash commands
+
+Arguments:
+ path path with respect to current working directory that will locate all published files
+
+Options:
+ -i, --import [scriptPath...] Prerequire a script to load into publisher
+ -t, --token [token]
+ --appId [applicationId]
+ -h, --help display help for command
+```
+
+## Introduction
+
+The publish command is a way to publish slash commands to Discord. It uses the [`PUT`](https://discord.com/developers/docs/interactions/application-commands#bulk-overwrite-global-application-commands) route to overwrite existing commands.
+
+Wherever your commands directory is located, publish will override the existing application commands on Discord. Existing commands do not count towards the command limit creation daily.
+
+The publish command automatically reads your `.env` file in the working directory. If you do not have a `.env` file, you can pass in the `--token` and `--appId` flags.
+
+:::caution
+CLI arguments, if specified, take precedence over `.env` file.
+:::
+
+Your `.env` file should look like this:
+
+```sh title=".env"
+DISCORD_TOKEN=
+APPLICATION_ID=
+NODE_ENV=
+```
+
+## Usage
+
+:::caution
+CommonJS and JavaScript users need to compile first, then run `sern publish` on the `dist` output
+:::
+
+
+
+## Features
+
+- Automatically syncs API with your command base
+- Generates a JSON file of output (`.sern/command-data-remote.json`)
+- Supports publishing direct ESM TypeScript files
+- Prerequire scripts are supported
+- Supports a configuration that is the same as the original publish plugin
+- Each command file can have an extra config that follows `ValidPublishOptions`
+ - This can be a function or a `PublishConfig` object
+
+## Config
+
+```ts {13-15}
+type ValidMemberPermissions =
+ | PermissionFlagBits // discord.js enum
+ | PermissionFlagBits[] // array of discord.js enum
+ | string // must be a stringified number (such as "8" for ADMINISTRATOR)
+ | bigint
+
+interface PublishConfig {
+ guildIds?: string[];
+ dmPermission?: boolean;
+ defaultMemberPermissions: ValidMemberPermissions;
+}
+
+type ValidPublishOptions =
+ | PublishConfig
+ | (absPath: string, module: CommandModule) => PublishConfig
+```
+
+## Prerequiring
+
+Is there a [service](/v3/guide/walkthrough/services) that is required at the top level of a command?
+
+Create an ES6 script anywhere, such as:
+
+```ts title="scripts/prerequire.mjs"
+import { makeDependencies, single, Service } from "@sern/handler";
+import { Client } from "discord.js";
+
+await makeDependencies({
+ build: (root) =>
+ root.add({ "@sern/client": single(() => new Client(...options)) }),
+});
+
+await Service("@sern/client").login();
+```
+
+This will create a container for publishing.
+
+:::danger
+As of 0.6.0, the `client` is required, or this will crash.
+:::
+
+## Example
+
+This example will publish a ping command to a specific guild: `889026545715400705`.
+
+### Script
+
+```sh
+sern commands publish -i ./scripts/prerequire.mjs
+```
+
+### Command
+
+```ts title=src/commands/ping.ts {5-7}
+import { commandModule, Service, CommandType } from '@sern/handler'
+
+const client = Service('@sern/client');
+
+export const config = {
+ guildIds: ["889026545715400705"]
+}
+
+export default commandModule( {
+ type: CommandType.Slash
+ description: `${client.user.username}'s ping`,
+ execute: (ctx) => {
+ ctx.reply('pong')
+ }
+})
+```
diff --git a/src/content/docs/v3/guide/getting-started/choose-ide.mdx b/src/content/docs/v3/guide/getting-started/choose-ide.mdx
new file mode 100644
index 000000000..a1f232994
--- /dev/null
+++ b/src/content/docs/v3/guide/getting-started/choose-ide.mdx
@@ -0,0 +1,12 @@
+---
+title: Choosing an IDE
+description: Choose an IDE for sern bot development
+---
+
+Choosing an IDE is a matter of personal preference. They make programming easier. The following are some suggestions for choosing an IDE:
+
+- [Visual Studio Code](https://code.visualstudio.com)
+ - We have an [snippet extension](https://marketplace.visualstudio.com/items?itemName=SrIzan.sern-snippets) to help automate development :)
+- [Sublime Text](https://www.sublimetext.com/)
+- [NotePad++](https://notepad-plus-plus.org/)
+- [nvim](https://neovim.io/) (chad)
diff --git a/src/content/docs/v3/guide/getting-started/preparing.mdx b/src/content/docs/v3/guide/getting-started/preparing.mdx
new file mode 100644
index 000000000..b9bf46360
--- /dev/null
+++ b/src/content/docs/v3/guide/getting-started/preparing.mdx
@@ -0,0 +1,12 @@
+---
+title: Preparing to Code
+description: Prepare your environment for sern bot development
+---
+
+After installing an IDE, you need to install `node`. Node is necessary to use `sern`, as it's based on `Discord.js`.
+
+You can download Node from the official website [here](https://nodejs.org/en/download/).
+
+After you've downloaded Node you will need a [Discord token](https://github.com/reactiflux/discord-irc/wiki/Creating-a-discord-bot-&-getting-a-token)
+
+CONTINUE 🤓
diff --git a/src/content/docs/v3/guide/walkthrough/autocomplete.mdx b/src/content/docs/v3/guide/walkthrough/autocomplete.mdx
new file mode 100644
index 000000000..628c4ed0c
--- /dev/null
+++ b/src/content/docs/v3/guide/walkthrough/autocomplete.mdx
@@ -0,0 +1,93 @@
+---
+title: Autocomplete
+description: Implementing autocomplete in your commands
+sidebar:
+ order: 9
+---
+
+Autocomplete is a special interaction which can happen on multiple options can be suggested for a single command.
+
+We've implemented this functionality using a simple tree search algorithm within a nested options tree.
+
+## Example
+
+In this example, the option `list` will autocomplete with the cheeses `gouda`, `parmesan`, and `harvarti`.
+
+```ts title="src/commands/cheese.ts" {13-22}
+export default commandModule({
+ type: CommandType.Slash,
+ description: "show me cheese",
+ options: [
+ {
+ name: "list",
+ type: ApplicationCommandOptionType.String,
+ description: "pick a cheese to show",
+ required: true,
+ autocomplete: true,
+ command: {
+ onEvent: [],
+ execute: (ctx) => {
+ // focus can be used to refine the options
+ const focus = ctx.options.getFocused();
+ ctx.respond(
+ ["gouda", "parmesan", "harvarti"].map((cheese) => ({
+ name: cheese,
+ value: cheese,
+ })),
+ );
+ },
+ },
+ },
+ ],
+ execute: (ctx, [, args]) => {
+ const cheese = args.getString("list", true);
+ ctx.reply("selected cheese");
+ },
+});
+```
+
+## Using Focus
+
+The `focus` object can be used to refine the options. For example, if the user types `g`, the focus object will be `g`.
+
+We can filter the cheeses based on the focus object, and return only the cheeses that start with the focus object.
+
+You can do a lot more with the focus object, such as performing API calls, or implementing a fuzzy search.
+
+```ts title="src/commands/cheese.ts" {13-23}
+export default commandModule({
+ type: CommandType.Slash,
+ description: "show me cheese",
+ options: [
+ {
+ name: "list",
+ type: ApplicationCommandOptionType.String,
+ description: "pick a cheese to show",
+ required: true,
+ autocomplete: true,
+ command: {
+ onEvent: [],
+ execute: (ctx) => {
+ const focus = ctx.options.getFocused();
+ ctx.respond(
+ ["gouda", "parmesan", "harvarti"]
+ .filter((cheese) => cheese.startsWith(focus))
+ .map((cheese) => ({
+ name: cheese,
+ value: cheese,
+ })),
+ );
+ },
+ },
+ },
+ ],
+ execute: (ctx, [, args]) => {
+ const cheese = args.getString("list", true);
+ ctx.reply("selected cheese");
+ },
+});
+```
+
+:::tip
+Sern will handle autocomplete interactions at arbitrary depths and subcommand levels.
+:::
diff --git a/src/content/docs/v3/guide/walkthrough/cli.mdx b/src/content/docs/v3/guide/walkthrough/cli.mdx
new file mode 100644
index 000000000..866ae959c
--- /dev/null
+++ b/src/content/docs/v3/guide/walkthrough/cli.mdx
@@ -0,0 +1,44 @@
+---
+title: CLI
+description: The CLI is your plug to the sern ecosystem — install plugins, extra utilities, and more.
+sidebar:
+ order: 3
+---
+
+Setting up the [CLI](https://github.com/sern-handler/cli) is easy.
+
+The CLI is your plug to the sern ecosystem. It allows you to install plugins with ease, install extra utilities, and much more.
+
+## Installing the CLI
+
+If you haven't already installed the CLI globally, you can do so by running:
+
+import PackageManagers from '~/components/PackageManagers.astro';
+
+
+
+## Adding Plugins
+
+:::caution
+You must have a [sern.config.json](/v3/guide/walkthrough/good-to-know#sernconfigjson) to use this command.
+:::
+
+To install [plugins](/v3/guide/walkthrough/plugins) maintained by the community [repository](https://github.com/sern-handler/awesome-plugins):
+
+```sh
+sern plugins
+```
+
+This will display a menu selection of all installable plugins.
+
+If you'd like to view all plugins, check out our [plugins page](/plugins).
+
+## Extra Utilities
+
+To install extra utilities into your project, run:
+
+```sh
+sern extra
+```
+
+We have a more in depth [guide](/v3/cli/about) on the CLI if you're interested in learning more.
diff --git a/src/content/docs/v3/guide/walkthrough/conclusion.mdx b/src/content/docs/v3/guide/walkthrough/conclusion.mdx
new file mode 100644
index 000000000..7c379dc5b
--- /dev/null
+++ b/src/content/docs/v3/guide/walkthrough/conclusion.mdx
@@ -0,0 +1,14 @@
+---
+title: Conclusion
+description: Thank you for reading the sern guide
+sidebar:
+ order: 12
+---
+
+If you reached this far, thank you for reading!
+
+We hope you have learned the necessities you need to create a bot with the sern framework.
+
+If you have any other questions, bugs, feature requests, concerns, please join our [community server](https://sern.dev/discord), and we'll be glad to answer your questions!
+
+
diff --git a/src/content/docs/v3/guide/walkthrough/dependency-injection.mdx b/src/content/docs/v3/guide/walkthrough/dependency-injection.mdx
new file mode 100644
index 000000000..e0976dcff
--- /dev/null
+++ b/src/content/docs/v3/guide/walkthrough/dependency-injection.mdx
@@ -0,0 +1,129 @@
+---
+title: Dependency Injection
+description: Customize your bot's utilities and structures
+sidebar:
+ order: 10
+---
+
+
+Since version 2.0.0, dependency injection, thanks to [iti](https://github.com/molszanski/iti), is a feature to customize your bot's utilities and structures.
+
+For example, a minimal setup for any project might look like this:
+
+```ts title="src/index.ts"
+const client = new Client({
+ ...options,
+});
+
+Sern.makeDependencies({
+ build: (root) =>
+ root.add({
+ "@sern/client": single(() => client),
+ }),
+});
+```
+
+For any TypeScript project, you'll need to add an interface to get intellisense and typings.
+
+```ts title="src/dependencies.d.ts"
+interface MyDependencies extends Dependencies {
+ "@sern/client": Singleton;
+}
+```
+
+## Full Example
+
+Your full setup may have the following structure:
+
+import { FileTree } from '@astrojs/starlight/components';
+
+
+- src/
+ - index.ts **(your main file and client)**
+ - **dependencies.d.ts** **(for intellisense)**
+
+
+```ts title="src/index.ts"
+const client = new Client({
+ ...options,
+});
+
+interface MyDependencies extends Dependencies {
+ "@sern/client": Singleton;
+}
+
+export const useContainer = Sern.makeDependencies({
+ build: (root) =>
+ root.add({
+ "@sern/client": single(() => client),
+ }),
+});
+```
+
+Everything else is handled. However, you may want customize things.
+
+## Adding Dependencies to Root
+
+Each sern built dependency must implement its contracts:
+
+- `@sern/logger`: Logging data → [`Logging`](/v3/api/interfaces/logging)
+- `@sern/errors`: Handling errors and lifetime → [`ErrorHandling`](/v3/api/interfaces/errorhandling)
+- `@sern/modules`: Managing all command modules → `ModuleManager`
+- `@sern/emitter`: The key to emit events and occurences in a project → [`Emitter`](/v3/api/interfaces/emitter)
+
+You may also add disposers so that when the application crashes, the targeted dependency calls that function.
+
+```ts title="src/index.ts"
+export const useContainer = Sern.makeDependencies({
+ build: (root) =>
+ root
+ .add({
+ "@sern/client": single(() => client),
+ })
+ .addDisposer({ "@sern/client": (client) => client.destroy() }),
+});
+```
+
+:::caution
+Below is v3 API.
+:::
+
+## Init
+
+import { Steps } from '@astrojs/starlight/components';
+
+
+1. Do you need to perform intializing behavor for a dependency?
+ ```ts title="src/database.ts"
+ import { Init } from "@sern/handler";
+
+ class Database implements Init {
+ init() {
+ await this.connect();
+ console.log("Connected");
+ }
+ }
+ ```
+
+2. Modify your `Dependencies` interface:
+ ```ts title="src/dependencies.d.ts" {4}
+ import type { Initializable } from "@sern/handler";
+
+ interface Dependencies extends CoreDependencies {
+ database: Initializable;
+ }
+ ```
+
+3. Make sure its been added:
+ ```ts title="src/index.ts" {3}
+ await makeDependencies({
+ build: root => root
+ .add({ database => new Database() })
+ })
+ ```
+
+4. Now, when your bot starts, the `init` method will be called. 🎉
+
+
+
+
diff --git a/src/content/docs/v3/guide/walkthrough/first-command.mdx b/src/content/docs/v3/guide/walkthrough/first-command.mdx
new file mode 100644
index 000000000..9d3bd9704
--- /dev/null
+++ b/src/content/docs/v3/guide/walkthrough/first-command.mdx
@@ -0,0 +1,126 @@
+---
+title: First Command
+description: How to create your first sern command module
+sidebar:
+ order: 5
+---
+
+:::tip
+**TLDR:** Command modules are Discord bot commands. There are many types, and each one will correspond to an event from Discord. For example, `CommandType.Slash` commands will listen to slash command interactions.
+:::
+
+## Introduction
+
+In this guide, we'll walk you through creating your first command module.
+
+If you installed a new project via the CLI, your file should be here:
+
+import { FileTree } from '@astrojs/starlight/components';
+
+
+- src/commands/
+ - **ping.ts** **(right here, probably)**
+- ...
+
+
+import { Tabs, TabItem } from '@astrojs/starlight/components';
+
+
+
+ ```js title="src/commands/ping.js"
+ const { CommandType, commandModule } = require("@sern/handler");
+
+ export default commandModule({
+ type: CommandType.Both,
+ plugins: [],
+ description: "A ping command",
+ // alias : [],
+ execute: async (ctx, args) => {
+ await ctx.reply("Pong 🏓");
+ },
+ });
+ ```
+
+
+ ```ts title="src/commands/ping.ts"
+ import { commandModule, CommandType } from "@sern/handler";
+
+ export default commandModule({
+ type: CommandType.Both,
+ plugins: [],
+ description: "A ping command",
+ // alias : [],
+ execute: async (ctx, args) => {
+ await ctx.reply({ content: "Pong 🏓" });
+ },
+ });
+ ```
+
+
+
+To view what each of these properties mean in depth, visit the docs for [`CommandType`](/v3/api/enumerations/commandtype).
+
+## Command Module Types
+
+Every command module `type` is part of an enum. This field allows type inference for the rest of a module's fields.
+
+All the command types can be found in the [`CommandType`](/v3/api/enumerations/commandtype) enum!
+
+## Example Modal Command
+
+So, lets say you want to make a command module that listens to modals.
+
+:::tip
+Keep in mind, you'll need to send a modal with a custom id of `dm-me`. This example below is the response to a modal being sent.
+:::
+
+
+
+ ```javascript
+ const { CommandType, commandModule } = require("@sern/handler");
+
+ exports.default = commandModule({
+ name: "dm-me",
+ type: CommandType.Modal,
+ async execute(modal) {
+ const value = modal.fields.getTextInputValue("message");
+ modal.client.users
+ .fetch("182326315813306368")
+ .then((u) => u.send(value + ` from ${modal.user}`));
+ modal.reply({ ephemeral: true, content: "Sent" });
+ },
+ });
+ ```
+
+
+ ```typescript
+ import { commandModule, CommandType } from "@sern/handler";
+
+ export default commandModule({
+ name: "dm-me",
+ type: CommandType.Modal,
+ async execute(modal) {
+ const value = modal.fields.getTextInputValue("message");
+ modal.client.users
+ .fetch("182326315813306368")
+ .then((u) => u.send(value + ` from ${modal.user}`));
+ modal.reply({ ephemeral: true, content: "Sent" });
+ },
+ });
+ ```
+
+
+
+Commands are straight forward. Keep in mind, the only required fields for command modules are the `type` and `execute` function.
+
+## Context Class
+
+The provided [`Context`](/v3/api/classes/context) class helps with modules of `CommandType.Both` (A mixture of slash / legacy commands).
+
+The `Context` class is passed into modules with type:
+
+- `CommandType.Both`
+- `CommandType.Slash`
+- `CommandType.Text`
+
+This data structure helps interop between legacy commands and slash commands with ease.
diff --git a/src/content/docs/v3/guide/walkthrough/first-event.mdx b/src/content/docs/v3/guide/walkthrough/first-event.mdx
new file mode 100644
index 000000000..cfa9c7ad9
--- /dev/null
+++ b/src/content/docs/v3/guide/walkthrough/first-event.mdx
@@ -0,0 +1,75 @@
+---
+title: First Event
+description: How to create your first sern event module
+sidebar:
+ order: 6
+---
+
+:::tip
+**TLDR:** Event modules are event listeners. There are three types: `EventType.Discord`, `EventType.Sern`, and `EventType.External`.
+:::
+
+## Introduction
+
+In this guide, we'll walk you through creating your first event module.
+
+import { Tabs, TabItem } from '@astrojs/starlight/components';
+
+
+
+ ```js title="src/events/activate.js"
+ exports.default = eventModule({
+ type: EventType.Sern,
+ plugins : [],
+ name: 'module.activate',
+ execute(event) {
+ console.log(event);
+ }
+ })
+ ```
+
+
+ ```ts title="src/events/activate.ts"
+ export default eventModule({
+ type: EventType.Sern,
+ plugins : [],
+ name: 'module.activate', //name of event.
+ execute(event) {
+ console.log(event);
+ }
+ })
+ ```
+
+
+
+Similar to command modules, the `type` property denotes what kind of event it is. You can view [`EventType`](/v3/api/enumerations/eventtype) for more information.
+
+To view what each of these properties mean in depth, visit the docs for [`EventType`](/v3/api/enumerations/eventtype).
+
+## External Events
+
+In versions 2 & 3, any dependency that you have passed into `makeDependencies` can be registered here as well.
+
+```ts title="src/index.ts" {3}
+await makeDependencies({
+ build: root => root.add({
+ eventlistener: single(() => new EventEmitter())
+ })
+})
+```
+
+In your event module, you can now listen to events from `eventlistener`, which will be emitted from the `EventEmitter`.
+
+```ts title="src/events/myevent.ts" {3}
+export default eventModule({
+ type: EventType.External,
+ emitter: 'eventlistener',
+ execute: (args) => {
+ console.log('Got event from eventlistener: ', args);
+ }
+})
+```
+
+:::note
+Make sure that the `emitter` property matches the name of the dependency you passed into `makeDependencies`.
+:::
diff --git a/src/content/docs/v3/guide/walkthrough/goal.mdx b/src/content/docs/v3/guide/walkthrough/goal.mdx
new file mode 100644
index 000000000..7cb0d4043
--- /dev/null
+++ b/src/content/docs/v3/guide/walkthrough/goal.mdx
@@ -0,0 +1,58 @@
+---
+title: Goal
+description: sern's goal is to make bot development easier and more efficient
+sidebar:
+ order: 1
+---
+
+This walkthrough will be written in [TypeScript](https://www.typescriptlang.org/) but will have JavaScript snippets throughout.
+
+## Make robust, modular, bots
+
+- **Modularity**: sern is built with modularity in mind. You can swap pieces and parts easily.
+- **Familiar**: Commands and structures are similar to classic v12 handlers and the official Discord.js command handler guide, while packing many features!
+- **Concise**: Too much code is a liability. With sern, write less for more. 🤯
+
+## Why sern?
+
+import { Tabs, TabItem } from '@astrojs/starlight/components';
+
+
+
+ ```ts title="commands/ping.ts"
+ import { Command } from "@sapphire/framework";
+ import type { CommandInteraction } from "discord.js";
+
+ export class PingCommand extends Command {
+ public constructor(context: Command.Context) {
+ super(context, {
+ description: "Pong!",
+ chatInputCommand: {
+ register: true,
+ },
+ });
+ }
+ public async chatInputRun(interaction: CommandInteraction) {
+ await interaction.reply("Pong!");
+ }
+ }
+ ```
+
+
+ ```ts title="commands/ping.ts"
+ import { commandModule, CommandType } from "@sern/handler";
+
+ export default commandModule({
+ type: CommandType.Both,
+ description: "Pong!",
+ execute: async (ctx, args) => {
+ await ctx.reply("Pong!");
+ },
+ });
+ ```
+
+
+
+Keep in mind the sern example acts as both a slash command AND a text command. The Sapphire example is only a slash command, and it's more code than sern.
+
+## Be smart. Choose sern.
diff --git a/src/content/docs/v3/guide/walkthrough/good-to-know.mdx b/src/content/docs/v3/guide/walkthrough/good-to-know.mdx
new file mode 100644
index 000000000..c7630530d
--- /dev/null
+++ b/src/content/docs/v3/guide/walkthrough/good-to-know.mdx
@@ -0,0 +1,26 @@
+---
+title: Good to Know
+description: Helpful tips for sern bot development
+sidebar:
+ order: 13
+---
+
+## `sern.config.json`
+
+A `sern.config.json`, although not necessary, allows your project to communicate with our cli.
+
+For example, when installing TypeScript plugins, the language property is necessary to install from our [open source repository](https://github.com/sern-handler/awesome-plugins).
+
+Using the CLI and running `sern init --sync` on pre-existing projects should install this file in the your project.
+
+Or, if this is a brand-new project, `sern init` automatically installs it.
+
+```json title="sern.config.json"
+{
+ "language": "typescript",
+ "paths": {
+ "base": "src",
+ "commands": "commands"
+ }
+}
+```
diff --git a/src/content/docs/v3/guide/walkthrough/new-project.mdx b/src/content/docs/v3/guide/walkthrough/new-project.mdx
new file mode 100644
index 000000000..b047b8fd2
--- /dev/null
+++ b/src/content/docs/v3/guide/walkthrough/new-project.mdx
@@ -0,0 +1,14 @@
+---
+title: New Project
+description: Create a new project with @sern/bot
+sidebar:
+ order: 2
+---
+
+import PackageManagers from '~/components/PackageManagers.astro';
+
+
+
+Once you've used this command, follow the interactive prompts to create your new project.
+
+If you need help, feel free to ask on our [Discord](https://sern.dev/discord).
diff --git a/src/content/docs/v3/guide/walkthrough/plugins.mdx b/src/content/docs/v3/guide/walkthrough/plugins.mdx
new file mode 100644
index 000000000..83984baef
--- /dev/null
+++ b/src/content/docs/v3/guide/walkthrough/plugins.mdx
@@ -0,0 +1,119 @@
+---
+title: Plugins
+description: Reduce code repetition with sern plugins
+sidebar:
+ order: 7
+---
+
+:::tip
+**TLDR:** Plugins help reduce code repetition and are installable via `sern plugins`. Put them into the `plugins` field of a command/event module.
+:::
+
+## Installation
+
+Chances are, you just want your bot to work. Plugins can preprocess and create reusable conditions for modules.
+
+To install plugins, you can use the CLI:
+
+```sh
+sern plugins
+```
+
+:::caution
+Some plugins only work with specific command types. Most, however, are targeted towards slash / both modules.
+:::
+
+import { Steps } from '@astrojs/starlight/components';
+
+
+1. Install your favorite(s) (or the ones that look the coolest). In my imaginary mind, I installed the `ownerOnly` plugin. (This should install to `src/plugins`)
+2. Add the plugin to your module in the `plugins` field.
+
+
+```ts title="src/commands/ping.ts" {6}
+import { commandModule, CommandType } from '@sern/handler'
+import { ownerOnly } from '../plugins'
+
+export default commandModule({
+ type: CommandType.Both,
+ plugins: [ownerOnly(['182326315813306368'])],
+ description: 'ping command',
+ execute: (ctx) => {
+ ctx.reply('hello, owner');
+ }
+})
+```
+
+#### ┗|` O′|┛ perfect, your first plugin!
+
+## Creating Plugins
+
+Plugins are essentially functions that use the controller object to determine whether to continue or stop the execution of a command.
+
+### Controller Object
+
+The controller object is passed into every plugin. It has two methods: `next` and `stop`.
+
+Plugins use these methods to control the flow of the command. For example, if a plugin fails, it can call `controller.stop()` to prevent the command from executing.
+
+```ts
+export interface Controller {
+ next: () => Ok;
+ stop: () => Err;
+}
+```
+
+## Init Plugins
+
+Init plugins modify how commands are loaded or do preprocessing.
+
+An instance of `Controller` (as seen above) is passed into every plugin. This controls whether a module is stored into sern.
+
+```ts title="src/plugins/inDir.ts" {11} {14}
+import { CommandInitPlugin } from "@sern/handler";
+import path from "path";
+
+export const inDir = (dir: string) => {
+ return CommandInitPlugin(({ module, absPath }) => {
+ if (path.dirname(absPath) !== dir) {
+ console.log(
+ Date.now(),
+ `${module.name} is not in the correct directory!`,
+ );
+ return controller.stop();
+ }
+ console.log(Date.now(), `${module.name} is in the correct directory!`);
+ return controller.next(); // continue to next plugin
+ });
+};
+```
+
+:::tip
+The plugin above simply checks if the module is in the correct directory. If it's not, it logs a message and stops the command from being loaded.
+:::
+
+## Event Plugins
+
+
+
+
+1. An event is emitted by `discord.js`.
+2. This event is passed to all plugins (**in order!!**),
+3. If all are successful, the command is executed.
+
+
+:::note
+Calling `controller.stop()` notifies sern that this command should not be run, and command is ignored.
+:::
+
+#### Can you predict the behavior of this command?
+
+
+1. Before loading into sern, this command module will check if this module is in the correct directory: `other`.
+2. Before an event occurs, this command module will check if the user has the id `182326315813306368`.
+3. If all plugins return `controller.next()`, this command replies `Pong 🏓`
+
+
+:::tip
+Event Plugins are good for filtering, preconditions, parsing.
+:::
diff --git a/src/content/docs/v3/guide/walkthrough/sern-emitter.mdx b/src/content/docs/v3/guide/walkthrough/sern-emitter.mdx
new file mode 100644
index 000000000..048bf6c11
--- /dev/null
+++ b/src/content/docs/v3/guide/walkthrough/sern-emitter.mdx
@@ -0,0 +1,22 @@
+---
+title: Sern Emitter
+description: How to use the SernEmitter class for event handling
+sidebar:
+ order: 11
+---
+
+You're shipped with the `SernEmitter` class. This `EventEmitter` listens to
+
+import { Steps } from '@astrojs/starlight/components';
+
+
+1. Command modules executing and its status; the `module.activate` event
+2. Command modules registered and its status; the `module.register` event
+3. On default, sern creates a single SernEmitter for your bot process.
+4. Any error that occurs; the `error` event
+5. `warn` events, where it is possible to throw errors
+
+
+You can put these and other event listeners into [event modules](/v3/guide/walkthrough/first-event)!
+
+You can view all events in the [`SernEventsMapping`](/v3/api/interfaces/serneventsmapping) interface.
diff --git a/src/content/docs/v3/guide/walkthrough/services.mdx b/src/content/docs/v3/guide/walkthrough/services.mdx
new file mode 100644
index 000000000..6d5f40109
--- /dev/null
+++ b/src/content/docs/v3/guide/walkthrough/services.mdx
@@ -0,0 +1,143 @@
+---
+title: Services
+description: Using services in your project, and how to wire them together.
+sidebar:
+ order: 8
+---
+
+
+You need some way to use dependencies in your command module. Services to the rescue!
+
+```ts title="src/dependencies.d.ts"
+import { CoreDependencies, Singleton } from "@sern/handler";
+import { Client } from "discord.js";
+
+interface Dependencies extends CoreDependencies {
+ "@sern/client": Singleton;
+}
+```
+
+## Special Dependencies
+
+Some keys in `Dependencies` are special and are used by sern internally:
+
+- `@sern/client`: Your Discord client. → [`Emitter`](/v3/api/interfaces/emitter)
+- `@sern/logger`: Logging data → [`Logging`](/v3/api/interfaces/logging)
+- `@sern/errors`: Handling errors and lifetime → [`ErrorHandling`](/v3/api/interfaces/errorhandling)
+- `@sern/modules`: Managing all command modules → `ModuleManager`
+- `@sern/emitter`: The key to emit events and occurences in a project → [`Emitter`](/v3/api/interfaces/emitter)
+
+## Usage
+
+Lets try to access the client you provided.
+
+```ts title="src/commands/ping.ts" {8}
+import { Service } from "@sern/handler";
+
+export default commandModule({
+ // ...
+ execute: (ctx) => {
+ // Type is inferred from the dependencies file.
+ // → Dependencies['@sern/client']
+ const client = Service("@sern/client");
+ },
+ // ...
+});
+```
+
+import { Tabs, TabItem } from '@astrojs/starlight/components';
+
+## Safety
+
+Services cannot be called in other services while `makeDependencies` is forming.
+
+For example, let's pass a logger into our database:
+
+### Example
+
+
+
+ ```ts title="index.ts"
+ await makeDependencies({
+ build: root => root
+ // Overriding the default logger provided.
+ .upsert({ '@sern/logger': single(() => new Logger()) })
+
+ // Wiring our logger into the database.
+ .add(ctx => {
+ return { database: single(() => new Database(ctx['sern/logger']))) }
+ })
+ })
+ ```
+
+
+ ```ts title="index.ts"
+ await makeDependencies({
+ build: (root) =>
+ root
+ // Overriding the default logger provided.
+ .upsert({ "@sern/logger": single(() => new Logger()) })
+
+ // Wiring our logger into the database.
+ // We wire our database incorrectly. Logger should be passed INTO the constructor
+ .add({ database: single(() => new Database()) }),
+ });
+ ```
+
+ ```ts title="index.ts"
+ import { Service, makeDependencies } from "@sern/handler";
+
+ // Calling Service prematurely!
+ const logger = Service("@sern/logger");
+
+ class Database {
+ constructor() {
+ this.logger = logger;
+ }
+ }
+ ```
+ This is a code smell anyway. It breaks encapsulation and defeats the purpose of wiring dependencies
+
+
+
+### Another Example
+
+
+
+ ```ts title="index.ts"
+ await makeDependencies(/* ...pass your options here */)
+ ```
+
+ ```ts title="commands/ping.ts"
+ // This is guaranteed to be defined if configured correctly
+ import { Service } from "@sern/handler";
+ const client = Service("@sern/client");
+ ```
+
+
+ ```ts title="index.ts"
+ import { Service, makeDependencies } from "@sern/handler";
+ /* DON'T USE SERVICES BEFORE CALLING makeDependencies */
+ const logger = Service("@sern/logger");
+
+ await makeDependencies();
+ ```
+
+
+
+## Important
+
+import { Steps } from '@astrojs/starlight/components';
+
+
+1. Services can only be used after sern has made dependencies. → Calling a service before will crash your application.
+2. Services can be safely used outside of a `commandModule`. → Be careful to not cause too many side effects.
+3. You will need to wire dependencies together. → This is a good practice to keep your code clean.
+4. Services can only be used after sern has made dependencies. → Calling a service before will crash your application.
+5. Services can be safely used outside of a `commandModule`. → Be careful to not cause too many side effects.
+
+
+## Related API
+
+- Use `Service` for single dependency.
+- Use `Services` for multiple dependencies.
diff --git a/src/content/docs/v3/guide/walkthrough/transition.mdx b/src/content/docs/v3/guide/walkthrough/transition.mdx
new file mode 100644
index 000000000..c64b96d0a
--- /dev/null
+++ b/src/content/docs/v3/guide/walkthrough/transition.mdx
@@ -0,0 +1,35 @@
+---
+title: Transition from v2 to v3
+description: Transitioning from v2 to v3 of sern
+sidebar:
+ order: 4
+---
+
+```diff title="src/index.ts" lang="ts" showLineNumbers=false
+- Sern.makeDependencies({ build: () => {} })
++ await makeDependencies({ build: () => {} })
+```
+
+v3 comes with the new [Service API](/v3/guide/walkthrough/services). To make sure to enable intellisense,
+include a `dependencies.d.ts` file into compilation. (Check out the [changelog](/blog/3.0.0) for all new features)
+
+
+A standard project file tree:
+
+import { FileTree } from '@astrojs/starlight/components';
+
+
+- src
+ - commands/
+ - events/
+ - plugins/
+ - dependencies.d.ts
+ - index.ts
+- .env
+- .gitignore
+- bun.lockb
+- package.json
+- README.md
+- sern.config.json
+- tsconfig.json
+
diff --git a/src/content/docs/v4/api/README.md b/src/content/docs/v4/api/README.md
new file mode 100644
index 000000000..06ccfba6f
--- /dev/null
+++ b/src/content/docs/v4/api/README.md
@@ -0,0 +1,89 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "@sern/handler"
+---
+
+## Namespaces
+
+- [Sern](/v4/api/namespaces/sern/readme/)
+
+## Enumerations
+
+- [CommandType](/v4/api/enumerations/commandtype/)
+- [EventType](/v4/api/enumerations/eventtype/)
+- [PayloadType](/v4/api/enumerations/payloadtype/)
+- [PluginType](/v4/api/enumerations/plugintype/)
+
+## Classes
+
+- [Context](/v4/api/classes/context/)
+
+## Interfaces
+
+- [BothCommand](/v4/api/interfaces/bothcommand/)
+- [ButtonCommand](/v4/api/interfaces/buttoncommand/)
+- [ChannelSelectCommand](/v4/api/interfaces/channelselectcommand/)
+- [CommandModuleDefs](/v4/api/interfaces/commandmoduledefs/)
+- [ContextMenuMsg](/v4/api/interfaces/contextmenumsg/)
+- [ContextMenuUser](/v4/api/interfaces/contextmenuuser/)
+- [ControlPlugin](/v4/api/interfaces/controlplugin/)
+- [CoreDependencies](/v4/api/interfaces/coredependencies/)
+- [DiscordEventCommand](/v4/api/interfaces/discordeventcommand/)
+- [Disposable](/v4/api/interfaces/disposable/)
+- [Emitter](/v4/api/interfaces/emitter/)
+- [ErrorHandling](/v4/api/interfaces/errorhandling/)
+- [EventModuleDefs](/v4/api/interfaces/eventmoduledefs/)
+- [ExternalEventCommand](/v4/api/interfaces/externaleventcommand/)
+- [Init](/v4/api/interfaces/init/)
+- [InitPlugin](/v4/api/interfaces/initplugin/)
+- [Logging](/v4/api/interfaces/logging/)
+- [MentionableSelectCommand](/v4/api/interfaces/mentionableselectcommand/)
+- [ModalSubmitCommand](/v4/api/interfaces/modalsubmitcommand/)
+- [Module](/v4/api/interfaces/module/)
+- [Plugin](/v4/api/interfaces/plugin/)
+- [PresenceResult](/v4/api/interfaces/presenceresult/)
+- [RoleSelectCommand](/v4/api/interfaces/roleselectcommand/)
+- [SernAutocompleteData](/v4/api/interfaces/sernautocompletedata/)
+- [SernEventCommand](/v4/api/interfaces/serneventcommand/)
+- [SernEventsMapping](/v4/api/interfaces/serneventsmapping/)
+- [SernSubCommandData](/v4/api/interfaces/sernsubcommanddata/)
+- [SernSubCommandGroupData](/v4/api/interfaces/sernsubcommandgroupdata/)
+- [SlashCommand](/v4/api/interfaces/slashcommand/)
+- [StringSelectCommand](/v4/api/interfaces/stringselectcommand/)
+- [TextCommand](/v4/api/interfaces/textcommand/)
+- [UserSelectCommand](/v4/api/interfaces/userselectcommand/)
+
+## Type Aliases
+
+- [AnyPlugin](/v4/api/type-aliases/anyplugin/)
+- [CommandModule](/v4/api/type-aliases/commandmodule/)
+- [Controller](/v4/api/type-aliases/controller/)
+- [EventModule](/v4/api/type-aliases/eventmodule/)
+- [LogPayload](/v4/api/type-aliases/logpayload/)
+- [Payload](/v4/api/type-aliases/payload/)
+- [PluginResult](/v4/api/type-aliases/pluginresult/)
+- [PresenceConfig](/v4/api/type-aliases/presenceconfig/)
+- [SDT](/v4/api/type-aliases/sdt/)
+- [SernOptionsData](/v4/api/type-aliases/sernoptionsdata/)
+
+## Variables
+
+- [Presence](/v4/api/variables/presence/)
+- [controller](/v4/api/variables/controller/)
+
+## Functions
+
+- [CommandControlPlugin](/v4/api/functions/commandcontrolplugin/)
+- [CommandInitPlugin](/v4/api/functions/commandinitplugin/)
+- [EventInitPlugin](/v4/api/functions/eventinitplugin/)
+- [Service](/v4/api/functions/service/)
+- [Services](/v4/api/functions/services/)
+- [commandModule](/v4/api/functions/commandmodule/)
+- [discordEvent](/v4/api/functions/discordevent/)
+- [eventModule](/v4/api/functions/eventmodule/)
+- [makeDependencies](/v4/api/functions/makedependencies/)
+- [makePlugin](/v4/api/functions/makeplugin/)
+- [single](/v4/api/functions/single/)
+- [transient](/v4/api/functions/transient/)
diff --git a/src/content/docs/v4/api/classes/Context.md b/src/content/docs/v4/api/classes/Context.md
new file mode 100644
index 000000000..c508c6e8e
--- /dev/null
+++ b/src/content/docs/v4/api/classes/Context.md
@@ -0,0 +1,303 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Context"
+---
+
+## Since
+
+1.0.0
+Provides values shared between
+Message and ChatInputCommandInteraction
+
+## Extends
+
+- `CoreContext`\<`Message`, `ChatInputCommandInteraction`\>
+
+## Accessors
+
+### channel
+
+> `get` **channel**(): `null` \| `TextBasedChannel`
+
+#### Returns
+
+`null` \| `TextBasedChannel`
+
+#### Source
+
+[src/core/structures/context.ts:49](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/context.ts#L49)
+
+***
+
+### channelId
+
+> `get` **channelId**(): `string`
+
+#### Returns
+
+`string`
+
+#### Source
+
+[src/core/structures/context.ts:53](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/context.ts#L53)
+
+***
+
+### client
+
+> `get` **client**(): `Client`\<`boolean`\>
+
+#### Returns
+
+`Client`\<`boolean`\>
+
+#### Source
+
+[src/core/structures/context.ts:108](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/context.ts#L108)
+
+***
+
+### createdTimestamp
+
+> `get` **createdTimestamp**(): `number`
+
+#### Returns
+
+`number`
+
+#### Source
+
+[src/core/structures/context.ts:73](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/context.ts#L73)
+
+***
+
+### guild
+
+> `get` **guild**(): `null` \| `Guild`
+
+#### Returns
+
+`null` \| `Guild`
+
+#### Source
+
+[src/core/structures/context.ts:79](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/context.ts#L79)
+
+***
+
+### guildId
+
+> `get` **guildId**(): `null` \| `string`
+
+#### Returns
+
+`null` \| `string`
+
+#### Source
+
+[src/core/structures/context.ts:85](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/context.ts#L85)
+
+***
+
+### id
+
+> `get` **id**(): `string`
+
+#### Returns
+
+`string`
+
+#### Source
+
+[src/core/structures/context.ts:43](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/context.ts#L43)
+
+***
+
+### inGuild
+
+> `get` **inGuild**(): `boolean`
+
+#### Returns
+
+`boolean`
+
+#### Source
+
+[src/core/structures/context.ts:114](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/context.ts#L114)
+
+***
+
+### interaction
+
+> `get` **interaction**(): `ChatInputCommandInteraction`\<`CacheType`\>
+
+#### Returns
+
+`ChatInputCommandInteraction`\<`CacheType`\>
+
+#### Source
+
+[src/core/structures/context.ts:103](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/context.ts#L103)
+
+***
+
+### member
+
+> `get` **member**(): `null` \| `GuildMember` \| `APIInteractionGuildMember`
+
+#### Returns
+
+`null` \| `GuildMember` \| `APIInteractionGuildMember`
+
+#### Source
+
+[src/core/structures/context.ts:93](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/context.ts#L93)
+
+***
+
+### message
+
+> `get` **message**(): `Message`\<`boolean`\>
+
+#### Returns
+
+`Message`\<`boolean`\>
+
+#### Source
+
+[src/core/structures/context.ts:99](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/context.ts#L99)
+
+***
+
+### options
+
+> `get` **options**(): `string`[] \| `Omit`\<`CommandInteractionOptionResolver`\<`CacheType`\>, `"getMessage"` \| `"getFocused"`\>
+
+#### Returns
+
+`string`[] \| `Omit`\<`CommandInteractionOptionResolver`\<`CacheType`\>, `"getMessage"` \| `"getFocused"`\>
+
+#### Source
+
+[src/core/structures/context.ts:26](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/context.ts#L26)
+
+***
+
+### prefix
+
+> `get` **prefix**(): `undefined` \| `string`
+
+#### Returns
+
+`undefined` \| `string`
+
+#### Source
+
+[src/core/structures/context.ts:40](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/context.ts#L40)
+
+***
+
+### user
+
+> `get` **user**(): `User`
+
+If context is holding a message, message.author
+else, interaction.user
+
+#### Returns
+
+`User`
+
+#### Source
+
+[src/core/structures/context.ts:63](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/context.ts#L63)
+
+***
+
+### userId
+
+> `get` **userId**(): `string`
+
+#### Returns
+
+`string`
+
+#### Source
+
+[src/core/structures/context.ts:69](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/context.ts#L69)
+
+## Methods
+
+### isMessage()
+
+> **isMessage**(): `this is CoreContext, never>`
+
+#### Returns
+
+`this is CoreContext, never>`
+
+#### Inherited from
+
+`CoreContext.isMessage`
+
+#### Source
+
+[src/core/structures/core-context.ts:11](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/core-context.ts#L11)
+
+***
+
+### isSlash()
+
+> **isSlash**(): `this is CoreContext>`
+
+#### Returns
+
+`this is CoreContext>`
+
+#### Inherited from
+
+`CoreContext.isSlash`
+
+#### Source
+
+[src/core/structures/core-context.ts:15](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/core-context.ts#L15)
+
+***
+
+### reply()
+
+> **reply**(`content`): `Promise`\<`Message`\<`boolean`\>\>
+
+#### Parameters
+
+• **content**: `ReplyOptions`
+
+#### Returns
+
+`Promise`\<`Message`\<`boolean`\>\>
+
+#### Source
+
+[src/core/structures/context.ts:120](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/context.ts#L120)
+
+***
+
+### wrap()
+
+> `static` **wrap**(`wrappable`, `prefix`?): [`Context`](/v4/api/classes/context/)
+
+#### Parameters
+
+• **wrappable**: `BaseInteraction`\<`CacheType`\> \| `Message`\<`boolean`\>
+
+• **prefix?**: `string`
+
+#### Returns
+
+[`Context`](/v4/api/classes/context/)
+
+#### Source
+
+[src/core/structures/context.ts:129](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/context.ts#L129)
diff --git a/src/content/docs/v4/api/enumerations/CommandType.md b/src/content/docs/v4/api/enumerations/CommandType.md
new file mode 100644
index 000000000..450846988
--- /dev/null
+++ b/src/content/docs/v4/api/enumerations/CommandType.md
@@ -0,0 +1,144 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "CommandType"
+---
+
+## Since
+
+1.0.0
+A bitfield that discriminates command modules
+
+## Example
+
+```ts
+export default commandModule({
+ // highlight-next-line
+ type : CommandType.Text,
+ name : 'a text command'
+ execute(message) {
+ console.log(message.content)
+ }
+})
+```
+
+## Enumeration Members
+
+### Both
+
+> **Both**: `3`
+
+#### Source
+
+[src/core/structures/enums.ts:20](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/enums.ts#L20)
+
+***
+
+### Button
+
+> **Button**: `16`
+
+#### Source
+
+[src/core/structures/enums.ts:23](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/enums.ts#L23)
+
+***
+
+### ChannelSelect
+
+> **ChannelSelect**: `1024`
+
+#### Source
+
+[src/core/structures/enums.ts:29](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/enums.ts#L29)
+
+***
+
+### CtxMsg
+
+> **CtxMsg**: `8`
+
+#### Source
+
+[src/core/structures/enums.ts:22](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/enums.ts#L22)
+
+***
+
+### CtxUser
+
+> **CtxUser**: `4`
+
+#### Source
+
+[src/core/structures/enums.ts:21](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/enums.ts#L21)
+
+***
+
+### MentionableSelect
+
+> **MentionableSelect**: `512`
+
+#### Source
+
+[src/core/structures/enums.ts:28](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/enums.ts#L28)
+
+***
+
+### Modal
+
+> **Modal**: `64`
+
+#### Source
+
+[src/core/structures/enums.ts:25](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/enums.ts#L25)
+
+***
+
+### RoleSelect
+
+> **RoleSelect**: `256`
+
+#### Source
+
+[src/core/structures/enums.ts:27](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/enums.ts#L27)
+
+***
+
+### Slash
+
+> **Slash**: `2`
+
+#### Source
+
+[src/core/structures/enums.ts:19](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/enums.ts#L19)
+
+***
+
+### StringSelect
+
+> **StringSelect**: `32`
+
+#### Source
+
+[src/core/structures/enums.ts:24](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/enums.ts#L24)
+
+***
+
+### Text
+
+> **Text**: `1`
+
+#### Source
+
+[src/core/structures/enums.ts:18](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/enums.ts#L18)
+
+***
+
+### UserSelect
+
+> **UserSelect**: `128`
+
+#### Source
+
+[src/core/structures/enums.ts:26](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/enums.ts#L26)
diff --git a/src/content/docs/v4/api/enumerations/EventType.md b/src/content/docs/v4/api/enumerations/EventType.md
new file mode 100644
index 000000000..611279662
--- /dev/null
+++ b/src/content/docs/v4/api/enumerations/EventType.md
@@ -0,0 +1,68 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "EventType"
+---
+
+A bitfield that discriminates event modules
+
+## Example
+
+```ts
+export default eventModule({
+ //highlight-next-line
+ type : EventType.Discord,
+ name : 'guildMemberAdd'
+ execute(member : GuildMember) {
+ console.log(member)
+ }
+})
+```
+
+## Enumeration Members
+
+### Cron
+
+> **Cron**: `3`
+
+#### Source
+
+[src/core/structures/enums.ts:61](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/enums.ts#L61)
+
+***
+
+### Discord
+
+> **Discord**: `0`
+
+The EventType for handling discord events
+
+#### Source
+
+[src/core/structures/enums.ts:51](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/enums.ts#L51)
+
+***
+
+### External
+
+> **External**: `2`
+
+The EventType for handling external events.
+Could be for example, `process` events, database events
+
+#### Source
+
+[src/core/structures/enums.ts:60](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/enums.ts#L60)
+
+***
+
+### Sern
+
+> **Sern**: `1`
+
+The EventType for handling sern events
+
+#### Source
+
+[src/core/structures/enums.ts:55](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/enums.ts#L55)
diff --git a/src/content/docs/v4/api/enumerations/PayloadType.md b/src/content/docs/v4/api/enumerations/PayloadType.md
new file mode 100644
index 000000000..a9e1facbc
--- /dev/null
+++ b/src/content/docs/v4/api/enumerations/PayloadType.md
@@ -0,0 +1,40 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "PayloadType"
+---
+
+:::caution[Deprecated]
+- Use strings 'success' | 'failure' | 'warning'
+:::
+
+## Enumeration Members
+
+### ~~Failure~~
+
+> **Failure**: `"failure"`
+
+#### Source
+
+[src/core/structures/enums.ts:94](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/enums.ts#L94)
+
+***
+
+### ~~Success~~
+
+> **Success**: `"success"`
+
+#### Source
+
+[src/core/structures/enums.ts:93](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/enums.ts#L93)
+
+***
+
+### ~~Warning~~
+
+> **Warning**: `"warning"`
+
+#### Source
+
+[src/core/structures/enums.ts:95](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/enums.ts#L95)
diff --git a/src/content/docs/v4/api/enumerations/PluginType.md b/src/content/docs/v4/api/enumerations/PluginType.md
new file mode 100644
index 000000000..5b1596b66
--- /dev/null
+++ b/src/content/docs/v4/api/enumerations/PluginType.md
@@ -0,0 +1,44 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "PluginType"
+---
+
+A bitfield that discriminates plugins
+
+## Example
+
+```ts
+export default function myPlugin() : EventPlugin {
+ //highlight-next-line
+ type : PluginType.Event,
+ execute([ctx, args], controller) {
+ return controller.next();
+ }
+}
+```
+
+## Enumeration Members
+
+### Control
+
+> **Control**: `2`
+
+The PluginType for EventPlugins
+
+#### Source
+
+[src/core/structures/enums.ts:86](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/enums.ts#L86)
+
+***
+
+### Init
+
+> **Init**: `1`
+
+The PluginType for InitPlugins
+
+#### Source
+
+[src/core/structures/enums.ts:82](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/structures/enums.ts#L82)
diff --git a/src/content/docs/v4/api/functions/CommandControlPlugin.md b/src/content/docs/v4/api/functions/CommandControlPlugin.md
new file mode 100644
index 000000000..3f4f32bab
--- /dev/null
+++ b/src/content/docs/v4/api/functions/CommandControlPlugin.md
@@ -0,0 +1,28 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "CommandControlPlugin"
+---
+
+> **CommandControlPlugin**\<`I`\>(`execute`): [`Plugin`](/v4/api/interfaces/plugin/)\<`unknown`[]\>
+
+## Type parameters
+
+• **I** *extends* [`CommandType`](/v4/api/enumerations/commandtype/)
+
+## Parameters
+
+• **execute**
+
+## Returns
+
+[`Plugin`](/v4/api/interfaces/plugin/)\<`unknown`[]\>
+
+## Since
+
+2.5.0
+
+## Source
+
+[src/core/create-plugins.ts:28](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/create-plugins.ts#L28)
diff --git a/src/content/docs/v4/api/functions/CommandInitPlugin.md b/src/content/docs/v4/api/functions/CommandInitPlugin.md
new file mode 100644
index 000000000..d070c5f39
--- /dev/null
+++ b/src/content/docs/v4/api/functions/CommandInitPlugin.md
@@ -0,0 +1,28 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "CommandInitPlugin"
+---
+
+> **CommandInitPlugin**\<`I`\>(`execute`): [`Plugin`](/v4/api/interfaces/plugin/)\<`unknown`[]\>
+
+## Type parameters
+
+• **I** *extends* [`CommandType`](/v4/api/enumerations/commandtype/)
+
+## Parameters
+
+• **execute**
+
+## Returns
+
+[`Plugin`](/v4/api/interfaces/plugin/)\<`unknown`[]\>
+
+## Since
+
+2.5.0
+
+## Source
+
+[src/core/create-plugins.ts:20](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/create-plugins.ts#L20)
diff --git a/src/content/docs/v4/api/functions/EventInitPlugin.md b/src/content/docs/v4/api/functions/EventInitPlugin.md
new file mode 100644
index 000000000..b5f8eab3f
--- /dev/null
+++ b/src/content/docs/v4/api/functions/EventInitPlugin.md
@@ -0,0 +1,24 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "EventInitPlugin"
+---
+
+> **EventInitPlugin**(`execute`): [`Plugin`](/v4/api/interfaces/plugin/)\<`unknown`[]\>
+
+## Parameters
+
+• **execute**
+
+## Returns
+
+[`Plugin`](/v4/api/interfaces/plugin/)\<`unknown`[]\>
+
+## Since
+
+2.5.0
+
+## Source
+
+[src/core/create-plugins.ts:14](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/create-plugins.ts#L14)
diff --git a/src/content/docs/v4/api/functions/Service.md b/src/content/docs/v4/api/functions/Service.md
new file mode 100644
index 000000000..939554892
--- /dev/null
+++ b/src/content/docs/v4/api/functions/Service.md
@@ -0,0 +1,41 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Service"
+---
+
+> **Service**\<`T`\>(`key`): `Dependencies`\[`T`\]
+
+The new Service api, a cleaner alternative to useContainer
+To obtain intellisense, ensure a .d.ts file exists in the root of compilation.
+Usually our scaffolding tool takes care of this.
+Note: this method only works AFTER your container has been initiated
+
+## Type parameters
+
+• **T** *extends* keyof `Dependencies`
+
+## Parameters
+
+• **key**: `T`
+
+a key that corresponds to a dependency registered.
+
+## Returns
+
+`Dependencies`\[`T`\]
+
+## Since
+
+3.0.0
+
+## Example
+
+```ts
+const client = Service('@sern/client');
+```
+
+## Source
+
+[src/core/ioc.ts:87](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/ioc.ts#L87)
diff --git a/src/content/docs/v4/api/functions/Services.md b/src/content/docs/v4/api/functions/Services.md
new file mode 100644
index 000000000..2a125f4bf
--- /dev/null
+++ b/src/content/docs/v4/api/functions/Services.md
@@ -0,0 +1,31 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Services"
+---
+
+> **Services**\<`T`\>(...`keys`): `IntoDependencies`\<`T`\>
+
+## Type parameters
+
+• **T** *extends* keyof `Dependencies`[]
+
+## Parameters
+
+• ...**keys**: [`...T[]`]
+
+## Returns
+
+`IntoDependencies`\<`T`\>
+
+array of dependencies, in the same order of keys provided
+
+## Since
+
+3.0.0
+The plural version of [Service](../../../../../../v4/api/functions/service)
+
+## Source
+
+[src/core/ioc.ts:95](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/ioc.ts#L95)
diff --git a/src/content/docs/v4/api/functions/commandModule.md b/src/content/docs/v4/api/functions/commandModule.md
new file mode 100644
index 000000000..c2f3c2045
--- /dev/null
+++ b/src/content/docs/v4/api/functions/commandModule.md
@@ -0,0 +1,24 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "commandModule"
+---
+
+> **commandModule**(`mod`): [`Module`](/v4/api/interfaces/module/)
+
+## Parameters
+
+• **mod**: `InputCommand`
+
+## Returns
+
+[`Module`](/v4/api/interfaces/module/)
+
+## Since
+
+1.0.0 The wrapper function to define command modules for sern
+
+## Source
+
+[src/core/modules.ts:15](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/modules.ts#L15)
diff --git a/src/content/docs/v4/api/functions/discordEvent.md b/src/content/docs/v4/api/functions/discordEvent.md
new file mode 100644
index 000000000..f9041bd97
--- /dev/null
+++ b/src/content/docs/v4/api/functions/discordEvent.md
@@ -0,0 +1,34 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "discordEvent"
+---
+
+> **discordEvent**\<`T`\>(`mod`): [`Module`](/v4/api/interfaces/module/)
+
+Create event modules from discord.js client events,
+This is an [eventModule](../../../../../../v4/api/functions/eventmodule) for discord events,
+where typings can be very bad.
+
+## Type parameters
+
+• **T** *extends* keyof `ClientEvents`
+
+## Parameters
+
+• **mod**
+
+• **mod.execute**
+
+• **mod.name**: `T`
+
+## Returns
+
+[`Module`](/v4/api/interfaces/module/)
+
+## Experimental
+
+## Source
+
+[src/core/modules.ts:42](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/modules.ts#L42)
diff --git a/src/content/docs/v4/api/functions/eventModule.md b/src/content/docs/v4/api/functions/eventModule.md
new file mode 100644
index 000000000..1340e4a48
--- /dev/null
+++ b/src/content/docs/v4/api/functions/eventModule.md
@@ -0,0 +1,25 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "eventModule"
+---
+
+> **eventModule**(`mod`): [`Module`](/v4/api/interfaces/module/)
+
+## Parameters
+
+• **mod**: `InputEvent`
+
+## Returns
+
+[`Module`](/v4/api/interfaces/module/)
+
+## Since
+
+1.0.0
+The wrapper function to define event modules for sern
+
+## Source
+
+[src/core/modules.ts:28](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/modules.ts#L28)
diff --git a/src/content/docs/v4/api/functions/makeDependencies.md b/src/content/docs/v4/api/functions/makeDependencies.md
new file mode 100644
index 000000000..2290998cf
--- /dev/null
+++ b/src/content/docs/v4/api/functions/makeDependencies.md
@@ -0,0 +1,31 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "makeDependencies"
+---
+
+> **makeDependencies**(`conf`): `Promise`\<`void`\>
+
+makeDependencies constructs a dependency injection container for sern handler to use.
+This is required to start the handler, and is to be called before Sern.init.
+
+## Parameters
+
+• **conf**: `ValidDependencyConfig`
+
+## Returns
+
+`Promise`\<`void`\>
+
+## Example
+
+```ts
+await makeDependencies(({ add }) => {
+ add('@sern/client', new Client({ intents, partials })
+})
+```
+
+## Source
+
+[src/core/ioc.ts:56](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/ioc.ts#L56)
diff --git a/src/content/docs/v4/api/functions/makePlugin.md b/src/content/docs/v4/api/functions/makePlugin.md
new file mode 100644
index 000000000..70186bba7
--- /dev/null
+++ b/src/content/docs/v4/api/functions/makePlugin.md
@@ -0,0 +1,26 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "makePlugin"
+---
+
+> **makePlugin**\<`V`\>(`type`, `execute`): [`Plugin`](/v4/api/interfaces/plugin/)\<`V`\>
+
+## Type parameters
+
+• **V** *extends* `unknown`[]
+
+## Parameters
+
+• **type**: [`PluginType`](/v4/api/enumerations/plugintype/)
+
+• **execute**
+
+## Returns
+
+[`Plugin`](/v4/api/interfaces/plugin/)\<`V`\>
+
+## Source
+
+[src/core/create-plugins.ts:5](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/create-plugins.ts#L5)
diff --git a/src/content/docs/v4/api/functions/single.md b/src/content/docs/v4/api/functions/single.md
new file mode 100644
index 000000000..1cb59834e
--- /dev/null
+++ b/src/content/docs/v4/api/functions/single.md
@@ -0,0 +1,28 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "single"
+---
+
+> **single**\<`T`\>(`cb`): `T`
+
+:::caution[Deprecated]
+Creates a singleton object.
+:::
+
+## Type parameters
+
+• **T**
+
+## Parameters
+
+• **cb**
+
+## Returns
+
+`T`
+
+## Source
+
+[src/core/ioc.ts:104](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/ioc.ts#L104)
diff --git a/src/content/docs/v4/api/functions/transient.md b/src/content/docs/v4/api/functions/transient.md
new file mode 100644
index 000000000..c671df78f
--- /dev/null
+++ b/src/content/docs/v4/api/functions/transient.md
@@ -0,0 +1,33 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "transient"
+---
+
+> **transient**\<`T`\>(`cb`): `T`
+
+:::caution[Deprecated]
+This API is no longer supported and may be removed in a future release.
+:::
+
+## Type parameters
+
+• **T**
+
+## Parameters
+
+• **cb**
+
+## Returns
+
+`T`
+
+## Since
+
+2.0.0
+Creates a transient object
+
+## Source
+
+[src/core/ioc.ts:115](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/ioc.ts#L115)
diff --git a/src/content/docs/v4/api/interfaces/BothCommand.md b/src/content/docs/v4/api/interfaces/BothCommand.md
new file mode 100644
index 000000000..b3bf0db53
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/BothCommand.md
@@ -0,0 +1,150 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "BothCommand"
+---
+
+## Extends
+
+- [`Module`](/v4/api/interfaces/module/)
+
+## Properties
+
+### description
+
+> **description**: `string`
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`description`](/v4/api/interfaces/module/#description)
+
+#### Source
+
+[src/types/core-modules.ts:140](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L140)
+
+***
+
+### execute()
+
+> **execute**: (`ctx`, `tbd`) => `unknown`
+
+#### Parameters
+
+• **ctx**: [`Context`](/v4/api/classes/context/)
+
+• **tbd**: [`SDT`](/v4/api/type-aliases/sdt/)
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`execute`](/v4/api/interfaces/module/#execute)
+
+#### Source
+
+[src/types/core-modules.ts:142](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L142)
+
+***
+
+### locals
+
+> **locals**: `Record`\<`string`, `unknown`\>
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`locals`](/v4/api/interfaces/module/#locals)
+
+#### Source
+
+[src/types/core-modules.ts:44](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L44)
+
+***
+
+### meta
+
+> **meta**: `object`
+
+#### absPath
+
+> **absPath**: `string`
+
+#### id
+
+> **id**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`meta`](/v4/api/interfaces/module/#meta)
+
+#### Source
+
+[src/types/core-modules.ts:40](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L40)
+
+***
+
+### name?
+
+> `optional` **name**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`name`](/v4/api/interfaces/module/#name)
+
+#### Source
+
+[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L36)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v4/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`onEvent`](/v4/api/interfaces/module/#onevent)
+
+#### Source
+
+[src/types/core-modules.ts:37](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L37)
+
+***
+
+### options?
+
+> `optional` **options**: [`SernOptionsData`](/v4/api/type-aliases/sernoptionsdata/)[]
+
+#### Source
+
+[src/types/core-modules.ts:141](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L141)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v4/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`plugins`](/v4/api/interfaces/module/#plugins)
+
+#### Source
+
+[src/types/core-modules.ts:38](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L38)
+
+***
+
+### type
+
+> **type**: [`Both`](/v4/api/enumerations/commandtype/#both)
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`type`](/v4/api/interfaces/module/#type)
+
+#### Source
+
+[src/types/core-modules.ts:139](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L139)
diff --git a/src/content/docs/v4/api/interfaces/ButtonCommand.md b/src/content/docs/v4/api/interfaces/ButtonCommand.md
new file mode 100644
index 000000000..56a726900
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/ButtonCommand.md
@@ -0,0 +1,140 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "ButtonCommand"
+---
+
+## Extends
+
+- [`Module`](/v4/api/interfaces/module/)
+
+## Properties
+
+### description?
+
+> `optional` **description**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`description`](/v4/api/interfaces/module/#description)
+
+#### Source
+
+[src/types/core-modules.ts:39](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L39)
+
+***
+
+### execute()
+
+> **execute**: (`ctx`, `tbd`) => `unknown`
+
+#### Parameters
+
+• **ctx**: `ButtonInteraction`\<`CacheType`\>
+
+• **tbd**: [`SDT`](/v4/api/type-aliases/sdt/)
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`execute`](/v4/api/interfaces/module/#execute)
+
+#### Source
+
+[src/types/core-modules.ts:82](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L82)
+
+***
+
+### locals
+
+> **locals**: `Record`\<`string`, `unknown`\>
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`locals`](/v4/api/interfaces/module/#locals)
+
+#### Source
+
+[src/types/core-modules.ts:44](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L44)
+
+***
+
+### meta
+
+> **meta**: `object`
+
+#### absPath
+
+> **absPath**: `string`
+
+#### id
+
+> **id**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`meta`](/v4/api/interfaces/module/#meta)
+
+#### Source
+
+[src/types/core-modules.ts:40](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L40)
+
+***
+
+### name?
+
+> `optional` **name**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`name`](/v4/api/interfaces/module/#name)
+
+#### Source
+
+[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L36)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v4/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`onEvent`](/v4/api/interfaces/module/#onevent)
+
+#### Source
+
+[src/types/core-modules.ts:37](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L37)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v4/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`plugins`](/v4/api/interfaces/module/#plugins)
+
+#### Source
+
+[src/types/core-modules.ts:38](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L38)
+
+***
+
+### type
+
+> **type**: [`Button`](/v4/api/enumerations/commandtype/#button)
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`type`](/v4/api/interfaces/module/#type)
+
+#### Source
+
+[src/types/core-modules.ts:81](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L81)
diff --git a/src/content/docs/v4/api/interfaces/ChannelSelectCommand.md b/src/content/docs/v4/api/interfaces/ChannelSelectCommand.md
new file mode 100644
index 000000000..a684c4762
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/ChannelSelectCommand.md
@@ -0,0 +1,140 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "ChannelSelectCommand"
+---
+
+## Extends
+
+- [`Module`](/v4/api/interfaces/module/)
+
+## Properties
+
+### description?
+
+> `optional` **description**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`description`](/v4/api/interfaces/module/#description)
+
+#### Source
+
+[src/types/core-modules.ts:39](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L39)
+
+***
+
+### execute()
+
+> **execute**: (`ctx`, `tbd`) => `unknown`
+
+#### Parameters
+
+• **ctx**: `ChannelSelectMenuInteraction`\<`CacheType`\>
+
+• **tbd**: [`SDT`](/v4/api/type-aliases/sdt/)
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`execute`](/v4/api/interfaces/module/#execute)
+
+#### Source
+
+[src/types/core-modules.ts:92](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L92)
+
+***
+
+### locals
+
+> **locals**: `Record`\<`string`, `unknown`\>
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`locals`](/v4/api/interfaces/module/#locals)
+
+#### Source
+
+[src/types/core-modules.ts:44](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L44)
+
+***
+
+### meta
+
+> **meta**: `object`
+
+#### absPath
+
+> **absPath**: `string`
+
+#### id
+
+> **id**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`meta`](/v4/api/interfaces/module/#meta)
+
+#### Source
+
+[src/types/core-modules.ts:40](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L40)
+
+***
+
+### name?
+
+> `optional` **name**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`name`](/v4/api/interfaces/module/#name)
+
+#### Source
+
+[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L36)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v4/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`onEvent`](/v4/api/interfaces/module/#onevent)
+
+#### Source
+
+[src/types/core-modules.ts:37](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L37)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v4/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`plugins`](/v4/api/interfaces/module/#plugins)
+
+#### Source
+
+[src/types/core-modules.ts:38](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L38)
+
+***
+
+### type
+
+> **type**: [`ChannelSelect`](/v4/api/enumerations/commandtype/#channelselect)
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`type`](/v4/api/interfaces/module/#type)
+
+#### Source
+
+[src/types/core-modules.ts:91](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L91)
diff --git a/src/content/docs/v4/api/interfaces/CommandModuleDefs.md b/src/content/docs/v4/api/interfaces/CommandModuleDefs.md
new file mode 100644
index 000000000..df1e657cd
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/CommandModuleDefs.md
@@ -0,0 +1,126 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "CommandModuleDefs"
+---
+
+## Properties
+
+### 1
+
+> **1**: [`TextCommand`](/v4/api/interfaces/textcommand/)
+
+#### Source
+
+[src/types/core-modules.ts:163](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L163)
+
+***
+
+### 1024
+
+> **1024**: [`ChannelSelectCommand`](/v4/api/interfaces/channelselectcommand/)
+
+#### Source
+
+[src/types/core-modules.ts:171](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L171)
+
+***
+
+### 128
+
+> **128**: [`UserSelectCommand`](/v4/api/interfaces/userselectcommand/)
+
+#### Source
+
+[src/types/core-modules.ts:173](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L173)
+
+***
+
+### 16
+
+> **16**: [`ButtonCommand`](/v4/api/interfaces/buttoncommand/)
+
+#### Source
+
+[src/types/core-modules.ts:168](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L168)
+
+***
+
+### 2
+
+> **2**: [`SlashCommand`](/v4/api/interfaces/slashcommand/)
+
+#### Source
+
+[src/types/core-modules.ts:164](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L164)
+
+***
+
+### 256
+
+> **256**: [`RoleSelectCommand`](/v4/api/interfaces/roleselectcommand/)
+
+#### Source
+
+[src/types/core-modules.ts:170](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L170)
+
+***
+
+### 3
+
+> **3**: [`BothCommand`](/v4/api/interfaces/bothcommand/)
+
+#### Source
+
+[src/types/core-modules.ts:165](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L165)
+
+***
+
+### 32
+
+> **32**: [`StringSelectCommand`](/v4/api/interfaces/stringselectcommand/)
+
+#### Source
+
+[src/types/core-modules.ts:169](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L169)
+
+***
+
+### 4
+
+> **4**: [`ContextMenuUser`](/v4/api/interfaces/contextmenuuser/)
+
+#### Source
+
+[src/types/core-modules.ts:167](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L167)
+
+***
+
+### 512
+
+> **512**: [`MentionableSelectCommand`](/v4/api/interfaces/mentionableselectcommand/)
+
+#### Source
+
+[src/types/core-modules.ts:172](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L172)
+
+***
+
+### 64
+
+> **64**: [`ModalSubmitCommand`](/v4/api/interfaces/modalsubmitcommand/)
+
+#### Source
+
+[src/types/core-modules.ts:174](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L174)
+
+***
+
+### 8
+
+> **8**: [`ContextMenuMsg`](/v4/api/interfaces/contextmenumsg/)
+
+#### Source
+
+[src/types/core-modules.ts:166](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L166)
diff --git a/src/content/docs/v4/api/interfaces/ContextMenuMsg.md b/src/content/docs/v4/api/interfaces/ContextMenuMsg.md
new file mode 100644
index 000000000..519ee4b8d
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/ContextMenuMsg.md
@@ -0,0 +1,140 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "ContextMenuMsg"
+---
+
+## Extends
+
+- [`Module`](/v4/api/interfaces/module/)
+
+## Properties
+
+### description?
+
+> `optional` **description**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`description`](/v4/api/interfaces/module/#description)
+
+#### Source
+
+[src/types/core-modules.ts:39](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L39)
+
+***
+
+### execute()
+
+> **execute**: (`ctx`, `tbd`) => `unknown`
+
+#### Parameters
+
+• **ctx**: `MessageContextMenuCommandInteraction`\<`CacheType`\>
+
+• **tbd**: [`SDT`](/v4/api/type-aliases/sdt/)
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`execute`](/v4/api/interfaces/module/#execute)
+
+#### Source
+
+[src/types/core-modules.ts:77](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L77)
+
+***
+
+### locals
+
+> **locals**: `Record`\<`string`, `unknown`\>
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`locals`](/v4/api/interfaces/module/#locals)
+
+#### Source
+
+[src/types/core-modules.ts:44](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L44)
+
+***
+
+### meta
+
+> **meta**: `object`
+
+#### absPath
+
+> **absPath**: `string`
+
+#### id
+
+> **id**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`meta`](/v4/api/interfaces/module/#meta)
+
+#### Source
+
+[src/types/core-modules.ts:40](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L40)
+
+***
+
+### name?
+
+> `optional` **name**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`name`](/v4/api/interfaces/module/#name)
+
+#### Source
+
+[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L36)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v4/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`onEvent`](/v4/api/interfaces/module/#onevent)
+
+#### Source
+
+[src/types/core-modules.ts:37](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L37)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v4/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`plugins`](/v4/api/interfaces/module/#plugins)
+
+#### Source
+
+[src/types/core-modules.ts:38](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L38)
+
+***
+
+### type
+
+> **type**: [`CtxMsg`](/v4/api/enumerations/commandtype/#ctxmsg)
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`type`](/v4/api/interfaces/module/#type)
+
+#### Source
+
+[src/types/core-modules.ts:76](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L76)
diff --git a/src/content/docs/v4/api/interfaces/ContextMenuUser.md b/src/content/docs/v4/api/interfaces/ContextMenuUser.md
new file mode 100644
index 000000000..b09968a8f
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/ContextMenuUser.md
@@ -0,0 +1,140 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "ContextMenuUser"
+---
+
+## Extends
+
+- [`Module`](/v4/api/interfaces/module/)
+
+## Properties
+
+### description?
+
+> `optional` **description**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`description`](/v4/api/interfaces/module/#description)
+
+#### Source
+
+[src/types/core-modules.ts:39](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L39)
+
+***
+
+### execute()
+
+> **execute**: (`ctx`, `tbd`) => `unknown`
+
+#### Parameters
+
+• **ctx**: `UserContextMenuCommandInteraction`\<`CacheType`\>
+
+• **tbd**: [`SDT`](/v4/api/type-aliases/sdt/)
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`execute`](/v4/api/interfaces/module/#execute)
+
+#### Source
+
+[src/types/core-modules.ts:72](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L72)
+
+***
+
+### locals
+
+> **locals**: `Record`\<`string`, `unknown`\>
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`locals`](/v4/api/interfaces/module/#locals)
+
+#### Source
+
+[src/types/core-modules.ts:44](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L44)
+
+***
+
+### meta
+
+> **meta**: `object`
+
+#### absPath
+
+> **absPath**: `string`
+
+#### id
+
+> **id**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`meta`](/v4/api/interfaces/module/#meta)
+
+#### Source
+
+[src/types/core-modules.ts:40](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L40)
+
+***
+
+### name?
+
+> `optional` **name**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`name`](/v4/api/interfaces/module/#name)
+
+#### Source
+
+[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L36)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v4/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`onEvent`](/v4/api/interfaces/module/#onevent)
+
+#### Source
+
+[src/types/core-modules.ts:37](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L37)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v4/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`plugins`](/v4/api/interfaces/module/#plugins)
+
+#### Source
+
+[src/types/core-modules.ts:38](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L38)
+
+***
+
+### type
+
+> **type**: [`CtxUser`](/v4/api/enumerations/commandtype/#ctxuser)
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`type`](/v4/api/interfaces/module/#type)
+
+#### Source
+
+[src/types/core-modules.ts:71](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L71)
diff --git a/src/content/docs/v4/api/interfaces/ControlPlugin.md b/src/content/docs/v4/api/interfaces/ControlPlugin.md
new file mode 100644
index 000000000..85c6c1ae2
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/ControlPlugin.md
@@ -0,0 +1,50 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "ControlPlugin"
+---
+
+## Extends
+
+- [`Plugin`](/v4/api/interfaces/plugin/)\<`Args`\>
+
+## Type parameters
+
+• **Args** *extends* `any`[] = `any`[]
+
+## Properties
+
+### execute()
+
+> **execute**: (...`args`) => [`PluginResult`](/v4/api/type-aliases/pluginresult/)
+
+#### Parameters
+
+• ...**args**: `Args`
+
+#### Returns
+
+[`PluginResult`](/v4/api/type-aliases/pluginresult/)
+
+#### Inherited from
+
+[`Plugin`](/v4/api/interfaces/plugin/).[`execute`](/v4/api/interfaces/plugin/#execute)
+
+#### Source
+
+[src/types/core-plugin.ts:43](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-plugin.ts#L43)
+
+***
+
+### type
+
+> **type**: [`Control`](/v4/api/enumerations/plugintype/#control)
+
+#### Overrides
+
+[`Plugin`](/v4/api/interfaces/plugin/).[`type`](/v4/api/interfaces/plugin/#type)
+
+#### Source
+
+[src/types/core-plugin.ts:51](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-plugin.ts#L51)
diff --git a/src/content/docs/v4/api/interfaces/CoreDependencies.md b/src/content/docs/v4/api/interfaces/CoreDependencies.md
new file mode 100644
index 000000000..f805ab420
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/CoreDependencies.md
@@ -0,0 +1,69 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "CoreDependencies"
+---
+
+## Properties
+
+### @sern/client
+
+> **@sern/client**: `Client`\<`boolean`\>
+
+discord.js client.
+
+#### Source
+
+[src/types/ioc.ts:12](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/ioc.ts#L12)
+
+***
+
+### @sern/emitter
+
+> **@sern/emitter**: [`Emitter`](/v4/api/interfaces/emitter/)
+
+sern emitter listens to events that happen throughout
+the handler. some include module.register, module.activate.
+
+#### Source
+
+[src/types/ioc.ts:17](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/ioc.ts#L17)
+
+***
+
+### @sern/errors
+
+> **@sern/errors**: [`ErrorHandling`](/v4/api/interfaces/errorhandling/)
+
+An error handler which is the final step before
+the sern process actually crashes.
+
+#### Source
+
+[src/types/ioc.ts:22](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/ioc.ts#L22)
+
+***
+
+### @sern/logger?
+
+> `optional` **@sern/logger**: [`Logging`](/v4/api/interfaces/logging/)\<`unknown`\>
+
+Optional logger. Performs ... logging
+
+#### Source
+
+[src/types/ioc.ts:26](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/ioc.ts#L26)
+
+***
+
+### @sern/modules
+
+> **@sern/modules**: `Map`\<`string`, [`Module`](/v4/api/interfaces/module/)\>
+
+Readonly module store. sern stores these
+by module.meta.id -> Module
+
+#### Source
+
+[src/types/ioc.ts:31](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/ioc.ts#L31)
diff --git a/src/content/docs/v4/api/interfaces/DiscordEventCommand.md b/src/content/docs/v4/api/interfaces/DiscordEventCommand.md
new file mode 100644
index 000000000..d1f07c5ca
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/DiscordEventCommand.md
@@ -0,0 +1,142 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "DiscordEventCommand"
+---
+
+## Extends
+
+- [`Module`](/v4/api/interfaces/module/)
+
+## Type parameters
+
+• **T** *extends* keyof `ClientEvents` = keyof `ClientEvents`
+
+## Properties
+
+### description?
+
+> `optional` **description**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`description`](/v4/api/interfaces/module/#description)
+
+#### Source
+
+[src/types/core-modules.ts:39](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L39)
+
+***
+
+### locals
+
+> **locals**: `Record`\<`string`, `unknown`\>
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`locals`](/v4/api/interfaces/module/#locals)
+
+#### Source
+
+[src/types/core-modules.ts:44](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L44)
+
+***
+
+### meta
+
+> **meta**: `object`
+
+#### absPath
+
+> **absPath**: `string`
+
+#### id
+
+> **id**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`meta`](/v4/api/interfaces/module/#meta)
+
+#### Source
+
+[src/types/core-modules.ts:40](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L40)
+
+***
+
+### name?
+
+> `optional` **name**: `T`
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`name`](/v4/api/interfaces/module/#name)
+
+#### Source
+
+[src/types/core-modules.ts:122](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L122)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v4/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`onEvent`](/v4/api/interfaces/module/#onevent)
+
+#### Source
+
+[src/types/core-modules.ts:37](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L37)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v4/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`plugins`](/v4/api/interfaces/module/#plugins)
+
+#### Source
+
+[src/types/core-modules.ts:38](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L38)
+
+***
+
+### type
+
+> **type**: [`Discord`](/v4/api/enumerations/eventtype/#discord)
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`type`](/v4/api/interfaces/module/#type)
+
+#### Source
+
+[src/types/core-modules.ts:123](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L123)
+
+## Methods
+
+### execute()
+
+> **execute**(...`args`): `unknown`
+
+#### Parameters
+
+• ...**args**: `ClientEvents`\[`T`\]
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`execute`](/v4/api/interfaces/module/#execute)
+
+#### Source
+
+[src/types/core-modules.ts:124](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L124)
diff --git a/src/content/docs/v4/api/interfaces/Disposable.md b/src/content/docs/v4/api/interfaces/Disposable.md
new file mode 100644
index 000000000..205d8069f
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/Disposable.md
@@ -0,0 +1,23 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Disposable"
+---
+
+Represents a Disposable contract.
+Let dependencies implement this to dispose and cleanup.
+
+## Methods
+
+### dispose()
+
+> **dispose**(): `unknown`
+
+#### Returns
+
+`unknown`
+
+#### Source
+
+[src/core/interfaces.ts:17](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/interfaces.ts#L17)
diff --git a/src/content/docs/v4/api/interfaces/Emitter.md b/src/content/docs/v4/api/interfaces/Emitter.md
new file mode 100644
index 000000000..afd5581db
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/Emitter.md
@@ -0,0 +1,66 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Emitter"
+---
+
+## Methods
+
+### addListener()
+
+> **addListener**(`eventName`, `listener`): `this`
+
+#### Parameters
+
+• **eventName**: `string` \| `symbol`
+
+• **listener**: `AnyFunction`
+
+#### Returns
+
+`this`
+
+#### Source
+
+[src/core/interfaces.ts:22](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/interfaces.ts#L22)
+
+***
+
+### emit()
+
+> **emit**(`eventName`, ...`payload`): `boolean`
+
+#### Parameters
+
+• **eventName**: `string` \| `symbol`
+
+• ...**payload**: `any`[]
+
+#### Returns
+
+`boolean`
+
+#### Source
+
+[src/core/interfaces.ts:24](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/interfaces.ts#L24)
+
+***
+
+### removeListener()
+
+> **removeListener**(`eventName`, `listener`): `this`
+
+#### Parameters
+
+• **eventName**: `string` \| `symbol`
+
+• **listener**: `AnyFunction`
+
+#### Returns
+
+`this`
+
+#### Source
+
+[src/core/interfaces.ts:23](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/interfaces.ts#L23)
diff --git a/src/content/docs/v4/api/interfaces/ErrorHandling.md b/src/content/docs/v4/api/interfaces/ErrorHandling.md
new file mode 100644
index 000000000..4f9261397
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/ErrorHandling.md
@@ -0,0 +1,52 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "ErrorHandling"
+---
+
+## Since
+
+2.0.0
+
+## Methods
+
+### ~~crash()~~
+
+> **crash**(`err`): `never`
+
+:::caution[Deprecated]
+Version 4 will remove this method
+:::
+
+#### Parameters
+
+• **err**: `Error`
+
+#### Returns
+
+`never`
+
+#### Source
+
+[src/core/interfaces.ts:36](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/interfaces.ts#L36)
+
+***
+
+### updateAlive()
+
+> **updateAlive**(`error`): `void`
+
+A function that is called on every throw.
+
+#### Parameters
+
+• **error**: `Error`
+
+#### Returns
+
+`void`
+
+#### Source
+
+[src/core/interfaces.ts:41](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/interfaces.ts#L41)
diff --git a/src/content/docs/v4/api/interfaces/EventModuleDefs.md b/src/content/docs/v4/api/interfaces/EventModuleDefs.md
new file mode 100644
index 000000000..7cb269d0d
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/EventModuleDefs.md
@@ -0,0 +1,46 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "EventModuleDefs"
+---
+
+## Properties
+
+### 0
+
+> **0**: [`DiscordEventCommand`](/v4/api/interfaces/discordeventcommand/)\
+
+#### Source
+
+[src/types/core-modules.ts:179](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L179)
+
+***
+
+### 1
+
+> **1**: [`SernEventCommand`](/v4/api/interfaces/serneventcommand/)\
+
+#### Source
+
+[src/types/core-modules.ts:178](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L178)
+
+***
+
+### 2
+
+> **2**: [`ExternalEventCommand`](/v4/api/interfaces/externaleventcommand/)
+
+#### Source
+
+[src/types/core-modules.ts:180](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L180)
+
+***
+
+### 3
+
+> **3**: `CronEventCommand`
+
+#### Source
+
+[src/types/core-modules.ts:181](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L181)
diff --git a/src/content/docs/v4/api/interfaces/ExternalEventCommand.md b/src/content/docs/v4/api/interfaces/ExternalEventCommand.md
new file mode 100644
index 000000000..aa999edb0
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/ExternalEventCommand.md
@@ -0,0 +1,148 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "ExternalEventCommand"
+---
+
+## Extends
+
+- [`Module`](/v4/api/interfaces/module/)
+
+## Properties
+
+### description?
+
+> `optional` **description**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`description`](/v4/api/interfaces/module/#description)
+
+#### Source
+
+[src/types/core-modules.ts:39](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L39)
+
+***
+
+### emitter
+
+> **emitter**: keyof `Dependencies`
+
+#### Source
+
+[src/types/core-modules.ts:57](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L57)
+
+***
+
+### locals
+
+> **locals**: `Record`\<`string`, `unknown`\>
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`locals`](/v4/api/interfaces/module/#locals)
+
+#### Source
+
+[src/types/core-modules.ts:44](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L44)
+
+***
+
+### meta
+
+> **meta**: `object`
+
+#### absPath
+
+> **absPath**: `string`
+
+#### id
+
+> **id**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`meta`](/v4/api/interfaces/module/#meta)
+
+#### Source
+
+[src/types/core-modules.ts:40](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L40)
+
+***
+
+### name?
+
+> `optional` **name**: `string`
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`name`](/v4/api/interfaces/module/#name)
+
+#### Source
+
+[src/types/core-modules.ts:56](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L56)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v4/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`onEvent`](/v4/api/interfaces/module/#onevent)
+
+#### Source
+
+[src/types/core-modules.ts:37](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L37)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v4/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`plugins`](/v4/api/interfaces/module/#plugins)
+
+#### Source
+
+[src/types/core-modules.ts:38](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L38)
+
+***
+
+### type
+
+> **type**: [`External`](/v4/api/enumerations/eventtype/#external)
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`type`](/v4/api/interfaces/module/#type)
+
+#### Source
+
+[src/types/core-modules.ts:58](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L58)
+
+## Methods
+
+### execute()
+
+> **execute**(...`args`): `unknown`
+
+#### Parameters
+
+• ...**args**: `unknown`[]
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`execute`](/v4/api/interfaces/module/#execute)
+
+#### Source
+
+[src/types/core-modules.ts:59](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L59)
diff --git a/src/content/docs/v4/api/interfaces/Init.md b/src/content/docs/v4/api/interfaces/Init.md
new file mode 100644
index 000000000..bbd4da449
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/Init.md
@@ -0,0 +1,23 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Init"
+---
+
+Represents an initialization contract.
+Let dependencies implement this to initiate some logic.
+
+## Methods
+
+### init()
+
+> **init**(): `unknown`
+
+#### Returns
+
+`unknown`
+
+#### Source
+
+[src/core/interfaces.ts:9](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/interfaces.ts#L9)
diff --git a/src/content/docs/v4/api/interfaces/InitPlugin.md b/src/content/docs/v4/api/interfaces/InitPlugin.md
new file mode 100644
index 000000000..29efedd1f
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/InitPlugin.md
@@ -0,0 +1,50 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "InitPlugin"
+---
+
+## Extends
+
+- [`Plugin`](/v4/api/interfaces/plugin/)\<`Args`\>
+
+## Type parameters
+
+• **Args** *extends* `any`[] = `any`[]
+
+## Properties
+
+### execute()
+
+> **execute**: (...`args`) => [`PluginResult`](/v4/api/type-aliases/pluginresult/)
+
+#### Parameters
+
+• ...**args**: `Args`
+
+#### Returns
+
+[`PluginResult`](/v4/api/type-aliases/pluginresult/)
+
+#### Overrides
+
+[`Plugin`](/v4/api/interfaces/plugin/).[`execute`](/v4/api/interfaces/plugin/#execute)
+
+#### Source
+
+[src/types/core-plugin.ts:48](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-plugin.ts#L48)
+
+***
+
+### type
+
+> **type**: [`Init`](/v4/api/enumerations/plugintype/#init)
+
+#### Overrides
+
+[`Plugin`](/v4/api/interfaces/plugin/).[`type`](/v4/api/interfaces/plugin/#type)
+
+#### Source
+
+[src/types/core-plugin.ts:47](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-plugin.ts#L47)
diff --git a/src/content/docs/v4/api/interfaces/Logging.md b/src/content/docs/v4/api/interfaces/Logging.md
new file mode 100644
index 000000000..b1227c43a
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/Logging.md
@@ -0,0 +1,86 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Logging"
+---
+
+## Since
+
+2.0.0
+
+## Type parameters
+
+• **T** = `unknown`
+
+## Methods
+
+### debug()
+
+> **debug**(`payload`): `void`
+
+#### Parameters
+
+• **payload**: [`LogPayload`](/v4/api/type-aliases/logpayload/)\<`T`\>
+
+#### Returns
+
+`void`
+
+#### Source
+
+[src/core/interfaces.ts:52](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/interfaces.ts#L52)
+
+***
+
+### error()
+
+> **error**(`payload`): `void`
+
+#### Parameters
+
+• **payload**: [`LogPayload`](/v4/api/type-aliases/logpayload/)\<`T`\>
+
+#### Returns
+
+`void`
+
+#### Source
+
+[src/core/interfaces.ts:49](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/interfaces.ts#L49)
+
+***
+
+### info()
+
+> **info**(`payload`): `void`
+
+#### Parameters
+
+• **payload**: [`LogPayload`](/v4/api/type-aliases/logpayload/)\<`T`\>
+
+#### Returns
+
+`void`
+
+#### Source
+
+[src/core/interfaces.ts:51](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/interfaces.ts#L51)
+
+***
+
+### warning()
+
+> **warning**(`payload`): `void`
+
+#### Parameters
+
+• **payload**: [`LogPayload`](/v4/api/type-aliases/logpayload/)\<`T`\>
+
+#### Returns
+
+`void`
+
+#### Source
+
+[src/core/interfaces.ts:50](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/interfaces.ts#L50)
diff --git a/src/content/docs/v4/api/interfaces/MentionableSelectCommand.md b/src/content/docs/v4/api/interfaces/MentionableSelectCommand.md
new file mode 100644
index 000000000..3316567d1
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/MentionableSelectCommand.md
@@ -0,0 +1,140 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "MentionableSelectCommand"
+---
+
+## Extends
+
+- [`Module`](/v4/api/interfaces/module/)
+
+## Properties
+
+### description?
+
+> `optional` **description**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`description`](/v4/api/interfaces/module/#description)
+
+#### Source
+
+[src/types/core-modules.ts:39](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L39)
+
+***
+
+### execute()
+
+> **execute**: (`ctx`, `tbd`) => `unknown`
+
+#### Parameters
+
+• **ctx**: `MentionableSelectMenuInteraction`\<`CacheType`\>
+
+• **tbd**: [`SDT`](/v4/api/type-aliases/sdt/)
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`execute`](/v4/api/interfaces/module/#execute)
+
+#### Source
+
+[src/types/core-modules.ts:102](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L102)
+
+***
+
+### locals
+
+> **locals**: `Record`\<`string`, `unknown`\>
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`locals`](/v4/api/interfaces/module/#locals)
+
+#### Source
+
+[src/types/core-modules.ts:44](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L44)
+
+***
+
+### meta
+
+> **meta**: `object`
+
+#### absPath
+
+> **absPath**: `string`
+
+#### id
+
+> **id**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`meta`](/v4/api/interfaces/module/#meta)
+
+#### Source
+
+[src/types/core-modules.ts:40](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L40)
+
+***
+
+### name?
+
+> `optional` **name**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`name`](/v4/api/interfaces/module/#name)
+
+#### Source
+
+[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L36)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v4/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`onEvent`](/v4/api/interfaces/module/#onevent)
+
+#### Source
+
+[src/types/core-modules.ts:37](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L37)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v4/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`plugins`](/v4/api/interfaces/module/#plugins)
+
+#### Source
+
+[src/types/core-modules.ts:38](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L38)
+
+***
+
+### type
+
+> **type**: [`MentionableSelect`](/v4/api/enumerations/commandtype/#mentionableselect)
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`type`](/v4/api/interfaces/module/#type)
+
+#### Source
+
+[src/types/core-modules.ts:101](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L101)
diff --git a/src/content/docs/v4/api/interfaces/ModalSubmitCommand.md b/src/content/docs/v4/api/interfaces/ModalSubmitCommand.md
new file mode 100644
index 000000000..ca197b8ed
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/ModalSubmitCommand.md
@@ -0,0 +1,140 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "ModalSubmitCommand"
+---
+
+## Extends
+
+- [`Module`](/v4/api/interfaces/module/)
+
+## Properties
+
+### description?
+
+> `optional` **description**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`description`](/v4/api/interfaces/module/#description)
+
+#### Source
+
+[src/types/core-modules.ts:39](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L39)
+
+***
+
+### execute()
+
+> **execute**: (`ctx`, `tbd`) => `unknown`
+
+#### Parameters
+
+• **ctx**: `ModalSubmitInteraction`\<`CacheType`\>
+
+• **tbd**: [`SDT`](/v4/api/type-aliases/sdt/)
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`execute`](/v4/api/interfaces/module/#execute)
+
+#### Source
+
+[src/types/core-modules.ts:112](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L112)
+
+***
+
+### locals
+
+> **locals**: `Record`\<`string`, `unknown`\>
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`locals`](/v4/api/interfaces/module/#locals)
+
+#### Source
+
+[src/types/core-modules.ts:44](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L44)
+
+***
+
+### meta
+
+> **meta**: `object`
+
+#### absPath
+
+> **absPath**: `string`
+
+#### id
+
+> **id**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`meta`](/v4/api/interfaces/module/#meta)
+
+#### Source
+
+[src/types/core-modules.ts:40](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L40)
+
+***
+
+### name?
+
+> `optional` **name**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`name`](/v4/api/interfaces/module/#name)
+
+#### Source
+
+[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L36)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v4/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`onEvent`](/v4/api/interfaces/module/#onevent)
+
+#### Source
+
+[src/types/core-modules.ts:37](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L37)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v4/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`plugins`](/v4/api/interfaces/module/#plugins)
+
+#### Source
+
+[src/types/core-modules.ts:38](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L38)
+
+***
+
+### type
+
+> **type**: [`Modal`](/v4/api/enumerations/commandtype/#modal)
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`type`](/v4/api/interfaces/module/#type)
+
+#### Source
+
+[src/types/core-modules.ts:111](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L111)
diff --git a/src/content/docs/v4/api/interfaces/Module.md b/src/content/docs/v4/api/interfaces/Module.md
new file mode 100644
index 000000000..ca898253b
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/Module.md
@@ -0,0 +1,120 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Module"
+---
+
+## Extended by
+
+- [`BothCommand`](/v4/api/interfaces/bothcommand/)
+- [`ContextMenuMsg`](/v4/api/interfaces/contextmenumsg/)
+- [`ContextMenuUser`](/v4/api/interfaces/contextmenuuser/)
+- [`SlashCommand`](/v4/api/interfaces/slashcommand/)
+- [`TextCommand`](/v4/api/interfaces/textcommand/)
+- [`ButtonCommand`](/v4/api/interfaces/buttoncommand/)
+- [`StringSelectCommand`](/v4/api/interfaces/stringselectcommand/)
+- [`MentionableSelectCommand`](/v4/api/interfaces/mentionableselectcommand/)
+- [`UserSelectCommand`](/v4/api/interfaces/userselectcommand/)
+- [`ChannelSelectCommand`](/v4/api/interfaces/channelselectcommand/)
+- [`RoleSelectCommand`](/v4/api/interfaces/roleselectcommand/)
+- [`ModalSubmitCommand`](/v4/api/interfaces/modalsubmitcommand/)
+- [`DiscordEventCommand`](/v4/api/interfaces/discordeventcommand/)
+- [`SernEventCommand`](/v4/api/interfaces/serneventcommand/)
+- [`ExternalEventCommand`](/v4/api/interfaces/externaleventcommand/)
+
+## Properties
+
+### description?
+
+> `optional` **description**: `string`
+
+#### Source
+
+[src/types/core-modules.ts:39](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L39)
+
+***
+
+### locals
+
+> **locals**: `Record`\<`string`, `unknown`\>
+
+#### Source
+
+[src/types/core-modules.ts:44](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L44)
+
+***
+
+### meta
+
+> **meta**: `object`
+
+#### absPath
+
+> **absPath**: `string`
+
+#### id
+
+> **id**: `string`
+
+#### Source
+
+[src/types/core-modules.ts:40](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L40)
+
+***
+
+### name?
+
+> `optional` **name**: `string`
+
+#### Source
+
+[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L36)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v4/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Source
+
+[src/types/core-modules.ts:37](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L37)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v4/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Source
+
+[src/types/core-modules.ts:38](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L38)
+
+***
+
+### type
+
+> **type**: [`CommandType`](/v4/api/enumerations/commandtype/) \| [`EventType`](/v4/api/enumerations/eventtype/)
+
+#### Source
+
+[src/types/core-modules.ts:35](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L35)
+
+## Methods
+
+### execute()
+
+> **execute**(...`args`): `any`
+
+#### Parameters
+
+• ...**args**: `any`[]
+
+#### Returns
+
+`any`
+
+#### Source
+
+[src/types/core-modules.ts:45](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L45)
diff --git a/src/content/docs/v4/api/interfaces/Plugin.md b/src/content/docs/v4/api/interfaces/Plugin.md
new file mode 100644
index 000000000..f73e6d654
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/Plugin.md
@@ -0,0 +1,43 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Plugin"
+---
+
+## Extended by
+
+- [`InitPlugin`](/v4/api/interfaces/initplugin/)
+- [`ControlPlugin`](/v4/api/interfaces/controlplugin/)
+
+## Type parameters
+
+• **Args** *extends* `any`[] = `any`[]
+
+## Properties
+
+### execute()
+
+> **execute**: (...`args`) => [`PluginResult`](/v4/api/type-aliases/pluginresult/)
+
+#### Parameters
+
+• ...**args**: `Args`
+
+#### Returns
+
+[`PluginResult`](/v4/api/type-aliases/pluginresult/)
+
+#### Source
+
+[src/types/core-plugin.ts:43](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-plugin.ts#L43)
+
+***
+
+### type
+
+> **type**: [`PluginType`](/v4/api/enumerations/plugintype/)
+
+#### Source
+
+[src/types/core-plugin.ts:42](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-plugin.ts#L42)
diff --git a/src/content/docs/v4/api/interfaces/PresenceResult.md b/src/content/docs/v4/api/interfaces/PresenceResult.md
new file mode 100644
index 000000000..29bb2ef19
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/PresenceResult.md
@@ -0,0 +1,74 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "PresenceResult"
+---
+
+## Properties
+
+### activities?
+
+> `optional` **activities**: `ActivitiesOptions`[]
+
+#### Source
+
+[src/core/presences.ts:11](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/presences.ts#L11)
+
+***
+
+### afk?
+
+> `optional` **afk**: `boolean`
+
+#### Source
+
+[src/core/presences.ts:10](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/presences.ts#L10)
+
+***
+
+### onRepeat()?
+
+> `optional` **onRepeat**: (`previous`) => [`PresenceResult`](/v4/api/interfaces/presenceresult/)
+
+#### Parameters
+
+• **previous**: [`PresenceResult`](/v4/api/interfaces/presenceresult/)
+
+#### Returns
+
+[`PresenceResult`](/v4/api/interfaces/presenceresult/)
+
+#### Source
+
+[src/core/presences.ts:14](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/presences.ts#L14)
+
+***
+
+### repeat?
+
+> `optional` **repeat**: `number` \| [[`Emitter`](/v4/api/interfaces/emitter/), `string`]
+
+#### Source
+
+[src/core/presences.ts:13](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/presences.ts#L13)
+
+***
+
+### shardId?
+
+> `optional` **shardId**: `number`[]
+
+#### Source
+
+[src/core/presences.ts:12](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/presences.ts#L12)
+
+***
+
+### status?
+
+> `optional` **status**: `Status`
+
+#### Source
+
+[src/core/presences.ts:9](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/presences.ts#L9)
diff --git a/src/content/docs/v4/api/interfaces/RoleSelectCommand.md b/src/content/docs/v4/api/interfaces/RoleSelectCommand.md
new file mode 100644
index 000000000..d9a6acee6
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/RoleSelectCommand.md
@@ -0,0 +1,140 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "RoleSelectCommand"
+---
+
+## Extends
+
+- [`Module`](/v4/api/interfaces/module/)
+
+## Properties
+
+### description?
+
+> `optional` **description**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`description`](/v4/api/interfaces/module/#description)
+
+#### Source
+
+[src/types/core-modules.ts:39](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L39)
+
+***
+
+### execute()
+
+> **execute**: (`ctx`, `tbd`) => `unknown`
+
+#### Parameters
+
+• **ctx**: `RoleSelectMenuInteraction`\<`CacheType`\>
+
+• **tbd**: [`SDT`](/v4/api/type-aliases/sdt/)
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`execute`](/v4/api/interfaces/module/#execute)
+
+#### Source
+
+[src/types/core-modules.ts:97](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L97)
+
+***
+
+### locals
+
+> **locals**: `Record`\<`string`, `unknown`\>
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`locals`](/v4/api/interfaces/module/#locals)
+
+#### Source
+
+[src/types/core-modules.ts:44](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L44)
+
+***
+
+### meta
+
+> **meta**: `object`
+
+#### absPath
+
+> **absPath**: `string`
+
+#### id
+
+> **id**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`meta`](/v4/api/interfaces/module/#meta)
+
+#### Source
+
+[src/types/core-modules.ts:40](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L40)
+
+***
+
+### name?
+
+> `optional` **name**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`name`](/v4/api/interfaces/module/#name)
+
+#### Source
+
+[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L36)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v4/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`onEvent`](/v4/api/interfaces/module/#onevent)
+
+#### Source
+
+[src/types/core-modules.ts:37](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L37)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v4/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`plugins`](/v4/api/interfaces/module/#plugins)
+
+#### Source
+
+[src/types/core-modules.ts:38](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L38)
+
+***
+
+### type
+
+> **type**: [`RoleSelect`](/v4/api/enumerations/commandtype/#roleselect)
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`type`](/v4/api/interfaces/module/#type)
+
+#### Source
+
+[src/types/core-modules.ts:96](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L96)
diff --git a/src/content/docs/v4/api/interfaces/SernAutocompleteData.md b/src/content/docs/v4/api/interfaces/SernAutocompleteData.md
new file mode 100644
index 000000000..a20d2a5f3
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/SernAutocompleteData.md
@@ -0,0 +1,110 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "SernAutocompleteData"
+---
+
+## Extends
+
+- `Omit`\<`BaseApplicationCommandOptionsData`, `"autocomplete"`\>
+
+## Properties
+
+### autocomplete
+
+> **autocomplete**: `true`
+
+#### Source
+
+[src/types/core-modules.ts:186](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L186)
+
+***
+
+### command
+
+> **command**: `AutocompleteCommand`
+
+#### Source
+
+[src/types/core-modules.ts:191](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L191)
+
+***
+
+### description
+
+> **description**: `string`
+
+#### Inherited from
+
+`Omit.description`
+
+#### Source
+
+node\_modules/discord.js/typings/index.d.ts:4715
+
+***
+
+### descriptionLocalizations?
+
+> `optional` **descriptionLocalizations**: `Partial`\<`Record`\<`"id"` \| `"en-US"` \| `"en-GB"` \| `"bg"` \| `"zh-CN"` \| `"zh-TW"` \| `"hr"` \| `"cs"` \| `"da"` \| `"nl"` \| `"fi"` \| `"fr"` \| `"de"` \| `"el"` \| `"hi"` \| `"hu"` \| `"it"` \| `"ja"` \| `"ko"` \| `"lt"` \| `"no"` \| `"pl"` \| `"pt-BR"` \| `"ro"` \| `"ru"` \| `"es-ES"` \| `"es-419"` \| `"sv-SE"` \| `"th"` \| `"tr"` \| `"uk"` \| `"vi"`, `null` \| `string`\>\>
+
+#### Inherited from
+
+`Omit.descriptionLocalizations`
+
+#### Source
+
+node\_modules/discord.js/typings/index.d.ts:4716
+
+***
+
+### name
+
+> **name**: `string`
+
+#### Inherited from
+
+`Omit.name`
+
+#### Source
+
+node\_modules/discord.js/typings/index.d.ts:4713
+
+***
+
+### nameLocalizations?
+
+> `optional` **nameLocalizations**: `Partial`\<`Record`\<`"id"` \| `"en-US"` \| `"en-GB"` \| `"bg"` \| `"zh-CN"` \| `"zh-TW"` \| `"hr"` \| `"cs"` \| `"da"` \| `"nl"` \| `"fi"` \| `"fr"` \| `"de"` \| `"el"` \| `"hi"` \| `"hu"` \| `"it"` \| `"ja"` \| `"ko"` \| `"lt"` \| `"no"` \| `"pl"` \| `"pt-BR"` \| `"ro"` \| `"ru"` \| `"es-ES"` \| `"es-419"` \| `"sv-SE"` \| `"th"` \| `"tr"` \| `"uk"` \| `"vi"`, `null` \| `string`\>\>
+
+#### Inherited from
+
+`Omit.nameLocalizations`
+
+#### Source
+
+node\_modules/discord.js/typings/index.d.ts:4714
+
+***
+
+### required?
+
+> `optional` **required**: `boolean`
+
+#### Inherited from
+
+`Omit.required`
+
+#### Source
+
+node\_modules/discord.js/typings/index.d.ts:4717
+
+***
+
+### type
+
+> **type**: `String` \| `Integer` \| `Number`
+
+#### Source
+
+[src/types/core-modules.ts:187](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L187)
diff --git a/src/content/docs/v4/api/interfaces/SernEventCommand.md b/src/content/docs/v4/api/interfaces/SernEventCommand.md
new file mode 100644
index 000000000..3ab4430b5
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/SernEventCommand.md
@@ -0,0 +1,142 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "SernEventCommand"
+---
+
+## Extends
+
+- [`Module`](/v4/api/interfaces/module/)
+
+## Type parameters
+
+• **T** *extends* keyof [`SernEventsMapping`](/v4/api/interfaces/serneventsmapping/) = keyof [`SernEventsMapping`](/v4/api/interfaces/serneventsmapping/)
+
+## Properties
+
+### description?
+
+> `optional` **description**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`description`](/v4/api/interfaces/module/#description)
+
+#### Source
+
+[src/types/core-modules.ts:39](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L39)
+
+***
+
+### locals
+
+> **locals**: `Record`\<`string`, `unknown`\>
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`locals`](/v4/api/interfaces/module/#locals)
+
+#### Source
+
+[src/types/core-modules.ts:44](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L44)
+
+***
+
+### meta
+
+> **meta**: `object`
+
+#### absPath
+
+> **absPath**: `string`
+
+#### id
+
+> **id**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`meta`](/v4/api/interfaces/module/#meta)
+
+#### Source
+
+[src/types/core-modules.ts:40](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L40)
+
+***
+
+### name?
+
+> `optional` **name**: `T`
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`name`](/v4/api/interfaces/module/#name)
+
+#### Source
+
+[src/types/core-modules.ts:50](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L50)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v4/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`onEvent`](/v4/api/interfaces/module/#onevent)
+
+#### Source
+
+[src/types/core-modules.ts:37](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L37)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v4/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`plugins`](/v4/api/interfaces/module/#plugins)
+
+#### Source
+
+[src/types/core-modules.ts:38](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L38)
+
+***
+
+### type
+
+> **type**: [`Sern`](/v4/api/enumerations/eventtype/#sern)
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`type`](/v4/api/interfaces/module/#type)
+
+#### Source
+
+[src/types/core-modules.ts:51](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L51)
+
+## Methods
+
+### execute()
+
+> **execute**(...`args`): `unknown`
+
+#### Parameters
+
+• ...**args**: [`SernEventsMapping`](/v4/api/interfaces/serneventsmapping/)\[`T`\]
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`execute`](/v4/api/interfaces/module/#execute)
+
+#### Source
+
+[src/types/core-modules.ts:52](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L52)
diff --git a/src/content/docs/v4/api/interfaces/SernEventsMapping.md b/src/content/docs/v4/api/interfaces/SernEventsMapping.md
new file mode 100644
index 000000000..41e6a9e33
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/SernEventsMapping.md
@@ -0,0 +1,56 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "SernEventsMapping"
+---
+
+## Properties
+
+### error
+
+> **error**: [`object`]
+
+#### Source
+
+[src/types/utility.ts:13](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/utility.ts#L13)
+
+***
+
+### module.activate
+
+> **module.activate**: [[`Payload`](/v4/api/type-aliases/payload/)]
+
+#### Source
+
+[src/types/utility.ts:12](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/utility.ts#L12)
+
+***
+
+### module.register
+
+> **module.register**: [[`Payload`](/v4/api/type-aliases/payload/)]
+
+#### Source
+
+[src/types/utility.ts:11](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/utility.ts#L11)
+
+***
+
+### modulesLoaded
+
+> **modulesLoaded**: [`undefined?`]
+
+#### Source
+
+[src/types/utility.ts:15](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/utility.ts#L15)
+
+***
+
+### warning
+
+> **warning**: [[`Payload`](/v4/api/type-aliases/payload/)]
+
+#### Source
+
+[src/types/utility.ts:14](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/utility.ts#L14)
diff --git a/src/content/docs/v4/api/interfaces/SernSubCommandData.md b/src/content/docs/v4/api/interfaces/SernSubCommandData.md
new file mode 100644
index 000000000..4ffc304a3
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/SernSubCommandData.md
@@ -0,0 +1,104 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "SernSubCommandData"
+---
+
+## Extends
+
+- `APIApplicationCommandOptionBase`\<`ApplicationCommandOptionType.Subcommand`\>
+
+## Properties
+
+### description
+
+> **description**: `string`
+
+#### Inherited from
+
+`APIApplicationCommandOptionBase.description`
+
+#### Source
+
+node\_modules/discord-api-types/payloads/v10/\_interactions/\_applicationCommands/\_chatInput/base.d.ts:7
+
+***
+
+### description\_localizations?
+
+> `optional` **description\_localizations**: `null` \| `Partial`\<`Record`\<`"id"` \| `"en-US"` \| `"en-GB"` \| `"bg"` \| `"zh-CN"` \| `"zh-TW"` \| `"hr"` \| `"cs"` \| `"da"` \| `"nl"` \| `"fi"` \| `"fr"` \| `"de"` \| `"el"` \| `"hi"` \| `"hu"` \| `"it"` \| `"ja"` \| `"ko"` \| `"lt"` \| `"no"` \| `"pl"` \| `"pt-BR"` \| `"ro"` \| `"ru"` \| `"es-ES"` \| `"es-419"` \| `"sv-SE"` \| `"th"` \| `"tr"` \| `"uk"` \| `"vi"`, `null` \| `string`\>\>
+
+#### Inherited from
+
+`APIApplicationCommandOptionBase.description_localizations`
+
+#### Source
+
+node\_modules/discord-api-types/payloads/v10/\_interactions/\_applicationCommands/\_chatInput/base.d.ts:8
+
+***
+
+### name
+
+> **name**: `string`
+
+#### Inherited from
+
+`APIApplicationCommandOptionBase.name`
+
+#### Source
+
+node\_modules/discord-api-types/payloads/v10/\_interactions/\_applicationCommands/\_chatInput/base.d.ts:5
+
+***
+
+### name\_localizations?
+
+> `optional` **name\_localizations**: `null` \| `Partial`\<`Record`\<`"id"` \| `"en-US"` \| `"en-GB"` \| `"bg"` \| `"zh-CN"` \| `"zh-TW"` \| `"hr"` \| `"cs"` \| `"da"` \| `"nl"` \| `"fi"` \| `"fr"` \| `"de"` \| `"el"` \| `"hi"` \| `"hu"` \| `"it"` \| `"ja"` \| `"ko"` \| `"lt"` \| `"no"` \| `"pl"` \| `"pt-BR"` \| `"ro"` \| `"ru"` \| `"es-ES"` \| `"es-419"` \| `"sv-SE"` \| `"th"` \| `"tr"` \| `"uk"` \| `"vi"`, `null` \| `string`\>\>
+
+#### Inherited from
+
+`APIApplicationCommandOptionBase.name_localizations`
+
+#### Source
+
+node\_modules/discord-api-types/payloads/v10/\_interactions/\_applicationCommands/\_chatInput/base.d.ts:6
+
+***
+
+### options?
+
+> `optional` **options**: [`SernOptionsData`](/v4/api/type-aliases/sernoptionsdata/)[]
+
+#### Source
+
+[src/types/core-modules.ts:226](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L226)
+
+***
+
+### required?
+
+> `optional` **required**: `boolean`
+
+#### Inherited from
+
+`APIApplicationCommandOptionBase.required`
+
+#### Source
+
+node\_modules/discord-api-types/payloads/v10/\_interactions/\_applicationCommands/\_chatInput/base.d.ts:9
+
+***
+
+### type
+
+> **type**: `Subcommand`
+
+#### Overrides
+
+`APIApplicationCommandOptionBase.type`
+
+#### Source
+
+[src/types/core-modules.ts:225](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L225)
diff --git a/src/content/docs/v4/api/interfaces/SernSubCommandGroupData.md b/src/content/docs/v4/api/interfaces/SernSubCommandGroupData.md
new file mode 100644
index 000000000..31b3a1c8e
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/SernSubCommandGroupData.md
@@ -0,0 +1,114 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "SernSubCommandGroupData"
+---
+
+## Extends
+
+- `BaseApplicationCommandOptionsData`
+
+## Properties
+
+### autocomplete?
+
+> `optional` **autocomplete**: `undefined`
+
+#### Inherited from
+
+`BaseApplicationCommandOptionsData.autocomplete`
+
+#### Source
+
+node\_modules/discord.js/typings/index.d.ts:4718
+
+***
+
+### description
+
+> **description**: `string`
+
+#### Inherited from
+
+`BaseApplicationCommandOptionsData.description`
+
+#### Source
+
+node\_modules/discord.js/typings/index.d.ts:4715
+
+***
+
+### descriptionLocalizations?
+
+> `optional` **descriptionLocalizations**: `Partial`\<`Record`\<`"id"` \| `"en-US"` \| `"en-GB"` \| `"bg"` \| `"zh-CN"` \| `"zh-TW"` \| `"hr"` \| `"cs"` \| `"da"` \| `"nl"` \| `"fi"` \| `"fr"` \| `"de"` \| `"el"` \| `"hi"` \| `"hu"` \| `"it"` \| `"ja"` \| `"ko"` \| `"lt"` \| `"no"` \| `"pl"` \| `"pt-BR"` \| `"ro"` \| `"ru"` \| `"es-ES"` \| `"es-419"` \| `"sv-SE"` \| `"th"` \| `"tr"` \| `"uk"` \| `"vi"`, `null` \| `string`\>\>
+
+#### Inherited from
+
+`BaseApplicationCommandOptionsData.descriptionLocalizations`
+
+#### Source
+
+node\_modules/discord.js/typings/index.d.ts:4716
+
+***
+
+### name
+
+> **name**: `string`
+
+#### Inherited from
+
+`BaseApplicationCommandOptionsData.name`
+
+#### Source
+
+node\_modules/discord.js/typings/index.d.ts:4713
+
+***
+
+### nameLocalizations?
+
+> `optional` **nameLocalizations**: `Partial`\<`Record`\<`"id"` \| `"en-US"` \| `"en-GB"` \| `"bg"` \| `"zh-CN"` \| `"zh-TW"` \| `"hr"` \| `"cs"` \| `"da"` \| `"nl"` \| `"fi"` \| `"fr"` \| `"de"` \| `"el"` \| `"hi"` \| `"hu"` \| `"it"` \| `"ja"` \| `"ko"` \| `"lt"` \| `"no"` \| `"pl"` \| `"pt-BR"` \| `"ro"` \| `"ru"` \| `"es-ES"` \| `"es-419"` \| `"sv-SE"` \| `"th"` \| `"tr"` \| `"uk"` \| `"vi"`, `null` \| `string`\>\>
+
+#### Inherited from
+
+`BaseApplicationCommandOptionsData.nameLocalizations`
+
+#### Source
+
+node\_modules/discord.js/typings/index.d.ts:4714
+
+***
+
+### options?
+
+> `optional` **options**: [`SernSubCommandData`](/v4/api/interfaces/sernsubcommanddata/)[]
+
+#### Source
+
+[src/types/core-modules.ts:231](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L231)
+
+***
+
+### required?
+
+> `optional` **required**: `boolean`
+
+#### Inherited from
+
+`BaseApplicationCommandOptionsData.required`
+
+#### Source
+
+node\_modules/discord.js/typings/index.d.ts:4717
+
+***
+
+### type
+
+> **type**: `SubcommandGroup`
+
+#### Source
+
+[src/types/core-modules.ts:230](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L230)
diff --git a/src/content/docs/v4/api/interfaces/SlashCommand.md b/src/content/docs/v4/api/interfaces/SlashCommand.md
new file mode 100644
index 000000000..14ad16bf2
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/SlashCommand.md
@@ -0,0 +1,150 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "SlashCommand"
+---
+
+## Extends
+
+- [`Module`](/v4/api/interfaces/module/)
+
+## Properties
+
+### description
+
+> **description**: `string`
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`description`](/v4/api/interfaces/module/#description)
+
+#### Source
+
+[src/types/core-modules.ts:133](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L133)
+
+***
+
+### execute()
+
+> **execute**: (`ctx`, `tbd`) => `unknown`
+
+#### Parameters
+
+• **ctx**: [`Context`](/v4/api/classes/context/) & `object`
+
+• **tbd**: [`SDT`](/v4/api/type-aliases/sdt/)
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`execute`](/v4/api/interfaces/module/#execute)
+
+#### Source
+
+[src/types/core-modules.ts:135](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L135)
+
+***
+
+### locals
+
+> **locals**: `Record`\<`string`, `unknown`\>
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`locals`](/v4/api/interfaces/module/#locals)
+
+#### Source
+
+[src/types/core-modules.ts:44](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L44)
+
+***
+
+### meta
+
+> **meta**: `object`
+
+#### absPath
+
+> **absPath**: `string`
+
+#### id
+
+> **id**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`meta`](/v4/api/interfaces/module/#meta)
+
+#### Source
+
+[src/types/core-modules.ts:40](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L40)
+
+***
+
+### name?
+
+> `optional` **name**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`name`](/v4/api/interfaces/module/#name)
+
+#### Source
+
+[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L36)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v4/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`onEvent`](/v4/api/interfaces/module/#onevent)
+
+#### Source
+
+[src/types/core-modules.ts:37](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L37)
+
+***
+
+### options?
+
+> `optional` **options**: [`SernOptionsData`](/v4/api/type-aliases/sernoptionsdata/)[]
+
+#### Source
+
+[src/types/core-modules.ts:134](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L134)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v4/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`plugins`](/v4/api/interfaces/module/#plugins)
+
+#### Source
+
+[src/types/core-modules.ts:38](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L38)
+
+***
+
+### type
+
+> **type**: [`Slash`](/v4/api/enumerations/commandtype/#slash)
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`type`](/v4/api/interfaces/module/#type)
+
+#### Source
+
+[src/types/core-modules.ts:132](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L132)
diff --git a/src/content/docs/v4/api/interfaces/StringSelectCommand.md b/src/content/docs/v4/api/interfaces/StringSelectCommand.md
new file mode 100644
index 000000000..15ca89f0c
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/StringSelectCommand.md
@@ -0,0 +1,140 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "StringSelectCommand"
+---
+
+## Extends
+
+- [`Module`](/v4/api/interfaces/module/)
+
+## Properties
+
+### description?
+
+> `optional` **description**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`description`](/v4/api/interfaces/module/#description)
+
+#### Source
+
+[src/types/core-modules.ts:39](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L39)
+
+***
+
+### execute()
+
+> **execute**: (`ctx`, `tbd`) => `unknown`
+
+#### Parameters
+
+• **ctx**: `StringSelectMenuInteraction`\<`CacheType`\>
+
+• **tbd**: [`SDT`](/v4/api/type-aliases/sdt/)
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`execute`](/v4/api/interfaces/module/#execute)
+
+#### Source
+
+[src/types/core-modules.ts:87](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L87)
+
+***
+
+### locals
+
+> **locals**: `Record`\<`string`, `unknown`\>
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`locals`](/v4/api/interfaces/module/#locals)
+
+#### Source
+
+[src/types/core-modules.ts:44](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L44)
+
+***
+
+### meta
+
+> **meta**: `object`
+
+#### absPath
+
+> **absPath**: `string`
+
+#### id
+
+> **id**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`meta`](/v4/api/interfaces/module/#meta)
+
+#### Source
+
+[src/types/core-modules.ts:40](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L40)
+
+***
+
+### name?
+
+> `optional` **name**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`name`](/v4/api/interfaces/module/#name)
+
+#### Source
+
+[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L36)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v4/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`onEvent`](/v4/api/interfaces/module/#onevent)
+
+#### Source
+
+[src/types/core-modules.ts:37](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L37)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v4/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`plugins`](/v4/api/interfaces/module/#plugins)
+
+#### Source
+
+[src/types/core-modules.ts:38](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L38)
+
+***
+
+### type
+
+> **type**: [`StringSelect`](/v4/api/enumerations/commandtype/#stringselect)
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`type`](/v4/api/interfaces/module/#type)
+
+#### Source
+
+[src/types/core-modules.ts:86](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L86)
diff --git a/src/content/docs/v4/api/interfaces/TextCommand.md b/src/content/docs/v4/api/interfaces/TextCommand.md
new file mode 100644
index 000000000..1276c9f97
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/TextCommand.md
@@ -0,0 +1,140 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "TextCommand"
+---
+
+## Extends
+
+- [`Module`](/v4/api/interfaces/module/)
+
+## Properties
+
+### description?
+
+> `optional` **description**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`description`](/v4/api/interfaces/module/#description)
+
+#### Source
+
+[src/types/core-modules.ts:39](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L39)
+
+***
+
+### execute()
+
+> **execute**: (`ctx`, `tbd`) => `unknown`
+
+#### Parameters
+
+• **ctx**: [`Context`](/v4/api/classes/context/) & `object`
+
+• **tbd**: [`SDT`](/v4/api/type-aliases/sdt/)
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`execute`](/v4/api/interfaces/module/#execute)
+
+#### Source
+
+[src/types/core-modules.ts:128](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L128)
+
+***
+
+### locals
+
+> **locals**: `Record`\<`string`, `unknown`\>
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`locals`](/v4/api/interfaces/module/#locals)
+
+#### Source
+
+[src/types/core-modules.ts:44](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L44)
+
+***
+
+### meta
+
+> **meta**: `object`
+
+#### absPath
+
+> **absPath**: `string`
+
+#### id
+
+> **id**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`meta`](/v4/api/interfaces/module/#meta)
+
+#### Source
+
+[src/types/core-modules.ts:40](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L40)
+
+***
+
+### name?
+
+> `optional` **name**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`name`](/v4/api/interfaces/module/#name)
+
+#### Source
+
+[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L36)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v4/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`onEvent`](/v4/api/interfaces/module/#onevent)
+
+#### Source
+
+[src/types/core-modules.ts:37](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L37)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v4/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`plugins`](/v4/api/interfaces/module/#plugins)
+
+#### Source
+
+[src/types/core-modules.ts:38](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L38)
+
+***
+
+### type
+
+> **type**: [`Text`](/v4/api/enumerations/commandtype/#text)
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`type`](/v4/api/interfaces/module/#type)
+
+#### Source
+
+[src/types/core-modules.ts:127](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L127)
diff --git a/src/content/docs/v4/api/interfaces/UserSelectCommand.md b/src/content/docs/v4/api/interfaces/UserSelectCommand.md
new file mode 100644
index 000000000..62656a6b2
--- /dev/null
+++ b/src/content/docs/v4/api/interfaces/UserSelectCommand.md
@@ -0,0 +1,140 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "UserSelectCommand"
+---
+
+## Extends
+
+- [`Module`](/v4/api/interfaces/module/)
+
+## Properties
+
+### description?
+
+> `optional` **description**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`description`](/v4/api/interfaces/module/#description)
+
+#### Source
+
+[src/types/core-modules.ts:39](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L39)
+
+***
+
+### execute()
+
+> **execute**: (`ctx`, `tbd`) => `unknown`
+
+#### Parameters
+
+• **ctx**: `UserSelectMenuInteraction`\<`CacheType`\>
+
+• **tbd**: [`SDT`](/v4/api/type-aliases/sdt/)
+
+#### Returns
+
+`unknown`
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`execute`](/v4/api/interfaces/module/#execute)
+
+#### Source
+
+[src/types/core-modules.ts:107](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L107)
+
+***
+
+### locals
+
+> **locals**: `Record`\<`string`, `unknown`\>
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`locals`](/v4/api/interfaces/module/#locals)
+
+#### Source
+
+[src/types/core-modules.ts:44](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L44)
+
+***
+
+### meta
+
+> **meta**: `object`
+
+#### absPath
+
+> **absPath**: `string`
+
+#### id
+
+> **id**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`meta`](/v4/api/interfaces/module/#meta)
+
+#### Source
+
+[src/types/core-modules.ts:40](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L40)
+
+***
+
+### name?
+
+> `optional` **name**: `string`
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`name`](/v4/api/interfaces/module/#name)
+
+#### Source
+
+[src/types/core-modules.ts:36](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L36)
+
+***
+
+### onEvent
+
+> **onEvent**: [`ControlPlugin`](/v4/api/interfaces/controlplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`onEvent`](/v4/api/interfaces/module/#onevent)
+
+#### Source
+
+[src/types/core-modules.ts:37](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L37)
+
+***
+
+### plugins
+
+> **plugins**: [`InitPlugin`](/v4/api/interfaces/initplugin/)\<`any`[]\>[]
+
+#### Inherited from
+
+[`Module`](/v4/api/interfaces/module/).[`plugins`](/v4/api/interfaces/module/#plugins)
+
+#### Source
+
+[src/types/core-modules.ts:38](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L38)
+
+***
+
+### type
+
+> **type**: [`UserSelect`](/v4/api/enumerations/commandtype/#userselect)
+
+#### Overrides
+
+[`Module`](/v4/api/interfaces/module/).[`type`](/v4/api/interfaces/module/#type)
+
+#### Source
+
+[src/types/core-modules.ts:106](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L106)
diff --git a/src/content/docs/v4/api/namespaces/Sern/functions/init.md b/src/content/docs/v4/api/namespaces/Sern/functions/init.md
new file mode 100644
index 000000000..767c5d8b6
--- /dev/null
+++ b/src/content/docs/v4/api/namespaces/Sern/functions/init.md
@@ -0,0 +1,33 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "init"
+---
+
+> **init**(`maybeWrapper`): `void`
+
+## Parameters
+
+• **maybeWrapper**: `Wrapper`= `undefined`
+
+## Returns
+
+`void`
+
+## Since
+
+1.0.0
+
+## Example
+
+```ts title="src/index.ts"
+Sern.init({
+ commands: 'dist/commands',
+ events: 'dist/events',
+})
+```
+
+## Source
+
+[src/sern.ts:34](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/sern.ts#L34)
diff --git a/src/content/docs/v4/api/type-aliases/AnyPlugin.md b/src/content/docs/v4/api/type-aliases/AnyPlugin.md
new file mode 100644
index 000000000..389fc6bc6
--- /dev/null
+++ b/src/content/docs/v4/api/type-aliases/AnyPlugin.md
@@ -0,0 +1,12 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "AnyPlugin"
+---
+
+> **AnyPlugin**: [`ControlPlugin`](/v4/api/interfaces/controlplugin/) \| [`InitPlugin`](/v4/api/interfaces/initplugin/)\<[`InitArgs`\<`Processed`\<[`Module`](/v4/api/interfaces/module/)\>\>]\>
+
+## Source
+
+[src/types/core-plugin.ts:54](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-plugin.ts#L54)
diff --git a/src/content/docs/v4/api/type-aliases/CommandModule.md b/src/content/docs/v4/api/type-aliases/CommandModule.md
new file mode 100644
index 000000000..369742491
--- /dev/null
+++ b/src/content/docs/v4/api/type-aliases/CommandModule.md
@@ -0,0 +1,12 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "CommandModule"
+---
+
+> **CommandModule**: [`TextCommand`](/v4/api/interfaces/textcommand/) \| [`SlashCommand`](/v4/api/interfaces/slashcommand/) \| [`BothCommand`](/v4/api/interfaces/bothcommand/) \| [`ContextMenuUser`](/v4/api/interfaces/contextmenuuser/) \| [`ContextMenuMsg`](/v4/api/interfaces/contextmenumsg/) \| [`ButtonCommand`](/v4/api/interfaces/buttoncommand/) \| [`StringSelectCommand`](/v4/api/interfaces/stringselectcommand/) \| [`MentionableSelectCommand`](/v4/api/interfaces/mentionableselectcommand/) \| [`UserSelectCommand`](/v4/api/interfaces/userselectcommand/) \| [`ChannelSelectCommand`](/v4/api/interfaces/channelselectcommand/) \| [`RoleSelectCommand`](/v4/api/interfaces/roleselectcommand/) \| [`ModalSubmitCommand`](/v4/api/interfaces/modalsubmitcommand/)
+
+## Source
+
+[src/types/core-modules.ts:146](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L146)
diff --git a/src/content/docs/v4/api/type-aliases/Controller.md b/src/content/docs/v4/api/type-aliases/Controller.md
new file mode 100644
index 000000000..c93d7f455
--- /dev/null
+++ b/src/content/docs/v4/api/type-aliases/Controller.md
@@ -0,0 +1,12 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Controller"
+---
+
+> **Controller**: *typeof* [`controller`](/v4/api/variables/controller/)
+
+## Source
+
+[src/index.ts:52](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/index.ts#L52)
diff --git a/src/content/docs/v4/api/type-aliases/EventModule.md b/src/content/docs/v4/api/type-aliases/EventModule.md
new file mode 100644
index 000000000..f017e455f
--- /dev/null
+++ b/src/content/docs/v4/api/type-aliases/EventModule.md
@@ -0,0 +1,12 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "EventModule"
+---
+
+> **EventModule**: [`DiscordEventCommand`](/v4/api/interfaces/discordeventcommand/) \| [`SernEventCommand`](/v4/api/interfaces/serneventcommand/) \| [`ExternalEventCommand`](/v4/api/interfaces/externaleventcommand/) \| `CronEventCommand`
+
+## Source
+
+[src/types/core-modules.ts:145](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L145)
diff --git a/src/content/docs/v4/api/type-aliases/LogPayload.md b/src/content/docs/v4/api/type-aliases/LogPayload.md
new file mode 100644
index 000000000..be168ad4f
--- /dev/null
+++ b/src/content/docs/v4/api/type-aliases/LogPayload.md
@@ -0,0 +1,22 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "LogPayload"
+---
+
+> **LogPayload**\<`T`\>: `object`
+
+## Type parameters
+
+• **T** = `unknown`
+
+## Type declaration
+
+### message
+
+> **message**: `T`
+
+## Source
+
+[src/core/interfaces.ts:55](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/interfaces.ts#L55)
diff --git a/src/content/docs/v4/api/type-aliases/Payload.md b/src/content/docs/v4/api/type-aliases/Payload.md
new file mode 100644
index 000000000..7dba57ed1
--- /dev/null
+++ b/src/content/docs/v4/api/type-aliases/Payload.md
@@ -0,0 +1,12 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Payload"
+---
+
+> **Payload**: `object` \| `object` \| `object`
+
+## Source
+
+[src/types/utility.ts:18](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/utility.ts#L18)
diff --git a/src/content/docs/v4/api/type-aliases/PluginResult.md b/src/content/docs/v4/api/type-aliases/PluginResult.md
new file mode 100644
index 000000000..c9124af76
--- /dev/null
+++ b/src/content/docs/v4/api/type-aliases/PluginResult.md
@@ -0,0 +1,12 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "PluginResult"
+---
+
+> **PluginResult**: `Awaitable`\<`Result`\<`Record`\<`string`, `unknown`\> \| `undefined`, `string` \| `undefined`\>\>
+
+## Source
+
+[src/types/core-plugin.ts:35](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-plugin.ts#L35)
diff --git a/src/content/docs/v4/api/type-aliases/PresenceConfig.md b/src/content/docs/v4/api/type-aliases/PresenceConfig.md
new file mode 100644
index 000000000..a7291a927
--- /dev/null
+++ b/src/content/docs/v4/api/type-aliases/PresenceConfig.md
@@ -0,0 +1,34 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "PresenceConfig"
+---
+
+> **PresenceConfig**\<`T`\>: `object`
+
+## Type parameters
+
+• **T** *extends* keyof `Dependencies`[]
+
+## Type declaration
+
+### execute()
+
+> **execute**: (...`v`) => [`PresenceResult`](/v4/api/interfaces/presenceresult/)
+
+#### Parameters
+
+• ...**v**: `IntoDependencies`\<`T`\>
+
+#### Returns
+
+[`PresenceResult`](/v4/api/interfaces/presenceresult/)
+
+### inject?
+
+> `optional` **inject**: [`...T`]
+
+## Source
+
+[src/core/presences.ts:60](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/presences.ts#L60)
diff --git a/src/content/docs/v4/api/type-aliases/SDT.md b/src/content/docs/v4/api/type-aliases/SDT.md
new file mode 100644
index 000000000..68acaa6e5
--- /dev/null
+++ b/src/content/docs/v4/api/type-aliases/SDT.md
@@ -0,0 +1,30 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "SDT"
+---
+
+> **SDT**: `object`
+
+## Type declaration
+
+### deps
+
+> **deps**: `Dependencies`
+
+### params?
+
+> `optional` **params**: `string`
+
+### state
+
+> **state**: `Record`\<`string`, `unknown`\>
+
+### type
+
+> **type**: [`CommandType`](/v4/api/enumerations/commandtype/)
+
+## Source
+
+[src/types/core-modules.ts:25](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L25)
diff --git a/src/content/docs/v4/api/type-aliases/SernOptionsData.md b/src/content/docs/v4/api/type-aliases/SernOptionsData.md
new file mode 100644
index 000000000..40cf00fe3
--- /dev/null
+++ b/src/content/docs/v4/api/type-aliases/SernOptionsData.md
@@ -0,0 +1,14 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "SernOptionsData"
+---
+
+> **SernOptionsData**: [`SernSubCommandData`](/v4/api/interfaces/sernsubcommanddata/) \| [`SernSubCommandGroupData`](/v4/api/interfaces/sernsubcommandgroupdata/) \| `APIApplicationCommandBasicOption` \| [`SernAutocompleteData`](/v4/api/interfaces/sernautocompletedata/)
+
+Type that replaces autocomplete with [SernAutocompleteData](../../../../../../v4/api/interfaces/sernautocompletedata)
+
+## Source
+
+[src/types/core-modules.ts:217](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/types/core-modules.ts#L217)
diff --git a/src/content/docs/v4/api/variables/Presence.md b/src/content/docs/v4/api/variables/Presence.md
new file mode 100644
index 000000000..37239b8d8
--- /dev/null
+++ b/src/content/docs/v4/api/variables/Presence.md
@@ -0,0 +1,119 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "Presence"
+---
+
+> `const` **Presence**: `object`
+
+## Type declaration
+
+### module()
+
+> **module**: \<`T`\>(`conf`) => [`PresenceConfig`](/v4/api/type-aliases/presenceconfig/)\<`T`\>
+
+A small wrapper to provide type inference.
+Create a Presence module which **MUST** be put in a file called presence.(language-extension)
+adjacent to the file where **Sern.init** is CALLED.
+
+#### Type parameters
+
+• **T** *extends* keyof `Dependencies`[]
+
+#### Parameters
+
+• **conf**: [`PresenceConfig`](/v4/api/type-aliases/presenceconfig/)\<`T`\>
+
+#### Returns
+
+[`PresenceConfig`](/v4/api/type-aliases/presenceconfig/)\<`T`\>
+
+### of()
+
+> **of**: (`root`) => `object`
+
+Create a Presence body which can be either:
+- once, the presence is activated only once.
+- repeated, per cycle or event, the presence can be changed.
+
+#### Parameters
+
+• **root**: `Omit`\<[`PresenceResult`](/v4/api/interfaces/presenceresult/), `"repeat"` \| `"onRepeat"`\>
+
+#### Returns
+
+`object`
+
+##### once()
+
+> **once**: () => `Omit`\<[`PresenceResult`](/v4/api/interfaces/presenceresult/), `"repeat"` \| `"onRepeat"`\>
+
+###### Example
+
+```ts
+Presence.of({
+ activities: [
+ { name: "Chilling out" }
+ ]
+ }).once() // Sets the presence once, with what's provided in '.of()'
+ ```
+
+###### Returns
+
+`Omit`\<[`PresenceResult`](/v4/api/interfaces/presenceresult/), `"repeat"` \| `"onRepeat"`\>
+
+##### repeated()
+
+> **repeated**: (`onRepeat`, `repeat`) => `object`
+
+###### Example
+
+```ts
+Presence
+ .of({ activities: [{ name: "deez nuts" }] }) //starts presence with "deez nuts".
+ .repeated(prev => {
+ return {
+ afk: true,
+ activities: prev.activities?.map(s => ({ ...s, name: s.name+"s" }))
+ };
+ }, 10000)) //every 10 s, the callback sets the presence to the value returned.
+```
+
+###### Parameters
+
+• **onRepeat**: `PresenceReduce`
+
+• **repeat**: `number` \| [[`Emitter`](/v4/api/interfaces/emitter/), `string`]
+
+###### Returns
+
+`object`
+
+###### activities?
+
+> `optional` **activities**: `ActivitiesOptions`[]
+
+###### afk?
+
+> `optional` **afk**: `boolean`
+
+###### onRepeat
+
+> **onRepeat**: `PresenceReduce`
+
+###### repeat
+
+> **repeat**: `number` \| [[`Emitter`](/v4/api/interfaces/emitter/), `string`]
+
+###### shardId?
+
+> `optional` **shardId**: `number`[]
+
+###### status?
+
+> `optional` **status**: `Status`
+
+## Source
+
+[src/core/presences.ts:17](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/presences.ts#L17)
diff --git a/src/content/docs/v4/api/variables/controller.md b/src/content/docs/v4/api/variables/controller.md
new file mode 100644
index 000000000..35577985d
--- /dev/null
+++ b/src/content/docs/v4/api/variables/controller.md
@@ -0,0 +1,43 @@
+---
+editUrl: false
+next: false
+prev: false
+title: "controller"
+---
+
+> `const` **controller**: `object`
+
+## Since
+
+1.0.0
+The object passed into every plugin to control a command's behavior
+
+## Type declaration
+
+### next()
+
+> **next**: (`val`?) => `Ok`\<`undefined` \| `Record`\<`string`, `unknown`\>\>
+
+#### Parameters
+
+• **val?**: `Record`\<`string`, `unknown`\>
+
+#### Returns
+
+`Ok`\<`undefined` \| `Record`\<`string`, `unknown`\>\>
+
+### stop()
+
+> **stop**: (`val`?) => `Err`\<`undefined` \| `string`\>
+
+#### Parameters
+
+• **val?**: `string`
+
+#### Returns
+
+`Err`\<`undefined` \| `string`\>
+
+## Source
+
+[src/core/create-plugins.ts:39](https://github.com/sern-handler/handler/blob/7c8e39defbafdd6312a04a2d30750d647a3ab22b/src/core/create-plugins.ts#L39)
diff --git a/src/content/docs/v4/cli/about.mdx b/src/content/docs/v4/cli/about.mdx
new file mode 100644
index 000000000..2a6ce41ee
--- /dev/null
+++ b/src/content/docs/v4/cli/about.mdx
@@ -0,0 +1,35 @@
+---
+title: About the CLI
+description: The CLI is your pocketknife for discord bot development. It'll have all features necessary for developing and shipping to production.
+---
+
+Publish commands to the API, install plugins, and use other tools provided by our cli.
+
+The CLI is your pocketknife for discord bot development. It'll have all features necessary for developing and shipping to production.
+
+```ansi
+Usage: sern [options] [command]
+
+
+ ___ ___ _ __ _ __
+ / __|/ _ \ '__| '_ \
+ \__ \ __/ | | | | |
+ |___/\___|_| |_| |_|
+
+ Welcome!
+
+ If you're new to [36msern[0m, run [35mnpm create @sern/bot[0m for an interactive setup to your new bot project!
+
+ [33mIf you have any ideas, suggestions, bug reports, kindly join our support server: https://sern.dev/discord[0m
+
+Options:
+ -v, --version output the version number
+ -h, --help display help for command
+
+Commands:
+ init [options] Quickest way to scaffold a new project [93m[DEPRECATED][0m
+ plugins [options] Install plugins from https://github.com/sern-handler/awesome-plugins
+ extra Easy way to add extra things in your sern project
+ commands Defacto way to manage your slash commands
+ help [command] display help for command
+```
diff --git a/src/content/docs/v4/cli/build.mdx b/src/content/docs/v4/cli/build.mdx
new file mode 100644
index 000000000..69ae88987
--- /dev/null
+++ b/src/content/docs/v4/cli/build.mdx
@@ -0,0 +1,208 @@
+---
+title: Build
+description: Build your bot using the sern CLI tool
+---
+
+```sh
+Usage: sern build [options]
+
+Build your bot
+
+Options:
+ -f --format [fmt] The module system of your application. `cjs` or `esm` (default: "esm")
+ -m --mode [mode] the mode for sern to build in. `production` or `development` (default: "development")
+ -W --suppress-warnings suppress experimental warning
+ -p --project [filePath] build with this sern.build file
+ -h, --help display help for command
+```
+
+## Guiding Principles
+
+When designing the `sern build` command, our aim was to make building bot applications as simple as possible for the majority of developers. The setup process has been streamlined, and most of the configuration details have been handled for you.
+
+Here are some key points to keep in mind:
+
+import { Steps } from '@astrojs/starlight/components';
+
+
+1. **Minimal Configuration**: In the vast majority (99%) of use cases, developers do not need to configure the bot application building process. We believe that simplicity is key, so only a few decisions need to be made on the developer's end.
+
+2. **Optimal Defaults**: We've chosen sensible defaults. This means you can get started without getting bogged down by complex, unneeded configurations.
+
+3. **Finetuned for production bots**: Our CLI leverages an opinionated build solution powered by esbuild. This ensures that bots are built without issues and can be shipped easily.
+
+
+## Experimental Features
+
+Both the `sern build` and `sern publish` commands are marked as experimental. While they might not be completely stable, they are designed to work for the majority of users. We appreciate any feedback in helping us make these features even better.
+
+## Features
+
+The `sern build` command comes equipped with a range of features designed to enhance your development process. Here's a glimpse of what it offers:
+
+- **esbuild Integration**: our CLI takes inspiration from the efficiency of SvelteKit, ensuring your bot application is built effectively and with type safety. Leverage the [esbuild plugin ecosystem](https://github.com/esbuild/community-plugins).
+
+- **Zero Configuration**: Building your bot application without additional configuration. The CLI handles most of the setup for you.
+
+- **Experimental Image Support**: We've introduced experimental support for top-level imports of PNG and JPG files, making it easier to include images in your bot application.
+
+- **Compile Time Constants**: Customize your build with constants such as `__DEV__`, `__PROD__`, allowing you to tailor your application to different production stages.
+
+- **Development and Production Modes**: The CLI supports both development and production modes, enabling you to tailor your bot application for different stages of development.
+
+- **Type-safe `process.env`**: The CLI generates a type-safe `process.env`, reducing potential errors.
+
+## Implicits
+
+- Command line arguments take precendence over `sern.build` configuration file
+- Default build format is ESM
+- `defineVersion = true`
+- `__DEV__` AND `__PROD__` constants are configured.
+- Only a [few tsconfig options](https://esbuild.github.io/content-types/#tsconfig-json) are respected.
+
+### `sern.build.js`
+
+The `sern.build.js` file is for any extra configuration you may need, such as adding esbuild plugins.
+
+The CLI was intentionally made to be installed globally, and we can't provide typings at a project level. If you need typings, here they are:
+
+```ts
+type BuildOptions = {
+ /**
+ * Define __VERSION__
+ * This option is a quick switch to defining the __VERSION__ constant which will be a string of the version provided in
+ * cwd's package.json
+ */
+ defineVersion?: boolean;
+ /**
+ * default = esm
+ */
+ format?: "cjs" | "esm";
+ /**
+ * extra esbuild plugins to build with sern.
+ */
+ esbuildPlugins?: esbuild.Plugin[];
+ /**
+ * https://esbuild.github.io/api/#drop-labels
+ **/
+ dropLabels?: string[];
+ /**
+ * https://esbuild.github.io/api/#define
+ **/
+ define?: Record;
+ /**
+ * Path to tsconfig
+ **/
+ tsconfig?: string;
+ /**
+ * default = 'development'
+ */
+ mode: "production" | "development";
+ /**
+ * will search for env file. If none exists,
+ * default to .env.
+ */
+ env?: string;
+};
+```
+
+## Usage
+
+```sh
+sern build
+```
+
+(that was easy)
+
+## Adapting Older Projects
+
+Change your `tsconfig.json` to extend our generated one, `./.sern/tsconfig.json`.
+
+```json {2}
+{
+ "extends": "./.sern/tsconfig.json",
+ "compilerOptions": {
+ // all of your old fields
+ }
+}
+```
+
+## In Depth
+
+We use the `define` and `drop labels` API in C style macros to have easy development stage differences. [Here](https://esbuild.github.io/api/#drop-labels) is the esbuild full API documentation
+
+### Drop Labels
+
+```sh
+# mode is set to production
+sern build
+```
+
+import { Tabs, TabItem } from '@astrojs/starlight/components';
+
+
+
+ ```ts
+ __DEV__: console.log("This is for production only");
+ __PROD__: console.log("This is for either mode");
+ ```
+
+
+ ```sh
+ # mode is set to production
+ sern build
+ ```
+
+
+ ```ts
+ __PROD__ console.log('This is for either mode')
+ ```
+
+
+
+### Constants
+
+sern builds with three default constants. `__DEV__`, `__PROD__`, `__VERSION__`, where `__VERSION__` is the version in your build options, or `package.json` if unspecified.
+
+
+
+ ```sh
+ sern build
+ ```
+
+
+ ```ts
+ if (__PROD__) {
+ console.log("Bot version: " + __VERSION__);
+ }
+ ```
+
+
+
+Full esbuild documentation [here](https://esbuild.github.io/api/#define). Add more to the `define` field in build options (only availible with a `sern.build` file at the moment)
+
+### `process.env`
+
+We generate your process.env with `dotenv` and generate typings for process.env. Less hassle!
+
+
+
+ ```sh frame="none"
+ DISCORD_TOKEN=
+ ```
+
+ ```ts
+ process.env.DISCORD_TOKEN; // string | undefined (not typesafe :()
+ ```
+
+
+
+ ```sh
+ sern build
+ ```
+
+ ```ts
+ process.env.DISCORD_TOKEN; // string (typesafe :))
+ ```
+
+
diff --git a/src/content/docs/v4/cli/clear.mdx b/src/content/docs/v4/cli/clear.mdx
new file mode 100644
index 000000000..b833358d5
--- /dev/null
+++ b/src/content/docs/v4/cli/clear.mdx
@@ -0,0 +1,39 @@
+---
+title: Clear
+description: Clear and reset your commands, both globally and per guild
+---
+
+```sh
+Usage: sern commands clear [options]
+
+Clear and reset commands-data-remote.json and the api
+
+Options:
+ -y, --yes Say yes to all prompts
+ -e, --env [path] Supply a path to a .env
+ -h, --help display help for command
+```
+
+## Introduction
+
+The clear command is a utility that resets all of your commands. It's useful if you accidentally publish the wrong command, such as publishing a guild command globally.
+
+The clear command works by sending an empty array via the [`PUT`](https://discord.com/developers/docs/interactions/application-commands#bulk-overwrite-global-application-commands) route to the Discord API, for each guild and globally.
+
+To use this command, ensure you have a proper `.env` file in your root directory:
+
+```sh title=".env"
+DISCORD_TOKEN=
+NODE_ENV=
+```
+
+## Usage
+
+```sh
+sern commands clear
+```
+
+## Notes
+
+- The clear command will prompt you to confirm the action. You can bypass this by using the `-y` flag.
+- The clear command will automatically read a `.env` file in the working directory. If you need to override this, you can use the `-e` flag to supply a path to a different `.env` file.
diff --git a/src/content/docs/v4/cli/extra.mdx b/src/content/docs/v4/cli/extra.mdx
new file mode 100644
index 000000000..96fdc10e8
--- /dev/null
+++ b/src/content/docs/v4/cli/extra.mdx
@@ -0,0 +1,27 @@
+---
+title: Extra
+description: Add extra features to your sern project
+---
+
+```sh
+Usage: sern extra [options]
+
+Easy way to add extra things in your sern project
+
+Options:
+ -h, --help display help for command
+```
+
+## Introduction
+
+This command is pretty straightfoward. Install utilities into your application, assuming you have a `sern.config.json`.
+
+You can use this command to install things such as a `Dockerfile`
+
+## Usage
+
+```ansi frame
+[33m❯[0m sern extra
+[90m# Choose which extra feature from the prompt, such as this:[0m
+[33m✔[0m What extra feature do you want to add? [90m›[0m Dockerfile (TypeScript)
+```
diff --git a/src/content/docs/v4/cli/publish.mdx b/src/content/docs/v4/cli/publish.mdx
new file mode 100644
index 000000000..faf42fc7b
--- /dev/null
+++ b/src/content/docs/v4/cli/publish.mdx
@@ -0,0 +1,136 @@
+---
+title: Publish
+description: Publish your commands to Discord
+---
+
+:::tip
+`sern commands publish` was experimental and we've decided to move on from it.
+This cli command only works with version 3 of `@sern/handler` in an integrated fashion,
+use the new service `Publisher`, officially maintained.
+:::
+
+```sh
+Usage: sern commands publish [options] [path]
+
+New way to manage your slash commands
+
+Arguments:
+ path path with respect to current working directory that will locate all published files
+
+Options:
+ -i, --import [scriptPath...] Prerequire a script to load into publisher
+ -t, --token [token]
+ -h, --help display help for command
+```
+
+## Introduction
+
+The publish command is a way to publish slash commands to Discord. It uses the [`PUT`](https://discord.com/developers/docs/interactions/application-commands#bulk-overwrite-global-application-commands) route to overwrite existing commands.
+
+Wherever your commands directory is located, publish will override the existing application commands on Discord. Existing commands do not count towards the command limit creation daily.
+
+The publish command automatically reads your `.env` file in the working directory. If you do not have a `.env` file, you can pass in the `--token` and `--appId` flags.
+
+:::caution
+CLI arguments, if specified, take precedence over `.env` file.
+:::
+
+Your `.env` file should look like this:
+
+```sh title=".env"
+DISCORD_TOKEN=
+APPLICATION_ID=
+NODE_ENV=
+```
+
+## Usage
+
+:::caution
+CommonJS and JavaScript users need to compile first, then run `sern publish` on the `dist` output
+:::
+
+
+
+## Features
+
+- Automatically syncs API with your command base
+- Generates a JSON file of output (`.sern/command-data-remote.json`)
+- Supports publishing direct ESM TypeScript files
+- Prerequire scripts are supported
+- Supports a configuration that is the same as the original publish plugin
+- Each command file can have an extra config that follows `ValidPublishOptions`
+ - This can be a function or a `PublishConfig` object
+
+## Config
+
+```ts {13-15}
+type ValidMemberPermissions =
+ | PermissionFlagBits // discord.js enum
+ | PermissionFlagBits[] // array of discord.js enum
+ | string // must be a stringified number (such as "8" for ADMINISTRATOR)
+ | bigint
+
+interface PublishConfig {
+ guildIds?: string[];
+ dmPermission?: boolean;
+ defaultMemberPermissions: ValidMemberPermissions;
+}
+
+type ValidPublishOptions =
+ | PublishConfig
+ | (absPath: string, module: CommandModule) => PublishConfig
+```
+
+## Prerequiring
+
+Is there a [service](/v3/guide/walkthrough/services) that is required at the top level of a command?
+
+Create an ES6 script anywhere, such as:
+
+```ts title="scripts/prerequire.mjs"
+import { makeDependencies, single, Service } from "@sern/handler";
+import { Client } from "discord.js";
+
+await makeDependencies({
+ build: (root) =>
+ root.add({ "@sern/client": single(() => new Client(...options)) }),
+});
+
+await Service("@sern/client").login();
+```
+
+This will create a container for publishing.
+
+:::danger
+As of 0.6.0, the `client` is required, or this will crash.
+:::
+
+## Example
+
+This example will publish a ping command to a specific guild: `889026545715400705`.
+
+### Script
+
+```sh
+sern commands publish -i ./scripts/prerequire.mjs
+```
+
+### Command
+
+```ts title=src/commands/ping.ts {5-7}
+import { commandModule, Service, CommandType } from '@sern/handler'
+
+const client = Service('@sern/client');
+
+export const config = {
+ guildIds: ["889026545715400705"]
+}
+
+export default commandModule( {
+ type: CommandType.Slash
+ description: `${client.user.username}'s ping`,
+ execute: (ctx) => {
+ ctx.reply('pong')
+ }
+})
+```
diff --git a/src/content/docs/v4/reference/autocomplete.mdx b/src/content/docs/v4/reference/autocomplete.mdx
new file mode 100644
index 000000000..f9386bbb0
--- /dev/null
+++ b/src/content/docs/v4/reference/autocomplete.mdx
@@ -0,0 +1,83 @@
+---
+title: Autocomplete
+description: Implementing autocomplete in your commands
+sidebar:
+ order: 8
+---
+
+Autocomplete is a special interaction which can happen on multiple options can be suggested for a single command.
+We've implemented this functionality using a simple tree search algorithm within a nested options tree.
+
+## Example
+In this example, the option `list` will autocomplete with the cheeses `gouda`, `parmesan`, and `harvarti`.
+
+```ts title="src/commands/cheese.ts" {13-22}
+export default commandModule({
+ type: CommandType.Slash,
+ description: "show me cheese",
+ options: [
+ {
+ name: "list",
+ type: ApplicationCommandOptionType.String,
+ description: "pick a cheese to show",
+ required: true,
+ autocomplete: true,
+ command: {
+ execute: (ctx) => {
+ // focus can be used to refine the options
+ const focus = ctx.options.getFocused();
+ ctx.respond(
+ ["gouda", "parmesan", "harvarti"].map((cheese) => ({
+ name: cheese,
+ value: cheese,
+ })),
+ );
+ },
+ },
+ },
+ ],
+ execute: (ctx, [, args]) => {
+ const cheese = args.getString("list", true);
+ ctx.reply("selected cheese " + cheese);
+ },
+});
+```
+
+## Using Focus
+
+The `focus` object refines the options. For example, if the user types `g`, the focus object will be `g`.
+We can filter cheeses based on the focus object, and return only the cheeses that start with the focus object.
+You can do a lot more with the focus object, such as performing API calls, or implementing a fuzzy search.
+
+```ts title="src/commands/cheese.ts" {13-23}
+export default commandModule({
+ type: CommandType.Slash,
+ description: "show me cheese",
+ options: [
+ {
+ name: "list",
+ type: ApplicationCommandOptionType.String,
+ description: "pick a cheese to show",
+ required: true,
+ autocomplete: true,
+ command: {
+ onEvent: [],
+ execute: (ctx) => {
+ const focus = ctx.options.getFocused();
+ ctx.respond ["gouda", "parmesan", "harvarti"]
+ .filter((cheese) => cheese.startsWith(focus))
+ .map((cheese) => ({ name: cheese, value: cheese })));
+ },
+ },
+ },
+ ],
+ execute: (ctx) => {
+ const cheese = ctx.options.getString("list", true);
+ ctx.reply("selected cheese");
+ },
+});
+```
+
+:::tip
+sern will handle autocomplete interactions at arbitrary depths and subcommand levels.
+:::
diff --git a/src/content/docs/v4/reference/conclusion.mdx b/src/content/docs/v4/reference/conclusion.mdx
new file mode 100644
index 000000000..017c8189b
--- /dev/null
+++ b/src/content/docs/v4/reference/conclusion.mdx
@@ -0,0 +1,14 @@
+---
+title: Conclusion
+description: Thank you for reading the sern guide
+sidebar:
+ order: 9
+---
+
+If you reached this far, thank you for reading!
+
+We hope you have learned the necessities you need to create a bot with the sern framework.
+
+If you have any other questions, bugs, feature requests, concerns, please join our [community server](https://sern.dev/discord), and we'll be glad to answer your questions!
+
+
diff --git a/src/content/docs/v4/reference/config.mdx b/src/content/docs/v4/reference/config.mdx
new file mode 100644
index 000000000..8aac8b212
--- /dev/null
+++ b/src/content/docs/v4/reference/config.mdx
@@ -0,0 +1,60 @@
+---
+title: Config
+description: Configure your bot
+sidebar:
+ order: 2
+---
+Your app needs a way to store constants and required variables for the framework to work.
+
+A project should look like this:
+
+import { FileTree } from '@astrojs/starlight/components';
+
+
+- src
+ - commands/
+ - events/
+ - plugins/
+ - index.js
+ - config.js **we are here**
+- .env
+- .gitignore
+- bun.lockb
+- package.json
+- README.md
+- sern.config.json
+- jsconfig.json # tsconfig.json if you are using typescript
+
+
+## Required
+
+### `commands`
+```js title='src/config.js'
+export const commands = './dist/commands'
+```
+
+We will pass this file so sern can start properly.
+
+```js title='src/index.js'
+import * as config from './config.js'
+
+Sern.init(config)
+```
+
+## Optional
+
+### events
+Supply a directory for sern to register [event modules](/v4/reference/modules)
+
+### tasks
+Supply a directory for sern to register [scheduled tasks](/v4/reference/tasks)
+
+### defaultPrefix
+Supply a prefix for sern to enable text commands.
+
+
+### user defined
+Feel free to supply any other constants / variables you may need.
+```js
+export const OWNERS = ['182326315813306368']
+```
diff --git a/src/content/docs/v4/reference/dependencies.mdx b/src/content/docs/v4/reference/dependencies.mdx
new file mode 100644
index 000000000..e6cfc5a73
--- /dev/null
+++ b/src/content/docs/v4/reference/dependencies.mdx
@@ -0,0 +1,171 @@
+---
+title: Dependencies
+description: Customize & manage stateful dependencies
+sidebar:
+ order: 7
+---
+
+Manage objects which contain lots of state. If you were a previous user of Sapphire, dependency injection is the moral equivalent of `container`.
+Dependency injection promotes maintainability and helps organize imports.
+
+For example, a minimal setup for any project might look like this:
+
+import { FileTree } from '@astrojs/starlight/components';
+
+
+- src/
+ - index.js **(your main file and client)**
+ - **dependencies.d.ts** **(for intellisense)**
+
+
+
+
+```js title="src/index.js"
+const client = new Client({
+ ...options,
+});
+
+await makeDependencies((root) => {
+ root.add("@sern/client", client),
+});
+```
+
+Everything else is handled. However, you may want customize things.
+
+## Adding Dependencies to Root
+
+When [makeDependencies](/v4/api/functions/makedependencies) is called, sern **implicility** adds dependencies to the container. A few of these are shown:
+- `@sern/logger`: Loggers implement [`Logging`](/v4/api/interfaces/logging)
+- `@sern/modules`: A map of all command modules. ID -> Module
+- `@sern/errors`: Handling errors and lifetime → [`ErrorHandling`](/v4/api/interfaces/errorhandling)
+- `@sern/emitter`: Emit events that occur throughout the lifecycle of a project → [`Emitter`](/v3/api/interfaces/emitter)
+
+:::tip
+Swap out these dependencies **at your own risk**.
+A common occurence in sern projects is to swap out the Logger for a custom one. An example:
+```ts {2}
+await makeDependencies(({ swap }) => {
+ //MAKE SURE `MyCustomLogger` implements Logging
+ swap('@sern/logger', new MyCustomLogger());
+})
+```
+:::
+
+
+## Lifecycle Hooks
+Dependencies can call a function throughout you bot's lifetime.
+
+### Init
+
+> Your object needs to initiate things. Developers are allowed to use `async` and `await`.
+
+import { Steps } from '@astrojs/starlight/components';
+
+
+1. Do you need to perform intializing behavior for a dependency?
+ ```js title="src/database.js"
+ import pg from 'pg'
+ const { Client } = pg
+ class Database {
+ __database = new Client()
+ async init() {
+ await this.__database.connect();
+ }
+ }
+ ```
+
+2. Modify your `Dependencies` interface:
+ ```js title="src/dependencies.d.ts" {4}
+ import { Database } from './services/database.js'
+ interface Dependencies extends CoreDependencies {
+ database: Database;
+ }
+ ```
+
+3. Make sure its been added:
+ ```ts title="src/index.ts" {3}
+ await makeDependencies(({ add }) => {
+ add('database', new Database())
+ })
+ ```
+
+4. Now, when your bot starts, the `init` method will be called. 🎉
+
+
+
+### Dispose
+> Your object needs to destroy things before shutdown, if a crash occurs
+
+
+
+1. Do you need to perform intializing behavior for a dependency?
+ ```js title="src/database.js"
+ import pg from 'pg'
+ const { Client } = pg
+ class Database {
+ __database = new Client()
+ async init() {
+ await this.__database.connect();
+ }
+ async dispose() {
+ console.log("Disposing database")
+ }
+ }
+ ```
+
+3. Make sure its been added:
+ ```js title="src/index.ts" {3}
+ await makeDependencies(({ add }) => {
+ add('database', new Database())
+ })
+ ```
+4. Now, when your bot starts, the `dispose` method will be called. 🎉
+
+
+:::tip
+Both `dispose` and `init` are exposed as interfaces in TypeScript. For extra typesafety it may be feasible to implement these interfaces.
+```ts
+import { type Init } from '@sern/handler'
+import pg from 'pg'
+const { Client } = pg
+class Database implements Init {
+ __database = new Client()
+ async init() {
+ await this.__database.connect();
+ }
+}
+```
+:::
+
+## Usage in Commands
+> This is for command modules, plugins only. event modules would have to use the `Service` api
+
+Your dependencies are located in SDT.
+```ts
+export default commandModule({
+ type: CommandType.Slash,
+ execute: (ctx, sdt) =>{
+ sdt.deps.database // Database
+ }
+})
+```
+
+## Service
+The Service api is used for places where sern cannot inject into parameters properly. [View](/v3/guide/walkthrough/services/)
+
+
+## When to use Dependency injection
+
+Leveraging dependency injection in your projects is recommended because DI creates a loose coupling between the parts of your application.
+As a result, the codebase is more modular and easier to test and refactor
+
+:::danger
+Be careful and not take the idea of dependency injection to its extreme. For example:
+
+Do not inject helper libraries like `lodash` as a dependency of your class. Import and use it directly.
+Your codebase might not need loose coupling for components that are ever likely to get swapped or replaced.
+For example, you may prefer importing the logger service vs. injecting the Logger class as a dependency.
+:::
+
+
+
diff --git a/src/content/docs/v4/reference/getting-started.mdx b/src/content/docs/v4/reference/getting-started.mdx
new file mode 100644
index 000000000..2df4ec209
--- /dev/null
+++ b/src/content/docs/v4/reference/getting-started.mdx
@@ -0,0 +1,14 @@
+---
+title: Getting Started
+description: Get started with the sern framework
+sidebar:
+ order: 1
+---
+
+import PackageManagers from '~/components/PackageManagers.astro';
+
+
+
+Once you've used this command, follow the interactive prompts to create your new project.
+
+If you need help, feel free to ask on our [Discord](https://sern.dev/discord).
diff --git a/src/content/docs/v4/reference/modules.mdx b/src/content/docs/v4/reference/modules.mdx
new file mode 100644
index 000000000..dcff352c3
--- /dev/null
+++ b/src/content/docs/v4/reference/modules.mdx
@@ -0,0 +1,181 @@
+---
+title: Modules
+description: Learn how to create modules for your sern bot
+sidebar:
+ order: 4
+---
+
+
+import { Tabs, TabItem } from '@astrojs/starlight/components';
+
+## Introduction
+
+sern operates with **modules**. At its core, modules are simple objects which contain properties `type`,`execute`, and [`plugins`](/v4/reference/plugins) (code ran before `execute`).
+
+## Modules
+
+We'll walk you through creating your first **command** module.
+
+If you installed a new project via the CLI, your file should be here:
+
+import { FileTree } from '@astrojs/starlight/components';
+
+
+- src/commands/
+ - **ping.js** **(right here, probably)**
+- ...
+
+
+### Application Commands
+- Includes `CommandType.Slash`, `CommandType.Both`, `CommandType.CtxUser`, `CommandType.CtxMsg`
+
+#### Chat Input Commands (Slash Commands)
+```js title="src/commands/ping.js"
+import { commandModule, CommandType } from "@sern/handler";
+
+export default commandModule({
+ type: CommandType.Slash,
+ description: "A ping command",
+ execute: async (ctx, sdt) => { // ctx is Context, sdt is SDT type
+ await ctx.reply("Pong 🏓");
+ },
+});
+```
+
+
+#### Context Menus
+
+```js title="src/commands/hello.js"
+import { commandModule, CommandType } from "@sern/handler";
+
+export default commandModule({
+ type: CommandType.CtxMsg,
+ execute: async (ctx) => {
+ await ctx.reply("Hello.");
+ },
+});
+```
+
+:::tip
+You'll need to publish these modules. Don't worry, we've already got that covered [here](/v4/tools/localizer).
+You may not see your command instantly in Discord, if so, try refreshing.
+:::
+
+
+### Components
+
+So, lets say you want to make a command module that listens to **buttons**, or ANY **component** (modals, select menus).
+
+
+
+ ```js title="src/commands/ping.js"
+ import { CommandType, commandModule } from "@sern/handler";
+ import { ButtonStyle, ActionRowBuilder, ButtonBuilder } from 'discord.js';
+ export default commandModule({
+ type: CommandType.Slash,
+ description: "A ping command",
+ execute: async (ctx, sdt) => {
+ const editButton = new ButtonBuilder({
+ customId: "btn",
+ label: "Click me",
+ emoji: "🛠",
+ style: ButtonStyle.Primary,
+ });
+ await ctx.reply({
+ content: "Pong 🏓",
+ components: [new ActionRowBuilder().addComponents(editButton)]
+ });
+ },
+ });
+ ```
+
+
+ ```ts title="src/commands/btn.js"
+ import { CommandType, commandModule } from "@sern/handler";
+
+ export default commandModule({
+ type: CommandType.Button,
+ execute: (ibtn) => {
+ ibtn.reply('clicked')
+ },
+ });
+ ```
+
+
+
+### Dynamic Component Parameters
+Components can carry metadata. This comes in handy when handling multiple components of the same purpose. This is good for passing small, string based data across components.
+
+
+
+ ```js title="src/commands/ping.js" {8}
+ import { CommandType, commandModule } from "@sern/handler";
+ import { ButtonStyle, ActionRowBuilder, ButtonBuilder } from 'discord.js';
+ export default commandModule({
+ type: CommandType.Slash,
+ description: "A ping command",
+ execute: async (ctx, sdt) => {
+ const editButton = new ButtonBuilder({
+ customId: "btn/1061421834341462036",
+ label: "Click me",
+ emoji: "🛠",
+ style: ButtonStyle.Primary,
+ });
+ await ctx.reply({
+ content: "Pong 🏓",
+ components: [new ActionRowBuilder().addComponents(editButton)]
+ });
+ },
+ });
+ ```
+
+
+ ```ts title="src/commands/btn.js"
+ import { CommandType, commandModule } from "@sern/handler";
+
+ export default commandModule({
+ type: CommandType.Button,
+ execute: (ibtn, sdt) => {
+ ibtn.reply('clicked with ' + sdt.params)
+ },
+ });
+ ```
+
+
+
+:::tip
+The first `/` is significant in custom ids. On the left of it is the custom id to be matched, and on the right is any user defined data.
+:::
+
+## Event Modules
+We are now moving to event modules, which listens to the vast streams of data provided by
+- `sern`, `EventType.Sern`
+- `discord.js`, `EventType.Discord`
+- `yourself`, `EventType.External`
+
+
+
+- src/events/
+ - **messageCreate.js** **(right here, probably)**
+- ...
+
+
+### Listening to Discord Events
+
+```js title="src/events/messageCreate.js"
+import { eventModule, EventType } from "@sern/handler";
+
+export default eventModule({
+ type: EventType.Discord,
+ execute: async (message) => {
+ console.log(`${message.user} said`, message.content)
+ },
+});
+```
+
+:::tip
+Typescript users can use `discordEvent`, a specialized eventModule with typings for discord.js events.
+:::
+
+
+
diff --git a/src/content/docs/v4/reference/plugins.mdx b/src/content/docs/v4/reference/plugins.mdx
new file mode 100644
index 000000000..8ebaacc3c
--- /dev/null
+++ b/src/content/docs/v4/reference/plugins.mdx
@@ -0,0 +1,195 @@
+---
+title: Plugins
+description: Run code before execution
+sidebar:
+ order: 5
+---
+
+:::tip
+**TLDR:** Plugins are reusable pieces of code and are installable via `sern plugins` or other sources.
+They can modify the module's fields and also perform preconditions.
+Put them into the `plugins` field of a [module](/v4/reference/modules).
+:::
+
+## Installation
+
+Chances are, you just want your bot to work. Plugins can preprocess and create reusable conditions for modules.
+
+To install plugins, you can use the CLI:
+
+```sh
+sern plugins
+```
+:::tip
+Feel free to contribute to the [repository](https://github.com/sern-handler/awesome-plugins)!
+:::
+
+:::caution
+Some plugins only work with specific command types. Most, however, are targeted towards slash / both modules.
+:::
+
+import { Steps } from '@astrojs/starlight/components';
+
+
+1. Install your favorite(s) (or the ones that look the coolest). I installed the `ownerOnly` plugin.
+2. Thank the creator of the plugin. (mandatory)
+3. Add the plugin to your module in the `plugins` field.
+
+
+```ts title="src/commands/ping.ts" {6}
+import { commandModule, CommandType } from '@sern/handler'
+import { ownerOnly } from '../plugins'
+
+export default commandModule({
+ type: CommandType.Both,
+ plugins: [ownerOnly(['182326315813306368'])],
+ description: 'ping command',
+ execute: (ctx) => {
+ ctx.reply('hello, owner');
+ }
+})
+```
+┗|` O′|┛ perfect, your first plugin!
+
+## Creating Plugins
+
+Plugins are essentially functions that use the controller object to determine whether to continue or stop the execution of a command.
+
+## Init Plugins
+
+Init plugins modify how commands are loaded or do preprocessing.
+```ts title="src/plugins/updateDescription.js" {3} {9}
+import { CommandInitPlugin } from "@sern/handler";
+
+export const updateDescription = (description: string) => {
+ return CommandInitPlugin(({ deps }) => {
+ if(description.length > 100) {
+ deps.logger?.info({ message: "Invalid description" })
+ return controller.stop("From updateDescription: description is invalid");
+ }
+ module.description = description;
+ return controller.next(); // continue to next plugin
+ });
+};
+```
+:::warning
+You may modify any of the fields of the module, but please careful!
+This also includes double checking any plugins which may modify fields of modules.
+:::
+
+### User Data
+
+Each module has a `locals` object which you are free to add custom user data. For example, the localizer AND publisher
+take advantage of this to attach metadata.
+
+```ts title="src/plugins/dateRegistered.js" {3} {9}
+import { CommandInitPlugin } from "@sern/handler";
+
+export const dateRegistered = (description: string) => {
+ return CommandInitPlugin(({ module, deps }) => {
+ module.locals.registered = Date.now() // save module registration date
+ return controller.next(); // continue to next plugin
+ });
+};
+```
+
+## Control Plugins
+
+
+
+
+```js
+import { CommandControlPlugin } from "@sern/handler";
+
+export const inGuild = (guildId: string) => {
+ return CommandInitPlugin(ctx, sdt) => {
+ if(ctx.guild.id !== guildId) {
+ return controller.stop();
+ }
+ return controller.next();
+ });
+};
+
+```
+
+1. An event is emitted by `discord.js`.
+2. This event is passed to all control plugins **in order!!**,
+3. If all are successful, the command is executed.
+
+
+:::note
+Calling `controller.stop()` notifies sern that this command should not be run, and command is ignored.
+:::
+
+:::tip
+Control Plugins are good for filtering, preconditions, parsing.
+:::
+
+
+### Controller Object
+
+The controller object is passed into every plugin. It has two methods: `next` and `stop`.
+
+Plugins use the controller to control the flow of the command. For example, if a plugin fails, it calls `controller.stop()` to prevent the command from executing.
+
+```ts
+// Reference object, import this from @sern/handler
+const controller = {
+ next: (val?: Record) => Ok(val),
+ stop: (val?: string) => Err(val),
+};
+```
+
+### State
+> SDT = **state**, [dependencies](/v4/reference/dependencies), type (very creative)
+
+Plugins can recieve data from previous plugins. State is created when `controller.next` is called with a record.
+If all control plugins are successful, the final state is passed to the module `execute`.
+
+```js
+import { commandModule, CommandControlPlugin, CommandType } from '@sern/handler'
+
+const plugin = CommandControlPlugin((ctx, sdt) => {
+ return controller.next({ a: 'from plugin1' });
+});
+const plugin2 = CommandControlPlugin((ctx, sdt) => {
+ return controller.next({ b: ctx.user.id + "from plugin2" });
+})
+
+export default commandModule({
+ type: CommandType.Slash,
+ plugins: [plugin, plugin2],
+ execute: (ctx, sdt) => {
+ sdt.state // { a: 'from plugin1', b: '182326315813306368 from plugin2' }
+ }
+})
+```
+
+:::tip
+State passing is a glorified asynchronous [reduce](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce).
+:::
+
+#### Caveats
+Passing data with the same key will get overridden by the latest plugin.
+It is recommended to **namespace** data keys if you have multiple plugins, or you can ensure no keys are overridden by the
+plugin chain.
+```js
+return controller.next({ 'cheese-plugin/data' : "From cheese-plugin" })
+```
+
+### Dependencies
+> SDT = state, **[dependencies](/v4/reference/dependencies)**, type (very creative)
+
+Plugins also carry an instance of all of your dependencies. Use them and use them as you please! For example,
+creating a plugin which logs which user uses your command
+
+```js
+import { commandModule, CommandControlPlugin, CommandType } from '@sern/handler'
+export const log = CommandControlPlugin((ctx, sdt) => {
+ sdt
+ .deps['@sern/logger']
+ .info({ message: `${ctx.user.id} used this command from ${ctx.guild.id}` });
+})
+```
+
+
diff --git a/src/content/docs/v4/reference/presence.mdx b/src/content/docs/v4/reference/presence.mdx
new file mode 100644
index 000000000..47642c25f
--- /dev/null
+++ b/src/content/docs/v4/reference/presence.mdx
@@ -0,0 +1,92 @@
+---
+title: Presence
+description: Manage your bot's presence programatically
+sidebar:
+ order: 6
+---
+
+
+## Presence
+Your bot should have a personality. (or invite link)
+
+### Once
+
+Your presence will be set once, after discord.js `Client` is called.
+
+```js title="./src/presence.js"
+import { Presence } from '@sern/handler'
+import { ActivityType } from 'discord.js';
+
+const activity = { type: ActivityType.Listening, name: "what's bofa" };
+
+export default Presence.module({
+ execute: () => {
+ return Presence
+ .of({ activities: [activity], status: "idle" })
+ .once();
+ }
+ })
+```
+
+
+### Repeated
+
+Set your presence on intervals or events emitted.
+An example of this is shuffling presences on intervals.
+```js title="./src/presence.js"
+import { Presence } from '@sern/handler'
+import { ActivityType, ClientPresenceStatus } from 'discord.js';
+
+/**
+ * Sorry for using any[]
+ * @param array {any[]}
+ */
+function shuffleArray(array) {
+ for (let i = array.length - 1; i > 0; i--) {
+ const j = Math.floor(Math.random() * (i + 1));
+ [array[i], array[j]] = [array[j], array[i]];
+ }
+ return [...array];
+}
+
+const statuses = [[ActivityType.Watching, "the sern community", "online"],
+ [ActivityType.Listening, "Evo", "dnd"],
+ [ActivityType.Playing, "with @sern/cli", "idle"],
+ [ActivityType.Watching, "sern bots", "dnd"],
+ [ActivityType.Watching, "github stars go brrr", "online"],
+ [ActivityType.Listening, "what's bofa", "idle"]];
+
+export default Presence.module({
+ execute: () => {
+ const [type, name, status] = statuses.at(0)!;
+ return Presence
+ //start your presence with this.
+ .of({ activities: [ { type, name } ], status })
+ .repeated(() => {
+ const [type, name, status] = [...shuffleArray(statuses)].shift()!;
+ return {
+ status,
+ activities: [{ type, name }]
+ };
+ }, 60_000); //repeat and setPresence with returned result every minute
+ }
+})
+```
+
+### Inject dependencies
+```js title="./src/presence.js" {7-8}
+import { Presence } from '@sern/handler'
+import { ActivityType } from 'discord.js';
+
+const activity = { type: ActivityType.Listening, name: "what's bofa" };
+export default Presence.module({
+ inject: ['@sern/logger'],
+ execute: (logger) => {
+ logger?.info({ message: "Presence changed" });
+ return Presence
+ .of({ activities: [activity], status: "idle" })
+ .once();
+ }
+ })
+```
+
diff --git a/src/content/docs/v4/reference/project-layout.mdx b/src/content/docs/v4/reference/project-layout.mdx
new file mode 100644
index 000000000..638a15e33
--- /dev/null
+++ b/src/content/docs/v4/reference/project-layout.mdx
@@ -0,0 +1,26 @@
+---
+title: Project Layout
+description: The layout of a sern project
+sidebar:
+ order: 3
+---
+
+A project should look like this:
+
+import { FileTree } from '@astrojs/starlight/components';
+
+
+- src
+ - commands/
+ - events/
+ - plugins/ # created automatically if running `sern plugins`
+ - index.js
+ - config.js # configuration for your entire application
+- .env
+- .gitignore
+- bun.lockb
+- package.json
+- README.md
+- sern.config.json
+- jsconfig.json # tsconfig.json if you are using typescript
+
diff --git a/src/content/docs/v4/reference/tasks.mdx b/src/content/docs/v4/reference/tasks.mdx
new file mode 100644
index 000000000..b672fed6f
--- /dev/null
+++ b/src/content/docs/v4/reference/tasks.mdx
@@ -0,0 +1,25 @@
+---
+title: Tasks
+description: Schedule and execute functions at certain times
+sidebar:
+ order: 2
+---
+
+Your app may need to execute tasks in the future on intervals or over a long time.
+ If you haven't already, add the `tasks` directory to your [config](/v4/reference/config)
+
+```js
+export const tasks = "./dist/tasks"
+```
+
+Defines a task that runs every minute.
+```js title="./src/tasks/every-minute.js"
+import { scheduledTask } from "@sern/handler";
+
+export default scheduledTask({
+ name: "* * * * *",
+ execute: (context) => {
+ console.log("cron cron")
+ }
+})
+```
diff --git a/src/content/docs/v4/snippets/command.mdx b/src/content/docs/v4/snippets/command.mdx
new file mode 100644
index 000000000..2dcb4799b
--- /dev/null
+++ b/src/content/docs/v4/snippets/command.mdx
@@ -0,0 +1,20 @@
+---
+title: Command
+description: The command module in sern
+sidebar:
+ order: 1
+---
+
+```ts title="src/commands/ping.js"
+import { commandModule, CommandType } from "@sern/handler";
+
+export default commandModule({
+ type: CommandType.Both,
+ plugins: [],
+ description: "A ping command",
+ execute: async (ctx, sdt) => {
+ await ctx.reply("Pong 🏓");
+ },
+});
+```
+
diff --git a/src/content/docs/v4/snippets/event.mdx b/src/content/docs/v4/snippets/event.mdx
new file mode 100644
index 000000000..6604db7b1
--- /dev/null
+++ b/src/content/docs/v4/snippets/event.mdx
@@ -0,0 +1,40 @@
+---
+title: Event
+description: The event module in sern
+sidebar:
+ order: 2
+---
+
+import { Tabs, TabItem } from '@astrojs/starlight/components';
+
+
+
+ ```js title="src/events/ping.js"
+ import { eventModule, EventType } from "@sern/handler";
+ import type { GuildMember } from "discord.js";
+
+ export default eventModule({
+ type: EventType.Discord,
+ name: "guildMemberAdd",
+ async execute(member) {
+ },
+ });
+ ```
+
+
+ ```ts title="src/commands/ping.ts"
+ import { eventModule, EventType } from "@sern/handler";
+ import type { GuildMember } from "discord.js";
+
+ export default eventModule({
+ type: EventType.Discord,
+ name: "guildMemberAdd",
+ async execute(member: GuildMember) {
+ // TODO: This should be inferred
+ if (member.pending) return;
+ },
+ });
+ ```
+
+
+
diff --git a/src/content/docs/v4/snippets/plugin.mdx b/src/content/docs/v4/snippets/plugin.mdx
new file mode 100644
index 000000000..0eac7c288
--- /dev/null
+++ b/src/content/docs/v4/snippets/plugin.mdx
@@ -0,0 +1,21 @@
+---
+title: Plugins
+description: A plugin in sern
+sidebar:
+ order: 3
+---
+
+```ts
+// This plugin only allows users with '182326315813306368' as their id to use this command.
+import { CommandControlPlugin, CommandType, controller } from "@sern/handler";
+import type { ModalSubmitInteraction } from "discord.js";
+
+const OWNER = '182326315813306368';
+export function ownerOnly() {
+ return CommandControlPlugin((ctx, sdt)=> {
+ if(ctx.user === OWNER)
+ return controller.next()
+ return controller.stop()
+ })
+}
+```
diff --git a/src/content/docs/v4/snippets/presence.mdx b/src/content/docs/v4/snippets/presence.mdx
new file mode 100644
index 000000000..f7e8b746a
--- /dev/null
+++ b/src/content/docs/v4/snippets/presence.mdx
@@ -0,0 +1,23 @@
+---
+title: Presence
+description: Set the presence of your bot
+sidebar:
+ order: 4
+---
+
+```js
+import { Presence } from '@sern/handler'
+import { ActivityType } from 'discord.js';
+
+const activity = { type: ActivityType.Listening, name: "what's bofa" };
+
+export default Presence.module({
+ execute: () => {
+ return Presence
+ .of({ activities: [activity], status: "idle" })
+ .once();
+ }
+ })
+```
+
+
diff --git a/src/content/docs/v4/tools/localizer.mdx b/src/content/docs/v4/tools/localizer.mdx
new file mode 100644
index 000000000..0d33a731b
--- /dev/null
+++ b/src/content/docs/v4/tools/localizer.mdx
@@ -0,0 +1,95 @@
+---
+title: Localizer
+description: Translate your bot for the world
+sidebar:
+ order: 2
+---
+
+
+A localization module for managing translations and providing localized content in your application.
+
+## Installation
+
+```
+npm i @sern/localizer
+```
+
+
+import { Tabs, TabItem } from "@astrojs/starlight/components";
+
+
+## Usage
+
+**Initializing the Localizer**
+
+
+
+ ```ts {2} {6}
+ import { makeDependencies } from '@sern/handler';
+ import { Localization } from '@sern/localizer';
+
+ await makeDependencies(({ add }) => {
+ // add other deps
+ add('localizer', Localization());
+ });
+ ```
+
+
+ ```ts {5}
+ import type { Logging, CoreDependencies } from '@sern/handler'
+ import type { Localizer } from '@sern/localizer'
+ declare global {
+ interface Dependencies extends CoreDependencies {
+ localizer: Localizer;
+ }
+ }
+ export {}
+ ```
+
+
+
+This localizer is **FILE BASED**.
+Create the directory `assets/locals`. Each json file in here must be named after the `locale`
+
+
+
+
+ ```json title=~/assets/locals/es-ES.json
+ {
+ "salute": {
+ "hello": "hola"
+ }
+ }
+ ```
+
+
+ ```json title=~/assets/locals/en-US.json
+ {
+ "salute": {
+ "hello": "hello"
+ }
+ }
+ ```
+
+
+
+
+
+**Accessing translations**
+- If you are in a command execute callback, use `deps` from SDT.
+```ts
+execute : (ctx, { deps }) => {
+ //the localizer object from makeDependencies
+ deps.localizer
+ // Returns the Spanish translation for 'salute.hello'
+ deps.localizer.translate("salute.hello", "es-ES");
+}
+```
+
+
+```ts
+import { local } from '@sern/localizer';
+
+// Returns the Spanish translation for 'salute.hello'
+const greeting = local('salute.hello', 'es-ES');
+```
diff --git a/src/content/docs/v4/tools/publisher.mdx b/src/content/docs/v4/tools/publisher.mdx
new file mode 100644
index 000000000..d1cd15b29
--- /dev/null
+++ b/src/content/docs/v4/tools/publisher.mdx
@@ -0,0 +1,106 @@
+---
+title: Publisher
+description: Publish application commands as a Service
+sidebar:
+ order: 1
+---
+
+## Implicits
+- Requires process.env to be populated
+- A common provider of this is `dotenv`
+```txt title=".env"
+DISCORD_TOKEN=
+NODE_ENV=
+```
+- Calls the discord API with the [PUT route](https://discord.com/developers/docs/interactions/application-commands#bulk-overwrite-global-application-commands). Wherever your commands directory is located, publish will override the existing application commands at Discord.
+
+## Usage
+
+**Initializing the Publisher**
+```ts
+import { makeDependencies } from '@sern/handler';
+import { Publisher } from '@sern/publisher';
+
+await makeDependencies(({ add }) => {
+ add('publisher', new Publisher());
+});
+```
+
+## Features
+- Automatically syncs api with your command base
+- generates JSON file of output (**.sern/command-data-remote.json**)
+- supports a configuration that is the same as the original publish plugin.
+
+
+Each command file can have an extra plugin `publishConfig` that follows `ValidPublishOptions`:
+## Config
+```ts
+
+type ValidMemberPermissions =
+ | typeof PermissionFlagBits //discord.js enum
+ | typeof PermissionFlagBits[] //array of discord.js enum
+ | string //must be a stringified number
+ | bigint
+
+interface PublishConfig {
+ guildIds?: string[];
+ defaultMemberPermissions?: ValidMemberPermissions;
+ integrationTypes?: Array<'Guild'|'User'>
+ contexts: number[]
+}
+type ValidPublishOptions =
+ | PublishConfig
+ | (absPath: string, module: CommandModule) => PublishConfig
+```
+:::tip
+These types are exported under @sern/publisher
+:::
+
+### Example: command published with integrationTypes
+
+:::tip
+Make sure you modify the install method in the Discord dev portal
+:::
+
+```ts title=src/commands/ping.ts
+import { commandModule, CommandType } from '@sern/handler'
+import { publishConfig } from '@sern/publisher'
+
+export default commandModule( {
+ type: CommandType.Slash,
+ plugins: [
+ publishConfig({
+ integrationTypes: ['User'],
+ contexts: [1,2]
+ })
+ ],
+ description: `hello worl`,
+ execute: (ctx) => {
+ ctx.reply('pong')
+ }
+})
+
+```
+
+
+### Example: command published in guild
+
+```ts title=src/commands/ping.ts
+import { commandModule, CommandType } from '@sern/handler'
+import { publishConfig } from '@sern/publisher'
+
+export default commandModule( {
+ type: CommandType.Slash,
+ plugins: [
+ publishConfig({
+ guildIds: ["889026545715400705"]
+ })
+ ],
+ description: `hello worl`,
+ execute: (ctx) => {
+ ctx.reply('pong')
+ }
+})
+
+```
+
diff --git a/src/content/docs/v4/transition/from-v3.mdx b/src/content/docs/v4/transition/from-v3.mdx
new file mode 100644
index 000000000..6c5b5615d
--- /dev/null
+++ b/src/content/docs/v4/transition/from-v3.mdx
@@ -0,0 +1,77 @@
+---
+title: Updating your sern app
+description: Moving from version three to four
+sidebar:
+ order: 1
+---
+
+## Arguments changed for all commands.
+> The second argument is the `new SDT` type
+
+```ts {7-10}
+import { commandModule, CommandType } from '@sern/handler'
+
+export default commandModule({
+ type: CommandType.Slash,
+ description: "My ping command",
+ execute: (ctx, sdt) => {
+ sdt.params // only exists if current command is not a component
+ sdt.deps // Dependencies
+ sdt.type // module type
+ }
+})
+```
+:::tip
+To access arguments, use `ctx.options`.
+This getter will return `string[]` if `ctx` is a `Message`, else the discord.js interaction resolver
+:::
+
+It used to look like this:
+```ts {7-8}
+import { commandModule, CommandType } from '@sern/handler'
+
+export default commandModule({
+ type: CommandType.Slash,
+ description: "My ping command",
+ execute: (ctx, [type, opts]) => {
+ type // 'text' | 'slash'
+ opts // string[] | discord.js command option resolver
+ }
+})
+```
+
+## Killing Experimental Things
+> *Sometimes your experiments need to be put behind the barn.*
+
+- `Sern.init('file')` has been removed.
+
+
+## Publishing Application Commands
+- `sern commands publish` does not work with localizer plugin. It will work in version four, but it is recommended to use
+publishing as a [service](/v4/tools/publisher)
+
+## Singleton, Transient, CoreModuleStore types removed
+ - All objects are by default a singleton now.
+ - By this assertion, we removed the type helpers for these. This may affect intellisense
+## Things marked internal are now removed from public api.
+
+:::tip
+your dependencies.d.ts file will probably have these typings. Feel free to remove them.
+:::
+
+```diff lang="ts"
+- import type { SernEmitter, CoreDependencies, Singleton } from "@sern/handler";
++ import type { SernEmitter, CoreDependencies } from "@sern/handler";
+import type { SernLogger } from "./utils/Logger";
+import type { Octokit } from "@octokit/rest";
+declare global {
+ interface Dependencies extends CoreDependencies {
++ "@sern/logger": SernLogger;
+- "@sern/logger": Singleton;
++ octokit: Octokit;
+- octokit: Singleton;
+ }
+}
+export {};
+```
+
diff --git a/src/css/custom.css b/src/css/custom.css
deleted file mode 100644
index 25cf35360..000000000
--- a/src/css/custom.css
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * Any CSS included here will be global. The classic template
- * bundles Infima by default. Infima is a CSS framework designed to
- * work well for content-centric websites.
- */
-
-/* You can override the default Infima variables here. */
-:root {
- --ifm-color-primary: #ae2a55;
- --ifm-color-primary-dark: #372955;
- /* darker is secondary color in material */
- --ifm-color-primary-darker: #385ca9;
- --ifm-color-primary-darkest: #2b2042;
- --ifm-color-primary-light: #433267;
- --ifm-color-primary-lighter: #46346c;
- --ifm-color-primary-lightest: #d9e2ff;
- --ifm-background-color: #fffbff;
- --ifm-code-font-size: 95%;
- --docusaurus-highlighted-code-line-bg: rgba(82, 78, 183, 0.2);
- --ifm-font-family-monospace: 'Fira Code', 'Meslo NGF', 'JetBrains Mono', 'Menlo', SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono',
- 'Courier New', monospace;
- --ifm-font-family-base: Mulish, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;
- --ifm-navbar-background-color: #ffd9df;
-}
-
-.footer--dark {
- margin: 0;
- text-align: center;
-}
-
-/* For readability concerns, you should choose a lighter palette in dark mode. */
-[data-theme='dark'] {
- --ifm-color-primary: #ffb1c1;
- --ifm-color-primary-dark: #efb5e4;
- /* darker is secondary color in material */
- --ifm-color-primary-darker: #b0c6ff;
- --ifm-color-primary-darkest: #de69c9;
- --ifm-color-primary-light: #ffffff;
- --ifm-color-primary-lighter: #ffffff;
- --ifm-color-primary-lightest: #ffffff;
- --ifm-background-color: #242526;
- --docusaurus-highlighted-code-line-bg: rgba(82, 78, 183, 0.3);
- --ifm-font-family-monospace: 'JetBrains Mono', 'Fira Code', 'Meslo NGF', 'Menlo', SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', monospace;
- --ifm-navbar-background-color :#66002a
-}
-
-button {
- background-color: var(--ifm-color-primary);
- transition: background-color 0.3s;
- color: var(--ifm-background-color);
- border: none;
- padding: 0.5rem 1rem;
- border-radius: 0.5rem;
- cursor: pointer;
-}
-button:hover {
- /* change the color of the button when hovered, with a bit of a transition */
- background-color: var(--ifm-color-primary-dark);
- transition: background-color 0.3s;
-}
-/* replicate the button parallax that for example material design has */
-button:active {
- transform: translateY(0.09rem);
-}
\ No newline at end of file
diff --git a/src/env.d.ts b/src/env.d.ts
new file mode 100644
index 000000000..acef35f17
--- /dev/null
+++ b/src/env.d.ts
@@ -0,0 +1,2 @@
+///
+///
diff --git a/src/hooks/useTheme.js b/src/hooks/useTheme.js
deleted file mode 100644
index a7fd52ac0..000000000
--- a/src/hooks/useTheme.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import { useEffect, useState } from "react";
-
-export default function useTheme() {
- const [theme, setTheme] = useState(window.localStorage.getItem('theme'));
-
- useEffect(() => {
- window.addEventListener('storage', (e) => {
- e.key === 'theme' && setTheme(e.newValue);
- })
- }, []);
-
- return [theme, setTheme];
-}
\ No newline at end of file
diff --git a/src/overrides/FallbackContentNotice.astro b/src/overrides/FallbackContentNotice.astro
new file mode 100644
index 000000000..696b29230
--- /dev/null
+++ b/src/overrides/FallbackContentNotice.astro
@@ -0,0 +1,9 @@
+---
+import StarlightFallbackContentNotice from "@astrojs/starlight/components/FallbackContentNotice.astro";
+import type { Props } from "@astrojs/starlight/props";
+
+const { slug } = Astro.props;
+const isApi = slug.includes("/api/");
+---
+
+{!isApi && }
diff --git a/src/overrides/Head.astro b/src/overrides/Head.astro
new file mode 100644
index 000000000..fb3072c6a
--- /dev/null
+++ b/src/overrides/Head.astro
@@ -0,0 +1,34 @@
+---
+import type { Props } from "@astrojs/starlight/props";
+import StarlightHead from "@astrojs/starlight/components/Head.astro";
+import { getOgImage } from "~/utils/ogImage";
+
+const ogImageUrl = getOgImage(Astro.url.pathname, !!Astro.props.isFallback);
+const imageSrc = new URL(ogImageUrl ?? "/sern-logo.png", Astro.site);
+---
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/overrides/Sidebar.astro b/src/overrides/Sidebar.astro
new file mode 100644
index 000000000..1ef9ad85c
--- /dev/null
+++ b/src/overrides/Sidebar.astro
@@ -0,0 +1,130 @@
+---
+// Heavily inspired from starlight-utils (https://github.com/lorenzolewis/starlight-utils) — adapted so we can disable for blog pages
+import type { Props } from "@astrojs/starlight/props";
+import StarlightSidebar from "@astrojs/starlight/components/Sidebar.astro";
+import BlogSidebar from "starlight-blog/overrides/Sidebar.astro";
+import { AstroError } from "astro/errors";
+import { Icon } from "@astrojs/starlight/components";
+
+const sidebarConfig: [string, boolean, Props][] = Astro.props.sidebar.map(
+ (s) => {
+ if (s.type !== "group") {
+ throw new AstroError(
+ `\`${s.label}\` cannot be used with multiple Starlight sidebars.
+
+ Each top-level \`sidebar\` item in the Starlight config must be either a group or autogenerated.
+
+ See https://starlight.astro.build/guides/sidebar/#groups and https://starlight.astro.build/guides/sidebar/#autogenerated-groups`,
+ );
+ }
+
+ const isCurrent = (s: (typeof Astro.props.sidebar)[number]) =>
+ s.type === "link" ? s.isCurrent : s.entries.some(isCurrent);
+
+ return [s.label, isCurrent(s), { ...Astro.props, sidebar: [...s.entries] }];
+ },
+);
+
+const isBlog = Astro.url.pathname.split("/")[1] === "blog";
+---
+
+{
+ isBlog ? (
+
+
+
+ ) : (
+
+
+ {sidebarConfig.map(([label, isCurrent, props]) => (
+