diff --git a/components/status/StatusCard.vue b/components/status/StatusCard.vue
index cc3b43f9..d821969b 100644
--- a/components/status/StatusCard.vue
+++ b/components/status/StatusCard.vue
@@ -1,5 +1,5 @@
 <script setup lang="ts">
-import type { Filter, FilterAction, FilterContext, Status } from 'masto'
+import type { FilterContext, Status } from 'masto'
 
 const props = withDefaults(
   defineProps<{
@@ -108,6 +108,7 @@ const avatarOnAvatar = $(computedEager(() => useFeatureFlags().experimentalAvata
               :status="status"
               minimized
             />
+            <StatusPreviewCard v-if="status.card" :card="status.card" />
           </StatusSpoiler>
           <StatusCard
             v-if="status.reblog"
@@ -115,6 +116,7 @@ const avatarOnAvatar = $(computedEager(() => useFeatureFlags().experimentalAvata
             :actions="false"
           />
         </div>
+        <StatusLink v-if="status.card" :card="status.card" />
         <StatusActions v-if="(actions !== false && !isZenMode)" pt2 :status="status" />
       </div>
     </div>
diff --git a/components/status/StatusDetails.vue b/components/status/StatusDetails.vue
index 45105fbd..f78302b2 100644
--- a/components/status/StatusDetails.vue
+++ b/components/status/StatusDetails.vue
@@ -42,6 +42,7 @@ const visibility = $computed(() => STATUS_VISIBILITIES.find(v => v.value === sta
         />
       </StatusSpoiler>
     </div>
+    <StatusPreviewCard v-if="status.card" :card="status.card" />
     <div flex="~ gap-1" items-center text-secondary text-sm>
       <div flex>
         <div>{{ createdAt }}</div>
diff --git a/components/status/StatusPreviewCard.vue b/components/status/StatusPreviewCard.vue
new file mode 100644
index 00000000..7aefd433
--- /dev/null
+++ b/components/status/StatusPreviewCard.vue
@@ -0,0 +1,47 @@
+<script setup lang="ts">
+import type { Card } from 'masto'
+
+const prop = defineProps<{
+  card: Card
+}>()
+const alt = $computed(() => `${prop.card.title} - ${prop.card.title}`)
+
+// TODO: handle card.type: 'photo' | 'video' | 'rich';
+</script>
+
+<template>
+  <div
+    v-if="card"
+    border="~ base"
+    display-block
+    rounded-lg
+  >
+    <NuxtLink display-block :to="card.url">
+      <CommonBlurhash
+        v-if="card.image"
+        :blurhash="card.blurhash"
+        :src="card.image"
+        :width="card.width"
+        :height="card.height"
+        :alt="alt"
+        display-block
+        rounded-lg
+        rounded-b-none
+        object-cover
+        w-full
+      />
+      <div p4 max-h-2xl>
+        <p v-if="card.providerName" text-secondary line-clamp-1 text-ellipsis>
+          {{ card.providerName }}
+        </p>
+        <strong v-if="card.title" line-clamp-1 text-ellipsis>{{ card.title }}</strong>
+        <p v-if="card.description" text-secondary line-clamp-2 text-ellipsis>
+          {{ card.description }}
+        </p>
+        <p v-else text-secondary line-clamp-2 text-ellipsis>
+          {{ card.url }}
+        </p>
+      </div>
+    </NuxtLink>
+  </div>
+</template>