diff --git a/.eslintrc.js b/.eslintrc.js
index 44f3edfd17..726cc56074 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -34,6 +34,7 @@ module.exports = {
'P',
'Admonition',
'Admonition.Admonition',
+ 'Span',
],
impliedTextProps: [],
suggestedTextWrappers: {
diff --git a/assets/icons/circleCheck_stroke2_corner0_rounded.svg b/assets/icons/circleCheck_stroke2_corner0_rounded.svg
new file mode 100644
index 0000000000..d6b0b6bbf9
--- /dev/null
+++ b/assets/icons/circleCheck_stroke2_corner0_rounded.svg
@@ -0,0 +1 @@
+
diff --git a/assets/icons/sparkle_stroke2_corner0_rounded.svg b/assets/icons/sparkle_stroke2_corner0_rounded.svg
new file mode 100644
index 0000000000..84478380e7
--- /dev/null
+++ b/assets/icons/sparkle_stroke2_corner0_rounded.svg
@@ -0,0 +1 @@
+
diff --git a/assets/icons/verifiedCheck.svg b/assets/icons/verifiedCheck.svg
new file mode 100644
index 0000000000..f76955ac82
--- /dev/null
+++ b/assets/icons/verifiedCheck.svg
@@ -0,0 +1 @@
+
diff --git a/assets/icons/verifierCheck.svg b/assets/icons/verifierCheck.svg
new file mode 100644
index 0000000000..71158eb132
--- /dev/null
+++ b/assets/icons/verifierCheck.svg
@@ -0,0 +1 @@
+
diff --git a/assets/images/initial_verification_announcement_1.png b/assets/images/initial_verification_announcement_1.png
new file mode 100644
index 0000000000..c7f38153b3
Binary files /dev/null and b/assets/images/initial_verification_announcement_1.png differ
diff --git a/assets/images/initial_verification_announcement_2.png b/assets/images/initial_verification_announcement_2.png
new file mode 100644
index 0000000000..d78f1b5830
Binary files /dev/null and b/assets/images/initial_verification_announcement_2.png differ
diff --git a/bskyweb/cmd/bskyweb/server.go b/bskyweb/cmd/bskyweb/server.go
index b74df5ff10..f419212cc9 100644
--- a/bskyweb/cmd/bskyweb/server.go
+++ b/bskyweb/cmd/bskyweb/server.go
@@ -263,6 +263,7 @@ func serve(cctx *cli.Context) error {
e.GET("/moderation/modlists", server.WebGeneric)
e.GET("/moderation/muted-accounts", server.WebGeneric)
e.GET("/moderation/blocked-accounts", server.WebGeneric)
+ e.GET("/moderation/verification-settings", server.WebGeneric)
e.GET("/settings", server.WebGeneric)
e.GET("/settings/language", server.WebGeneric)
e.GET("/settings/app-passwords", server.WebGeneric)
diff --git a/package.json b/package.json
index 974eef74ca..235b1a91bc 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
"icons:optimize": "svgo -f ./assets/icons"
},
"dependencies": {
- "@atproto/api": "^0.14.21",
+ "@atproto/api": "^0.15.3",
"@bitdrift/react-native": "^0.6.8",
"@braintree/sanitize-url": "^6.0.2",
"@discord/bottom-sheet": "bluesky-social/react-native-bottom-sheet",
diff --git a/src/Navigation.tsx b/src/Navigation.tsx
index 277ffb07ec..d4fdc4797a 100644
--- a/src/Navigation.tsx
+++ b/src/Navigation.tsx
@@ -70,6 +70,7 @@ import {MessagesConversationScreen} from '#/screens/Messages/Conversation'
import {MessagesInboxScreen} from '#/screens/Messages/Inbox'
import {MessagesSettingsScreen} from '#/screens/Messages/Settings'
import {ModerationScreen} from '#/screens/Moderation'
+import {Screen as ModerationVerificationSettings} from '#/screens/Moderation/VerificationSettings'
import {Screen as ModerationInteractionSettings} from '#/screens/ModerationInteractionSettings'
import {PostLikedByScreen} from '#/screens/Post/PostLikedBy'
import {PostQuotesScreen} from '#/screens/Post/PostQuotes'
@@ -167,6 +168,14 @@ function commonScreens(Stack: typeof HomeTab, unreadCountLabel?: string) {
requireAuth: true,
}}
/>
+ ModerationVerificationSettings}
+ options={{
+ title: title(msg`Verification Settings`),
+ requireAuth: true,
+ }}
+ />
SettingsScreen}
diff --git a/src/components/AccountList.tsx b/src/components/AccountList.tsx
index 52d149eb5a..f2e781ccf9 100644
--- a/src/components/AccountList.tsx
+++ b/src/components/AccountList.tsx
@@ -1,6 +1,6 @@
import React, {useCallback} from 'react'
import {View} from 'react-native'
-import {AppBskyActorDefs} from '@atproto/api'
+import {type AppBskyActorDefs} from '@atproto/api'
import {msg, Trans} from '@lingui/macro'
import {useLingui} from '@lingui/react'
@@ -12,6 +12,8 @@ import {UserAvatar} from '#/view/com/util/UserAvatar'
import {atoms as a, useTheme} from '#/alf'
import {Check_Stroke2_Corner0_Rounded as Check} from '#/components/icons/Check'
import {ChevronRight_Stroke2_Corner0_Rounded as Chevron} from '#/components/icons/Chevron'
+import {useSimpleVerificationState} from '#/components/verification'
+import {VerificationCheck} from '#/components/verification/VerificationCheck'
import {Button} from './Button'
import {Text} from './Typography'
@@ -74,11 +76,13 @@ export function AccountList({
]}>
{otherLabel ?? Other account}
@@ -105,6 +109,7 @@ function AccountItem({
}) {
const t = useTheme()
const {_} = useLingui()
+ const verification = useSimpleVerificationState({profile})
const onPress = useCallback(() => {
onSelect(account)
@@ -114,7 +119,7 @@ function AccountItem({