- {plan.id.replace(/-/g, " ")} -
- {plan.cpuModel && ( -{plan.cpuModel}
- )} -/month
-Showing {filtered.length} of {plans.length} server{plans.length !== 1 ? "s" : ""}
-+ Affordable, always-on hosting for Discord bots. Upload your code, pick your runtime, and let it run, with backups included. +
+No bot hosting plans in stock right now
+Check back soon, or get in touch and we'll help you find a fit.
+Need more power for a bigger bot?
++ Large or sharded bots run great on a VPS. Get in touch and we'll help you size it. +
+- {plan.name ?? plan.id} -
- {plan.description && ( -{plan.description}
- )} -/month
-Showing {filtered.length} of {plans.length} plan{plans.length !== 1 ? "s" : ""}
-{service.description}
+{service.description}
- {/* Highlights */}
{t("servicesHome.customSolution")}{" "}
diff --git a/packages/ui/components/Layouts/Nodes/nodes-client.tsx b/packages/ui/components/Layouts/Nodes/nodes-client.tsx
deleted file mode 100644
index 0771fb6..0000000
--- a/packages/ui/components/Layouts/Nodes/nodes-client.tsx
+++ /dev/null
@@ -1,508 +0,0 @@
-"use client"
-
-import { useState, useEffect, useSyncExternalStore } from "react"
-import {
- Server,
- MapPin,
- Info,
- Globe,
- Network,
- Zap,
- Cpu,
- Activity,
- MemoryStick,
-} from "lucide-react"
-import { Card, CardContent, CardHeader, CardTitle } from "@/packages/ui/components/ui/card"
-import { Badge } from "@/packages/ui/components/ui/badge"
-import { Button } from "@/packages/ui/components/ui/button"
-import {
- Accordion,
- AccordionContent,
- AccordionItem,
- AccordionTrigger,
-} from "@/packages/ui/components/ui/accordion"
-import { Alert, AlertDescription } from "@/packages/ui/components/ui/alert"
-import type { PublicNode } from "@/packages/core/constants/node-types"
-import { NODE_DISPLAY_OVERRIDES, LOCATION_MONITOR_MAP } from "@/packages/core/constants/status-mapping"
-import { useNodeStatus } from "@/packages/core/hooks/use-node-status"
-import type { StatusApiMonitor } from "@/app/api/status/route"
-import { cn } from "@/lib/utils"
-import Link from "next/link"
-import { LINKS } from "@/packages/core/constants/links"
-
-interface ExtendedNode extends PublicNode {
- cpu?: string
- ramType?: string
- uptime?: number
-}
-
-/** Build the node list from names discovered live from the status page, filling in any known display extras. */
-function buildNodes(nodeNames: string[]): ExtendedNode[] {
- return nodeNames.map((name, i) => {
- const overrides = NODE_DISPLAY_OVERRIDES[name] ?? {}
- return {
- id: i + 1,
- name,
- locationCode: overrides.locationCode ?? "",
- isMaintenanceMode: false,
- cpu: overrides.cpu,
- ramType: overrides.ramType,
- }
- })
-}
-
-// ─── Location data ───────────────────────────────────────────────────────────
-
-interface DataCentreLocation {
- id: string
- city: string
- area?: string // datacenter suburb / campus name
- country: string
- flag: string
- region: "Europe" | "Americas" | "Asia-Pacific"
- primary?: boolean
-}
-
-const LOCATIONS: DataCentreLocation[] = [
- // Europe — United Kingdom
- { id: "ncl", city: "Newcastle", country: "United Kingdom", flag: "🇬🇧", region: "Europe", primary: true },
- { id: "lon", city: "London", area: "Erith", country: "United Kingdom", flag: "🇬🇧", region: "Europe" },
- // Europe — France
- { id: "bor", city: "Bordeaux", country: "France", flag: "🇫🇷", region: "Europe" },
- { id: "cro", city: "Croix", country: "France", flag: "🇫🇷", region: "Europe" },
- { id: "gra", city: "Gravelines", country: "France", flag: "🇫🇷", region: "Europe" },
- { id: "grn", city: "Grenoble", country: "France", flag: "🇫🇷", region: "Europe" },
- { id: "par", city: "Paris", country: "France", flag: "🇫🇷", region: "Europe" },
- { id: "rbx", city: "Roubaix", country: "France", flag: "🇫🇷", region: "Europe" },
- { id: "sbg", city: "Strasbourg", country: "France", flag: "🇫🇷", region: "Europe" },
- { id: "tur", city: "Tours", country: "France", flag: "🇫🇷", region: "Europe" },
- // Europe — Germany
- { id: "fal", city: "Falkenstein", area: "Limburg", country: "Germany", flag: "🇩🇪", region: "Europe" },
- { id: "fra", city: "Frankfurt", country: "Germany", flag: "🇩🇪", region: "Europe" },
- // Europe — Finland
- { id: "hel", city: "Helsinki", country: "Finland", flag: "🇫🇮", region: "Europe", primary: true },
- // Europe — Italy
- { id: "mil", city: "Milan", country: "Italy", flag: "🇮🇹", region: "Europe" },
- // Europe — Poland
- { id: "waw", city: "Warsaw", area: "Ożarów", country: "Poland", flag: "🇵🇱", region: "Europe" },
- // Americas — Canada
- { id: "bhs", city: "Montréal", area: "Beauharnois", country: "Canada", flag: "🇨🇦", region: "Americas" },
- { id: "tor", city: "Toronto", area: "Cambridge", country: "Canada", flag: "🇨🇦", region: "Americas" },
- // Americas — United States
- { id: "hil", city: "Seattle", area: "Hillsboro, OR", country: "United States", flag: "🇺🇸", region: "Americas" },
- { id: "vhv", city: "Washington DC", area: "Vint Hill, VA", country: "United States", flag: "🇺🇸", region: "Americas" },
- { id: "newy", city: "New York", area: "Secaucus, NJ", country: "United States", flag: "🇺🇸", region: "Americas" },
- // Asia-Pacific
- { id: "sgp", city: "Singapore", country: "Singapore", flag: "🇸🇬", region: "Asia-Pacific" },
- { id: "syd", city: "Sydney", country: "Australia", flag: "🇦🇺", region: "Asia-Pacific" },
- { id: "mum", city: "Mumbai", country: "India", flag: "🇮🇳", region: "Asia-Pacific" },
-]
-
-// ─── Helpers ────────────────────────────────────────────────────────────────
-
-function formatSize(mib: number): string {
- if (mib >= 1024 * 1024) return `${(mib / 1024 / 1024).toFixed(1)} TB`
- if (mib >= 1024) return `${(mib / 1024).toFixed(0)} GB`
- return `${mib} MiB`
-}
-
-const LIVE_STATE_STYLES: Record {country}
- Our active server nodes and every data centre location available at checkout.
-
- Node status is temporarily unavailable Check the status page directly for the latest info.
- {LOCATIONS.length} data centre locations across 3 regions. Select your preferred location at checkout.
-
- {region} · {regionLocs.length} location{regionLocs.length !== 1 && "s"}
-
- Everything about our nodes and choosing the right location for your service.
-
- Ready to deploy? Browse our plans and pick your preferred location at checkout.
-
- {plan.name ?? plan.id.replace(/-/g, " ")}
- {plan.storageLabel} /month
Showing {filtered.length} of {plans.length} plan{plans.length !== 1 ? "s" : ""}
- {plan.sku ?? plan.id}
- {plan.cpuModel} /month
Showing {filtered.length} of {plans.length} plans
- {t("vps.pricing.description")}
-
- {t("gamePage.pricing.outOfStockDesc", { game: `${variantName} VPS` })}
-
- {t("gamePage.pricing.outOfStockNote")}
-
- 50% off your first month on all VPS plans
-
- Use this code at checkout valid until March 22, 2026
- {t("vps.pricing.filters.noResultsDesc")} {t("vpsPage.startingAt")} {plan.description}
- {t("vps.pricing.customSolution")}{" "}
-
- {t("vps.pricing.contactUs")}
-
-
+ {name}
+
+ {subtitle}
+ /month
+ {spec.value}
+
+ {spec.label}
+
- Nodes &{" "}
-
- Locations
-
-
-
- Deploy Anywhere{" "}
-
- Globally
-
-
-
- Common{" "}
-
- Questions
-
-
-
- {plan.features.map((feature) => (
-
- >
- )}
-
- {plan.setupFeeGBP > 0 && (
-
+ {plan.features.map((feature) => (
+
+ )
+ }
+ info={
+ plan.setupFeeGBP > 0 && (
+
- {variantName} VPS{" "}
-
- {t("vps.pricing.title")}
-
-
- {t("gamePage.pricing.outOfStock")}
- {t("vps.pricing.filters.noResults")}
- {plan.id}
-
-
-
- {plan.stock === "out_of_stock" ? (
-
- ) : plan.stock === "coming_soon" ? (
-
- ) : (
-
- )}
-