(
const payload = {
...rest,
+ ...conditional(
+ EnvSet.values.isCloud &&
+ EnvSet.values.isDevFeaturesEnabled &&
+ hideLogtoBranding !== undefined && { hideLogtoBranding }
+ ),
...conditional(
filteredSocialSignInConnectorTargets && {
socialSignInConnectorTargets: filteredSocialSignInConnectorTargets,
diff --git a/packages/experience/src/Layout/AppLayout/index.tsx b/packages/experience/src/Layout/AppLayout/index.tsx
index 3762440163be..51b1346a7419 100644
--- a/packages/experience/src/Layout/AppLayout/index.tsx
+++ b/packages/experience/src/Layout/AppLayout/index.tsx
@@ -1,6 +1,8 @@
import classNames from 'classnames';
+import { useContext } from 'react';
import { Outlet } from 'react-router-dom';
+import PageContext from '@/Providers/PageContextProvider/PageContext';
import LogtoSignature from '@/components/LogtoSignature';
import usePlatform from '@/hooks/use-platform';
import { layoutClassNames } from '@/utils/consts';
@@ -9,7 +11,9 @@ import CustomContent from './CustomContent';
import styles from './index.module.scss';
const AppLayout = () => {
+ const { experienceSettings } = useContext(PageContext);
const { isMobile } = usePlatform();
+ const hideLogtoBranding = experienceSettings?.hideLogtoBranding === true;
return (
@@ -17,7 +21,9 @@ const AppLayout = () => {
{!isMobile && }
-
+ {!hideLogtoBranding && (
+
+ )}
diff --git a/packages/experience/src/__mocks__/logto.tsx b/packages/experience/src/__mocks__/logto.tsx
index 2791d2d55199..fc4132ade36f 100644
--- a/packages/experience/src/__mocks__/logto.tsx
+++ b/packages/experience/src/__mocks__/logto.tsx
@@ -121,6 +121,7 @@ export const mockSignInExperience: SignInExperience = {
sentinelPolicy: {},
emailBlocklistPolicy: {},
forgotPasswordMethods: [],
+ hideLogtoBranding: false,
};
export const mockSignInExperienceSettings: SignInExperienceResponse = {
@@ -131,6 +132,7 @@ export const mockSignInExperienceSettings: SignInExperienceResponse = {
termsOfUseUrl: mockSignInExperience.termsOfUseUrl,
privacyPolicyUrl: mockSignInExperience.privacyPolicyUrl,
languageInfo: mockSignInExperience.languageInfo,
+ hideLogtoBranding: false,
signIn: mockSignInExperience.signIn,
signUp: {
identifiers: [SignInIdentifier.Username],
diff --git a/packages/phrases/src/locales/ar/translation/admin-console/sign-in-exp/index.ts b/packages/phrases/src/locales/ar/translation/admin-console/sign-in-exp/index.ts
index f1aa7643c48d..745408654b44 100644
--- a/packages/phrases/src/locales/ar/translation/admin-console/sign-in-exp/index.ts
+++ b/packages/phrases/src/locales/ar/translation/admin-console/sign-in-exp/index.ts
@@ -40,6 +40,9 @@ const sign_in_exp = {
app_logo_and_favicon: 'شعار التطبيق ورمز الموقع',
company_logo_and_favicon: 'شعار الشركة ورمز الموقع',
organization_logo_and_favicon: 'شعار المنظمة ورمز الموقع',
+ hide_logto_branding: 'Hide Logto branding',
+ hide_logto_branding_description:
+ 'Remove "Powered by Logto". Spotlight your brand exclusively with a clean, professional sign-in experience.',
},
branding_uploads: {
app_logo: {
diff --git a/packages/phrases/src/locales/de/translation/admin-console/sign-in-exp/index.ts b/packages/phrases/src/locales/de/translation/admin-console/sign-in-exp/index.ts
index 557e405e8033..6403a548b6f4 100644
--- a/packages/phrases/src/locales/de/translation/admin-console/sign-in-exp/index.ts
+++ b/packages/phrases/src/locales/de/translation/admin-console/sign-in-exp/index.ts
@@ -42,6 +42,9 @@ const sign_in_exp = {
app_logo_and_favicon: 'App-Logo und Favicon',
company_logo_and_favicon: 'Firmenlogo und Favicon',
organization_logo_and_favicon: 'Organisationslogo und Favicon',
+ hide_logto_branding: 'Hide Logto branding',
+ hide_logto_branding_description:
+ 'Remove "Powered by Logto". Spotlight your brand exclusively with a clean, professional sign-in experience.',
},
branding_uploads: {
app_logo: {
diff --git a/packages/phrases/src/locales/en/translation/admin-console/sign-in-exp/index.ts b/packages/phrases/src/locales/en/translation/admin-console/sign-in-exp/index.ts
index 56ec647cd01a..a9c4c670b133 100644
--- a/packages/phrases/src/locales/en/translation/admin-console/sign-in-exp/index.ts
+++ b/packages/phrases/src/locales/en/translation/admin-console/sign-in-exp/index.ts
@@ -42,6 +42,9 @@ const sign_in_exp = {
app_logo_and_favicon: 'App logo and favicon',
company_logo_and_favicon: 'Company logo and favicon',
organization_logo_and_favicon: 'Organization logo and favicon',
+ hide_logto_branding: 'Hide Logto branding',
+ hide_logto_branding_description:
+ 'Remove "Powered by Logto". Spotlight your brand exclusively with a clean, professional sign-in experience.',
},
branding_uploads: {
app_logo: {
diff --git a/packages/phrases/src/locales/es/translation/admin-console/sign-in-exp/index.ts b/packages/phrases/src/locales/es/translation/admin-console/sign-in-exp/index.ts
index 139408505e01..8002cee81c87 100644
--- a/packages/phrases/src/locales/es/translation/admin-console/sign-in-exp/index.ts
+++ b/packages/phrases/src/locales/es/translation/admin-console/sign-in-exp/index.ts
@@ -43,6 +43,9 @@ const sign_in_exp = {
app_logo_and_favicon: 'Logotipo y favicon de la aplicación',
company_logo_and_favicon: 'Logotipo y favicon de la empresa',
organization_logo_and_favicon: 'Logotipo y favicon de la organización',
+ hide_logto_branding: 'Hide Logto branding',
+ hide_logto_branding_description:
+ 'Remove "Powered by Logto". Spotlight your brand exclusively with a clean, professional sign-in experience.',
},
branding_uploads: {
app_logo: {
diff --git a/packages/phrases/src/locales/fr/translation/admin-console/sign-in-exp/index.ts b/packages/phrases/src/locales/fr/translation/admin-console/sign-in-exp/index.ts
index 7c0dd2074755..7df705a339fe 100644
--- a/packages/phrases/src/locales/fr/translation/admin-console/sign-in-exp/index.ts
+++ b/packages/phrases/src/locales/fr/translation/admin-console/sign-in-exp/index.ts
@@ -43,6 +43,9 @@ const sign_in_exp = {
app_logo_and_favicon: "Logo de l'app et favicon",
company_logo_and_favicon: 'Logo de la société et favicon',
organization_logo_and_favicon: "Logo de l'organisation et favicon",
+ hide_logto_branding: 'Hide Logto branding',
+ hide_logto_branding_description:
+ 'Remove "Powered by Logto". Spotlight your brand exclusively with a clean, professional sign-in experience.',
},
branding_uploads: {
app_logo: {
diff --git a/packages/phrases/src/locales/it/translation/admin-console/sign-in-exp/index.ts b/packages/phrases/src/locales/it/translation/admin-console/sign-in-exp/index.ts
index 89af4c0a17e9..c3237dafa146 100644
--- a/packages/phrases/src/locales/it/translation/admin-console/sign-in-exp/index.ts
+++ b/packages/phrases/src/locales/it/translation/admin-console/sign-in-exp/index.ts
@@ -42,6 +42,9 @@ const sign_in_exp = {
app_logo_and_favicon: "Logo dell'app e favicon",
company_logo_and_favicon: 'Logo aziendale e favicon',
organization_logo_and_favicon: "Logo dell'organizzazione e favicon",
+ hide_logto_branding: 'Hide Logto branding',
+ hide_logto_branding_description:
+ 'Remove "Powered by Logto". Spotlight your brand exclusively with a clean, professional sign-in experience.',
},
branding_uploads: {
app_logo: {
diff --git a/packages/phrases/src/locales/ja/translation/admin-console/sign-in-exp/index.ts b/packages/phrases/src/locales/ja/translation/admin-console/sign-in-exp/index.ts
index 30d4b06c5fc8..6eb7b2ab9539 100644
--- a/packages/phrases/src/locales/ja/translation/admin-console/sign-in-exp/index.ts
+++ b/packages/phrases/src/locales/ja/translation/admin-console/sign-in-exp/index.ts
@@ -42,6 +42,9 @@ const sign_in_exp = {
app_logo_and_favicon: 'アプリロゴとファビコン',
company_logo_and_favicon: '企業ロゴとファビコン',
organization_logo_and_favicon: '組織のロゴとファビコン',
+ hide_logto_branding: 'Hide Logto branding',
+ hide_logto_branding_description:
+ 'Remove "Powered by Logto". Spotlight your brand exclusively with a clean, professional sign-in experience.',
},
branding_uploads: {
app_logo: {
diff --git a/packages/phrases/src/locales/ko/translation/admin-console/sign-in-exp/index.ts b/packages/phrases/src/locales/ko/translation/admin-console/sign-in-exp/index.ts
index 7a3daafa819e..9e98dd5297f5 100644
--- a/packages/phrases/src/locales/ko/translation/admin-console/sign-in-exp/index.ts
+++ b/packages/phrases/src/locales/ko/translation/admin-console/sign-in-exp/index.ts
@@ -39,6 +39,9 @@ const sign_in_exp = {
app_logo_and_favicon: '앱 로고 및 파비콘',
company_logo_and_favicon: '회사 로고 및 파비콘',
organization_logo_and_favicon: '조직 로고 및 파비콘',
+ hide_logto_branding: 'Hide Logto branding',
+ hide_logto_branding_description:
+ 'Remove "Powered by Logto". Spotlight your brand exclusively with a clean, professional sign-in experience.',
},
branding_uploads: {
app_logo: {
diff --git a/packages/phrases/src/locales/pl-pl/translation/admin-console/sign-in-exp/index.ts b/packages/phrases/src/locales/pl-pl/translation/admin-console/sign-in-exp/index.ts
index 1c119aa0a6e1..a43099974c7a 100644
--- a/packages/phrases/src/locales/pl-pl/translation/admin-console/sign-in-exp/index.ts
+++ b/packages/phrases/src/locales/pl-pl/translation/admin-console/sign-in-exp/index.ts
@@ -42,6 +42,9 @@ const sign_in_exp = {
app_logo_and_favicon: 'Logo aplikacji i favicon',
company_logo_and_favicon: 'Logo firmy i favicon',
organization_logo_and_favicon: 'Logo organizacji i favicon',
+ hide_logto_branding: 'Hide Logto branding',
+ hide_logto_branding_description:
+ 'Remove "Powered by Logto". Spotlight your brand exclusively with a clean, professional sign-in experience.',
},
branding_uploads: {
app_logo: {
diff --git a/packages/phrases/src/locales/pt-br/translation/admin-console/sign-in-exp/index.ts b/packages/phrases/src/locales/pt-br/translation/admin-console/sign-in-exp/index.ts
index f76672573950..75a44fdd8d9e 100644
--- a/packages/phrases/src/locales/pt-br/translation/admin-console/sign-in-exp/index.ts
+++ b/packages/phrases/src/locales/pt-br/translation/admin-console/sign-in-exp/index.ts
@@ -42,6 +42,9 @@ const sign_in_exp = {
app_logo_and_favicon: 'Logo do aplicativo e favicon',
company_logo_and_favicon: 'Logo da empresa e favicon',
organization_logo_and_favicon: 'Logo da organização e favicon',
+ hide_logto_branding: 'Hide Logto branding',
+ hide_logto_branding_description:
+ 'Remove "Powered by Logto". Spotlight your brand exclusively with a clean, professional sign-in experience.',
},
branding_uploads: {
app_logo: {
diff --git a/packages/phrases/src/locales/pt-pt/translation/admin-console/sign-in-exp/index.ts b/packages/phrases/src/locales/pt-pt/translation/admin-console/sign-in-exp/index.ts
index 64a065108b2c..c895372a8c7c 100644
--- a/packages/phrases/src/locales/pt-pt/translation/admin-console/sign-in-exp/index.ts
+++ b/packages/phrases/src/locales/pt-pt/translation/admin-console/sign-in-exp/index.ts
@@ -41,6 +41,9 @@ const sign_in_exp = {
app_logo_and_favicon: 'Logótipo e favicon do aplicativo',
company_logo_and_favicon: 'Logótipo e favicon da empresa',
organization_logo_and_favicon: 'Logótipo e favicon da organização',
+ hide_logto_branding: 'Hide Logto branding',
+ hide_logto_branding_description:
+ 'Remove "Powered by Logto". Spotlight your brand exclusively with a clean, professional sign-in experience.',
},
branding_uploads: {
app_logo: {
diff --git a/packages/phrases/src/locales/ru/translation/admin-console/sign-in-exp/index.ts b/packages/phrases/src/locales/ru/translation/admin-console/sign-in-exp/index.ts
index 5d73dc0a3fd5..d69dd5ca2d57 100644
--- a/packages/phrases/src/locales/ru/translation/admin-console/sign-in-exp/index.ts
+++ b/packages/phrases/src/locales/ru/translation/admin-console/sign-in-exp/index.ts
@@ -42,6 +42,9 @@ const sign_in_exp = {
app_logo_and_favicon: 'Логотип приложения и иконка',
company_logo_and_favicon: 'Логотип компании и иконка',
organization_logo_and_favicon: 'Логотип организации и иконка',
+ hide_logto_branding: 'Hide Logto branding',
+ hide_logto_branding_description:
+ 'Remove "Powered by Logto". Spotlight your brand exclusively with a clean, professional sign-in experience.',
},
branding_uploads: {
app_logo: {
diff --git a/packages/phrases/src/locales/th/translation/admin-console/sign-in-exp/index.ts b/packages/phrases/src/locales/th/translation/admin-console/sign-in-exp/index.ts
index e0a1243e67bf..241d838beb41 100644
--- a/packages/phrases/src/locales/th/translation/admin-console/sign-in-exp/index.ts
+++ b/packages/phrases/src/locales/th/translation/admin-console/sign-in-exp/index.ts
@@ -41,6 +41,9 @@ const sign_in_exp = {
app_logo_and_favicon: 'โลโก้แอปและ Favicon',
company_logo_and_favicon: 'โลโก้บริษัทและ Favicon',
organization_logo_and_favicon: 'โลโก้องค์กรและ Favicon',
+ hide_logto_branding: 'Hide Logto branding',
+ hide_logto_branding_description:
+ 'Remove "Powered by Logto". Spotlight your brand exclusively with a clean, professional sign-in experience.',
},
branding_uploads: {
app_logo: {
diff --git a/packages/phrases/src/locales/tr-tr/translation/admin-console/sign-in-exp/index.ts b/packages/phrases/src/locales/tr-tr/translation/admin-console/sign-in-exp/index.ts
index 36d6c3960431..fda13c6b1f9d 100644
--- a/packages/phrases/src/locales/tr-tr/translation/admin-console/sign-in-exp/index.ts
+++ b/packages/phrases/src/locales/tr-tr/translation/admin-console/sign-in-exp/index.ts
@@ -42,6 +42,9 @@ const sign_in_exp = {
app_logo_and_favicon: 'Uygulama logosu ve favicon',
company_logo_and_favicon: 'Şirket logosu ve favicon',
organization_logo_and_favicon: 'Organizasyon logosu ve favicon',
+ hide_logto_branding: 'Hide Logto branding',
+ hide_logto_branding_description:
+ 'Remove "Powered by Logto". Spotlight your brand exclusively with a clean, professional sign-in experience.',
},
branding_uploads: {
app_logo: {
diff --git a/packages/phrases/src/locales/zh-cn/translation/admin-console/sign-in-exp/index.ts b/packages/phrases/src/locales/zh-cn/translation/admin-console/sign-in-exp/index.ts
index f76bc273a855..d9079139ea67 100644
--- a/packages/phrases/src/locales/zh-cn/translation/admin-console/sign-in-exp/index.ts
+++ b/packages/phrases/src/locales/zh-cn/translation/admin-console/sign-in-exp/index.ts
@@ -39,6 +39,9 @@ const sign_in_exp = {
app_logo_and_favicon: '应用 logo 和 favicon',
company_logo_and_favicon: '公司 logo 和 favicon',
organization_logo_and_favicon: '组织 logo 和 favicon',
+ hide_logto_branding: 'Hide Logto branding',
+ hide_logto_branding_description:
+ 'Remove "Powered by Logto". Spotlight your brand exclusively with a clean, professional sign-in experience.',
},
branding_uploads: {
app_logo: {
diff --git a/packages/phrases/src/locales/zh-hk/translation/admin-console/sign-in-exp/index.ts b/packages/phrases/src/locales/zh-hk/translation/admin-console/sign-in-exp/index.ts
index 5a02c00ea14b..bb3736a4ea3c 100644
--- a/packages/phrases/src/locales/zh-hk/translation/admin-console/sign-in-exp/index.ts
+++ b/packages/phrases/src/locales/zh-hk/translation/admin-console/sign-in-exp/index.ts
@@ -39,6 +39,9 @@ const sign_in_exp = {
app_logo_and_favicon: '應用程式標誌和圖標',
company_logo_and_favicon: '公司標誌和圖標',
organization_logo_and_favicon: '組織標誌和圖標',
+ hide_logto_branding: 'Hide Logto branding',
+ hide_logto_branding_description:
+ 'Remove "Powered by Logto". Spotlight your brand exclusively with a clean, professional sign-in experience.',
},
branding_uploads: {
app_logo: {
diff --git a/packages/phrases/src/locales/zh-tw/translation/admin-console/sign-in-exp/index.ts b/packages/phrases/src/locales/zh-tw/translation/admin-console/sign-in-exp/index.ts
index 2259f1649f50..277fa085f57a 100644
--- a/packages/phrases/src/locales/zh-tw/translation/admin-console/sign-in-exp/index.ts
+++ b/packages/phrases/src/locales/zh-tw/translation/admin-console/sign-in-exp/index.ts
@@ -39,6 +39,9 @@ const sign_in_exp = {
app_logo_and_favicon: '應用圖標和 Favicon',
company_logo_and_favicon: '公司圖標和 Favicon',
organization_logo_and_favicon: '組織圖標和 Favicon',
+ hide_logto_branding: 'Hide Logto branding',
+ hide_logto_branding_description:
+ 'Remove "Powered by Logto". Spotlight your brand exclusively with a clean, professional sign-in experience.',
},
branding_uploads: {
app_logo: {
diff --git a/packages/schemas/alterations/next-1761283464-add-hide-logto-branding-column.ts b/packages/schemas/alterations/next-1761283464-add-hide-logto-branding-column.ts
new file mode 100644
index 000000000000..cd92e540ed92
--- /dev/null
+++ b/packages/schemas/alterations/next-1761283464-add-hide-logto-branding-column.ts
@@ -0,0 +1,20 @@
+import { sql } from '@silverhand/slonik';
+
+import type { AlterationScript } from '../lib/types/alteration.js';
+
+const alteration: AlterationScript = {
+ up: async (pool) => {
+ await pool.query(sql`
+ alter table sign_in_experiences
+ add column hide_logto_branding boolean not null default false;
+ `);
+ },
+ down: async (pool) => {
+ await pool.query(sql`
+ alter table sign_in_experiences
+ drop column hide_logto_branding;
+ `);
+ },
+};
+
+export default alteration;
diff --git a/packages/schemas/src/seeds/sign-in-experience.ts b/packages/schemas/src/seeds/sign-in-experience.ts
index 3a0a5ffc3df4..b82caeb0f421 100644
--- a/packages/schemas/src/seeds/sign-in-experience.ts
+++ b/packages/schemas/src/seeds/sign-in-experience.ts
@@ -24,6 +24,7 @@ export const createDefaultSignInExperience = (
logoUrl: isCloud ? undefined : 'https://logto.io/logo.svg',
darkLogoUrl: isCloud ? undefined : 'https://logto.io/logo-dark.svg',
},
+ hideLogtoBranding: false,
languageInfo: {
autoDetect: true,
fallbackLanguage: 'en' as const,
diff --git a/packages/schemas/tables/sign_in_experiences.sql b/packages/schemas/tables/sign_in_experiences.sql
index 0c73496534f9..f611d1f71c57 100644
--- a/packages/schemas/tables/sign_in_experiences.sql
+++ b/packages/schemas/tables/sign_in_experiences.sql
@@ -7,6 +7,7 @@ create table sign_in_experiences (
id varchar(21) not null,
color jsonb /* @use Color */ not null,
branding jsonb /* @use Branding */ not null,
+ hide_logto_branding boolean not null default false,
language_info jsonb /* @use LanguageInfo */ not null,
terms_of_use_url varchar(2048),
privacy_policy_url varchar(2048),