diff --git a/website/src/.vitepress/config.ts b/website/src/.vitepress/config.ts
index 31cba279..ad5cb3b7 100644
--- a/website/src/.vitepress/config.ts
+++ b/website/src/.vitepress/config.ts
@@ -11,7 +11,7 @@ import generateOgImages from "./config/hooks/generateOgImages";
 const title = "Tachiyomi";
 const description = "Read your favorite manga, webtoons, comics, and more – easier than ever on your Android.";
 
-const env = loadEnv("", process.cwd())
+const env = loadEnv("", process.cwd());
 const hostname: string = env.VITE_HOSTNAME || "http://localhost:4173";
 
 export default defineConfig({
diff --git a/website/src/.vitepress/config/hooks/generateMeta.ts b/website/src/.vitepress/config/hooks/generateMeta.ts
index 6127780f..f269a4a3 100644
--- a/website/src/.vitepress/config/hooks/generateMeta.ts
+++ b/website/src/.vitepress/config/hooks/generateMeta.ts
@@ -69,12 +69,8 @@ const generateMeta = (context: TransformContext, hostname: string) => {
 			},
 		]);
 	} else {
-		const url = pageData.filePath
-			.replace("index.md", "")
-			.replace(".md", "");
-		const imageUrl = `${url}/__og_image__/og.png`
-			.replace(/\/\//g, "/")
-			.replace(/^\//, "");
+		const url = pageData.filePath.replace("index.md", "").replace(".md", "");
+		const imageUrl = `${url}/__og_image__/og.png`.replace(/\/\//g, "/").replace(/^\//, "");
 
 		head.push(["meta", { property: "og:image", content: `${hostname}/${imageUrl}` }]);
 		head.push(["meta", { property: "og:image:width", content: "1200" }]);
diff --git a/website/src/.vitepress/config/hooks/generateOgImages.ts b/website/src/.vitepress/config/hooks/generateOgImages.ts
index e85b9586..4acdfd16 100644
--- a/website/src/.vitepress/config/hooks/generateOgImages.ts
+++ b/website/src/.vitepress/config/hooks/generateOgImages.ts
@@ -10,7 +10,7 @@ const __dirname = dirname(fileURLToPath(import.meta.url));
 const __fonts = resolve(__dirname, "../../fonts");
 
 async function generateOgImages(config: SiteConfig) {
-	const pages = await createContentLoader("**/*.md", { excerpt: true }).load()
+	const pages = await createContentLoader("**/*.md", { excerpt: true }).load();
 	const template = await readFile(resolve(__dirname, "../../theme/components/OgImageTemplate.vue"), "utf-8");
 
 	const fonts: SatoriOptions["fonts"] = [
@@ -40,14 +40,14 @@ async function generateOgImages(config: SiteConfig) {
 		},
 	];
 
-	const filteredPages = pages.filter(p => p.frontmatter.image === undefined);
+	const filteredPages = pages.filter((p) => p.frontmatter.image === undefined);
 
 	for (const page of filteredPages) {
 		await generateImage({
 			page,
 			template,
 			outDir: config.outDir,
-			fonts
+			fonts,
 		});
 	}
 }
@@ -69,19 +69,17 @@ async function generateImage({ page, template, outDir, fonts }: GenerateImagesOp
 		height: 628,
 		fonts,
 		props: {
-			title: frontmatter.layout === "home"
-				? (frontmatter.hero.name ?? frontmatter.title.replace(/\s\-.*$/, ""))
-				: (frontmatter.customMetaTitle ?? frontmatter.title.replace(/\s\-.*$/, "")),
-			description: frontmatter.layout === "home"
-				? (frontmatter.hero.tagline ?? frontmatter.description)
-				: frontmatter.description,
-			dir: (url.startsWith("/docs/faq/"))
-				? "FAQ"
-				: (url.startsWith("/docs/guides/"))
-				? "Guide"
-				: undefined,
-		}
-	}
+			title:
+				frontmatter.layout === "home"
+					? frontmatter.hero.name ?? frontmatter.title.replace(/\s\-.*$/, "")
+					: frontmatter.customMetaTitle ?? frontmatter.title.replace(/\s\-.*$/, ""),
+			description:
+				frontmatter.layout === "home"
+					? frontmatter.hero.tagline ?? frontmatter.description
+					: frontmatter.description,
+			dir: url.startsWith("/docs/faq/") ? "FAQ" : url.startsWith("/docs/guides/") ? "Guide" : undefined,
+		},
+	};
 
 	const svg = await satoriVue(options, template);
 
diff --git a/website/src/.vitepress/config/markdownConfig.ts b/website/src/.vitepress/config/markdownConfig.ts
index 5b6e009a..e7e49a00 100644
--- a/website/src/.vitepress/config/markdownConfig.ts
+++ b/website/src/.vitepress/config/markdownConfig.ts
@@ -13,18 +13,17 @@ import shortcodes from "./shortcodes";
 const markdownConfig: MarkdownOptions = {
 	config: (md) => {
 		md.use(attrs),
-		md.use(figure),
-		md.use(imgLazyload),
-		md.use(imgMark),
-		md.use(imgSize),
-		md.use(include, {
-			currentPath: (env) => env.filePath,
-		}),
-		md.use(tabsMarkdownPlugin);
+			md.use(figure),
+			md.use(imgLazyload),
+			md.use(imgMark),
+			md.use(imgSize),
+			md.use(include, {
+				currentPath: (env) => env.filePath,
+			}),
+			md.use(tabsMarkdownPlugin);
 
 		md.use(shortcode_plugin, shortcodes);
 	},
-
 };
 
 export default markdownConfig;
diff --git a/website/src/.vitepress/config/navigation/navbar.ts b/website/src/.vitepress/config/navigation/navbar.ts
index a0de1d1b..8e1ef8c8 100644
--- a/website/src/.vitepress/config/navigation/navbar.ts
+++ b/website/src/.vitepress/config/navigation/navbar.ts
@@ -8,7 +8,7 @@ const nav = [
 	},
 	{
 		text: APP_VERSION,
-		activeMatch: "^\/*?(download|changelogs)\/*?$",
+		activeMatch: "^/*?(download|changelogs)/*?$",
 		items: [
 			{
 				text: "Download",
diff --git a/website/src/.vitepress/config/shortcodes.ts b/website/src/.vitepress/config/shortcodes.ts
index 407cead7..be9fdef7 100644
--- a/website/src/.vitepress/config/shortcodes.ts
+++ b/website/src/.vitepress/config/shortcodes.ts
@@ -1,54 +1,54 @@
 const navigationMappings = {
-    more: {
-        name: "More",
+	more: {
+		name: "More",
 		title: "More menu",
-        icon: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><title>dots-horizontal</title><path d="M16,12A2,2 0 0,1 18,10A2,2 0 0,1 20,12A2,2 0 0,1 18,14A2,2 0 0,1 16,12M10,12A2,2 0 0,1 12,10A2,2 0 0,1 14,12A2,2 0 0,1 12,14A2,2 0 0,1 10,12M4,12A2,2 0 0,1 6,10A2,2 0 0,1 8,12A2,2 0 0,1 6,14A2,2 0 0,1 4,12Z" /></svg>`,
-    },
-    settings: {
-        name: "Settings",
+		icon: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><title>dots-horizontal</title><path d="M16,12A2,2 0 0,1 18,10A2,2 0 0,1 20,12A2,2 0 0,1 18,14A2,2 0 0,1 16,12M10,12A2,2 0 0,1 12,10A2,2 0 0,1 14,12A2,2 0 0,1 12,14A2,2 0 0,1 10,12M4,12A2,2 0 0,1 6,10A2,2 0 0,1 8,12A2,2 0 0,1 6,14A2,2 0 0,1 4,12Z" /></svg>`,
+	},
+	settings: {
+		name: "Settings",
 		title: "Settings menu",
-        icon: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><title>cog</title><path d="M12,15.5A3.5,3.5 0 0,1 8.5,12A3.5,3.5 0 0,1 12,8.5A3.5,3.5 0 0,1 15.5,12A3.5,3.5 0 0,1 12,15.5M19.43,12.97C19.47,12.65 19.5,12.33 19.5,12C19.5,11.67 19.47,11.34 19.43,11L21.54,9.37C21.73,9.22 21.78,8.95 21.66,8.73L19.66,5.27C19.54,5.05 19.27,4.96 19.05,5.05L16.56,6.05C16.04,5.66 15.5,5.32 14.87,5.07L14.5,2.42C14.46,2.18 14.25,2 14,2H10C9.75,2 9.54,2.18 9.5,2.42L9.13,5.07C8.5,5.32 7.96,5.66 7.44,6.05L4.95,5.05C4.73,4.96 4.46,5.05 4.34,5.27L2.34,8.73C2.21,8.95 2.27,9.22 2.46,9.37L4.57,11C4.53,11.34 4.5,11.67 4.5,12C4.5,12.33 4.53,12.65 4.57,12.97L2.46,14.63C2.27,14.78 2.21,15.05 2.34,15.27L4.34,18.73C4.46,18.95 4.73,19.03 4.95,18.95L7.44,17.94C7.96,18.34 8.5,18.68 9.13,18.93L9.5,21.58C9.54,21.82 9.75,22 10,22H14C14.25,22 14.46,21.82 14.5,21.58L14.87,18.93C15.5,18.67 16.04,18.34 16.56,17.94L19.05,18.95C19.27,19.03 19.54,18.95 19.66,18.73L21.66,15.27C21.78,15.05 21.73,14.78 21.54,14.63L19.43,12.97Z" /></svg>`,
-        dependsOn: "more",
-    },
-    reader: {
-        name: "Reader",
+		icon: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><title>cog</title><path d="M12,15.5A3.5,3.5 0 0,1 8.5,12A3.5,3.5 0 0,1 12,8.5A3.5,3.5 0 0,1 15.5,12A3.5,3.5 0 0,1 12,15.5M19.43,12.97C19.47,12.65 19.5,12.33 19.5,12C19.5,11.67 19.47,11.34 19.43,11L21.54,9.37C21.73,9.22 21.78,8.95 21.66,8.73L19.66,5.27C19.54,5.05 19.27,4.96 19.05,5.05L16.56,6.05C16.04,5.66 15.5,5.32 14.87,5.07L14.5,2.42C14.46,2.18 14.25,2 14,2H10C9.75,2 9.54,2.18 9.5,2.42L9.13,5.07C8.5,5.32 7.96,5.66 7.44,6.05L4.95,5.05C4.73,4.96 4.46,5.05 4.34,5.27L2.34,8.73C2.21,8.95 2.27,9.22 2.46,9.37L4.57,11C4.53,11.34 4.5,11.67 4.5,12C4.5,12.33 4.53,12.65 4.57,12.97L2.46,14.63C2.27,14.78 2.21,15.05 2.34,15.27L4.34,18.73C4.46,18.95 4.73,19.03 4.95,18.95L7.44,17.94C7.96,18.34 8.5,18.68 9.13,18.93L9.5,21.58C9.54,21.82 9.75,22 10,22H14C14.25,22 14.46,21.82 14.5,21.58L14.87,18.93C15.5,18.67 16.04,18.34 16.56,17.94L19.05,18.95C19.27,19.03 19.54,18.95 19.66,18.73L21.66,15.27C21.78,15.05 21.73,14.78 21.54,14.63L19.43,12.97Z" /></svg>`,
+		dependsOn: "more",
+	},
+	reader: {
+		name: "Reader",
 		title: "Reader menu",
-        icon: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><title>book-open-outline</title><path d="M21,4H3A2,2 0 0,0 1,6V19A2,2 0 0,0 3,21H21A2,2 0 0,0 23,19V6A2,2 0 0,0 21,4M3,19V6H11V19H3M21,19H13V6H21V19M14,9.5H20V11H14V9.5M14,12H20V13.5H14V12M14,14.5H20V16H14V14.5Z" /></svg>`,
-        dependsOn: "settings",
-    },
-    advanced: {
-        name: "Advanced",
+		icon: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><title>book-open-outline</title><path d="M21,4H3A2,2 0 0,0 1,6V19A2,2 0 0,0 3,21H21A2,2 0 0,0 23,19V6A2,2 0 0,0 21,4M3,19V6H11V19H3M21,19H13V6H21V19M14,9.5H20V11H14V9.5M14,12H20V13.5H14V12M14,14.5H20V16H14V14.5Z" /></svg>`,
+		dependsOn: "settings",
+	},
+	advanced: {
+		name: "Advanced",
 		title: "Advanced menu",
-        icon: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><title>code-tags</title><path d="M14.6,16.6L19.2,12L14.6,7.4L16,6L22,12L16,18L14.6,16.6M9.4,16.6L4.8,12L9.4,7.4L8,6L2,12L8,18L9.4,16.6Z" /></svg>`,
-        dependsOn: "settings",
-    },
+		icon: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><title>code-tags</title><path d="M14.6,16.6L19.2,12L14.6,7.4L16,6L22,12L16,18L14.6,16.6M9.4,16.6L4.8,12L9.4,7.4L8,6L2,12L8,18L9.4,16.6Z" /></svg>`,
+		dependsOn: "settings",
+	},
 };
 
 function generateNavigationHtml(navKey) {
-    const navData = navigationMappings[navKey];
+	const navData = navigationMappings[navKey];
 
-    if (!navData) {
-        return "<strong style='color:var(--vp-c-danger-1)'>Unsupported Navigation!</strong>";
-    }
+	if (!navData) {
+		return "<strong style='color:var(--vp-c-danger-1)'>Unsupported Navigation!</strong>";
+	}
 
-    const { name, title, icon, dependsOn } = navData;
+	const { name, title, icon, dependsOn } = navData;
 
-    let html = `<span class='shortcode navigation ${navKey}' title='${title}'>${icon}<span class="name">${name}</span></span>`;
+	let html = `<span class='shortcode navigation ${navKey}' title='${title}'>${icon}<span class="name">${name}</span></span>`;
 
-    if (dependsOn) {
-        html = generateNavigationHtml(dependsOn) + ` → ` + html;
-    }
+	if (dependsOn) {
+		html = generateNavigationHtml(dependsOn) + ` → ` + html;
+	}
 
-    return html;
+	return html;
 }
 
 const shortcodes = {
-    nav: {
-        render: function (attrs, env) {
-            const { method, to } = attrs;
-            return generateNavigationHtml(to);
-        },
-    },
+	nav: {
+		render: function (attrs, env) {
+			const { method, to } = attrs;
+			return generateNavigationHtml(to);
+		},
+	},
 };
 
 export default shortcodes;
diff --git a/website/src/.vitepress/config/themeConfig.ts b/website/src/.vitepress/config/themeConfig.ts
index 618f434a..176d3b57 100644
--- a/website/src/.vitepress/config/themeConfig.ts
+++ b/website/src/.vitepress/config/themeConfig.ts
@@ -38,7 +38,7 @@ const themeConfig: DefaultTheme.Config = {
 		},
 		{
 			icon: {
-			  svg: '<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0zm5.01 4.744c.688 0 1.25.561 1.25 1.249a1.25 1.25 0 0 1-2.498.056l-2.597-.547-.8 3.747c1.824.07 3.48.632 4.674 1.488.308-.309.73-.491 1.207-.491.968 0 1.754.786 1.754 1.754 0 .716-.435 1.333-1.01 1.614a3.111 3.111 0 0 1 .042.52c0 2.694-3.13 4.87-7.004 4.87-3.874 0-7.004-2.176-7.004-4.87 0-.183.015-.366.043-.534A1.748 1.748 0 0 1 4.028 12c0-.968.786-1.754 1.754-1.754.463 0 .898.196 1.207.49 1.207-.883 2.878-1.43 4.744-1.487l.885-4.182a.342.342 0 0 1 .14-.197.35.35 0 0 1 .238-.042l2.906.617a1.214 1.214 0 0 1 1.108-.701zM9.25 12C8.561 12 8 12.562 8 13.25c0 .687.561 1.248 1.25 1.248.687 0 1.248-.561 1.248-1.249 0-.688-.561-1.249-1.249-1.249zm5.5 0c-.687 0-1.248.561-1.248 1.25 0 .687.561 1.248 1.249 1.248.688 0 1.249-.561 1.249-1.249 0-.687-.562-1.249-1.25-1.249zm-5.466 3.99a.327.327 0 0 0-.231.094.33.33 0 0 0 0 .463c.842.842 2.484.913 2.961.913.477 0 2.105-.056 2.961-.913a.361.361 0 0 0 .029-.463.33.33 0 0 0-.464 0c-.547.533-1.684.73-2.512.73-.828 0-1.979-.196-2.512-.73a.326.326 0 0 0-.232-.095z"/></svg>',
+				svg: '<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0zm5.01 4.744c.688 0 1.25.561 1.25 1.249a1.25 1.25 0 0 1-2.498.056l-2.597-.547-.8 3.747c1.824.07 3.48.632 4.674 1.488.308-.309.73-.491 1.207-.491.968 0 1.754.786 1.754 1.754 0 .716-.435 1.333-1.01 1.614a3.111 3.111 0 0 1 .042.52c0 2.694-3.13 4.87-7.004 4.87-3.874 0-7.004-2.176-7.004-4.87 0-.183.015-.366.043-.534A1.748 1.748 0 0 1 4.028 12c0-.968.786-1.754 1.754-1.754.463 0 .898.196 1.207.49 1.207-.883 2.878-1.43 4.744-1.487l.885-4.182a.342.342 0 0 1 .14-.197.35.35 0 0 1 .238-.042l2.906.617a1.214 1.214 0 0 1 1.108-.701zM9.25 12C8.561 12 8 12.562 8 13.25c0 .687.561 1.248 1.25 1.248.687 0 1.248-.561 1.248-1.249 0-.688-.561-1.249-1.249-1.249zm5.5 0c-.687 0-1.248.561-1.248 1.25 0 .687.561 1.248 1.249 1.248.688 0 1.249-.561 1.249-1.249 0-.687-.562-1.249-1.25-1.249zm-5.466 3.99a.327.327 0 0 0-.231.094.33.33 0 0 0 0 .463c.842.842 2.484.913 2.961.913.477 0 2.105-.056 2.961-.913a.361.361 0 0 0 .029-.463.33.33 0 0 0-.464 0c-.547.533-1.684.73-2.512.73-.828 0-1.979-.196-2.512-.73a.326.326 0 0 0-.232-.095z"/></svg>',
 			},
 			link: "https://reddit.com/r/Tachiyomi",
 			ariaLabel: "Support subreddit",
diff --git a/website/src/.vitepress/theme/components/Changelogs.vue b/website/src/.vitepress/theme/components/Changelogs.vue
index 2088f466..e8a14fcb 100644
--- a/website/src/.vitepress/theme/components/Changelogs.vue
+++ b/website/src/.vitepress/theme/components/Changelogs.vue
@@ -56,14 +56,14 @@ const dateFormatter = new Intl.DateTimeFormat("en", {
 
 <style lang="stylus" scoped>
 h2 {
-	margin-bottom: 0;
-	display: flex;
-	align-items: center;
-	gap: 0.5rem;
+	margin-bottom: 0
+	display: flex
+	align-items: center
+	gap: 0.5rem
 }
 
 time {
-	font-size: 0.875rem;
-	color: var(--vp-c-text-2);
+	font-size: 0.875rem
+	color: var(--vp-c-text-2)
 }
 </style>
diff --git a/website/src/.vitepress/theme/components/Contributors.vue b/website/src/.vitepress/theme/components/Contributors.vue
index 39136c85..8f242ad5 100644
--- a/website/src/.vitepress/theme/components/Contributors.vue
+++ b/website/src/.vitepress/theme/components/Contributors.vue
@@ -81,29 +81,29 @@ function addToNonExistent(user: string) {
 <style lang="stylus" scoped>
 .contributors {
 	ul {
-		display: flex;
-		align-items: center;
-		flex-wrap: wrap;
-		gap: 0.5rem;
-		list-style-type: none;
-		padding-left: 0;
+		display: flex
+		align-items: center
+		flex-wrap: wrap
+		gap: 0.5rem
+		list-style-type: none
+		padding-left: 0
 
 		li + li {
-			margin-top: 0;
+			margin-top: 0
 		}
 	}
 
 	.avatar {
-		width: 32px;
-		height: 32px;
-		border-radius: 50%;
-		box-shadow: var(--vp-shadow-1);
-		border: 1px solid var(--vp-c-divider);
+		width: 32px
+		height: 32px
+		border-radius: 50%
+		box-shadow: var(--vp-shadow-1)
+		border: 1px solid var(--vp-c-divider)
 	}
 
 	.names {
-		font-size: 0.875rem;
-		color: var(--vp-c-text-2);
+		font-size: 0.875rem
+		color: var(--vp-c-text-2)
 	}
 }
 </style>
diff --git a/website/src/.vitepress/theme/components/ExtensionGroup.vue b/website/src/.vitepress/theme/components/ExtensionGroup.vue
deleted file mode 100644
index a4f891b3..00000000
--- a/website/src/.vitepress/theme/components/ExtensionGroup.vue
+++ /dev/null
@@ -1,50 +0,0 @@
-<script>
-import { langName, simpleLangName } from "../../../config/scripts/languages";
-import ExtensionItem from "./ExtensionItem.vue";
-
-export default {
-	components: { ExtensionItem },
-	props: ["list", "totalCount"],
-	computed: {
-		groupName: function () {
-			const firstItem = this.list[0];
-			return firstItem.lang === "en" ? simpleLangName(firstItem.lang) : langName(firstItem.lang);
-		},
-	},
-	methods: {
-		simpleLangName,
-		langName,
-	},
-};
-</script>
-
-<template>
-	<div class="extension-group">
-		<h2>
-			{{ groupName }}
-
-			<span class="extensions-total">
-				Total:
-				<span class="extensions-total-sum">
-					{{ totalCount }}
-				</span>
-			</span>
-		</h2>
-		<ExtensionItem
-			v-for="extension in list"
-			:id="extension.pkg.replace('eu.kanade.tachiyomi.extension.', '')"
-			:key="extension.apk"
-			:item="extension"
-		/>
-	</div>
-</template>
-
-<style lang="stylus">
-.extensions-total {
-	float: right
-
-	&-sum {
-		color: var(--vp-c-brand)
-	}
-}
-</style>
diff --git a/website/src/.vitepress/theme/components/Extensions/ExtensionItem.vue b/website/src/.vitepress/theme/components/Extensions/ExtensionItem.vue
index 52615443..2431f2ae 100644
--- a/website/src/.vitepress/theme/components/Extensions/ExtensionItem.vue
+++ b/website/src/.vitepress/theme/components/Extensions/ExtensionItem.vue
@@ -77,7 +77,7 @@ export default {
 
 	.extension-icon {
 		flex-shrink: 0
-		margin-left: -4px;
+		margin-left: -4px
 	}
 
 	.extension-text {
@@ -129,7 +129,7 @@ export default {
 	}
 
 	@media (max-width 767px) {
-		padding: 0.4em 0em
+		padding: 0.4em 0
 	}
 }
 
@@ -144,7 +144,7 @@ export default {
 		padding: 0.5em
 
 		.extension-icon {
-			margin-left: 0;
+			margin-left: 0
 		}
 
 		.extension-download {
diff --git a/website/src/.vitepress/theme/components/News.vue b/website/src/.vitepress/theme/components/News.vue
index 03aa39d0..d682702d 100644
--- a/website/src/.vitepress/theme/components/News.vue
+++ b/website/src/.vitepress/theme/components/News.vue
@@ -33,14 +33,15 @@ const dateFormatter = new Intl.DateTimeFormat("en", { dateStyle: "medium" });
 
 <style lang="stylus" scoped>
 .news {
-	display: flex;
-	flex-direction: column;
+	display: flex
+	flex-direction: column
 	gap: 0.5rem
 	position: relative
 
 	&:first-of-type {
 		margin-top: 3rem
 	}
+
 	& + .news {
 		margin-top: 3rem
 	}
@@ -52,7 +53,8 @@ const dateFormatter = new Intl.DateTimeFormat("en", { dateStyle: "medium" });
 		z-index: 10
 	}
 
-	h3, p {
+	h3,
+	p {
 		margin: 0
 	}
 
@@ -77,7 +79,10 @@ const dateFormatter = new Intl.DateTimeFormat("en", { dateStyle: "medium" });
 		}
 	}
 
-	.title,	.readPrompt, p,	time {
+	.title,
+	.readPrompt,
+	p,
+	time {
 		position: relative
 	}
 
@@ -102,7 +107,8 @@ const dateFormatter = new Intl.DateTimeFormat("en", { dateStyle: "medium" });
 		}
 	}
 
-	.hover, .background {
+	.hover,
+	.background {
 		position: absolute
 		z-index: 20
 		bottom: -1rem
@@ -117,18 +123,27 @@ const dateFormatter = new Intl.DateTimeFormat("en", { dateStyle: "medium" });
 		transform: scale(0.95)
 		opacity: 0
 		z-index: 0
-		transition: opacity 0.15s cubic-bezier(0.4, 0, 0.2, 1),
-			transform 0.15s cubic-bezier(0.4, 0, 0.2, 1);
+		transition: opacity 0.15s cubic-bezier(0.4, 0, 0.2, 1), transform 0.15s cubic-bezier(0.4, 0, 0.2, 1)
 	}
 
-	&:hover .background, &:focus-within .background {
+	&:hover .background,
+	&:focus-within .background {
 		opacity: 1
 		transform: scale(1)
 	}
 
-	h3 a:focus-visible + .background {
+	h3: a
+
+	:focus-visible + .background {
+		outline: 2px solid var(--vp-c-brand-2)
+	}
+
+	:focus-visible + .background {
+		outline: 2px solid var(--vp-c-brand-2)
+	}
+
+	:focus-visible + .background {
 		outline: 2px solid var(--vp-c-brand-2)
 	}
 }
-
 </style>
diff --git a/website/src/.vitepress/theme/components/OgImageTemplate.vue b/website/src/.vitepress/theme/components/OgImageTemplate.vue
index 25a93378..c7c692ea 100644
--- a/website/src/.vitepress/theme/components/OgImageTemplate.vue
+++ b/website/src/.vitepress/theme/components/OgImageTemplate.vue
@@ -24,6 +24,6 @@
 				<div v-if="description" tw="mt-2 text-4xl text-slate-600">{{ description }}</div>
 			</div>
 		</div>
-		<div tw="shrink-0 h-2 w-full flex" style="background-color: #8995FF;" />
+		<div tw="shrink-0 h-2 w-full flex" style="background-color: #8995ff;" />
 	</div>
 </template>
diff --git a/website/src/.vitepress/theme/components/WhatsNew.vue b/website/src/.vitepress/theme/components/WhatsNew.vue
index b86006ec..7e69cf2a 100644
--- a/website/src/.vitepress/theme/components/WhatsNew.vue
+++ b/website/src/.vitepress/theme/components/WhatsNew.vue
@@ -50,7 +50,7 @@ const whatsNew = computed(() => {
 	transition: border-color 0.25s, background-color 0.25s
 	padding: 24px
 	height: 100%
-	margin: 1.5em auto 0.5em auto
+	margin: 1.5em auto 0.5em
 
 	header {
 		display: flex
diff --git a/website/src/.vitepress/theme/data/changelogs.data.ts b/website/src/.vitepress/theme/data/changelogs.data.ts
index fd465c3c..e389fc49 100644
--- a/website/src/.vitepress/theme/data/changelogs.data.ts
+++ b/website/src/.vitepress/theme/data/changelogs.data.ts
@@ -1,4 +1,4 @@
-import { defineLoader } from "vitepress"
+import { defineLoader } from "vitepress";
 import { Octokit } from "@octokit/rest";
 import type { GetResponseDataTypeFromEndpointMethod } from "@octokit/types";
 
@@ -18,5 +18,5 @@ export default defineLoader({
 		});
 
 		return releases;
-	}
+	},
 });
diff --git a/website/src/.vitepress/theme/data/news.data.ts b/website/src/.vitepress/theme/data/news.data.ts
index 4c9b1629..c1b2fe34 100644
--- a/website/src/.vitepress/theme/data/news.data.ts
+++ b/website/src/.vitepress/theme/data/news.data.ts
@@ -1,4 +1,4 @@
-import { defineLoader, createContentLoader } from "vitepress"
+import { defineLoader, createContentLoader } from "vitepress";
 
 export interface News {
 	title: string;
@@ -16,12 +16,15 @@ export default defineLoader({
 
 		return articles
 			.filter(({ url }) => url !== "/news/")
-			.map(({ frontmatter, url }) => <News>({
-				title: frontmatter.title,
-				description: frontmatter.description,
-				date: frontmatter.date,
-				url,
-			}))
+			.map(
+				({ frontmatter, url }) =>
+					<News>{
+						title: frontmatter.title,
+						description: frontmatter.description,
+						date: frontmatter.date,
+						url,
+					}
+			)
 			.sort((a, b) => b.date.localeCompare(a.date));
-	}
+	},
 });
diff --git a/website/src/.vitepress/theme/data/release.data.ts b/website/src/.vitepress/theme/data/release.data.ts
index 831b5a0f..1011d12c 100644
--- a/website/src/.vitepress/theme/data/release.data.ts
+++ b/website/src/.vitepress/theme/data/release.data.ts
@@ -1,4 +1,4 @@
-import { defineLoader } from "vitepress"
+import { defineLoader } from "vitepress";
 import { Octokit } from "@octokit/rest";
 import type { GetResponseDataTypeFromEndpointMethod } from "@octokit/types";
 
@@ -27,5 +27,5 @@ export default defineLoader({
 		});
 
 		return { stable, preview };
-	}
+	},
 });
diff --git a/website/src/.vitepress/theme/styles/base.styl b/website/src/.vitepress/theme/styles/base.styl
index b89532d8..246b866b 100644
--- a/website/src/.vitepress/theme/styles/base.styl
+++ b/website/src/.vitepress/theme/styles/base.styl
@@ -117,13 +117,14 @@ html:not(.dark) {
 /**
  * Component: LocalSearch
  */
+
 .VPLocalSearchBox {
-	--vp-local-search-highlight-bg: var(--vp-c-brand-soft);
-	--vp-local-search-highlight-text: var(--vp-c-brand-dark);
+	--vp-local-search-highlight-bg: var(--vp-c-brand-soft)
+	--vp-local-search-highlight-text: var(--vp-c-brand-dark)
 }
 
-.dark .VPLocalSearchBox  {
-	--vp-local-search-highlight-text: var(--vp-c-brand-lightest);
+.dark .VPLocalSearchBox {
+	--vp-local-search-highlight-text: var(--vp-c-brand-lightest)
 }
 
 /**
@@ -191,6 +192,7 @@ main :where(h1, h2, h3, h4, h5, h6) + figure {
 /**
  * Component: Shortcodes
  * -------------------------------------------------------------------------- */
+
 .navigation {
 	color: var(--vp-c-text-2)
 	font-weight: 600
@@ -202,7 +204,7 @@ main :where(h1, h2, h3, h4, h5, h6) + figure {
 
 	svg,
 	span.name {
-		vertical-align: middle; /* Align both SVG and <span> vertically */
+		vertical-align: middle // Align both SVG and <span> vertically
 	}
 
 	svg {
diff --git a/website/src/.vitepress/theme/styles/forks/lint.styl b/website/src/.vitepress/theme/styles/forks/lint.styl
new file mode 100644
index 00000000..a952baef
--- /dev/null
+++ b/website/src/.vitepress/theme/styles/forks/lint.styl
@@ -0,0 +1,9 @@
+.extension-list {
+	> div {
+		&:not(:first-of-type) {
+			.extensions-total {
+				display: none
+			}
+		}
+	}
+}