diff --git a/src/components/Post/Embed/GalleryFallbackEmbed.tsx b/src/components/Post/Embed/GalleryFallbackEmbed.tsx
new file mode 100644
index 0000000000..38d7e4d013
--- /dev/null
+++ b/src/components/Post/Embed/GalleryFallbackEmbed.tsx
@@ -0,0 +1,99 @@
+import {Linking, View} from 'react-native'
+import {plural} from '@lingui/core/macro'
+import {Trans, useLingui} from '@lingui/react/macro'
+
+import {BSKY_DOWNLOAD_URL} from '#/lib/constants'
+import {atoms as a, useTheme} from '#/alf'
+import {Button, ButtonText} from '#/components/Button'
+import {Sparkle_Stroke2_Corner0_Rounded as Sparkle} from '#/components/icons/Sparkle'
+import {Text} from '#/components/Typography'
+import {IS_NATIVE} from '#/env'
+
+/**
+ * OTA-able fallback that ships to native builds which don't yet know how to
+ * render the new gallery embed (>4 images, Photos v2). Final copy and visual
+ * treatment pending design from Darrin/Danielle/Alex.
+ *
+ * Native-only per APP-2308 - web builds receive the new gallery support in
+ * the same release that adds it.
+ */
+export function GalleryFallbackEmbed({count}: {count?: number}) {
+ const t = useTheme()
+ const {t: l} = useLingui()
+
+ const bodyStyle = [
+ a.text_sm,
+ a.text_center,
+ a.leading_snug,
+ t.atoms.text_contrast_high,
+ ]
+
+ return (
+
+
+
+ Something new is here
+
+ {count ? (
+
+
+ {plural(count, {
+ one: 'This post has # photo.',
+ other: 'This post has # photos.',
+ })}
+
+ {IS_NATIVE ? (
+
+ {plural(count, {
+ one: 'Update your app to see it.',
+ other: 'Update your app to see them all.',
+ })}
+
+ ) : (
+
+ {plural(count, {
+ one: 'Refresh the page to see it.',
+ other: 'Refresh the page to see them all.',
+ })}
+
+ )}
+
+ ) : IS_NATIVE ? (
+
+ Update your app to see it.
+
+ ) : (
+
+ Refresh the page to see it.
+
+ )}
+ {IS_NATIVE && (
+
+ )}
+
+ )
+}
diff --git a/src/view/screens/Storybook/GalleryFallback.tsx b/src/view/screens/Storybook/GalleryFallback.tsx
new file mode 100644
index 0000000000..7cca087dba
--- /dev/null
+++ b/src/view/screens/Storybook/GalleryFallback.tsx
@@ -0,0 +1,25 @@
+import {View} from 'react-native'
+
+import {atoms as a} from '#/alf'
+import {GalleryFallbackEmbed} from '#/components/Post/Embed/GalleryFallbackEmbed'
+import {H1, H3} from '#/components/Typography'
+
+export function GalleryFallback() {
+ return (
+
+
Gallery fallback (APP-2308)
+
+
No count
+
+
+
1 photo
+
+
+
5 photos
+
+
+
10 photos
+
+
+ )
+}
diff --git a/src/view/screens/Storybook/Storybook.tsx b/src/view/screens/Storybook/Storybook.tsx
index 8fb85e8e0a..33c31a9ee6 100644
--- a/src/view/screens/Storybook/Storybook.tsx
+++ b/src/view/screens/Storybook/Storybook.tsx
@@ -16,6 +16,7 @@ import {Breakpoints} from './Breakpoints'
import {Buttons} from './Buttons'
import {Dialogs} from './Dialogs'
import {Forms} from './Forms'
+import {GalleryFallback} from './GalleryFallback'
import {Icons} from './Icons'
import {Links} from './Links'
import {Menus} from './Menus'
@@ -120,6 +121,7 @@ export default function Storybook() {
+