diff --git a/.terraform-version b/.terraform-version
index 66beabb5795e7441046623a209a2c48f22e7d20a..db77e0ee9760ad2a1d6af56399723c47e18fcf18 100644
--- a/.terraform-version
+++ b/.terraform-version
@@ -1 +1 @@
-1.9.8
+1.10.5
diff --git a/apps/mobile/app.config.ts b/apps/mobile/app.config.ts
index f14b61a02a179731767b106380a1a123a819239f..a51bd731d2e1c3015f177155677429a26659e2c9 100644
--- a/apps/mobile/app.config.ts
+++ b/apps/mobile/app.config.ts
@@ -6,9 +6,9 @@ require('ts-node/register')
 // see https://docs.expo.dev/build-reference/app-versions/
 // TODO somehow automatically increment version numbers on every release
 const versions = {
-  version: '1.44.3', // user-facing value visible in stores
-  iosBuildNumber: '1.44.3', // developer-facing build version, see https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleversion
-  androidVersionCode: 132, // developer-facing build version, see https://developer.android.com/studio/publish/versioning.html#versioningsettings
+  version: '1.45.1', // user-facing value visible in stores
+  iosBuildNumber: '1.45.1', // developer-facing build version, see https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleversion
+  androidVersionCode: 134, // developer-facing build version, see https://developer.android.com/studio/publish/versioning.html#versioningsettings
 }
 
 // - Environment variables are available in the mobile app source code via the expo-constants package.
diff --git a/apps/mobile/eas.json b/apps/mobile/eas.json
index e87cc2e87472aeae9eabc2644325ef16adffed9b..f2dff5fb15b108b0a7db868fef0da6ef07792c46 100644
--- a/apps/mobile/eas.json
+++ b/apps/mobile/eas.json
@@ -113,7 +113,7 @@
     },
     "production": {
       "extends": "base",
-      "channel": "production-1-44",
+      "channel": "production-1-45",
       "env": {
         "APP_VARIANT": "production",
         "ENVIRONMENT_ID": "production",
diff --git a/apps/mobile/navigation/BottomTabsNavigator.tsx b/apps/mobile/navigation/BottomTabsNavigator.tsx
index 7d06271e938b37a5b85310d62afebc2c32fa98a1..4b00104606c18d185eb8529934b2000314be8313 100644
--- a/apps/mobile/navigation/BottomTabsNavigator.tsx
+++ b/apps/mobile/navigation/BottomTabsNavigator.tsx
@@ -44,7 +44,7 @@ const BottomTabs = createBottomTabNavigator<BottomTabsScreens>()
 const BottomTabLabel = ({ label, focused }: { label: string; focused: boolean }) => {
   return (
     <HoliBox padding={[0, 0, 4, 0]}>
-      <TextLink size="xs" variant={focused ? 'primary' : 'tertiary'}>
+      <TextLink size="xs" color={focused ? 'main' : 'default'}>
         {label}
       </TextLink>
     </HoliBox>
diff --git a/apps/web/components/navigation/FooterTabBar.tsx b/apps/web/components/navigation/FooterTabBar.tsx
index c4fb248e3b42ff07c9fabd9c8650a6c9401778e5..818cf8b9c206aa338a1e75f17b4567973130eedf 100644
--- a/apps/web/components/navigation/FooterTabBar.tsx
+++ b/apps/web/components/navigation/FooterTabBar.tsx
@@ -61,7 +61,7 @@ const FooterTabBar = () => {
         >
           <HoliIcon icon={isHome ? HomeSmile2Filled : HomeSmile2} color={unistyles.icon(isHome).color} />
           <HoliGap size="xs" />
-          <TextLink size="xs" variant={isHome ? 'primary' : 'tertiary'} role="none">
+          <TextLink size="xs" color={isHome ? 'main' : 'default'} role="none">
             {t('navigation.home')}
           </TextLink>
         </HoliButton>
@@ -76,7 +76,7 @@ const FooterTabBar = () => {
         >
           <HoliIcon icon={isSpaces ? SpacesFilled : Spaces} color={unistyles.icon(isSpaces).color} />
           <HoliGap size="xs" />
-          <TextLink size="xs" variant={isSpaces ? 'primary' : 'tertiary'} role="none">
+          <TextLink size="xs" color={isSpaces ? 'main' : 'default'} role="none">
             {t('navigation.organize')}
           </TextLink>
         </HoliButton>
@@ -91,7 +91,7 @@ const FooterTabBar = () => {
         >
           <HoliIcon icon={isAct ? MegaphoneFilled : Megaphone} color={unistyles.icon(isAct).color} />
           <HoliGap size="xs" />
-          <TextLink size="xs" variant={isAct ? 'primary' : 'tertiary'} role="none">
+          <TextLink size="xs" color={isAct ? 'main' : 'default'} role="none">
             {t('navigation.act')}
           </TextLink>
         </HoliButton>
@@ -106,14 +106,14 @@ const FooterTabBar = () => {
         >
           <ChatBottomTabsNavigatorItem focused={isChat} />
           <HoliGap size="xs" />
-          <TextLink size="xs" variant={isChat ? 'primary' : 'tertiary'} role="none">
+          <TextLink size="xs" color={isChat ? 'main' : 'default'} role="none">
             {t('navigation.chat')}
           </TextLink>
         </HoliButton>
 
         <LoginProfileButton focused={isProfileLoginRegistrationForgotPassword} style={styles.button}>
           <HoliGap size="xs" />
-          <TextLink size="xs" variant={isProfileLoginRegistrationForgotPassword ? 'primary' : 'tertiary'} role="none">
+          <TextLink size="xs" color={isProfileLoginRegistrationForgotPassword ? 'main' : 'default'} role="none">
             {isLoggedIn ? t('navigation.profile') : t('navigation.login')}
           </TextLink>
         </LoginProfileButton>
diff --git a/apps/web/pages/api/health.ts b/apps/web/pages/api/health.ts
new file mode 100644
index 0000000000000000000000000000000000000000..aa888b260918fd856a32a8e463e8923f19232675
--- /dev/null
+++ b/apps/web/pages/api/health.ts
@@ -0,0 +1,5 @@
+import type { NextApiRequest, NextApiResponse } from 'next'
+
+const handler = (_req: NextApiRequest, res: NextApiResponse) => res.status(200).json({ ok: true })
+
+export default handler
diff --git a/core/auth/components/RecoverPasswordCode.tsx b/core/auth/components/RecoverPasswordCode.tsx
index 47eec17bd31c2094ff273a1603f9d795967135f9..9a8350c2d51e3ed6ab866b3fd0c741b49326a863 100644
--- a/core/auth/components/RecoverPasswordCode.tsx
+++ b/core/auth/components/RecoverPasswordCode.tsx
@@ -141,7 +141,7 @@ const RecoverPasswordCode = ({ email, flow, webview }: RecoverPasswordCodeProps)
         />
 
         <HoliBox padding={[16, 0, 0, 0]}>
-          <TextLink onPress={resendEmail} size="sm" role="link">
+          <TextLink onPress={resendEmail} size="sm">
             {t('registration.emailVerification.resendEmail')}
           </TextLink>
         </HoliBox>
diff --git a/core/components/RecoSlider.tsx b/core/components/RecoSlider.tsx
index f80282bb531dbf3254bcb59969eaef386910d2fa..595c8657fd42f22b70698e5b2ed0b31f8c17e8b7 100644
--- a/core/components/RecoSlider.tsx
+++ b/core/components/RecoSlider.tsx
@@ -1,18 +1,19 @@
 import { Text, TextLink } from 'holi-bricks/components/text'
-import React, { useMemo } from 'react'
+import type React from 'react'
+import { useMemo } from 'react'
 import { useTranslation } from 'react-i18next'
-import { FlatList, GestureResponderEvent, ListRenderItem, StyleSheet, View } from 'react-native'
+import { FlatList, type GestureResponderEvent, type ListRenderItem, StyleSheet, View } from 'react-native'
 
 import useRouting from '@holi/core/navigation/hooks/useRouting'
 import TrackableFlatList from '@holi/core/tracking/TrackableFlatList'
-import { TrackableFlatListParams } from '@holi/core/tracking/TrackableFlatList.shared'
+import type { TrackableFlatListParams } from '@holi/core/tracking/TrackableFlatList.shared'
 import { HoliIcon } from '@holi/icons/src/HoliIcon'
-import { HoliIconType } from '@holi/icons/src/HoliIconType'
+import type { HoliIconType } from '@holi/icons/src/HoliIconType'
 import HoliContainer from '@holi/ui/components/atoms/HoliContainer'
 import HoliMoreCard from '@holi/ui/components/atoms/HoliMoreCard'
 import HoliButton from '@holi/ui/components/molecules/HoliButton'
 import { dimensions } from '@holi/ui/styles/globalVars'
-import { HoliTheme, useTheme } from '@holi/ui/styles/theme'
+import { type HoliTheme, useTheme } from '@holi/ui/styles/theme'
 
 type RecoSliderProps = {
   name: string
@@ -121,12 +122,16 @@ const RecoSlider: React.FC<RecoSliderProps> = ({
                 <Text size="xxl" headingLevel="3">
                   {heading}
                 </Text>
-                <Text size="sm" variant="secondary">
+                <Text size="sm" color="support">
                   {subline}
                 </Text>
               </View>
             </View>
-            {seeAllPath && <TextLink size="sm">{t('global.seeAll')}</TextLink>}
+            {seeAllPath && (
+              <TextLink size="sm" role="none">
+                {t('global.seeAll')}
+              </TextLink>
+            )}
           </View>
         </HoliButton>
 
diff --git a/core/components/TrackingConsentModal/TrackingGeneralContentDescription.tsx b/core/components/TrackingConsentModal/TrackingGeneralContentDescription.tsx
index fd987376c2efd07301ea3a8b85c9486e7c30ed95..30ba82f9e98882dfb9937b9c6796c9b774be6ba4 100644
--- a/core/components/TrackingConsentModal/TrackingGeneralContentDescription.tsx
+++ b/core/components/TrackingConsentModal/TrackingGeneralContentDescription.tsx
@@ -47,7 +47,7 @@ const TrackingGeneralContentDescription = ({ checkTextCountList = [1, 2, 3] }: P
     <>
       <Text size="md">
         <Trans t={t} i18nKey={'tracking.consentModal.general.description'}>
-          <TextLink size="md" onPress={show} role="link" />
+          <TextLink size="md" onPress={show} />
         </Trans>
       </Text>
 
diff --git a/core/i18n/locales/de.json b/core/i18n/locales/de.json
index 7e02fe0d987734bc6acf912a908217d409190b33..a633fbe013c48f975dcdc58662382067bc0993bc 100644
--- a/core/i18n/locales/de.json
+++ b/core/i18n/locales/de.json
@@ -817,7 +817,6 @@
   "search.section.users.loadMore": "Zeige alle Personen",
   "search.section.users.title": "Personen",
   "search.title": "Suche",
-  "search.typesense.facets.all": "All",
   "search.typesense.facets.profile": "Nutzer",
   "search.typesense.facets.space": "Spaces",
   "search.typesense.facets.volunteering": "Volunteering",
diff --git a/core/i18n/locales/en.json b/core/i18n/locales/en.json
index 4cde38309e674dd7f26b29f631a47728a8942b98..62f79815c87df9296c05d478a87462c2593f8354 100644
--- a/core/i18n/locales/en.json
+++ b/core/i18n/locales/en.json
@@ -816,7 +816,6 @@
   "search.section.users.loadMore": "See all people",
   "search.section.users.title": "People",
   "search.title": "Search",
-  "search.typesense.facets.all": "All",
   "search.typesense.facets.profile": "User",
   "search.typesense.facets.space": "Spaces",
   "search.typesense.facets.volunteering": "Volunteering",
diff --git a/core/navigation/components/HoliTextLink/index.tsx b/core/navigation/components/HoliTextLink/index.tsx
index f40dda2b61f5be18ff422b537ccb00010402b1f4..7d8e191ad9b574d3b587b994ba021cdbf1047288 100644
--- a/core/navigation/components/HoliTextLink/index.tsx
+++ b/core/navigation/components/HoliTextLink/index.tsx
@@ -2,7 +2,7 @@ import { TextLink } from 'holi-bricks/components/text'
 import type { PropsWithChildren } from 'react'
 import React from 'react'
 
-import { HoliTextLinkProps } from '@holi/core/navigation/components/HoliTextLink/types'
+import type { HoliTextLinkProps } from '@holi/core/navigation/components/HoliTextLink/types'
 import useLink from '@holi/core/navigation/hooks/useLink'
 
 export const HoliTextLink = ({
@@ -12,21 +12,14 @@ export const HoliTextLink = ({
   onPress,
   children,
   mobileNavigateBackFirst,
-  variant,
+  color,
   size,
   textAlign,
 }: PropsWithChildren<HoliTextLinkProps>) => {
   const handleLinkPress = useLink({ href, external, onPress, mobileNavigateBackFirst })
 
   return (
-    <TextLink
-      size={size}
-      variant={variant}
-      textAlign={textAlign}
-      onPress={handleLinkPress}
-      aria-label={label}
-      role="link"
-    >
+    <TextLink size={size} color={color} textAlign={textAlign} onPress={handleLinkPress} aria-label={label}>
       {children}
     </TextLink>
   )
diff --git a/core/navigation/components/HoliTextLink/index.web.tsx b/core/navigation/components/HoliTextLink/index.web.tsx
index 540b75a9e61424a945fc6fdc0ec7b5d065e8bd36..3d858988fbe2d2b89c806fcce792fde72d29927c 100644
--- a/core/navigation/components/HoliTextLink/index.web.tsx
+++ b/core/navigation/components/HoliTextLink/index.web.tsx
@@ -3,7 +3,7 @@ import type { PropsWithChildren } from 'react'
 import React from 'react'
 
 import { HoliLink } from '@holi/core/navigation/components/HoliLink'
-import { HoliTextLinkProps } from '@holi/core/navigation/components/HoliTextLink/types'
+import type { HoliTextLinkProps } from '@holi/core/navigation/components/HoliTextLink/types'
 
 export const HoliTextLink = ({
   href,
@@ -12,12 +12,12 @@ export const HoliTextLink = ({
   onPress,
   children,
   mobileNavigateBackFirst,
-  variant,
+  color,
   textAlign,
   size,
 }: PropsWithChildren<HoliTextLinkProps>) => {
   return (
-    <TextLink size={size} variant={variant} textAlign={textAlign}>
+    <TextLink size={size} color={color} textAlign={textAlign} role="none">
       <HoliLink
         href={href}
         label={label}
diff --git a/core/navigation/components/HoliTextLink/types.ts b/core/navigation/components/HoliTextLink/types.ts
index 135996b7390f4dad6571dc7590c86228b5fc2187..a45087e233418749c0e2b12f57329d4351bc337d 100644
--- a/core/navigation/components/HoliTextLink/types.ts
+++ b/core/navigation/components/HoliTextLink/types.ts
@@ -2,4 +2,4 @@ import { TextLinkProps } from 'holi-bricks/components/text'
 
 import { HoliLinkProps } from '@holi/core/navigation/components/HoliLink/types'
 
-export type HoliTextLinkProps = Omit<HoliLinkProps, 'testID'> & Pick<TextLinkProps, 'variant' | 'size' | 'textAlign'>
+export type HoliTextLinkProps = Omit<HoliLinkProps, 'testID'> & Pick<TextLinkProps, 'color' | 'size' | 'textAlign'>
diff --git a/core/screens/act/ActHome.tsx b/core/screens/act/ActHome.tsx
index 0c8079700579365bceb4099e757f459607b16b4e..e3714168b8b7e0fc8e2e2967a44f5fdec8cf377c 100644
--- a/core/screens/act/ActHome.tsx
+++ b/core/screens/act/ActHome.tsx
@@ -65,7 +65,7 @@ const ActHome = () => {
 
   return (
     <ScrollViewRefreshable style={styles.layout}>
-      <View style={styles.container}>
+      <View style={styles.container} testID="act-home">
         <AttendingChallengeEventsLegacy />
         {sections.map((sectionName) => (
           <ActSection type={sectionName} key={sectionName} />
diff --git a/core/screens/homeFeed/components/HomeFeedHeader.tsx b/core/screens/homeFeed/components/HomeFeedHeader.tsx
index 3991a5c4a420d0c135eda081da6c3b623a92f63d..bddd0e1e071f273af7937de9dcd41184ef0b6fc5 100644
--- a/core/screens/homeFeed/components/HomeFeedHeader.tsx
+++ b/core/screens/homeFeed/components/HomeFeedHeader.tsx
@@ -103,7 +103,7 @@ const HomeFeedHeader: React.FC = () => {
           />
         </Animated.View>
       </HoliBox>
-      <ProfileCompletionCard style={styles.container} />
+      <ProfileCompletionCard style={styles.container} page="home_feed" />
       {displayNewHomeFeed === 'test' && <AttendingChallengeEvents />}
     </View>
   )
diff --git a/core/screens/homeFeed/components/Recommendations.tsx b/core/screens/homeFeed/components/Recommendations.tsx
index 7148f36ad0c023a496efb64dfab5046ec2720b41..ed00a50239754d8c27bd67bf2b3c86fc90618258 100644
--- a/core/screens/homeFeed/components/Recommendations.tsx
+++ b/core/screens/homeFeed/components/Recommendations.tsx
@@ -37,7 +37,7 @@ const RecommendationsHeader = () => {
       </Text>
       <HoliGap size="xs" />
       {subtitle && (
-        <Text size="md" variant="secondary">
+        <Text size="md" color="support">
           {t(subtitle)}
         </Text>
       )}
diff --git a/core/screens/insights/CurationPrinciplesPage.tsx b/core/screens/insights/CurationPrinciplesPage.tsx
index 4d1a64722d756c93718836202d972e07af19c9f4..44ffb83eaa78ddcadc15fdadc6bca2d250a86f14 100644
--- a/core/screens/insights/CurationPrinciplesPage.tsx
+++ b/core/screens/insights/CurationPrinciplesPage.tsx
@@ -108,6 +108,57 @@ const CurationPrinciplesPage: React.FC = () => {
   })
   const authors = data?.insightAuthors?.data || []
 
+  const partners = [
+    {
+      name: 'kohero magazin',
+      url: 'https://www.kohero-magazin.de',
+      image: require('@holi/ui/assets/img/logo/partner_kohero.png'),
+      isSvg: false,
+      width: 110,
+      height: 36,
+    },
+    {
+      name: 'Perspective Daily',
+      url: 'https://perspective-daily.de/',
+      image: require('@holi/ui/assets/img/logo/partner_perspectiveDaily.png'),
+      isSvg: false,
+      width: 110,
+      height: 36,
+    },
+    {
+      name: 'Klimareporter',
+      url: 'https://www.klimareporter.de/',
+      image: require('@holi/ui/assets/img/logo/partner_klimareporter.png'),
+      isSvg: false,
+      width: 110,
+      height: 36,
+    },
+    {
+      name: 'andererseits',
+      url: 'https://andererseits.org',
+      image: require('@holi/ui/assets/img/logo/partner_andererseits.svg'),
+      isSvg: true,
+      width: 110,
+      height: 36,
+    },
+    {
+      name: 'Salon 5',
+      url: 'https://www.instagram.com/salon5_',
+      image: require('@holi/ui/assets/img/logo/partner_salon5.png'),
+      isSvg: false,
+      width: 110,
+      height: 36,
+    },
+    {
+      name: 'veto Magazin',
+      url: 'https://veto-mag.de/',
+      image: require('@holi/ui/assets/img/logo/partner_vetoMagazin.png'),
+      isSvg: false,
+      width: 110,
+      height: 36,
+    },
+  ]
+
   useIsomorphicLayoutEffect(() => {
     setScreenOptions({
       headerBackTitleVisible: true,
@@ -197,55 +248,18 @@ const CurationPrinciplesPage: React.FC = () => {
             >
               {t('insights.curationPrinciples.partners.heading')}
             </HoliHeading>
-            <View
-              style={{
-                flexDirection: 'row',
-                alignItems: 'center',
-                justifyContent: 'center',
-                gap: Spacing.xs,
-                flexWrap: 'wrap',
-                flex: 1,
-              }}
-            >
-              <Pressable style={styles.partner} onPress={() => Linking.openURL('https://www.kohero-magazin.de')}>
-                <HoliLocalImage
-                  imageSource={require('@holi/ui/assets/img/logo/partner_kohero.png')}
-                  resizeMode="contain"
-                  label="kohero magazin"
-                  width={110}
-                  height={36}
-                />
-              </Pressable>
-              <Pressable style={styles.partner} onPress={() => Linking.openURL('https://piqd.de')}>
-                <HoliLocalImage
-                  imageSource={require('@holi/ui/assets/img/logo/partner_piqd.svg')}
-                  resizeMode="contain"
-                  label="piqd"
-                  width={64}
-                  height={36}
-                  isSvg
-                />
-              </Pressable>
-              <Pressable style={styles.partner} onPress={() => Linking.openURL('https://medwatch.de')}>
-                <HoliLocalImage
-                  imageSource={require('@holi/ui/assets/img/logo/partner_medwatch.svg')}
-                  resizeMode="contain"
-                  label="MEDWATCH"
-                  width={106}
-                  height={36}
-                  isSvg
-                />
-              </Pressable>
-              <Pressable style={styles.partner} onPress={() => Linking.openURL('https://andererseits.org')}>
-                <HoliLocalImage
-                  imageSource={require('@holi/ui/assets/img/logo/partner_andererseits.svg')}
-                  resizeMode="contain"
-                  label="andererseits"
-                  width={136}
-                  height={36}
-                  isSvg
-                />
-              </Pressable>
+            <View style={styles.partners}>
+              {partners.map((partner) => (
+                <Pressable key={partner.name} style={styles.partner} onPress={() => Linking.openURL(partner.url)}>
+                  <HoliLocalImage
+                    imageSource={partner.image}
+                    resizeMode="contain"
+                    label={partner.name}
+                    width={partner.width}
+                    height={partner.height}
+                  />
+                </Pressable>
+              ))}
             </View>
           </View>
         </View>
@@ -355,6 +369,15 @@ const getStyles = (theme: HoliTheme, isWideLayout: boolean) =>
       borderRadius: 8,
       height: 52,
     },
+
+    partners: {
+      flexDirection: 'row',
+      alignItems: 'center',
+      justifyContent: 'center',
+      gap: Spacing.xs,
+      flexWrap: 'wrap',
+      flex: 1,
+    },
   })
 
 export default memo(CurationPrinciplesPage)
diff --git a/core/screens/insights/InsightDetailPage.tsx b/core/screens/insights/InsightDetailPage.tsx
index eec278d27511fa3cad62c78d641c0179807aca27..5e0ba0e06638acb611bdfbc814df993f534c7f50 100644
--- a/core/screens/insights/InsightDetailPage.tsx
+++ b/core/screens/insights/InsightDetailPage.tsx
@@ -52,7 +52,6 @@ import { Avatar } from 'holi-bricks/components/avatar'
 import { Button } from 'holi-bricks/components/button'
 import HeaderBackButton from '@holi/core/navigation/components/HeaderBackButton'
 import { ScrollViewRefreshable } from '@holi/core/helpers/withRefreshControl'
-import GradientBackground from '@holi/core/components/HeaderAnimated/GradientBackground'
 
 export type InsightDetailPageParams = {
   insightId: string
@@ -85,7 +84,10 @@ const InsightDetailPage = () => {
       if (isNotFoundError(error) || error.message.includes('badly formed hexadecimal UUID string')) {
         return replaceRoute('/404')
       }
-      logError(error, 'Failed to load insight', { location: 'InsightDetailPage.insightById', insightId })
+      logError(error, 'Failed to load insight', {
+        location: 'InsightDetailPage.insightById',
+        insightId,
+      })
     },
   })
   const setScreenOptions = useSetScreenOptions()
@@ -94,16 +96,19 @@ const InsightDetailPage = () => {
 
   useIsomorphicLayoutEffect(() => {
     setScreenOptions({
-      headerTintColor: colors.light,
-      title: '',
-      headerTransparent: true,
-      headerLeft: () => <HeaderBackButton tintColor={colors.light} />,
-      headerBackground: () => <GradientBackground colors={[colors.dark, 'transparent']} />,
-      headerRight: () => {
+      ...Platform.select({
+        native: {
+          headerTintColor: colors.light,
+          title: '',
+          headerTransparent: true,
+        },
+      }),
+      headerLeft: ({ tintColor }) => <HeaderBackButton tintColor={tintColor} />,
+      headerRight: ({ tintColor }) => {
         return (
           insight && (
             <InsightDrawer insight={insight}>
-              <HoliIcon icon={MoreFilled} color={colors.light} />
+              <HoliIcon icon={MoreFilled} color={tintColor} />
             </InsightDrawer>
           )
         )
@@ -118,7 +123,9 @@ const InsightDetailPage = () => {
   const quotes: Quote[] = insight?.quotes || []
   const initiatives: Initiative[] = insight?.initiatives || []
   const creator = insight?.creator
-  const initiativesTitle = t('insights.initiatives.title', { name: creator?.firstName })
+  const initiativesTitle = t('insights.initiatives.title', {
+    name: creator?.firstName,
+  })
   const cardWidth = 330
   const currentLanguage = getLocale(i18n.language || '')
 
@@ -219,7 +226,7 @@ const InsightDetailPage = () => {
       />
       <StatusBar style="light" animated />
 
-      <ScrollViewRefreshable style={styles.wrapper}>
+      <ScrollViewRefreshable style={styles.wrapper} contentContainerStyle={styles.contentContainer}>
         {insight && !loading ? (
           <>
             <HoliImageBackground
@@ -273,7 +280,9 @@ const InsightDetailPage = () => {
                   </View>
 
                   <HoliModal
-                    label={t('user.cards.modal.showInfo', { name: creator.fullName })}
+                    label={t('user.cards.modal.showInfo', {
+                      name: creator.fullName,
+                    })}
                     shown={curatorModalShown}
                     onDismiss={() => setCuratorModalShown(false)}
                     style={{ backgroundColor: colors.background30 }}
@@ -459,6 +468,11 @@ const getStyles = (theme: HoliTheme, screenWidth: number) =>
     wrapper: {
       backgroundColor: theme.colors.background20,
     },
+    contentContainer: {
+      alignSelf: 'center',
+      width: '100%',
+      maxWidth: dimensions.breakpointL - 128,
+    },
     bannerImage: {
       paddingHorizontal: 0,
       height: Platform.OS === 'web' ? 680 : 340,
@@ -534,12 +548,16 @@ const getStyles = (theme: HoliTheme, screenWidth: number) =>
       flexDirection: 'row',
       alignItems: 'center',
       gap: Spacing['3xs'],
-      ...(screenWidth < dimensions.breakpointL && { paddingHorizontal: Spacing.xs }),
+      ...(screenWidth < dimensions.breakpointL && {
+        paddingHorizontal: Spacing.xs,
+      }),
       maxWidth: '95%',
     },
     posts: {
       marginBottom: 20,
-      ...(screenWidth < dimensions.breakpointL && { paddingHorizontal: Spacing.xs }),
+      ...(screenWidth < dimensions.breakpointL && {
+        paddingHorizontal: Spacing.xs,
+      }),
     },
     pollContainer: {
       marginBottom: 0,
@@ -612,4 +630,6 @@ const getStyles = (theme: HoliTheme, screenWidth: number) =>
     },
   })
 
-export default withProfiler(memo(InsightDetailPage), { name: 'InsightDetailPage' })
+export default withProfiler(memo(InsightDetailPage), {
+  name: 'InsightDetailPage',
+})
diff --git a/core/screens/notifications/components/NotificationConnectionItem.tsx b/core/screens/notifications/components/NotificationConnectionItem.tsx
index b9e8ea3c6c420e95d60c33fed85e11c062e257fe..bab9d4c9d7349497d748043cfb17f1295cd39502 100644
--- a/core/screens/notifications/components/NotificationConnectionItem.tsx
+++ b/core/screens/notifications/components/NotificationConnectionItem.tsx
@@ -73,6 +73,18 @@ const NotificationConnectionItem: React.FC<NotificationProps<NotificationConnect
     }
   }
 
+  const onAccept = async () => {
+    await connect(userId)
+    setConnectionAccepted(true)
+    track(TrackingEvent.UserConnectionAccepted(userId, loggedInUser!.id))
+  }
+
+  const onReject = async () => {
+    await disconnect(userId)
+    setConnectionAccepted(false)
+    track(TrackingEvent.UserConnectionRejected(userId, loggedInUser!.id))
+  }
+
   const buttons = [
     <Button
       inline
@@ -80,12 +92,7 @@ const NotificationConnectionItem: React.FC<NotificationProps<NotificationConnect
       variant="secondary"
       size="sm"
       label={t('notifications.connection.ignore')}
-      onPress={() =>
-        disconnect(userId).then(() => {
-          setConnectionAccepted(false)
-          track(TrackingEvent.UserConnectionRejected(userId, loggedInUser!.id))
-        })
-      }
+      onPress={onReject}
       disabled={loading}
       testID="ignore-connection-request-button"
     />,
@@ -95,12 +102,7 @@ const NotificationConnectionItem: React.FC<NotificationProps<NotificationConnect
       variant="primary"
       size="sm"
       label={t('notifications.connection.accept')}
-      onPress={() => {
-        connect(userId).then(() => {
-          setConnectionAccepted(true)
-          track(TrackingEvent.UserConnectionAccepted(userId, loggedInUser!.id))
-        })
-      }}
+      onPress={onAccept}
       disabled={loading}
       testID="accept-connection-request-button"
     />,
diff --git a/core/screens/notifications/components/NotificationSettingsList.tsx b/core/screens/notifications/components/NotificationSettingsList.tsx
index 4407abf4f690132c2c1980c77ebedc696f33a60d..953eb2d7d0cf161faad77727b3ba6bec203ada04 100644
--- a/core/screens/notifications/components/NotificationSettingsList.tsx
+++ b/core/screens/notifications/components/NotificationSettingsList.tsx
@@ -25,6 +25,8 @@ import HoliLoader from '@holi/ui/components/molecules/HoliLoader'
 import HoliRoundedSection from '@holi/ui/components/molecules/HoliRoundedSection'
 import Spacing from '@holi/ui/foundations/Spacing'
 import { HoliTheme, useTheme } from '@holi/ui/styles/theme'
+import useTracking from '@holi/core/tracking/hooks/useTracking'
+import { TrackingEvent } from '@holi/core/tracking'
 
 const CATEGORY_ILLUSTRATIONS = {
   GLOBAL: require('@holi/ui/assets/img/illustrations/illustration_bell.svg'),
@@ -144,19 +146,28 @@ const WorkflowSettings = ({
   const { t } = useTranslation()
   const { theme } = useTheme()
   const styles = useMemo(() => getStyles(theme), [theme])
+  const { track } = useTracking()
+
+  const workflowName = t(`profile.settings.notifications.workflow.${workflow.id}`)
+
+  const onSelect = (channel: Channel, checked: boolean) => {
+    track(TrackingEvent.NotificationPreferenceChanged(workflow.id, workflowName, channel, checked))
+
+    updatePreference(workflow.id, channel, checked)
+  }
 
   return (
     <View style={[styles.row, style]} testID={workflow.id}>
       <HoliColumns>
         <SettingsNameColumn>
-          <HoliText>{t(`profile.settings.notifications.workflow.${workflow.id}`)}</HoliText>
+          <HoliText>{workflowName}</HoliText>
         </SettingsNameColumn>
         <SettingsCheckBoxColumn>
           {workflow.preferences.push !== null && (
             <HoliCheckbox
               checked={workflow.preferences.push}
               aria-label={t('profile.settings.notifications.channel.push')}
-              onSelect={(checked) => updatePreference(workflow.id, Channel.PUSH, checked)}
+              onSelect={(checked) => onSelect(Channel.PUSH, checked)}
               testID="push"
             />
           )}
@@ -166,7 +177,7 @@ const WorkflowSettings = ({
             <HoliCheckbox
               checked={workflow.preferences.email}
               aria-label={t('profile.settings.notifications.channel.email')}
-              onSelect={(checked) => updatePreference(workflow.id, Channel.EMAIL, checked)}
+              onSelect={(checked) => onSelect(Channel.EMAIL, checked)}
               testID="email"
             />
           )}
diff --git a/core/screens/notifications/queries.ts b/core/screens/notifications/queries.ts
index 21e6863bc3134dc7a3905a49ab901ac77b0ca37e..43e812a21ac9f16827b5b9b26fe2427e27ca6093 100644
--- a/core/screens/notifications/queries.ts
+++ b/core/screens/notifications/queries.ts
@@ -1,8 +1,8 @@
 import { gql } from '@apollo/client/core'
 
 import { UserAvatarFragment } from '@holi/core/domain/shared/queries'
-import { Notification } from '@holi/core/screens/notifications/components/types'
-import { Paged } from '@holi/core/types'
+import type { Notification } from '@holi/core/screens/notifications/components/types'
+import type { Paged } from '@holi/core/types'
 
 export type NumberOfItems = {
   numberOfItems: number
@@ -44,6 +44,7 @@ export const notificationsQuery = gql`
           space {
             id
             title
+            name
             avatar
             avatarDefaultColor
           }
diff --git a/core/screens/onboarding/components/ImprintFooter.tsx b/core/screens/onboarding/components/ImprintFooter.tsx
index 908140d04216ee84eec9c6ab132f9e2d127d5a4d..9d0d6fb96228e16d7ab22a48711edf511215e4fb 100644
--- a/core/screens/onboarding/components/ImprintFooter.tsx
+++ b/core/screens/onboarding/components/ImprintFooter.tsx
@@ -21,7 +21,7 @@ export const ImprintFooter = ({ legalDocPath, showDocModal }: ImprintFooterProps
       }}
       href={`${legalDocPath}?type=imprint`}
       size="xs"
-      variant="secondary"
+      color="support"
       textAlign="center"
     >
       {t('profile.loggedOut.footer.imprint')}
diff --git a/core/screens/onboarding/components/OnboardingFinishModal.tsx b/core/screens/onboarding/components/OnboardingFinishModal.tsx
index 242bddc5ba62d2bbf4cb4a105730514a74185b9d..2238a37f5132545f2703b2d534f49f2dac52ae56 100644
--- a/core/screens/onboarding/components/OnboardingFinishModal.tsx
+++ b/core/screens/onboarding/components/OnboardingFinishModal.tsx
@@ -60,7 +60,7 @@ export const OnboardingFinishModal = ({ testID = 'community-guidelines-modal' }:
           </Text>
 
           <HoliBox padding={[Spacing.md, 0]}>
-            <Text size="md" variant="secondary">
+            <Text size="md" color="support">
               {t('onboarding.communityGuidelines.description')}
             </Text>
 
@@ -75,7 +75,7 @@ export const OnboardingFinishModal = ({ testID = 'community-guidelines-modal' }:
             </View>
           </HoliBox>
 
-          <Text size="md" variant="secondary">
+          <Text size="md" color="support">
             <Trans t={t} i18nKey={'onboarding.communityGuidelines.readDocument'}>
               <HoliTextLink
                 label={t('onboarding.communityGuidelines.term')}
diff --git a/core/screens/onboarding/helpers/__tests__/getRouteForContentType.test.ts b/core/screens/onboarding/helpers/__tests__/getRouteForContentType.test.ts
index a142fa25a9797bc5f5870401263ff62f88594108..86e92d413f62cc53b46ae470e14cd32f98fe0c4c 100644
--- a/core/screens/onboarding/helpers/__tests__/getRouteForContentType.test.ts
+++ b/core/screens/onboarding/helpers/__tests__/getRouteForContentType.test.ts
@@ -7,12 +7,13 @@ describe('getRouteForContentType', () => {
     { contentType: 'VOLUNTEERING', expectedRoute: '/act?section=VOLUNTEERING' },
     { contentType: 'SPACES', expectedRoute: '/spaces?tab=discover' },
     { contentType: 'POSTS', expectedRoute: '/' },
-    { contentType: 'invalid', expectedRoute: '/' },
+    { contentType: 'invalid', expectedRoute: '/act' },
+    { contentType: null, expectedRoute: '/act' },
   ]
   it.each(testCases)(
     'should create route $expectedRoute for content type $contentType',
     async ({ contentType, expectedRoute }) => {
-      const route = getRouteForContentType(contentType as ContentValue)
+      const route = getRouteForContentType(contentType as ContentValue | null)
 
       expect(route).toEqual(expectedRoute)
     }
diff --git a/core/screens/onboarding/helpers/getRouteForContentType.ts b/core/screens/onboarding/helpers/getRouteForContentType.ts
index 91b6aff48bbd8b9e2d333ce9d26ef3d5e457c59d..8faebbf0b5e46df215d33a2ebdb0f1e34924bdfa 100644
--- a/core/screens/onboarding/helpers/getRouteForContentType.ts
+++ b/core/screens/onboarding/helpers/getRouteForContentType.ts
@@ -10,7 +10,8 @@ export const getRouteForContentType = (selectedContentType?: ContentValue | null
     case 'SPACES':
       return '/spaces?tab=discover'
     case 'POSTS':
-    default:
       return '/'
+    default:
+      return '/act'
   }
 }
diff --git a/core/screens/onboarding/steps/CreateAccount.tsx b/core/screens/onboarding/steps/CreateAccount.tsx
index 51d7b988a9f05915915b16b5b8e0c0145efb564f..71839d40b4f18e95a11cc561e98677121bf67203 100644
--- a/core/screens/onboarding/steps/CreateAccount.tsx
+++ b/core/screens/onboarding/steps/CreateAccount.tsx
@@ -160,7 +160,7 @@ export const CreateAccount = ({
         />
 
         <HoliGap size="xxs" />
-        <Text size="xs" variant="secondary" textAlign="center">
+        <Text size="xs" color="support" textAlign="center">
           {t('auth.loginProtection.continueAsGuest.warning')}
         </Text>
         <HoliGap size="m" />
diff --git a/core/screens/onboarding/steps/EmailVerification.tsx b/core/screens/onboarding/steps/EmailVerification.tsx
index b9a16e837a768ebbe3dd64aefc5409a6f8e75543..72c64169b9a1fce5463e8cff1013c5e7bf0f2eaa 100644
--- a/core/screens/onboarding/steps/EmailVerification.tsx
+++ b/core/screens/onboarding/steps/EmailVerification.tsx
@@ -201,12 +201,7 @@ export const EmailVerification = ({
       />
 
       <HoliBox padding={[16, 0, 0, 0]}>
-        <TextLinkTracked
-          onPress={resendEmail}
-          size="sm"
-          trackingEvent={TrackingEvent.Auth.ResendEmailButtonPressed}
-          role="link"
-        >
+        <TextLinkTracked onPress={resendEmail} size="sm" trackingEvent={TrackingEvent.Auth.ResendEmailButtonPressed}>
           {t('registration.emailVerification.resendEmail')}
         </TextLinkTracked>
       </HoliBox>
diff --git a/core/screens/onboarding/steps/NamesSelection.tsx b/core/screens/onboarding/steps/NamesSelection.tsx
index d0b3e4f36a11ca6be247a95178c7d13cae4a5201..03946781cde681790412eb44e5f0b08ce86cde0e 100644
--- a/core/screens/onboarding/steps/NamesSelection.tsx
+++ b/core/screens/onboarding/steps/NamesSelection.tsx
@@ -102,7 +102,7 @@ export const NamesSelection = ({ userData, onFinish, testID = 'name-selection' }
           testID={`${testID}-pronouns`}
         />
         <HoliGap size="xxs" />
-        <Text size="xs" variant="secondary">
+        <Text size="xs" color="support">
           {t('user.profileForm.pronounsHint')}
         </Text>
       </View>
diff --git a/core/screens/report/CreateReport.tsx b/core/screens/report/CreateReport.tsx
index 932bed7d7ba99f0a7f2f3ae898c2568a3de4f770..24397e34913d76a6853be0571339a2a73aa25c9e 100644
--- a/core/screens/report/CreateReport.tsx
+++ b/core/screens/report/CreateReport.tsx
@@ -142,7 +142,7 @@ const CreateReport = () => {
                 >
                   <View style={styles.reasonTextContainer}>
                     <Text size="lg">{t(`report.reason.${reason}.title`)}</Text>
-                    <Text size="sm" variant="secondary">
+                    <Text size="sm" color="support">
                       {t(`report.reason.${reason}.description`)}
                     </Text>
                   </View>
@@ -167,7 +167,7 @@ const CreateReport = () => {
                   subject: t(`report.reason.${selectedReason}.title`).toLowerCase(),
                 })}
               </Text>
-              <Text size="sm" variant="secondary">
+              <Text size="sm" color="support">
                 {t(`report.reason.${selectedReason}.description`)}
               </Text>
             </View>
@@ -186,7 +186,7 @@ const CreateReport = () => {
                 />
               </View>
               {showTermsError && (
-                <Text size="sm" variant="error">
+                <Text size="sm" color="danger">
                   {t('report.details.termsError')}
                 </Text>
               )}
diff --git a/core/screens/search/typesense/Search.tsx b/core/screens/search/typesense/Search.tsx
index 1df88a5ee9313bd304b1a1eedd7758127b667d3e..2862a433672e099d58ee3be594bede2cc6cabcdb 100644
--- a/core/screens/search/typesense/Search.tsx
+++ b/core/screens/search/typesense/Search.tsx
@@ -19,6 +19,7 @@ import { useTranslation } from 'react-i18next'
 import { InstantSearch } from 'react-instantsearch-core'
 import { Dimensions, Platform, View } from 'react-native'
 import TypesenseInstantSearchAdapter from 'typesense-instantsearch-adapter'
+import ErrorBoundary from '@holi/core/errors/components/ErrorBoundary'
 
 export type SearchParams = {
   query?: string
@@ -59,7 +60,7 @@ export const Search = () => {
   const typesenseInstantSearchAdapter = useMemo(createTypesenseInstantSearchAdapter, [])
   const [initialQuery] = useParam('query', singleParamConfig)
   const [initialFacet] = useParam('facet', singleParamConfig)
-  const updateParams = useUpdateParams()
+  const updateParams = useUpdateParams({ web: { replace: true } })
 
   return (
     <InstantSearch searchClient={typesenseInstantSearchAdapter.searchClient} indexName={typesenseCollection}>
@@ -88,7 +89,9 @@ export const Search = () => {
         }}
         keyboardVerticalOffset={0}
       >
-        <SearchHitInfiniteList />
+        <ErrorBoundary>
+          <SearchHitInfiniteList />
+        </ErrorBoundary>
       </Screen>
     </InstantSearch>
   )
diff --git a/core/screens/search/typesense/SearchFacetsChips.tsx b/core/screens/search/typesense/SearchFacetsChips.tsx
index a4da0d3c7b5610fc5425edc88a2911982bb88e26..386e697a3eec1c3e602611bae25d34fefeb978f4 100644
--- a/core/screens/search/typesense/SearchFacetsChips.tsx
+++ b/core/screens/search/typesense/SearchFacetsChips.tsx
@@ -1,20 +1,24 @@
 import { dimensions } from '@holi/ui/styles/globalVars'
-import { Selector } from 'holi-bricks/components/selectors'
-import { SelectableChip } from 'holi-bricks/components/selectors/Selectable'
 import { useStyles } from 'holi-bricks/hooks'
 import { createStyleSheet } from 'holi-bricks/utils'
 import React, { useEffect } from 'react'
 import { useTranslation } from 'react-i18next'
 import { useClearRefinements, useRefinementList } from 'react-instantsearch-core'
 import { ScrollView, View } from 'react-native'
-
-const KEY_ALL = 'all'
+import { Selector } from 'holi-bricks/components/selectors'
+import { SelectableChip } from 'holi-bricks/components/selectors/Selectable'
 
 interface SearchFacetsChipsProps {
   initialFacet?: string
   onFacetChange?: (filter?: string) => void
 }
 
+const FACET_ORDERING_POSITIONS = new Map([
+  ['volunteering', 1],
+  ['space', 2],
+  ['profile', 3],
+])
+
 export const SearchFacetsChips = ({ initialFacet, onFacetChange }: SearchFacetsChipsProps) => {
   const { styles } = useStyles(stylesheet)
   const { t } = useTranslation()
@@ -24,25 +28,28 @@ export const SearchFacetsChips = ({ initialFacet, onFacetChange }: SearchFacetsC
     sortBy: ['count'],
   })
 
-  const initiallySelectedOptions = [initialFacet ? initialFacet : KEY_ALL]
-  const selected = items.filter((item) => item.isRefined).map((item) => item.value)
+  const initiallySelectedOptions = [initialFacet ? initialFacet : 'volunteering']
+
+  const refinedItems = items.filter((item) => item.isRefined).map((item) => item.value)
   const onSelect = (value: string) => {
-    const wasSelected = selected.includes(value)
-    clearRefinement()
-    if (value !== KEY_ALL && !wasSelected) {
-      refine(value)
+    if (refinedItems.includes(value)) {
+      return
     }
-    onFacetChange?.(value === KEY_ALL ? undefined : value)
+    clearRefinement()
+    refine(value)
+    onFacetChange?.(value)
   }
 
   useEffect(() => {
-    if (initialFacet) {
-      onSelect(initialFacet)
-    }
+    onSelect(initiallySelectedOptions[0])
     // Only trigger on initial render
     // eslint-disable-next-line react-hooks/exhaustive-deps
   }, [])
 
+  const orderedItems = items
+    .map((item) => ({ item, pos: FACET_ORDERING_POSITIONS.get(item.value) || Number.MAX_SAFE_INTEGER }))
+    .sort((a, b) => a.pos - b.pos)
+
   return (
     <ScrollView
       horizontal={true}
@@ -51,16 +58,7 @@ export const SearchFacetsChips = ({ initialFacet, onFacetChange }: SearchFacetsC
     >
       <Selector onSelect={onSelect} initiallySelectedOptions={initiallySelectedOptions} inputType="radio">
         <View style={styles.layout}>
-          <SelectableChip
-            id={KEY_ALL}
-            color="white"
-            size="md"
-            selected={!selected.length}
-            aria-label={t('search.typesense.facets.all')}
-          >
-            {t('search.typesense.facets.all')}
-          </SelectableChip>
-          {items.map((item) => {
+          {orderedItems.map(({ item }) => {
             const label = t(`search.typesense.facets.${item.label}`)
             return (
               <SelectableChip
@@ -71,7 +69,7 @@ export const SearchFacetsChips = ({ initialFacet, onFacetChange }: SearchFacetsC
                 aria-label={label}
                 testID={`facet-${item.value}`}
               >
-                {`${label} ยท ${item.count}`}
+                {label}
               </SelectableChip>
             )
           })}
diff --git a/core/screens/search/typesense/SearchHit.tsx b/core/screens/search/typesense/SearchHit.tsx
index 2da03b7da1838331fae1ad07e01ce00f55260a0f..75bd8e5dcf0b38400cac973a46ce816a28217a32 100644
--- a/core/screens/search/typesense/SearchHit.tsx
+++ b/core/screens/search/typesense/SearchHit.tsx
@@ -46,16 +46,16 @@ export const SearchHit = Trackable<SearchHitProps>(({ hit, onPress }: SearchHitP
         />
         <View style={styles.hitItemContent}>
           <View style={styles.hitItemTags}>
-            <Text size={'xs'} variant={'secondary'}>
+            <Text size={'xs'} color="support">
               {t(`search.typesense.hit.type.${hit.type}`)}
             </Text>
             {hit.location && (
               <>
-                <Text size={'xs'} variant={'secondary'}>
+                <Text size={'xs'} color="support">
                   &middot;
                 </Text>
                 <View style={styles.hitLocation}>
-                  <Text size={'xs'} variant={'secondary'} numberOfLines={1}>
+                  <Text size={'xs'} color="support" numberOfLines={1}>
                     {hit.location}
                   </Text>
                 </View>
diff --git a/core/screens/search/typesense/__tests__/SearchFacetsChips.test.tsx b/core/screens/search/typesense/__tests__/SearchFacetsChips.test.tsx
index f9a480561c3e7effc5f8c34b6eb5a3f9d5486515..199e521545e516d974f08c98bde6da5b41e724b1 100644
--- a/core/screens/search/typesense/__tests__/SearchFacetsChips.test.tsx
+++ b/core/screens/search/typesense/__tests__/SearchFacetsChips.test.tsx
@@ -14,14 +14,14 @@ jest.mock('react-instantsearch-core', () => ({
 
 describe('SearchFacetsChips', () => {
   const clearRefinement = jest.fn()
-  const refine = jest.fn()
+  const mockRefine = jest.fn()
 
   const mockRefinementList = ({ items = facets }: Partial<ReturnType<typeof useRefinementList>> = {}) => {
     mockUseRefinementList.mockReturnValue({
       items,
       hasExhaustiveItems: false,
       createURL: jest.fn(),
-      refine,
+      refine: mockRefine,
       sendEvent: jest.fn(),
       searchForItems: jest.fn(),
       isFromSearch: false,
@@ -45,7 +45,7 @@ describe('SearchFacetsChips', () => {
   it('should render available facets', async () => {
     render(<SearchFacetsChips />)
 
-    const expectedLabels = ['all'].concat(facets.map((facet) => facet.label))
+    const expectedLabels = facets.map((facet) => facet.label)
     expectedLabels.forEach((label: string) => {
       expect(screen.getByLabelText(`search.typesense.facets.${label}`)).toBeOnTheScreen()
     })
@@ -58,7 +58,7 @@ describe('SearchFacetsChips', () => {
 
     await user.press(screen.getByLabelText('search.typesense.facets.profile'))
 
-    expect(refine).toHaveBeenCalledWith('profile')
+    expect(mockRefine).toHaveBeenCalledWith('profile')
   })
 
   it('should clear previous refinement on facet press', async () => {
@@ -82,37 +82,21 @@ describe('SearchFacetsChips', () => {
     expect(onFacetChange).toHaveBeenCalledWith('profile')
   })
 
-  it('should toggle refinement on already selected facet press', async () => {
+  it('should NOT toggle refinement on already selected facet press', async () => {
     const user = userEvent.setup()
 
-    render(<SearchFacetsChips />)
-
-    await user.press(screen.getByLabelText('search.typesense.facets.space'))
-
-    expect(refine).not.toHaveBeenCalled()
-    expect(clearRefinement).toHaveBeenCalled()
-  })
-
-  it('should clear refinment but not refine search when facet "all" is pressed', async () => {
-    const user = userEvent.setup()
-
-    render(<SearchFacetsChips />)
-
-    await user.press(screen.getByLabelText('search.typesense.facets.all'))
-
-    expect(refine).not.toHaveBeenCalled()
-    expect(clearRefinement).toHaveBeenCalled()
-  })
+    render(<SearchFacetsChips initialFacet="space" />)
 
-  it('should call facet change callback with undefined when facet "all" is pressed', async () => {
-    const onFacetChange = jest.fn()
-    const user = userEvent.setup()
+    // Space is initally selected (in the mocked facet state)
+    const chip = screen.getByLabelText('search.typesense.facets.space')
+    expect(chip).toHaveAccessibilityState({ checked: true })
 
-    render(<SearchFacetsChips onFacetChange={onFacetChange} />)
+    mockRefine.mockReset()
 
-    await user.press(screen.getByLabelText('search.typesense.facets.all'))
+    await user.press(screen.getByLabelText('search.typesense.facets.space'))
 
-    expect(onFacetChange).toHaveBeenCalledWith(undefined)
+    expect(mockRefine).not.toHaveBeenCalled()
+    expect(clearRefinement).not.toHaveBeenCalled()
   })
 
   it('applies initial selection', async () => {
@@ -121,4 +105,39 @@ describe('SearchFacetsChips', () => {
     const chip = screen.getByLabelText('search.typesense.facets.space')
     expect(chip).toHaveAccessibilityState({ checked: true })
   })
+
+  it('should select volunteering if no initial facet selection is given', async () => {
+    render(<SearchFacetsChips />)
+
+    expect(mockRefine).toHaveBeenCalledWith('volunteering')
+  })
+
+  it('should order facets in a stable way', async () => {
+    const validateOrder = (expectedOrder: string[]) => {
+      const labels = screen
+        .getAllByLabelText(/^search\.typesense\.facets\.[^.]+$/)
+        .map((facet) => facet.props.accessibilityLabel)
+      expect(labels).toEqual(expectedOrder)
+    }
+
+    // order should always be [volunteering, spaces, profiles], no matter which order is returned by Typesense
+    const { rerender } = render(<SearchFacetsChips />)
+    validateOrder([
+      'search.typesense.facets.volunteering',
+      'search.typesense.facets.space',
+      'search.typesense.facets.profile',
+    ])
+
+    mockRefinementList({ items: facets.reverse() })
+    rerender(<SearchFacetsChips />)
+    validateOrder([
+      'search.typesense.facets.volunteering',
+      'search.typesense.facets.space',
+      'search.typesense.facets.profile',
+    ])
+
+    mockRefinementList({ items: [facets[2], facets[0]] })
+    rerender(<SearchFacetsChips />)
+    validateOrder(['search.typesense.facets.volunteering', 'search.typesense.facets.space'])
+  })
 })
diff --git a/core/screens/userprofile/OwnProfile.tsx b/core/screens/userprofile/OwnProfile.tsx
index 839166d48bb7399ceb35054a25be6aae966c8875..81f11b184a7f03993ccd1d084acbd34b661b5d9b 100644
--- a/core/screens/userprofile/OwnProfile.tsx
+++ b/core/screens/userprofile/OwnProfile.tsx
@@ -27,8 +27,11 @@ import HoliModal from '@holi/ui/components/molecules/HoliModal'
 import HoliKeyboardSaveView from '@holi/ui/components/organisms/HoliKeyboardSaveView'
 import { useTheme } from '@holi/ui/styles/theme'
 import { ButtonIcon } from 'holi-bricks/components/button'
+import useTracking from '@holi/core/tracking/hooks/useTracking'
+import { TrackingEvent } from '@holi/core/tracking'
 
 const OwnProfile = () => {
+  const { track } = useTracking()
   const [activeTab, setActiveTab] = useState<string>(Tab.PROFILE)
   const [showModal, setshowModal] = useState(false)
   const [editMode, setEditMode] = useState<EditModeState>()
@@ -48,17 +51,22 @@ const OwnProfile = () => {
   const toggleEditMode = useCallback(
     (newEditMode: EditModeState) => {
       setEditMode(newEditMode)
+      if (newEditMode === 'profile') {
+        track(TrackingEvent.UserProfile.editPressed())
+      }
       // if pressed too soon, the state is set to true, but the modal is not shown.
       // crude mechanism to recover from this state.
       // FIXME: We need a proper solution, e.g. involve a loading state in button disabled
       if (showModal) setshowModal(false)
       setshowModal(true)
     },
-    [showModal]
+    [showModal, track]
   )
 
   // TODO: remove after implementing the feature
-  const showFeatureNotImplementedToast = useToastForNotAvailableFeature({ feature: 'USER_PROFILE_SHARE' })
+  const showFeatureNotImplementedToast = useToastForNotAvailableFeature({
+    feature: 'USER_PROFILE_SHARE',
+  })
 
   useIsomorphicLayoutEffect(() => {
     const title = t('profile.title')
@@ -116,7 +124,9 @@ const OwnProfile = () => {
     await client.clearStore()
     // for mobile we need to refetch data manually, web will refetch it anyway with SSR, except for the authenticatedUser itself
     // fetching all queries can take a while, so we do not await them to not block the UI
-    client.refetchQueries({ include: Platform.OS !== 'web' ? 'active' : [authenticatedUserV2Query] })
+    client.refetchQueries({
+      include: Platform.OS !== 'web' ? 'active' : [authenticatedUserV2Query],
+    })
 
     closeModal()
   }, [client, closeModal])
diff --git a/core/screens/userprofile/components/OwnProfileView.tsx b/core/screens/userprofile/components/OwnProfileView.tsx
index 456933b7e9b1c187676292dc2225fa48bca7bd06..45e77c9b64404e6d7d2a2e0f818ad675b38f9580 100644
--- a/core/screens/userprofile/components/OwnProfileView.tsx
+++ b/core/screens/userprofile/components/OwnProfileView.tsx
@@ -65,7 +65,11 @@ const OwnProfileView = ({ user, toggleEditMode, activeTab, onTabChange }: PropsW
       <View style={{ backgroundColor: colors.background10 }}>
         <HoliContainer>
           <UserProfileView user={user} contactPossible={false} />
-          <ProfileCompletionCard onPressEdit={() => toggleEditMode('profile')} style={styles.profileCard} />
+          <ProfileCompletionCard
+            onPressEdit={() => toggleEditMode('profile')}
+            style={styles.profileCard}
+            page="profile"
+          />
         </HoliContainer>
       </View>
       <HoliTabs
diff --git a/core/screens/userprofile/components/ProfileCompletionCard.tsx b/core/screens/userprofile/components/ProfileCompletionCard.tsx
index 60d0eb2afe9fae65f87424a32cdeab9ba15fcf42..ce70b5669de4d5ba200133fc86549d9a1e242f8e 100644
--- a/core/screens/userprofile/components/ProfileCompletionCard.tsx
+++ b/core/screens/userprofile/components/ProfileCompletionCard.tsx
@@ -1,5 +1,5 @@
 import type React from 'react'
-import { useState, useMemo, useEffect } from 'react'
+import { useState, useMemo, useEffect, useCallback } from 'react'
 import { useTranslation } from 'react-i18next'
 import { Pressable, type StyleProp, StyleSheet, View, type ViewStyle } from 'react-native'
 import AsyncStorage from '@react-native-async-storage/async-storage'
@@ -16,6 +16,8 @@ import useRouting from '@holi/core/navigation/hooks/useRouting'
 import { useLoggedInUser } from '@holi/core/auth/hooks/useLoggedInUser'
 import HoliLocalImage from '@holi/ui/components/atoms/HoliLocalImage'
 import { Button } from 'holi-bricks/components/button'
+import { TrackingEvent } from '@holi/core/tracking'
+import useTracking from '@holi/core/tracking/hooks/useTracking'
 
 type Selection = {
   label: string
@@ -27,6 +29,7 @@ type Selection = {
 type ProfileCompletionCardProps = {
   onPressEdit?: () => void
   style?: StyleProp<ViewStyle>
+  page: 'profile' | 'home_feed'
 }
 
 const getCompletionPercentage = (selections: Selection[]): number => {
@@ -34,8 +37,9 @@ const getCompletionPercentage = (selections: Selection[]): number => {
   return selections.length ? (completedSelections / selections.length) * 100 : 0
 }
 
-const ProfileCompletionCard: React.FC<ProfileCompletionCardProps> = ({ style, onPressEdit }) => {
+const ProfileCompletionCard: React.FC<ProfileCompletionCardProps> = ({ style, onPressEdit, page }) => {
   const { theme } = useTheme()
+  const { track } = useTracking()
   const { navigate } = useRouting()
   const { colors } = theme
   const { t } = useTranslation()
@@ -55,15 +59,36 @@ const ProfileCompletionCard: React.FC<ProfileCompletionCardProps> = ({ style, on
 
   const selections: Selection[] = useMemo(
     () => [
-      { label: t('profile.completion.interests.title'), select: hasInterests, type: 'INTERESTS', icon: AddCircleLine },
-      { label: t('profile.completion.avatar.title'), select: hasAvatar, type: 'AVATAR', icon: UserSmile },
-      { label: t('profile.completion.location.title'), select: hasLocation, type: 'LOCATION', icon: MapPin2 },
+      {
+        label: t('profile.completion.interests.title'),
+        select: hasInterests,
+        type: 'INTERESTS',
+        icon: AddCircleLine,
+      },
+      {
+        label: t('profile.completion.avatar.title'),
+        select: hasAvatar,
+        type: 'AVATAR',
+        icon: UserSmile,
+      },
+      {
+        label: t('profile.completion.location.title'),
+        select: hasLocation,
+        type: 'LOCATION',
+        icon: MapPin2,
+      },
     ],
     [hasInterests, hasAvatar, hasLocation, t]
   )
 
   const completedSteps = selections.filter((selection) => selection.select).length
 
+  const handleDismiss = useCallback(async () => {
+    await AsyncStorage.setItem('profileCardDismissed', 'true')
+    track(TrackingEvent.UserProfile.completionDismissed(page))
+    setShowCard(false)
+  }, [track, page])
+
   useEffect(() => {
     const checkDismissed = async () => {
       const dismissed = await AsyncStorage.getItem('profileCardDismissed')
@@ -91,12 +116,7 @@ const ProfileCompletionCard: React.FC<ProfileCompletionCardProps> = ({ style, on
       }
     }
     checkCompletionStatus()
-  }, [user, isCompleted, justCompleted])
-
-  const handleDismiss = () => {
-    AsyncStorage.setItem('profileCardDismissed', 'true')
-    setShowCard(false)
-  }
+  }, [user, isCompleted, justCompleted, handleDismiss])
 
   const Header = () => (
     <Pressable
diff --git a/core/tracking/events.ts b/core/tracking/events.ts
index ec1c7df3660fd520e3635f332ecc2943cd7cfda0..f2e478a88a4947e96243c96c943010f44db8365f 100644
--- a/core/tracking/events.ts
+++ b/core/tracking/events.ts
@@ -1,5 +1,6 @@
 /* eslint-disable @typescript-eslint/no-namespace */
 import type { SignupModalPressedTrigger } from '@holi/core/tracking/types'
+import { Channel } from '@holi/core/screens/notifications/hooks/useNotificationPreferences'
 
 type RecommendationType = 'space' | 'donation' | 'volunteering_opportunity' | 'goodnews' | 'space_task'
 
@@ -395,6 +396,36 @@ export namespace TrackingEvent {
     properties: { pollId },
     ...versionOne,
   })
+
+  export const UserProfile = {
+    editPressed: (): TrackingEvent => ({
+      name: 'userProfileEdit_pressed',
+
+      ...versionOne,
+    }),
+    completionDismissed: (page: 'profile' | 'home_feed'): TrackingEvent => ({
+      name: 'userProfileCompletion_dismissed',
+      properties: {
+        page: page,
+      },
+      ...versionOne,
+    }),
+  }
+
+  export const NotificationPreferenceChanged = (
+    workflowId: string,
+    workflowName: string,
+    channel: Channel,
+    newState: boolean
+  ): TrackingEvent => ({
+    ...versionOne,
+    name: 'notificationPreferenceChanged',
+    properties: {
+      workflowId,
+      channel,
+      newState,
+    },
+  })
 }
 
 export const Unknown: TrackingEvent = {
diff --git a/e2e/mobile/helpers/auth.ts b/e2e/mobile/helpers/auth.ts
index 29561ea9e44fbc6884c09cfb6419b663411851f4..49478e0f179443b82aa3827a3c526e601249640a 100644
--- a/e2e/mobile/helpers/auth.ts
+++ b/e2e/mobile/helpers/auth.ts
@@ -1,6 +1,6 @@
 import { faker } from '@faker-js/faker'
 
-import { navigateBackToHomeScreen, waitForHomeScreen } from '../helpers/navigation'
+import { navigateBackToHomeScreen, waitForActScreen, waitForHomeScreen } from '../helpers/navigation'
 import {
   checkIfElementWithTestIdExists,
   fillFieldByTestId,
@@ -42,6 +42,8 @@ export const continueAsGuest = async () => {
     // Skip through all onboarding steps and continue as guet
     await skipOnboardingSteps()
     await tapOnElementWithTestId(testIdContinueAsGuest)
+    // User will land on act screen after onboarding > navigate to home feed
+    await tapOnElementWithTestId('btn-to-home-view')
   }
 
   await waitForHomeScreen()
@@ -108,6 +110,9 @@ export const register = async ({
     await finishAccountSetup()
 
     if (!userData?.content) {
+      // User will land on act screen after onboarding > navigate to home feed
+      await waitForActScreen()
+      await tapOnElementWithTestId('btn-to-home-view')
       await waitForHomeScreen()
     }
   }
diff --git a/e2e/mobile/helpers/navigation.ts b/e2e/mobile/helpers/navigation.ts
index e1ccb3d04225770e49080a7d4365812bbfc67af2..c3c216423d90c500666e24fae9c13fcf9e85ca8c 100644
--- a/e2e/mobile/helpers/navigation.ts
+++ b/e2e/mobile/helpers/navigation.ts
@@ -4,9 +4,12 @@ const homeScreenTestId = 'home-feed-insights-heading'
 
 export const waitForHomeScreen = async (timeout?: number) => waitForElementWithTestId(homeScreenTestId, timeout)
 
+export const waitForActScreen = async (timeout?: number) => waitForElementWithTestId('act-home', timeout)
+
 export const navigateToAppById = async (id: 'donations' | 'goodnews' | 'volunteering') => {
   await waitForHomeScreen()
   await tapOnElementWithTestId('btn-to-act')
+  await waitForElementWithTestId('act-home')
   await scrollToElementWithTestId(`${id}-reco-slider-heading-button`, 'down')
   await tapOnElementWithTestId(`${id}-reco-slider-heading-button`)
   await waitForElementWithTestId(`${id}-list-container`)
diff --git a/e2e/web/tests/helpers.ts b/e2e/web/tests/helpers.ts
index 26079da6b15fda9c2de8859a01aa9546643c9d3c..b0c3a97b4bd9f35c04f9e7f12b41b72ec8145e05 100644
--- a/e2e/web/tests/helpers.ts
+++ b/e2e/web/tests/helpers.ts
@@ -230,6 +230,9 @@ export const proceedAsGuest = async (page: Page): Promise<void> => {
   await clickElementByTestId(page, 'onboarding-account-creation-btn-continue-as-guest')
 
   await page.waitForSelector(byTestId('onboarding-account-creation-btn-continue-as-guest'), { state: 'detached' })
+
+  // User will land on act screen after onboarding > navigate to home feed
+  await clickElementByTestId(page, 'btn-to-home-view')
 }
 
 export const loginAsE2EUser = async (context: BrowserContext, page: Page): Promise<void> => {
@@ -247,7 +250,7 @@ const registerNewUserAccount = async (
     email,
     password,
     userData,
-    expectedScreen = 'home-feed-listing',
+    expectedScreen = 'act-home',
   }: {
     email?: string
     password?: string
@@ -264,7 +267,7 @@ const registerNewUserAccount = async (
   })
   await page.waitForSelector(byTestId('community-guidelines-modal-btn-submit'))
   await clickElementByTestId(page, 'community-guidelines-modal-btn-submit')
-  // wait for expected screen (usually home feed) - registration succeeded
+  // wait for expected screen (usually act home) - registration succeeded
   await page.waitForSelector(byTestId(expectedScreen))
   return newAccount
 }
diff --git a/e2e/web/tests/registration.spec.ts b/e2e/web/tests/registration.spec.ts
index d9a25d7b6f191460c45153e6b52164423d0da859..19325bd2cdc6dba2017e97fabe06a084cadf5181 100644
--- a/e2e/web/tests/registration.spec.ts
+++ b/e2e/web/tests/registration.spec.ts
@@ -32,8 +32,8 @@ test.describe('@Registration', () => {
     //FIXME: Error: Wasn't able to intercept user id while finishing account setup flow at finishAccountSetup in appointmentNotifications.spec.ts
     // using a random user session implicitly tests user registration
     await userHandler.asRandomUser(async (page) => {
-      // BUG: test-id: user-profile-full-name is not available on the page we are rendering. It is available on /profile. If that is intended behaviour, uncomment the next line
-      // await page.goto('/profile')
+      // Starting on profile page
+      // Ensure user is logged in
       await page.waitForSelector(byTestId('user-profile-full-name'))
 
       // trying to go to login page with logged in user should show home feed
diff --git a/holi-bricks/components/button/Button.tsx b/holi-bricks/components/button/Button.tsx
index 2906ce27f4d7b34d1fa001aa3c2ff6649b0c92c2..34e5701ee0ef496f93ef7d49168b865e5b73849f 100644
--- a/holi-bricks/components/button/Button.tsx
+++ b/holi-bricks/components/button/Button.tsx
@@ -12,13 +12,24 @@ import type { HoliIconType } from '@holi/icons/src/HoliIconType'
 import { SpinningIconContainer } from '@holi/icons/src/SpinningIconContainer'
 import { Loader } from '@holi/icons/src/generated'
 
-export type ButtonVariant = 'primary' | 'secondary' | 'danger'
+import {
+  buttonBaseStyle,
+  buttonContentStyle,
+  type ButtonVariant as ButtonVariantBaseType,
+  getButtonDisabledStyle,
+  getButtonSelectedStyle,
+  getButtonTextVarianStyle,
+  getButtonVariantStyle,
+} from './helpers'
+
+export type ButtonVariant = Extract<ButtonVariantBaseType, 'primary' | 'secondary' | 'danger'>
+
 export type ButtonSize = 'sm' | 'md' | 'lg'
 
 export type ButtonProps = AccessibilityProps & {
   label: string
   onPress?: (event: React.SyntheticEvent | GestureResponderEvent) => unknown | Promise<unknown>
-  variant?: ButtonVariant
+  variant?: Extract<ButtonVariant, 'primary' | 'secondary' | 'danger'>
   disabled?: boolean
   size?: ButtonSize
   loading?: boolean
@@ -58,7 +69,7 @@ export const Button = ({
   const labelToShow = isSpinning && loadingLabel ? loadingLabel : label
 
   const handlePress = useCallback(
-    async (event: React.SyntheticEvent | GestureResponderEvent) => {
+    async (event: GestureResponderEvent) => {
       if (onPress && !isSpinning && !disabled) {
         setProcessing(true)
         try {
@@ -115,28 +126,13 @@ export const Button = ({
 const stylesheet = createStyleSheet((theme) => ({
   button: (hovered: boolean, pressed: boolean, inline: boolean) => {
     return {
-      borderRadius: 1000, // pill
-      borderStyle: 'solid',
-      borderWidth: 1,
-      display: 'flex',
+      ...buttonBaseStyle,
       width: inline ? 'auto' : '100%',
       variants: {
         variant: {
-          primary: {
-            backgroundColor: theme.components.button.primary.background,
-            borderColor: theme.components.button.primary.border,
-            boxShadow: `0 0 0 ${pressed ? '2px' : hovered ? '1px' : '0px'} ${theme.components.button.primary.border}`,
-          },
-          secondary: {
-            backgroundColor: theme.components.button.secondary.background,
-            borderColor: theme.components.button.secondary.border,
-            boxShadow: `0 0 0 ${pressed ? '2px' : hovered ? '1px' : '0px'} ${theme.components.button.secondary.border}`,
-          },
-          danger: {
-            backgroundColor: theme.components.button.danger.background,
-            borderColor: theme.components.button.danger.border,
-            boxShadow: `0 0 0 ${pressed ? '2px' : hovered ? '1px' : '0px'} ${theme.components.button.danger.border}`,
-          },
+          primary: getButtonVariantStyle({ variant: 'primary', theme, pressed, hovered }),
+          secondary: getButtonVariantStyle({ variant: 'secondary', theme, pressed, hovered }),
+          danger: getButtonVariantStyle({ variant: 'danger', theme, pressed, hovered }),
         },
         size: {
           sm: {
@@ -149,29 +145,12 @@ const stylesheet = createStyleSheet((theme) => ({
             paddingHorizontal: Spacing.md,
           },
         },
-        selected: {
-          true: {
-            backgroundColor: theme.components.button.selected.background,
-            borderColor: theme.components.button.selected.border,
-          },
-        },
-        disabled: {
-          true: {
-            backgroundColor: theme.components.button.disabled.background,
-            borderColor: theme.components.button.disabled.border,
-          },
-        },
+        selected: getButtonSelectedStyle(theme),
+        disabled: getButtonDisabledStyle(theme),
       },
     }
   },
-  content: {
-    display: 'flex',
-    flexDirection: 'row',
-    alignItems: 'center',
-    justifyContent: 'center',
-    gap: 4,
-  },
-
+  content: buttonContentStyle,
   textContainer: (size: ButtonSize) => {
     const heightBySize = {
       sm: Spacing.lg,
@@ -183,13 +162,6 @@ const stylesheet = createStyleSheet((theme) => ({
       justifyContent: 'center',
     }
   },
-  text: (disabled: boolean, selected: boolean, variant: ButtonVariant) => {
-    return {
-      color: disabled
-        ? theme.components.button.disabled.text
-        : selected
-          ? theme.components.button.selected.text
-          : theme.components.button[variant].text,
-    }
-  },
+  text: (disabled: boolean, selected: boolean, variant: ButtonVariant) =>
+    getButtonTextVarianStyle({ variant, theme, disabled, selected }),
 }))
diff --git a/holi-bricks/components/button/ButtonIcon.test.tsx b/holi-bricks/components/button/ButtonIcon.test.tsx
index 11d809c8286fe779ffd1af126490d1fa87aadfdf..6dd57ba53205729b1cbb0ca707035c54ef34f761 100644
--- a/holi-bricks/components/button/ButtonIcon.test.tsx
+++ b/holi-bricks/components/button/ButtonIcon.test.tsx
@@ -1,5 +1,5 @@
 import { Chat3 } from '@holi/icons/src/generated'
-import { act, fireEvent, render, screen } from '@testing-library/react-native'
+import { render, screen, userEvent } from '@testing-library/react-native'
 import { ButtonIcon } from 'holi-bricks/components/button'
 import React from 'react'
 
@@ -7,41 +7,34 @@ describe('Button component', () => {
   it('renders correctly with the given text', () => {
     const mockFn = jest.fn()
     render(<ButtonIcon label="Click me" onPress={mockFn} icon={Chat3} />)
-    act(() => {
-      /* fire events that update state */
-      expect(screen.getByLabelText('Click me')).toBeTruthy()
-    })
+    expect(screen.getByLabelText('Click me')).toBeTruthy()
   })
 
-  it('calls onPress prop when not disabled', () => {
+  it('calls onPress prop when not disabled', async () => {
     const mockFn = jest.fn()
     render(<ButtonIcon label="Click me" onPress={mockFn} icon={Chat3} />)
-    act(() => {
-      /* fire events that update state */
-      fireEvent.press(screen.getByLabelText('Click me'))
-    })
+
+    await userEvent.press(screen.getByLabelText('Click me'))
+
     expect(mockFn).toHaveBeenCalledTimes(1)
   })
 
-  it('does not call onPress prop when disabled', () => {
+  it('does not call onPress prop when disabled', async () => {
     const mockFn = jest.fn()
     render(<ButtonIcon label="Click me" onPress={mockFn} disabled icon={Chat3} />)
-    act(() => {
-      /* fire events that update state */
-      fireEvent.press(screen.getByLabelText('Click me'))
-    })
+
+    await userEvent.press(screen.getByLabelText('Click me'))
+
     expect(mockFn).toHaveBeenCalledTimes(0)
   })
 
-  it('does not call onPress prop when loading', () => {
+  it('does not call onPress prop when loading', async () => {
     const mockFn = jest.fn()
-    render(<ButtonIcon label="Click me" onPress={mockFn} loading icon={Chat3} />)
+    render(<ButtonIcon label="Click me" onPress={mockFn} loading icon={Chat3} testID="button-icon" />)
+    expect(screen.getByTestId('button-icon-spinner')).toBeOnTheScreen()
+
+    await userEvent.press(screen.getByLabelText('Click me'))
 
-    expect(screen.getByTestId('spinner')).toBeOnTheScreen()
-    act(() => {
-      /* fire events that update state */
-      fireEvent.press(screen.getByLabelText('Click me'))
-    })
     expect(mockFn).not.toHaveBeenCalled()
   })
 })
diff --git a/holi-bricks/components/button/ButtonIcon.tsx b/holi-bricks/components/button/ButtonIcon.tsx
index dca4a273ba22482d93516a8141f2742f38e741fb..b06e61dc3c72fee1ed8826ba8b6c78c3191b66f5 100644
--- a/holi-bricks/components/button/ButtonIcon.tsx
+++ b/holi-bricks/components/button/ButtonIcon.tsx
@@ -10,12 +10,19 @@ import type { HoliIconType } from '@holi/icons/src/HoliIconType'
 import { SpinningIconContainer } from '@holi/icons/src/SpinningIconContainer'
 import { Loader } from '@holi/icons/src/generated'
 import type { ButtonProps } from 'holi-bricks/components/button'
-
-export type ButtonIconVariant = 'primary' | 'secondary' | 'tertiary'
+import {
+  buttonBaseStyle,
+  buttonContentStyle,
+  type ButtonVariant,
+  getButtonDisabledStyle,
+  getButtonSelectedStyle,
+  getButtonTextVarianStyle,
+  getButtonVariantStyle,
+} from './helpers'
 
 export interface ButtonIconProps extends Omit<ButtonProps, 'inline' | 'loadingLabel' | 'variant'> {
   icon: HoliIconType
-  variant?: ButtonIconVariant
+  variant?: Extract<ButtonVariant, 'primary' | 'secondary' | 'tertiary'>
 }
 
 export const ButtonIcon: React.FC<ButtonIconProps> = ({
@@ -40,19 +47,20 @@ export const ButtonIcon: React.FC<ButtonIconProps> = ({
   })
 
   const isSpinning = loading || isProcessing
+  const isDisabled = disabled || isSpinning
 
   const handlePress = useCallback(
-    async (event: React.SyntheticEvent | GestureResponderEvent) => {
-      if (onPress && !isSpinning && !disabled) {
-        setProcessing(true)
-        try {
-          await onPress(event)
-        } finally {
-          setProcessing(false)
-        }
+    async (event: GestureResponderEvent) => {
+      if (!onPress) return
+
+      setProcessing(true)
+      try {
+        await onPress(event)
+      } finally {
+        setProcessing(false)
       }
     },
-    [disabled, isSpinning, onPress]
+    [onPress]
   )
 
   return (
@@ -60,23 +68,21 @@ export const ButtonIcon: React.FC<ButtonIconProps> = ({
       accessibilityRole="button"
       accessibilityLabel={label}
       accessibilityState={{
-        disabled: isSpinning || disabled,
-        selected: selected,
+        disabled: isDisabled,
+        selected,
       }}
-      aria-disabled={isSpinning || disabled}
+      aria-disabled={isDisabled}
       aria-pressed={selected}
       onPress={handlePress}
-      onHoverIn={() => setIsHovered(true)}
-      onHoverOut={() => setIsHovered(false)}
-      style={({ pressed }) =>
-        !transparent ? [styles.button(!disabled && isHovered, !disabled && !!pressed)] : undefined
-      }
-      disabled={isSpinning || disabled}
+      onHoverIn={() => !disabled && setIsHovered(true)}
+      onHoverOut={() => !disabled && setIsHovered(false)}
+      style={({ pressed }) => !transparent && [styles.button(isHovered, pressed)]}
+      disabled={isDisabled}
       testID={testID}
     >
       <View style={styles.content}>
-        {isSpinning && (
-          <View testID="spinner">
+        {isSpinning ? (
+          <View testID={`${testID}-spinner`}>
             <SpinningIconContainer spinning={isSpinning}>
               <HoliIcon
                 icon={Loader}
@@ -85,8 +91,7 @@ export const ButtonIcon: React.FC<ButtonIconProps> = ({
               />
             </SpinningIconContainer>
           </View>
-        )}
-        {!isSpinning && (
+        ) : (
           <HoliIcon
             icon={icon}
             size={size === 'lg' ? 24 : size === 'md' ? 20 : 16}
@@ -101,26 +106,13 @@ export const ButtonIcon: React.FC<ButtonIconProps> = ({
 const stylesheet = createStyleSheet((theme) => ({
   button: (hovered: boolean, pressed: boolean) => {
     return {
-      borderRadius: 1000, // pill
-      borderStyle: 'solid',
-      borderWidth: 1,
-      display: 'flex',
+      ...buttonBaseStyle,
       variants: {
         iconVariant: {
-          primary: {
-            backgroundColor: theme.components.button.primary.background,
-            borderColor: theme.components.button.primary.border,
-            boxShadow: `0 0 0 ${pressed ? '2px' : hovered ? '1px' : '0px'} ${theme.components.button.primary.border}`,
-          },
-          secondary: {
-            backgroundColor: theme.components.button.secondary.background,
-            borderColor: theme.components.button.secondary.border,
-            boxShadow: `0 0 0 ${pressed ? '2px' : hovered ? '1px' : '0px'} ${theme.components.button.secondary.border}`,
-          },
+          primary: getButtonVariantStyle({ variant: 'primary', theme, pressed, hovered }),
+          secondary: getButtonVariantStyle({ variant: 'secondary', theme, pressed, hovered }),
           tertiary: {
-            backgroundColor: theme.components.button.tertiary.background,
-            borderColor: theme.components.button.tertiary.border,
-            boxShadow: `0 0 0 ${pressed ? '2px' : hovered ? '1px' : '0px'} ${theme.components.button.tertiary.border}`,
+            ...getButtonVariantStyle({ variant: 'tertiary', theme, pressed, hovered }),
             borderWidth: hovered || pressed ? 1 : 0,
           },
         },
@@ -141,35 +133,12 @@ const stylesheet = createStyleSheet((theme) => ({
             height: Spacing['xxl'],
           },
         },
-        selected: {
-          true: {
-            backgroundColor: theme.components.button.selected.background,
-            borderColor: theme.components.button.selected.border,
-          },
-        },
-        disabled: {
-          true: {
-            backgroundColor: theme.components.button.disabled.background,
-            borderColor: theme.components.button.disabled.border,
-          },
-        },
+        selected: getButtonSelectedStyle(theme),
+        disabled: getButtonDisabledStyle(theme),
       },
     }
   },
-  content: {
-    display: 'flex',
-    flexDirection: 'row',
-    alignItems: 'center',
-    justifyContent: 'center',
-    gap: 4,
-  },
-  text: (disabled: boolean, selected: boolean, variant: ButtonIconVariant) => {
-    return {
-      color: disabled
-        ? theme.components.button.disabled.text
-        : selected
-          ? theme.components.button.selected.text
-          : theme.components.button[variant].text,
-    }
-  },
+  content: buttonContentStyle,
+  text: (disabled: boolean, selected: boolean, variant: ButtonVariant) =>
+    getButtonTextVarianStyle({ variant, theme, disabled, selected }),
 }))
diff --git a/holi-bricks/components/button/helpers.ts b/holi-bricks/components/button/helpers.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c40a2bc78ded469c3f7a90869b6650de20311938
--- /dev/null
+++ b/holi-bricks/components/button/helpers.ts
@@ -0,0 +1,63 @@
+import type { UnistylesTheme } from 'react-native-unistyles'
+
+export const buttonBaseStyle = {
+  borderRadius: 1000, // pill
+  borderStyle: 'solid',
+  borderWidth: 1,
+  display: 'flex',
+} as const
+
+export type ButtonVariant = keyof UnistylesTheme['components']['button']
+
+interface ButtonVariantArgsBase {
+  variant: ButtonVariant
+  theme: UnistylesTheme
+}
+
+export const getButtonVariantStyle = ({
+  variant,
+  theme,
+  pressed,
+  hovered,
+}: ButtonVariantArgsBase & { pressed: boolean; hovered: boolean }) => ({
+  backgroundColor: theme.components.button[variant].background,
+  borderColor: theme.components.button[variant].border,
+  boxShadow: `0 0 0 ${pressed ? '2px' : hovered ? '1px' : '0px'} ${theme.components.button[variant].border}`,
+})
+
+export const getButtonSelectedStyle = (theme: UnistylesTheme) =>
+  ({
+    true: {
+      backgroundColor: theme.components.button.selected.background,
+      borderColor: theme.components.button.selected.border,
+    },
+  }) as const
+
+export const getButtonDisabledStyle = (theme: UnistylesTheme) =>
+  ({
+    true: {
+      backgroundColor: theme.components.button.disabled.background,
+      borderColor: theme.components.button.disabled.border,
+    },
+  }) as const
+
+export const getButtonTextVarianStyle = ({
+  variant,
+  theme,
+  disabled,
+  selected,
+}: ButtonVariantArgsBase & { disabled: boolean; selected: boolean }) => ({
+  color: disabled
+    ? theme.components.button.disabled.text
+    : selected
+      ? theme.components.button.selected.text
+      : theme.components.button[variant].text,
+})
+
+export const buttonContentStyle = {
+  display: 'flex',
+  flexDirection: 'row',
+  alignItems: 'center',
+  justifyContent: 'center',
+  gap: 4,
+} as const
diff --git a/holi-bricks/components/selectors/Selector.test.tsx b/holi-bricks/components/selectors/Selector.test.tsx
index 4aced82ec46f44d877df094a842cf242f3837e81..b81d5d46a4f35bf977ba4fa7f651d26b97695f62 100644
--- a/holi-bricks/components/selectors/Selector.test.tsx
+++ b/holi-bricks/components/selectors/Selector.test.tsx
@@ -78,6 +78,21 @@ describe('Selector', () => {
     expect(mockFn).toHaveBeenCalledWith(['1'])
   })
 
+  it('does not toggle selection in radio mode', () => {
+    const mockFn = jest.fn()
+    render(
+      <Selector title={'title'} onChange={mockFn} inputType="radio">
+        <SelectableCard title={'card1'} id={'1'} />
+        <SelectableCard title={'card2'} id={'2'} />
+      </Selector>
+    )
+    fireEvent.press(screen.getByText('card1'))
+    expect(mockFn).toHaveBeenCalledWith(['1'])
+
+    fireEvent.press(screen.getByText('card1'))
+    expect(mockFn).toHaveBeenCalledWith(['1'])
+  })
+
   it('calls childrens onPress correctly when clicked', () => {
     const mockFn = jest.fn()
     const mockFn1 = jest.fn()
diff --git a/holi-bricks/components/selectors/Selector.tsx b/holi-bricks/components/selectors/Selector.tsx
index 930d11c3ab2f8def72c0eb4f14862790bcbd064e..e94b749ee47517d21202058492904ec59baf19e3 100644
--- a/holi-bricks/components/selectors/Selector.tsx
+++ b/holi-bricks/components/selectors/Selector.tsx
@@ -50,7 +50,7 @@ export const Selector = ({
     (id: string) => {
       onSelect?.(id)
       const newSelectedOptions =
-        inputType === 'radio' ? { [id]: !selectedOptions[id] } : { ...selectedOptions, [id]: !selectedOptions[id] }
+        inputType === 'radio' ? { [id]: true } : { ...selectedOptions, [id]: !selectedOptions[id] }
       const newSelectedOptionsAsStringArray = Object.keys(newSelectedOptions).filter((key) => newSelectedOptions[key])
       onChange?.(newSelectedOptionsAsStringArray)
       setSelectedOptions(newSelectedOptions)
diff --git a/holi-bricks/components/text/Text.stories.tsx b/holi-bricks/components/text/Text.stories.tsx
index 2cd62bbcde1aec8fe2089eadac240783af61cc42..c658ec8dd4205bef4647b6e74bf214fe3ed3d0d3 100644
--- a/holi-bricks/components/text/Text.stories.tsx
+++ b/holi-bricks/components/text/Text.stories.tsx
@@ -1,5 +1,5 @@
 import type { Meta, StoryObj } from '@storybook/react'
-import { Text, type TextSize, type TextColor, type TextVariant } from 'holi-bricks/components/text'
+import { Text, type TextSize, type TextColor } from 'holi-bricks/components/text'
 import { lightTheme } from 'holi-bricks/themes/light'
 import React from 'react'
 import { View } from 'react-native'
@@ -76,22 +76,4 @@ export const ByColor: Story = {
   },
 }
 
-const availableVariants: TextVariant[] = ['primary', 'secondary', 'tertiary', 'quaternary', 'error']
-
-export const ByVariant: Story = {
-  argTypes: {},
-  args: {},
-  render: function Render(args) {
-    return (
-      <View style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>
-        {availableVariants.map((variant) => (
-          <Text key={variant} {...args} variant={variant}>
-            This is text in deprecated {variant}.
-          </Text>
-        ))}
-      </View>
-    )
-  },
-}
-
 export default meta
diff --git a/holi-bricks/components/text/Text.tsx b/holi-bricks/components/text/Text.tsx
index 3d1d96177991b944a857d63d39dae9d6f4f5f304..b46f357bfa22ddc1fdd7593504cd33142effd156 100644
--- a/holi-bricks/components/text/Text.tsx
+++ b/holi-bricks/components/text/Text.tsx
@@ -17,7 +17,7 @@ import {
 export type TextSize = '4xl' | '3xl' | 'xxl' | 'xl' | 'lg' | 'md' | 'sm' | 'xs' | 'xxs'
 export type TextHeadingLevel = '1' | '2' | '3'
 export type TextColor = keyof typeof lightTheme.colors.fill
-export type TextVariant =
+type TextVariant =
   /** Primary, Headlines, Body */
   | 'primary'
   /** Body, Captions, Subtexts */
diff --git a/holi-bricks/components/text/TextLink.stories.tsx b/holi-bricks/components/text/TextLink.stories.tsx
index 6905d76ee9a864a5081b09ce6574e768a6912953..787b3c5b2d0b4e22bf94f3ca6941407f97b539ba 100644
--- a/holi-bricks/components/text/TextLink.stories.tsx
+++ b/holi-bricks/components/text/TextLink.stories.tsx
@@ -1,11 +1,13 @@
 import { action } from '@storybook/addon-actions'
 import type { Meta, StoryObj } from '@storybook/react'
-import { TextLink, type TextLinkSize, type TextLinkVariant } from 'holi-bricks/components/text'
+import { type TextColor, TextLink, type TextLinkSize, type TextLinkVariant } from 'holi-bricks/components/text'
+import { lightTheme } from 'holi-bricks/themes/light'
 import React from 'react'
 import { View } from 'react-native'
 
+const availableColors = Object.keys(lightTheme.colors.fill) as TextColor[]
+
 const availableSizes: TextLinkSize[] = ['md', 'sm', 'xs']
-const availableVariants: TextLinkVariant[] = ['primary', 'secondary', 'tertiary', 'quaternary', 'special']
 const disabledProps = [
   'accessible',
   'id',
@@ -36,7 +38,7 @@ type Story = StoryObj<typeof TextLink>
 export const Playground: Story = {
   argTypes: {
     size: { control: 'select', options: availableSizes },
-    variant: { control: 'select', options: availableVariants },
+    color: { control: 'select', options: availableColors },
   },
   args: {
     size: 'md',
@@ -63,6 +65,24 @@ export const BySize: Story = {
   },
 }
 
+export const ByColor: Story = {
+  argTypes: {},
+  args: {},
+  render: function Render(args) {
+    return (
+      <View style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>
+        {availableColors.map((color) => (
+          <TextLink key={color} {...args} color={color}>
+            This is a text link in {color}.
+          </TextLink>
+        ))}
+      </View>
+    )
+  },
+}
+
+const availableVariants: TextLinkVariant[] = ['primary', 'secondary', 'tertiary', 'quaternary', 'special']
+
 export const ByVariant: Story = {
   argTypes: {},
   args: {},
@@ -71,7 +91,7 @@ export const ByVariant: Story = {
       <View style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>
         {availableVariants.map((variant) => (
           <TextLink key={variant} {...args} variant={variant}>
-            This is a text link in variant {variant}.
+            This is a text link in deprecated variant {variant}.
           </TextLink>
         ))}
       </View>
diff --git a/holi-bricks/components/text/TextLink.tsx b/holi-bricks/components/text/TextLink.tsx
index 8b92fb09e593ac7e714cfac844c51ecc718624ce..eb08194264aa27bb1baf2df0fad0d9c89800e788 100644
--- a/holi-bricks/components/text/TextLink.tsx
+++ b/holi-bricks/components/text/TextLink.tsx
@@ -1,5 +1,6 @@
 import { accessibilityProps, type AccessibilityProps } from 'holi-bricks/accessibility'
 import { fontFamilies } from 'holi-bricks/components/text/fontFamilies'
+import type { TextColor } from 'holi-bricks/components/text/Text'
 import { useStyles } from 'holi-bricks/hooks'
 import { createStyleSheet } from 'holi-bricks/utils'
 import type React from 'react'
@@ -30,20 +31,31 @@ export type TextLinkVariant =
 export interface TextLinkProps extends AccessibilityProps {
   size: TextLinkSize
   numberOfLines?: number
-  /** Specifies theme respecting text color, takes precedence over `color`. */
+  /** @deprecated Please use the 'color' prop instead. variant will be deleted once code has been migrated to 'color'. */
   variant?: TextLinkVariant
-  /** Use is discouraged in favor of `variant`. Requires manual theme handling. */
-  color?: TextStyle['color']
+  /** Managed Theme color. */
+  color?: TextColor
+  /** Use this if you need to provide an explicit color and/or manually manage the color for each theme  */
+  colorOveride?: ColorValue
   textAlign?: TextStyle['textAlign']
   ellipsizeMode?: TextProps['ellipsizeMode']
   onPress?: (event: React.SyntheticEvent | GestureResponderEvent) => unknown | Promise<unknown>
 }
 
+const variantToColor: Record<TextLinkVariant, TextColor> = {
+  primary: 'main',
+  secondary: 'support',
+  tertiary: 'default',
+  quaternary: 'disabled',
+  special: 'informative',
+}
+
 export const TextLink = ({
   size,
   numberOfLines,
   variant,
-  color,
+  color = 'main',
+  colorOveride,
   textAlign,
   ellipsizeMode,
   children,
@@ -51,7 +63,11 @@ export const TextLink = ({
   role = 'link',
   ...rest
 }: React.PropsWithChildren<TextLinkProps>) => {
-  const { styles } = useStyles(stylesheet, { size, variant })
+  const { styles } = useStyles(stylesheet, { size })
+
+  if (variant) {
+    color = variantToColor[variant]
+  }
 
   return (
     <Text
@@ -63,7 +79,7 @@ export const TextLink = ({
       // as TextStyle is required because ts
       // is throwing error cause of this line fontVariant: ['tabular-nums', 'lining-nums'],
       // this might be related to unistyle typings, needs more investigation
-      style={styles.text(color, textAlign) as unknown as TextStyle}
+      style={styles.text(color, colorOveride, textAlign) as unknown as TextStyle}
       onPress={onPress}
     >
       {children}
@@ -72,12 +88,12 @@ export const TextLink = ({
 }
 
 const stylesheet = createStyleSheet((theme) => ({
-  text: (color?: ColorValue, textAlign?: TextStyle['textAlign']) => {
+  text: (color: TextColor, colorOveride?: ColorValue, textAlign?: TextStyle['textAlign']) => {
     return {
       fontVariant: ['lining-nums', 'tabular-nums'],
       fontFamily: fontFamilies.bold,
       fontWeight: '500',
-      color: color ?? theme.components.text.primary,
+      color: colorOveride ?? theme.colors.fill[color],
       userSelect: 'auto',
       textAlign: textAlign,
       ...Platform.select({
@@ -87,23 +103,6 @@ const stylesheet = createStyleSheet((theme) => ({
         },
       }),
       variants: {
-        variant: {
-          primary: {
-            color: theme.components.text.primary,
-          },
-          secondary: {
-            color: theme.components.text.secondary,
-          },
-          tertiary: {
-            color: theme.components.text.tertiary,
-          },
-          quaternary: {
-            color: theme.components.text.quaternary,
-          },
-          special: {
-            color: theme.components.text.specialLink,
-          },
-        },
         size: {
           md: {
             fontSize: 16,
diff --git a/packages/api/graphql/errorLink.web.ts b/packages/api/graphql/errorLink.web.ts
index 371daf586688c02eb51c0f5cda5a79e6eaa24aa5..2bb29df02954397b33d76758c61db7ac88707d2b 100644
--- a/packages/api/graphql/errorLink.web.ts
+++ b/packages/api/graphql/errorLink.web.ts
@@ -41,7 +41,7 @@ const errorLink = onError(({ graphQLErrors, networkError, operation }) => {
     } else {
       logError(
         networkError,
-        `Network error ${JSON.stringify(networkError)} ${JSON.stringify(graphQLErrors)} Query: ${JSON.stringify(
+        `Network error: ${JSON.stringify(networkError)}; GraphQLErrors: ${JSON.stringify(graphQLErrors)}; Query "${operation?.operationName}": ${JSON.stringify(
           operation?.query
         )}`,
         {
diff --git a/packages/chat/src/components/RoomMessageList/RoomMessageListStart.tsx b/packages/chat/src/components/RoomMessageList/RoomMessageListStart.tsx
index c91c613c4bd44194c2f04999cff380edd6abcb76..d86619ef733c492910c63d5c7bc5b87677f117a4 100644
--- a/packages/chat/src/components/RoomMessageList/RoomMessageListStart.tsx
+++ b/packages/chat/src/components/RoomMessageList/RoomMessageListStart.tsx
@@ -44,7 +44,7 @@ const RoomMessageListStart = ({ chatPartnerHoliUser, member }: RoomMessageListSt
             label={t('user.visitProfile', { name: chatPartnerHoliUser.fullName })}
             href={`/profile/${chatPartnerHoliUser.id}`}
             size="md"
-            variant="special"
+            color="informative"
           />
         </Trans>
       </Text>
diff --git a/packages/ui/assets/img/logo/partner_klimareporter.png b/packages/ui/assets/img/logo/partner_klimareporter.png
new file mode 100644
index 0000000000000000000000000000000000000000..79358499d867f27073ec257e7a35859dc4d27c0c
Binary files /dev/null and b/packages/ui/assets/img/logo/partner_klimareporter.png differ
diff --git a/packages/ui/assets/img/logo/partner_kohero.png b/packages/ui/assets/img/logo/partner_kohero.png
index d6ab3437c9ce6f3120198c31b800f12681f77bdc..6ad0464b1c3dfe618f938965ace661b61a1e9dde 100644
Binary files a/packages/ui/assets/img/logo/partner_kohero.png and b/packages/ui/assets/img/logo/partner_kohero.png differ
diff --git a/packages/ui/assets/img/logo/partner_medwatch.svg b/packages/ui/assets/img/logo/partner_medwatch.svg
deleted file mode 100644
index 057d33fa6995f153dba89df22bad72347fc708d1..0000000000000000000000000000000000000000
--- a/packages/ui/assets/img/logo/partner_medwatch.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="407" height="151" viewBox="0 0 407 151"><g fill-rule="evenodd"><path fill-rule="nonzero" d="M353.665,73.0306 L353.665,107.951 C353.665,116.224 351.655,122.043 347.637,125.411 C343.619,128.779 337.947,130.463 330.62,130.463 C322.703,130.463 316.883,128.72 313.16,125.234 C309.438,121.748 307.576,115.869 307.576,107.597 L307.576,22.1576 C307.576,14.3581 309.674,8.71535 313.87,5.2292 C318.065,1.74304 323.708,0 330.797,0 C338.125,0 343.737,1.68321 347.637,5.0518 C351.537,8.41932 353.487,13.9446 353.487,21.6254 L353.487,53.5319 L334.52,53.5319 L334.52,23.5758 C334.52,21.0942 334.255,19.3801 333.722,18.4353 C333.191,17.4895 332.157,17.0171 330.62,17.0171 C329.32,17.0171 328.406,17.5184 327.873,18.5229 C327.341,19.5276 327.075,21.3294 327.075,23.9296 L327.075,105.469 C327.075,108.069 327.312,109.841 327.785,110.787 C328.257,111.733 329.202,112.205 330.62,112.205 C332.157,112.205 333.161,111.762 333.635,110.876 C334.107,109.99 334.402,108.306 334.52,105.824 L334.52,73.0306 L353.665,73.0306 Z"/><path d="M152.208,107.242 L152.208,23.2209 C152.208,15.0666 150.17,9.39493 146.093,6.20378 C142.016,3.0126 136.314,1.41807 128.987,1.41807 L105.766,1.41807 L105.766,129.045 L128.456,129.045 C135.664,129.045 141.425,127.449 145.738,124.259 C150.052,121.068 152.208,115.395 152.208,107.242 Z M132.71,105.468 C132.71,107.596 132.296,109.22 131.469,110.343 C130.642,111.466 129.401,112.027 127.747,112.027 L124.91,112.027 L124.91,17.5471 L127.747,17.5471 C129.401,17.5471 130.642,17.9906 131.469,18.8766 C132.296,19.7626 132.71,21.388 132.71,23.751 L132.71,105.468 Z"/><polygon fill-rule="nonzero" points="38.11 129.045 55.127 129.045 55.127 1.418 40.769 1.418 27.474 54.773 14.181 1.418 0 1.418 0 129.045 17.017 129.045 17.017 75.691 13.826 45.556 15.244 53.532 25.88 92.707 29.247 92.707 39.883 53.355 41.479 44.669 38.11 75.158"/><polygon fill-rule="nonzero" points="64.385 129.045 99.483 129.045 99.483 110.432 83.175 110.432 83.175 73.74 97.887 73.74 97.887 55.305 83.175 55.305 83.175 19.676 99.128 19.676 99.128 1.418 64.385 1.418"/><polygon fill-rule="nonzero" points="200.865 129.901 215.046 129.901 215.046 2.274 198.029 2.274 198.029 55.628 201.219 85.763 199.802 77.787 189.166 38.612 185.797 38.612 175.162 77.963 173.567 86.65 176.934 56.16 176.934 2.274 159.918 2.274 159.918 129.901 174.275 129.901 187.57 76.546"/><path d="M268.045,129.045 L252.623,1.41808 L233.124,1.41808 L218.412,129.045 L236.847,129.045 L237.734,116.814 L248.368,116.814 L249.432,129.045 L268.045,129.045 Z M246.952,99.9745 L239.152,99.9745 L241.987,62.9275 L243.052,40.0613 L243.938,62.9275 L246.952,99.9745 Z"/><polygon fill-rule="nonzero" points="292.508 19.676 304.03 19.676 304.03 1.418 262.197 1.418 262.197 19.676 273.541 19.676 273.541 129.045 292.508 129.045"/><polygon fill-rule="nonzero" points="387.168 129.045 406.312 129.045 406.312 1.418 387.168 1.418 387.168 55.482 379.369 55.482 379.369 1.418 360.225 1.418 360.225 129.045 379.369 129.045 379.369 73.563 387.168 73.563"/><polygon fill-rule="nonzero" points="159.839 135.27 406.364 135.27 406.364 150.337 159.839 150.337"/></g></svg>
\ No newline at end of file
diff --git a/packages/ui/assets/img/logo/partner_perspectiveDaily.png b/packages/ui/assets/img/logo/partner_perspectiveDaily.png
new file mode 100644
index 0000000000000000000000000000000000000000..b6d2ad65a5126eb0829ce69ea37cff0288a40981
Binary files /dev/null and b/packages/ui/assets/img/logo/partner_perspectiveDaily.png differ
diff --git a/packages/ui/assets/img/logo/partner_piqd.svg b/packages/ui/assets/img/logo/partner_piqd.svg
deleted file mode 100644
index a8c5f832164e0311baade91543ef61bcb2104276..0000000000000000000000000000000000000000
--- a/packages/ui/assets/img/logo/partner_piqd.svg
+++ /dev/null
@@ -1,12 +0,0 @@
-<svg viewBox="0 0 84 60" xmlns="http://www.w3.org/2000/svg" color="#0d8faf">
-    <defs>
-        <mask id="mask">
-            <rect fill="white" height="100%" width="100%" />
-            <path d="M70.915,35.345H69.66c-2.025,0-3.669,1.641-3.669,3.667v6.149c0,2.024,1.642,3.665,3.669,3.665h1.255 c2.024,0,3.669-1.639,3.669-3.665v-6.149C74.584,36.985,72.941,35.345,70.915,35.345z M47.25,35.345h-1.252 c-2.024,0-3.669,1.641-3.669,3.667v6.149c0,2.024,1.645,3.665,3.669,3.665h1.252c2.028,0,3.676-1.639,3.676-3.665v-6.149 C50.926,36.985,49.279,35.345,47.25,35.345z M84,0v84H0V0H84z M23.696,39.8c0-3.03-0.857-5.499-2.568-7.402 c-1.713-1.904-4.208-2.855-7.487-2.855c-1.55,0-2.907,0.308-4.068,0.837l-0.317-0.322H3.733v34.86l5.817-1.162V53.705 c0.132,0,0.354,0.087,0.831,0.263c0.475,0.179,0.966,0.299,1.459,0.372s1.165,0.106,2.013,0.106c2.96,0,5.344-0.854,7.142-2.567 c1.798-1.707,2.701-4.165,2.701-7.375L23.696,39.8L23.696,39.8z M33.21,30.058h-5.817v24.454h5.817V30.058z M33.471,22.774 c0-0.811-0.308-1.524-0.925-2.14c-0.619-0.618-1.332-0.929-2.142-0.929c-0.846,0-1.586,0.31-2.22,0.929 c-0.636,0.616-0.953,1.329-0.953,2.14c0,0.845,0.317,1.587,0.953,2.221c0.634,0.635,1.375,0.953,2.22,0.953 c0.81,0,1.522-0.317,2.142-0.953C33.163,24.361,33.471,23.619,33.471,22.774z M56.734,30.058h-5.388l-0.372,0.48 c-0.104-0.035-0.326-0.147-0.654-0.287c-0.342-0.14-0.619-0.266-0.848-0.354c-0.233-0.09-0.584-0.176-1.058-0.248 c-0.479-0.066-1-0.105-1.562-0.105c-3.277,0-5.786,0.959-7.497,2.883c-1.711,1.918-2.578,4.394-2.578,7.425v4.652 c0,3.21,0.911,5.668,2.708,7.375c1.797,1.716,4.185,2.569,7.144,2.569c0.636,0,1.227-0.035,1.781-0.11 c0.545-0.067,0.939-0.141,1.184-0.209c0.248-0.07,0.496-0.162,0.798-0.266c0.298-0.107,0.53-0.174,0.53-0.211v10.104l5.811,1.16 V30.058L56.734,30.058z M80.268,19.082l-5.817,1.167v10.045c0,0-0.313-0.089-0.79-0.268c-0.477-0.174-0.951-0.298-1.444-0.371 c-0.493-0.066-1.155-0.104-2.001-0.104c-2.961,0-5.312,0.854-7.106,2.565c-1.8,1.709-2.668,4.167-2.668,7.375v4.705 c0,3.03,0.827,5.498,2.535,7.406c1.715,1.901,4.192,2.854,7.469,2.854c1.554,0,2.903-0.229,4.065-0.755l0.314,0.407h5.443V19.082z"
-                  fill="black" transform="translate(0, -12)" />
-        </mask>
-    </defs>
-    <g mask="url(#mask)">
-        <rect fill="currentColor" height="58" width="82" x="1" y="1" />
-    </g>
-</svg>
\ No newline at end of file
diff --git a/packages/ui/assets/img/logo/partner_salon5.png b/packages/ui/assets/img/logo/partner_salon5.png
new file mode 100644
index 0000000000000000000000000000000000000000..6138344cf14db83c817c8d190fac2b0c14328743
Binary files /dev/null and b/packages/ui/assets/img/logo/partner_salon5.png differ
diff --git a/packages/ui/assets/img/logo/partner_vetoMagazin.png b/packages/ui/assets/img/logo/partner_vetoMagazin.png
new file mode 100644
index 0000000000000000000000000000000000000000..698709dc8fbea91b3439c62c3cac35e53d23313b
Binary files /dev/null and b/packages/ui/assets/img/logo/partner_vetoMagazin.png differ
diff --git a/packages/ui/components/molecules/__tests__/__snapshots__/HoliButtonBell.test.tsx.snap b/packages/ui/components/molecules/__tests__/__snapshots__/HoliButtonBell.test.tsx.snap
index e3119190ec78bc665a879150ba3e6e369d14e08b..c0c17302ec3f56cb43f21d69089ae3a59a5568c9 100644
--- a/packages/ui/components/molecules/__tests__/__snapshots__/HoliButtonBell.test.tsx.snap
+++ b/packages/ui/components/molecules/__tests__/__snapshots__/HoliButtonBell.test.tsx.snap
@@ -46,6 +46,7 @@ exports[`React tree renders correctly with new notifications badge 1`] = `
     onResponderTerminate={[Function]}
     onResponderTerminationRequest={[Function]}
     onStartShouldSetResponder={[Function]}
+    style={false}
     testID="bell-button"
   >
     <View
@@ -186,6 +187,7 @@ exports[`React tree renders without new notifications badge 1`] = `
     onResponderTerminate={[Function]}
     onResponderTerminationRequest={[Function]}
     onStartShouldSetResponder={[Function]}
+    style={false}
     testID="bell-button"
   >
     <View
diff --git a/packages/ui/components/organisms/HoliRichTextOutput.tsx b/packages/ui/components/organisms/HoliRichTextOutput.tsx
index 146067f7af8ee97f54c019849bd6b55444a87202..cb613d6c69ada1978935cdfd6bbcacbefa7bf620 100644
--- a/packages/ui/components/organisms/HoliRichTextOutput.tsx
+++ b/packages/ui/components/organisms/HoliRichTextOutput.tsx
@@ -1,11 +1,11 @@
 import { Text } from 'holi-bricks/components/text'
 import React from 'react'
-import { Platform, StyleProp, TextStyle, ViewStyle } from 'react-native'
+import { Platform, type StyleProp, type TextStyle, type ViewStyle } from 'react-native'
 
-import { User } from '@holi/core/domain/shared/types'
+import type { User } from '@holi/core/domain/shared/types'
 import { createUUID } from '@holi/core/helpers/strings'
 import { HoliTextLink } from '@holi/core/navigation/components/HoliTextLink'
-import { Link } from '@holi/core/screens/posts/types'
+import type { Link } from '@holi/core/screens/posts/types'
 import HoliText from '@holi/ui/components/atoms/HoliText'
 import type { HoliTextProps } from '@holi/ui/components/atoms/HoliText'
 import { REGEX_URL, REGEX_USER_MENTIONS, ensureProtocolPrefix, isValidUrl } from '@holi/ui/helper/richText'
@@ -62,7 +62,7 @@ const HoliRichTextOutput = ({
               href={`/profile/${user.id}`}
               key={index}
               size={linkSize}
-              variant="special"
+              color="informative"
             >
               {mentionPrefix}
               {replaced}
@@ -105,7 +105,7 @@ const HoliRichTextOutput = ({
               size={linkSize}
               key={link.requestedUrl}
               external={isExternalLink(link.requestedUrl)}
-              variant="special"
+              color="informative"
             >
               {link.title}
             </HoliTextLink>
diff --git a/packages/ui/components/organisms/HoliStepperV2/ProgressBar.tsx b/packages/ui/components/organisms/HoliStepperV2/ProgressBar.tsx
index cc6a6b88ab07b4649d39ff63c488dcfb73ea49e1..b801bdb6a6665ee678401043cafffe201cad4fac 100644
--- a/packages/ui/components/organisms/HoliStepperV2/ProgressBar.tsx
+++ b/packages/ui/components/organisms/HoliStepperV2/ProgressBar.tsx
@@ -31,7 +31,7 @@ export const ProgressBar = ({
       <HoliProgressBar percentage={percentage} />
 
       <View style={styles.stepCounter}>
-        <Text size="xs" variant="secondary">
+        <Text size="xs" color="support">
           {t('wizard.stepsCount', { current: currentStep + 1, total: totalCount })}
         </Text>
 
@@ -44,7 +44,7 @@ export const ProgressBar = ({
             onPress={onSkipPress}
             testID={`${testID}-skip-btn`}
           >
-            <Text size="xs" variant="secondary">
+            <Text size="xs" color="support">
               {t('global.skip')}
             </Text>
           </HoliButton>
diff --git a/terraform/environments/deployment.tf b/terraform/environments/deployment.tf
index 8d899b6c2a4e5717b93eddefdd15e2e8aa089fd1..63b9a48c6cda48be99fbc11fcc71888853724284 100644
--- a/terraform/environments/deployment.tf
+++ b/terraform/environments/deployment.tf
@@ -133,13 +133,23 @@ resource "google_cloud_run_service" "mvp_web" {
             memory = local.environment == "production" ? "1024Mi" : "1024Mi"
           }
         }
+
         startup_probe {
           initial_delay_seconds = 30
           period_seconds        = 5
           timeout_seconds       = 5
           failure_threshold     = 10
           http_get {
-            path = "/"
+            path = "/api/health"
+          }
+        }
+
+        liveness_probe {
+          period_seconds        = 15
+          timeout_seconds       = 10
+          failure_threshold     = 3
+          http_get {
+            path = "/api/health"
           }
         }
       }
@@ -148,7 +158,7 @@ resource "google_cloud_run_service" "mvp_web" {
     metadata {
       annotations = {
         "autoscaling.knative.dev/minScale"         = lookup(local.service_min_scale, local.environment, "0")
-        "autoscaling.knative.dev/maxScale"         = lookup(local.service_min_scale, local.environment, "2")
+        "autoscaling.knative.dev/maxScale"         = lookup(local.service_max_scale, local.environment, "2")
         "run.googleapis.com/execution-environment" = "gen1"
         "run.googleapis.com/startup-cpu-boost"     = "true"
       }
diff --git a/yarn.lock b/yarn.lock
index bb5d3f72804af0bc01b1d25d4a130760ce7b8342..75c0c3c68a5527e8e5470ad419d8b23481df0278 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -7042,17 +7042,17 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@next/env@npm:14.2.22":
-  version: 14.2.22
-  resolution: "@next/env@npm:14.2.22"
-  checksum: 10c0/1e7ffe24fab21fd242892bc272f9e88697db2fb220245ef52e7d9410b79d5b7c04b965e97df154ce622f7bb257e6b6c594a02da9d6337b86b74eac1886da913f
+"@next/env@npm:14.2.23":
+  version: 14.2.23
+  resolution: "@next/env@npm:14.2.23"
+  checksum: 10c0/00313ffbfa0ca990ec53a24ff007a114db95064034370f97ffa5733ca41d288e0d3b140e070bd07073db4da922a1ab93df84651cc61fc495572d7cdc65c10329
   languageName: node
   linkType: hard
 
-"@next/env@npm:15.1.3":
-  version: 15.1.3
-  resolution: "@next/env@npm:15.1.3"
-  checksum: 10c0/873e7977fe2a4d087f41fa2f9dff957111b88d59631437ab6fc13a11eb6d4ef59aa8109ca80f978389956e4b75b033ff8f68e05e96ce8d9fdcfa977dc90363ae
+"@next/env@npm:15.1.5":
+  version: 15.1.5
+  resolution: "@next/env@npm:15.1.5"
+  checksum: 10c0/bf6b8d6d87a88b6f8eba40d69192d2bde6d6ecee9dfcc779b383bf87c4efbf1de67b468a5b652225c32725192a644ac5175f51604f58ed094a2ef8e8c0f7a803
   languageName: node
   linkType: hard
 
@@ -7065,121 +7065,121 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@next/swc-darwin-arm64@npm:14.2.22":
-  version: 14.2.22
-  resolution: "@next/swc-darwin-arm64@npm:14.2.22"
+"@next/swc-darwin-arm64@npm:14.2.23":
+  version: 14.2.23
+  resolution: "@next/swc-darwin-arm64@npm:14.2.23"
   conditions: os=darwin & cpu=arm64
   languageName: node
   linkType: hard
 
-"@next/swc-darwin-arm64@npm:15.1.3":
-  version: 15.1.3
-  resolution: "@next/swc-darwin-arm64@npm:15.1.3"
+"@next/swc-darwin-arm64@npm:15.1.5":
+  version: 15.1.5
+  resolution: "@next/swc-darwin-arm64@npm:15.1.5"
   conditions: os=darwin & cpu=arm64
   languageName: node
   linkType: hard
 
-"@next/swc-darwin-x64@npm:14.2.22":
-  version: 14.2.22
-  resolution: "@next/swc-darwin-x64@npm:14.2.22"
+"@next/swc-darwin-x64@npm:14.2.23":
+  version: 14.2.23
+  resolution: "@next/swc-darwin-x64@npm:14.2.23"
   conditions: os=darwin & cpu=x64
   languageName: node
   linkType: hard
 
-"@next/swc-darwin-x64@npm:15.1.3":
-  version: 15.1.3
-  resolution: "@next/swc-darwin-x64@npm:15.1.3"
+"@next/swc-darwin-x64@npm:15.1.5":
+  version: 15.1.5
+  resolution: "@next/swc-darwin-x64@npm:15.1.5"
   conditions: os=darwin & cpu=x64
   languageName: node
   linkType: hard
 
-"@next/swc-linux-arm64-gnu@npm:14.2.22":
-  version: 14.2.22
-  resolution: "@next/swc-linux-arm64-gnu@npm:14.2.22"
+"@next/swc-linux-arm64-gnu@npm:14.2.23":
+  version: 14.2.23
+  resolution: "@next/swc-linux-arm64-gnu@npm:14.2.23"
   conditions: os=linux & cpu=arm64 & libc=glibc
   languageName: node
   linkType: hard
 
-"@next/swc-linux-arm64-gnu@npm:15.1.3":
-  version: 15.1.3
-  resolution: "@next/swc-linux-arm64-gnu@npm:15.1.3"
+"@next/swc-linux-arm64-gnu@npm:15.1.5":
+  version: 15.1.5
+  resolution: "@next/swc-linux-arm64-gnu@npm:15.1.5"
   conditions: os=linux & cpu=arm64 & libc=glibc
   languageName: node
   linkType: hard
 
-"@next/swc-linux-arm64-musl@npm:14.2.22":
-  version: 14.2.22
-  resolution: "@next/swc-linux-arm64-musl@npm:14.2.22"
+"@next/swc-linux-arm64-musl@npm:14.2.23":
+  version: 14.2.23
+  resolution: "@next/swc-linux-arm64-musl@npm:14.2.23"
   conditions: os=linux & cpu=arm64 & libc=musl
   languageName: node
   linkType: hard
 
-"@next/swc-linux-arm64-musl@npm:15.1.3":
-  version: 15.1.3
-  resolution: "@next/swc-linux-arm64-musl@npm:15.1.3"
+"@next/swc-linux-arm64-musl@npm:15.1.5":
+  version: 15.1.5
+  resolution: "@next/swc-linux-arm64-musl@npm:15.1.5"
   conditions: os=linux & cpu=arm64 & libc=musl
   languageName: node
   linkType: hard
 
-"@next/swc-linux-x64-gnu@npm:14.2.22":
-  version: 14.2.22
-  resolution: "@next/swc-linux-x64-gnu@npm:14.2.22"
+"@next/swc-linux-x64-gnu@npm:14.2.23":
+  version: 14.2.23
+  resolution: "@next/swc-linux-x64-gnu@npm:14.2.23"
   conditions: os=linux & cpu=x64 & libc=glibc
   languageName: node
   linkType: hard
 
-"@next/swc-linux-x64-gnu@npm:15.1.3":
-  version: 15.1.3
-  resolution: "@next/swc-linux-x64-gnu@npm:15.1.3"
+"@next/swc-linux-x64-gnu@npm:15.1.5":
+  version: 15.1.5
+  resolution: "@next/swc-linux-x64-gnu@npm:15.1.5"
   conditions: os=linux & cpu=x64 & libc=glibc
   languageName: node
   linkType: hard
 
-"@next/swc-linux-x64-musl@npm:14.2.22":
-  version: 14.2.22
-  resolution: "@next/swc-linux-x64-musl@npm:14.2.22"
+"@next/swc-linux-x64-musl@npm:14.2.23":
+  version: 14.2.23
+  resolution: "@next/swc-linux-x64-musl@npm:14.2.23"
   conditions: os=linux & cpu=x64 & libc=musl
   languageName: node
   linkType: hard
 
-"@next/swc-linux-x64-musl@npm:15.1.3":
-  version: 15.1.3
-  resolution: "@next/swc-linux-x64-musl@npm:15.1.3"
+"@next/swc-linux-x64-musl@npm:15.1.5":
+  version: 15.1.5
+  resolution: "@next/swc-linux-x64-musl@npm:15.1.5"
   conditions: os=linux & cpu=x64 & libc=musl
   languageName: node
   linkType: hard
 
-"@next/swc-win32-arm64-msvc@npm:14.2.22":
-  version: 14.2.22
-  resolution: "@next/swc-win32-arm64-msvc@npm:14.2.22"
+"@next/swc-win32-arm64-msvc@npm:14.2.23":
+  version: 14.2.23
+  resolution: "@next/swc-win32-arm64-msvc@npm:14.2.23"
   conditions: os=win32 & cpu=arm64
   languageName: node
   linkType: hard
 
-"@next/swc-win32-arm64-msvc@npm:15.1.3":
-  version: 15.1.3
-  resolution: "@next/swc-win32-arm64-msvc@npm:15.1.3"
+"@next/swc-win32-arm64-msvc@npm:15.1.5":
+  version: 15.1.5
+  resolution: "@next/swc-win32-arm64-msvc@npm:15.1.5"
   conditions: os=win32 & cpu=arm64
   languageName: node
   linkType: hard
 
-"@next/swc-win32-ia32-msvc@npm:14.2.22":
-  version: 14.2.22
-  resolution: "@next/swc-win32-ia32-msvc@npm:14.2.22"
+"@next/swc-win32-ia32-msvc@npm:14.2.23":
+  version: 14.2.23
+  resolution: "@next/swc-win32-ia32-msvc@npm:14.2.23"
   conditions: os=win32 & cpu=ia32
   languageName: node
   linkType: hard
 
-"@next/swc-win32-x64-msvc@npm:14.2.22":
-  version: 14.2.22
-  resolution: "@next/swc-win32-x64-msvc@npm:14.2.22"
+"@next/swc-win32-x64-msvc@npm:14.2.23":
+  version: 14.2.23
+  resolution: "@next/swc-win32-x64-msvc@npm:14.2.23"
   conditions: os=win32 & cpu=x64
   languageName: node
   linkType: hard
 
-"@next/swc-win32-x64-msvc@npm:15.1.3":
-  version: 15.1.3
-  resolution: "@next/swc-win32-x64-msvc@npm:15.1.3"
+"@next/swc-win32-x64-msvc@npm:15.1.5":
+  version: 15.1.5
+  resolution: "@next/swc-win32-x64-msvc@npm:15.1.5"
   conditions: os=win32 & cpu=x64
   languageName: node
   linkType: hard
@@ -25419,8 +25419,8 @@ __metadata:
   linkType: hard
 
 "matrix-js-sdk@npm:^34.9.0":
-  version: 34.9.0
-  resolution: "matrix-js-sdk@npm:34.9.0"
+  version: 34.13.0
+  resolution: "matrix-js-sdk@npm:34.13.0"
   dependencies:
     "@babel/runtime": "npm:^7.12.5"
     "@matrix-org/matrix-sdk-crypto-wasm": "npm:^9.0.0"
@@ -25431,23 +25431,23 @@ __metadata:
     jwt-decode: "npm:^4.0.0"
     loglevel: "npm:^1.7.1"
     matrix-events-sdk: "npm:0.0.1"
-    matrix-widget-api: "npm:^1.8.2"
+    matrix-widget-api: "npm:^1.10.0"
     oidc-client-ts: "npm:^3.0.1"
     p-retry: "npm:4"
     sdp-transform: "npm:^2.14.1"
     unhomoglyph: "npm:^1.0.6"
-    uuid: "npm:10"
-  checksum: 10c0/636ee25d78a20be07bb8b9836e751559497a3a5dd3bf85f0e7ad56a55aaa2f03efbd234ad871e1c39de6fcf10ba947fc02d523ef904b85394c5165d60d47a7ab
+    uuid: "npm:11"
+  checksum: 10c0/cd94e73b06fcf527a37c847e8c97847b941964ee8f5222a7a0c274fa216f8dddfed59daf8d52feaf4ba69bdbfcb15c92f20f8626fe902ea6774294c604899281
   languageName: node
   linkType: hard
 
-"matrix-widget-api@npm:^1.8.2":
-  version: 1.9.0
-  resolution: "matrix-widget-api@npm:1.9.0"
+"matrix-widget-api@npm:^1.10.0":
+  version: 1.11.0
+  resolution: "matrix-widget-api@npm:1.11.0"
   dependencies:
     "@types/events": "npm:^3.0.0"
     events: "npm:^3.2.0"
-  checksum: 10c0/7bce9201926db11ab1b402e635052c1dafdecb9f66befc32225cd927da9721bd1a089e84cec04aae19f420949888dcefa233367a62d500ae45d4f0ee78eea9f9
+  checksum: 10c0/ac35ed8fb2b5df6d186beb64b5faf907ec113d708ad8353bdd8f9196fb3da255561b8807e2e845f39d4cf7ae6af36f90b54c230a0a100556ac7ebd8f18bee848
   languageName: node
   linkType: hard
 
@@ -26474,18 +26474,18 @@ __metadata:
   linkType: hard
 
 "next@npm:>=12.0.10":
-  version: 15.1.3
-  resolution: "next@npm:15.1.3"
-  dependencies:
-    "@next/env": "npm:15.1.3"
-    "@next/swc-darwin-arm64": "npm:15.1.3"
-    "@next/swc-darwin-x64": "npm:15.1.3"
-    "@next/swc-linux-arm64-gnu": "npm:15.1.3"
-    "@next/swc-linux-arm64-musl": "npm:15.1.3"
-    "@next/swc-linux-x64-gnu": "npm:15.1.3"
-    "@next/swc-linux-x64-musl": "npm:15.1.3"
-    "@next/swc-win32-arm64-msvc": "npm:15.1.3"
-    "@next/swc-win32-x64-msvc": "npm:15.1.3"
+  version: 15.1.5
+  resolution: "next@npm:15.1.5"
+  dependencies:
+    "@next/env": "npm:15.1.5"
+    "@next/swc-darwin-arm64": "npm:15.1.5"
+    "@next/swc-darwin-x64": "npm:15.1.5"
+    "@next/swc-linux-arm64-gnu": "npm:15.1.5"
+    "@next/swc-linux-arm64-musl": "npm:15.1.5"
+    "@next/swc-linux-x64-gnu": "npm:15.1.5"
+    "@next/swc-linux-x64-musl": "npm:15.1.5"
+    "@next/swc-win32-arm64-msvc": "npm:15.1.5"
+    "@next/swc-win32-x64-msvc": "npm:15.1.5"
     "@swc/counter": "npm:0.1.3"
     "@swc/helpers": "npm:0.5.15"
     busboy: "npm:1.6.0"
@@ -26530,24 +26530,24 @@ __metadata:
       optional: true
   bin:
     next: dist/bin/next
-  checksum: 10c0/3450a2277057c74de9bda5390796e7971afb5c7725af8fce43045b4f5d4e4a5752a14a2fa7f78ad4eab523a11c6b147893038f607a9d87a8f7f7bdcd560245b5
+  checksum: 10c0/13e0001dfb1b36a191fc5cf12ff73b8b472a0271460609be948371ef8fa865873753801823a751aca785f2eb626ac5e6ae38e961d3e1c45237e40d92d5335637
   languageName: node
   linkType: hard
 
 "next@npm:^14.2.7":
-  version: 14.2.22
-  resolution: "next@npm:14.2.22"
-  dependencies:
-    "@next/env": "npm:14.2.22"
-    "@next/swc-darwin-arm64": "npm:14.2.22"
-    "@next/swc-darwin-x64": "npm:14.2.22"
-    "@next/swc-linux-arm64-gnu": "npm:14.2.22"
-    "@next/swc-linux-arm64-musl": "npm:14.2.22"
-    "@next/swc-linux-x64-gnu": "npm:14.2.22"
-    "@next/swc-linux-x64-musl": "npm:14.2.22"
-    "@next/swc-win32-arm64-msvc": "npm:14.2.22"
-    "@next/swc-win32-ia32-msvc": "npm:14.2.22"
-    "@next/swc-win32-x64-msvc": "npm:14.2.22"
+  version: 14.2.23
+  resolution: "next@npm:14.2.23"
+  dependencies:
+    "@next/env": "npm:14.2.23"
+    "@next/swc-darwin-arm64": "npm:14.2.23"
+    "@next/swc-darwin-x64": "npm:14.2.23"
+    "@next/swc-linux-arm64-gnu": "npm:14.2.23"
+    "@next/swc-linux-arm64-musl": "npm:14.2.23"
+    "@next/swc-linux-x64-gnu": "npm:14.2.23"
+    "@next/swc-linux-x64-musl": "npm:14.2.23"
+    "@next/swc-win32-arm64-msvc": "npm:14.2.23"
+    "@next/swc-win32-ia32-msvc": "npm:14.2.23"
+    "@next/swc-win32-x64-msvc": "npm:14.2.23"
     "@swc/helpers": "npm:0.5.5"
     busboy: "npm:1.6.0"
     caniuse-lite: "npm:^1.0.30001579"
@@ -26588,7 +26588,7 @@ __metadata:
       optional: true
   bin:
     next: dist/bin/next
-  checksum: 10c0/ea81b8a04a93a1d4d9cee859537298ab8f8e72a09f4fc487c2439617134ec9b1151338c2065118b04d5840df8ea405d73877c7abe97b75ba38593f73aa550c9e
+  checksum: 10c0/76eb77263f6c8064fe01d7652dc4a877a265ddc4d34e57196361c9266488a9c0c0cd5428ec3496593a09face78e5f9b6ec556c8a4bc1a01194b3ba5f1aca1a4b
   languageName: node
   linkType: hard
 
@@ -34060,12 +34060,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"uuid@npm:10":
-  version: 10.0.0
-  resolution: "uuid@npm:10.0.0"
+"uuid@npm:11":
+  version: 11.0.5
+  resolution: "uuid@npm:11.0.5"
   bin:
-    uuid: dist/bin/uuid
-  checksum: 10c0/eab18c27fe4ab9fb9709a5d5f40119b45f2ec8314f8d4cf12ce27e4c6f4ffa4a6321dc7db6c515068fa373c075b49691ba969f0010bf37f44c37ca40cd6bf7fe
+    uuid: dist/esm/bin/uuid
+  checksum: 10c0/6f59f0c605e02c14515401084ca124b9cb462b4dcac866916a49862bcf831874508a308588c23a7718269226ad11a92da29b39d761ad2b86e736623e3a33b6e7
   languageName: node
   linkType: hard