diff --git a/packages/ui/src/stories/servers/ServerListing.stories.ts b/packages/ui/src/stories/servers/ServerListing.stories.ts
new file mode 100644
index 0000000000..2173b0a82b
--- /dev/null
+++ b/packages/ui/src/stories/servers/ServerListing.stories.ts
@@ -0,0 +1,111 @@
+import type { Meta, StoryObj } from '@storybook/vue3-vite'
+
+import ServerListing from '../../components/servers/ServerListing.vue'
+
+const baseServer = {
+ server_id: 'srv_2n5x8j9k',
+ name: 'Survival SMP',
+ status: 'available',
+ game: 'Minecraft',
+ mc_version: '1.21.5',
+ loader: 'Fabric',
+ loader_version: '0.16.14',
+ net: {
+ ip: '203.0.113.42',
+ port: 25565,
+ domain: 'play.example.net',
+ },
+} as const
+
+const pendingChange = {
+ planSize: 'Performance 8 GB',
+ cpu: 4,
+ cpuBurst: 6,
+ ramGb: 8,
+ storageGb: 80,
+ date: new Date(Date.now() + 5 * 24 * 60 * 60 * 1000).toISOString(),
+ verb: 'Upgrade',
+} as const
+
+const meta = {
+ title: 'Servers/ServerListing',
+ component: ServerListing,
+ parameters: {
+ layout: 'padded',
+ },
+ decorators: [
+ (story) => ({
+ components: { story },
+ template: '
',
+ }),
+ ],
+} satisfies Meta
+
+export default meta
+type Story = StoryObj
+
+export const Default: Story = {
+ args: {
+ ...baseServer,
+ },
+}
+
+export const ConfiguringNewServer: Story = {
+ args: {
+ ...baseServer,
+ server_id: 'srv_new_flow',
+ name: 'Fresh Vanilla World',
+ status: 'installing',
+ flows: { intro: true },
+ loader: 'Vanilla',
+ loader_version: null,
+ },
+}
+
+export const WithPendingChange: Story = {
+ args: {
+ ...baseServer,
+ server_id: 'srv_pending',
+ name: 'Competitive UHC',
+ pendingChange,
+ },
+}
+
+export const SuspendedUpgrading: Story = {
+ args: {
+ ...baseServer,
+ server_id: 'srv_suspended_upgrade',
+ name: 'Creative Build Team',
+ status: 'suspended',
+ suspension_reason: 'upgrading',
+ },
+}
+
+export const SuspendedCancelled: Story = {
+ args: {
+ ...baseServer,
+ server_id: 'srv_suspended_cancelled',
+ name: 'Old Event Server',
+ status: 'suspended',
+ suspension_reason: 'cancelled',
+ },
+}
+
+export const SuspendedPaymentFailed: Story = {
+ args: {
+ ...baseServer,
+ server_id: 'srv_suspended_reason',
+ name: 'Minigames Network',
+ status: 'suspended',
+ suspension_reason: 'paymentfailed',
+ },
+}
+
+export const SuspendedGeneric: Story = {
+ args: {
+ ...baseServer,
+ server_id: 'srv_suspended_generic',
+ name: 'Archive Server',
+ status: 'suspended',
+ },
+}