By creating this pull request, I grant the project maintainers an unlimited,
perpetual license to use, modify, and redistribute these contributions under any terms they
choose, including both the AGPLv3 and the Fossorial Commercial license terms. I
represent that I have the right to grant this license for all contributed content.
This way it prevents typos when comparing the value of build everywhere and is validated by TypeScript.
Added a prop exact to the HorizontalTabs component to match paths exactly
Screenshots
-
-
Branding settings
Auth page tab
Resource auth page with branding
Org auth page with branding
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.
## 📋 Pull Request Information
**Original PR:** https://github.com/fosrl/pangolin/pull/1846
**Author:** [@Fredkiss3](https://github.com/Fredkiss3)
**Created:** 11/11/2025
**Status:** ✅ Merged
**Merged:** 12/17/2025
**Merged by:** [@miloschwartz](https://github.com/miloschwartz)
**Base:** `dev` ← **Head:** `feat/login-page-customization`
---
### 📝 Commits (10+)
- [`0abc561`](https://github.com/fosrl/pangolin/commit/0abc561bb843d07b19ef44456846525af672bb09) ♻️ refactor
- [`5641a2a`](https://github.com/fosrl/pangolin/commit/5641a2aa316589d35282380cac19f11a1a820ebf) 🗃️ add org auth page model
- [`46d60bd`](https://github.com/fosrl/pangolin/commit/46d60bd0900ba1ed3a693294c001bfb4b288d050) ♻️ add type
- [`08e4340`](https://github.com/fosrl/pangolin/commit/08e43400e40c6406d62166fc4b58d991ed1ae3de) 🚧 frontend wip
- [`f58cf68`](https://github.com/fosrl/pangolin/commit/f58cf68f7c20fb332d237b0c8b01b5cea5f3a94d) 🚧 WIP
- [`cfde4e7`](https://github.com/fosrl/pangolin/commit/cfde4e7443f1a5dab20a572df6967ba49d40e8c9) 🚧 WIP
- [`4bd1c4e`](https://github.com/fosrl/pangolin/commit/4bd1c4e0c650a5f17241ce4bddfc834c8e8af788) ♻️ refactor
- [`d218a4b`](https://github.com/fosrl/pangolin/commit/d218a4bbc3a85d11f712f2b9635c312b34af3878) 🏷️ fix types
- [`02cd2cf`](https://github.com/fosrl/pangolin/commit/02cd2cfb1705e8c0ac9e6f32cf40abe6daf601a7) ✨ save and update branding
- [`2284814`](https://github.com/fosrl/pangolin/commit/228481444f4ced3f61ab4f29cee9a77dd08c279a) ♻️ do not manually track the loading state in `ConfirmDeleteDialog`
### 📊 Changes
**41 files changed** (+4177 additions, -744 deletions)
<details>
<summary>View changed files</summary>
📝 `messages/en-US.json` (+21 -1)
📝 `package-lock.json` (+2291 -25)
📝 `package.json` (+3 -3)
📝 `server/db/pg/migrate.ts` (+1 -1)
📝 `server/db/pg/schema/privateSchema.ts` (+24 -0)
📝 `server/db/pg/schema/schema.ts` (+2 -1)
📝 `server/db/sqlite/schema/privateSchema.ts` (+31 -6)
📝 `server/db/sqlite/schema/schema.ts` (+7 -1)
📝 `server/private/routers/external.ts` (+27 -0)
📝 `server/private/routers/internal.ts` (+1 -0)
➕ `server/private/routers/loginPage/deleteLoginPageBranding.ts` (+113 -0)
➕ `server/private/routers/loginPage/getLoginPageBranding.ts` (+103 -0)
📝 `server/private/routers/loginPage/index.ts` (+4 -0)
➕ `server/private/routers/loginPage/loadLoginPageBranding.ts` (+100 -0)
➕ `server/private/routers/loginPage/upsertLoginPageBranding.ts` (+162 -0)
📝 `server/routers/loginPage/types.ts` (+8 -1)
📝 `server/routers/resource/getResourceAuthInfo.ts` (+0 -1)
📝 `src/app/[orgId]/settings/(private)/billing/layout.tsx` (+5 -23)
📝 `src/app/[orgId]/settings/(private)/idp/[idpId]/layout.tsx` (+2 -2)
➕ `src/app/[orgId]/settings/general/auth-page/page.tsx` (+68 -0)
_...and 21 more files_
</details>
### 📄 Description
## Community Contribution License Agreement
By creating this pull request, I grant the project maintainers an unlimited,
perpetual license to use, modify, and redistribute these contributions under any terms they
choose, including both the AGPLv3 and the Fossorial Commercial license terms. I
represent that I have the right to grant this license for all contributed content.
## Description
**Main changes:**
- Added settings to add branding to the login page for resources & org, they override the branding options set in the config file: https://docs.pangolin.net/manage/branding#branding
**Other changes:**
- Moved the auth page settings to its own tab in the Org general settings page
- Added a `process.exit(0)` line to the migration script because otherwise the migration script would just hang even though it has already finished running https://github.com/Fredkiss3/pangolin/blob/7a31292ec7192efae9b1be30fa5113153150debe/server/db/pg/migrate.ts#L13-L14
- Proposition: generate the `build.ts` file like this:
```ts
export const build = "oss" as "saas" | "enterprise" | "oss";
```
This way it prevents typos when comparing the value of `build` everywhere and is validated by TypeScript.
- Added a prop `exact` to the `HorizontalTabs` component to match paths exactly
## Screenshots
| - | - |
| ------ | ------ |
| Branding settings | <img width="1539" height="1142" alt="Screenshot 2025-11-15 at 06 27 15" src="https://github.com/user-attachments/assets/436d0e59-406b-4803-820a-2cd0f37c8fbd" /> |
| Auth page tab | <img width="1539" height="1142" alt="Screenshot 2025-11-15 at 06 27 19" src="https://github.com/user-attachments/assets/c1a14f08-3552-4b8f-bc74-6f2755339d81" /> |
| Resource auth page with branding | <img width="1499" height="1152" alt="Screenshot 2025-11-15 at 06 27 26" src="https://github.com/user-attachments/assets/218622fb-cbd5-4093-a3b2-d173bfe8c852" /> |
| Org auth page with branding |<img width="1499" height="1152" alt="Screenshot 2025-11-15 at 06 27 31" src="https://github.com/user-attachments/assets/bd70e07c-757a-4154-a5f0-309934f5176f" /> |
---
<sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
📋 Pull Request Information
Original PR: https://github.com/fosrl/pangolin/pull/1846
Author: @Fredkiss3
Created: 11/11/2025
Status: ✅ Merged
Merged: 12/17/2025
Merged by: @miloschwartz
Base:
dev← Head:feat/login-page-customization📝 Commits (10+)
0abc561♻️ refactor5641a2a🗃️ add org auth page model46d60bd♻️ add type08e4340🚧 frontend wipf58cf68🚧 WIPcfde4e7🚧 WIP4bd1c4e♻️ refactord218a4b🏷️ fix types02cd2cf✨ save and update branding2284814♻️ do not manually track the loading state inConfirmDeleteDialog📊 Changes
41 files changed (+4177 additions, -744 deletions)
View changed files
📝
messages/en-US.json(+21 -1)📝
package-lock.json(+2291 -25)📝
package.json(+3 -3)📝
server/db/pg/migrate.ts(+1 -1)📝
server/db/pg/schema/privateSchema.ts(+24 -0)📝
server/db/pg/schema/schema.ts(+2 -1)📝
server/db/sqlite/schema/privateSchema.ts(+31 -6)📝
server/db/sqlite/schema/schema.ts(+7 -1)📝
server/private/routers/external.ts(+27 -0)📝
server/private/routers/internal.ts(+1 -0)➕
server/private/routers/loginPage/deleteLoginPageBranding.ts(+113 -0)➕
server/private/routers/loginPage/getLoginPageBranding.ts(+103 -0)📝
server/private/routers/loginPage/index.ts(+4 -0)➕
server/private/routers/loginPage/loadLoginPageBranding.ts(+100 -0)➕
server/private/routers/loginPage/upsertLoginPageBranding.ts(+162 -0)📝
server/routers/loginPage/types.ts(+8 -1)📝
server/routers/resource/getResourceAuthInfo.ts(+0 -1)📝
src/app/[orgId]/settings/(private)/billing/layout.tsx(+5 -23)📝
src/app/[orgId]/settings/(private)/idp/[idpId]/layout.tsx(+2 -2)➕
src/app/[orgId]/settings/general/auth-page/page.tsx(+68 -0)...and 21 more files
📄 Description
Community Contribution License Agreement
By creating this pull request, I grant the project maintainers an unlimited,
perpetual license to use, modify, and redistribute these contributions under any terms they
choose, including both the AGPLv3 and the Fossorial Commercial license terms. I
represent that I have the right to grant this license for all contributed content.
Description
Main changes:
Other changes:
process.exit(0)line to the migration script because otherwise the migration script would just hang even though it has already finished running https://github.com/Fredkiss3/pangolin/blob/7a31292ec7192efae9b1be30fa5113153150debe/server/db/pg/migrate.ts#L13-L14build.tsfile like this:buildeverywhere and is validated by TypeScript.exactto theHorizontalTabscomponent to match paths exactlyScreenshots
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.