diff --git a/src/components/Post/Embed/ExternalEmbed/Gif.tsx b/src/components/Post/Embed/ExternalEmbed/Gif.tsx
new file mode 100644
index 0000000000..a839294f1c
--- /dev/null
+++ b/src/components/Post/Embed/ExternalEmbed/Gif.tsx
@@ -0,0 +1,224 @@
+import React from 'react'
+import {
+ Pressable,
+ StyleProp,
+ StyleSheet,
+ TouchableOpacity,
+ View,
+ ViewStyle,
+} from 'react-native'
+import {msg, Trans} from '@lingui/macro'
+import {useLingui} from '@lingui/react'
+
+import {HITSLOP_20} from '#/lib/constants'
+import {EmbedPlayerParams} from '#/lib/strings/embed-player'
+import {isWeb} from '#/platform/detection'
+import {useAutoplayDisabled} from '#/state/preferences'
+import {useLargeAltBadgeEnabled} from '#/state/preferences/large-alt-badge'
+import {atoms as a, useTheme} from '#/alf'
+import {Fill} from '#/components/Fill'
+import {Loader} from '#/components/Loader'
+import * as Prompt from '#/components/Prompt'
+import {Text} from '#/components/Typography'
+import {PlayButtonIcon} from '#/components/video/PlayButtonIcon'
+import {GifView} from '../../../../../modules/expo-bluesky-gif-view'
+import {GifViewStateChangeEvent} from '../../../../../modules/expo-bluesky-gif-view/src/GifView.types'
+
+function PlaybackControls({
+ onPress,
+ isPlaying,
+ isLoaded,
+}: {
+ onPress: () => void
+ isPlaying: boolean
+ isLoaded: boolean
+}) {
+ const {_} = useLingui()
+ const t = useTheme()
+
+ return (
+
+ {!isLoaded ? (
+
+
+
+
+
+ ) : !isPlaying ? (
+
+ ) : undefined}
+
+ )
+}
+
+export function GifEmbed({
+ params,
+ thumb,
+ altText,
+ isPreferredAltText,
+ hideAlt,
+ style = {width: '100%'},
+}: {
+ params: EmbedPlayerParams
+ thumb: string | undefined
+ altText: string
+ isPreferredAltText: boolean
+ hideAlt?: boolean
+ style?: StyleProp
+}) {
+ const t = useTheme()
+ const {_} = useLingui()
+ const autoplayDisabled = useAutoplayDisabled()
+
+ const playerRef = React.useRef(null)
+
+ const [playerState, setPlayerState] = React.useState<{
+ isPlaying: boolean
+ isLoaded: boolean
+ }>({
+ isPlaying: !autoplayDisabled,
+ isLoaded: false,
+ })
+
+ const onPlayerStateChange = React.useCallback(
+ (e: GifViewStateChangeEvent) => {
+ setPlayerState(e.nativeEvent)
+ },
+ [],
+ )
+
+ const onPress = React.useCallback(() => {
+ playerRef.current?.toggleAsync()
+ }, [])
+
+ return (
+
+
+
+
+ {!playerState.isPlaying && (
+
+ )}
+ {!hideAlt && isPreferredAltText && }
+
+
+ )
+}
+
+function AltText({text}: {text: string}) {
+ const control = Prompt.usePromptControl()
+ const largeAltBadge = useLargeAltBadgeEnabled()
+
+ const {_} = useLingui()
+ return (
+ <>
+
+
+ ALT
+
+
+
+
+ Alt Text
+
+ {text}
+
+ control.close()}
+ cta={_(msg`Close`)}
+ color="secondary"
+ />
+
+
+ >
+ )
+}
+
+const styles = StyleSheet.create({
+ altContainer: {
+ backgroundColor: 'rgba(0, 0, 0, 0.75)',
+ borderRadius: 6,
+ paddingHorizontal: isWeb ? 8 : 6,
+ paddingVertical: isWeb ? 6 : 3,
+ position: 'absolute',
+ // Related to margin/gap hack. This keeps the alt label in the same position
+ // on all platforms
+ right: isWeb ? 8 : 5,
+ bottom: isWeb ? 8 : 5,
+ zIndex: 2,
+ },
+ alt: {
+ color: 'white',
+ fontSize: isWeb ? 10 : 7,
+ fontWeight: '600',
+ },
+})
diff --git a/src/components/Post/Embed/ExternalEmbed/index.tsx b/src/components/Post/Embed/ExternalEmbed/index.tsx
index 6d6a664565..e94a394461 100644
--- a/src/components/Post/Embed/ExternalEmbed/index.tsx
+++ b/src/components/Post/Embed/ExternalEmbed/index.tsx
@@ -11,7 +11,6 @@ import {parseEmbedPlayerFromUrl} from '#/lib/strings/embed-player'
import {toNiceDomain} from '#/lib/strings/url-helpers'
import {isNative} from '#/platform/detection'
import {useExternalEmbedsPrefs} from '#/state/preferences'
-import {GifEmbed} from '#/view/com/util/post-embeds/GifEmbed'
import {atoms as a, useTheme} from '#/alf'
import {Divider} from '#/components/Divider'
import {Earth_Stroke2_Corner0_Rounded as Globe} from '#/components/icons/Globe'
@@ -19,6 +18,7 @@ import {Link} from '#/components/Link'
import {Text} from '#/components/Typography'
import {ExternalGif} from './ExternalGif'
import {ExternalPlayer} from './ExternalPlayer'
+import {GifEmbed} from './Gif'
export const ExternalEmbed = ({
link,