From 726e0001543c7d793d69cd0b109c279e051ebf5e Mon Sep 17 00:00:00 2001
From: Owen
Date: Sat, 2 May 2026 11:55:01 -0700
Subject: [PATCH 01/53] Show remote nodes update in table
---
messages/en-US.json | 1 +
.../remoteExitNode/listRemoteExitNodes.ts | 119 +++++++++++++++++-
server/routers/remoteExitNode/types.ts | 1 +
.../(private)/remote-exit-nodes/page.tsx | 1 +
src/components/ExitNodesTable.tsx | 9 +-
5 files changed, 129 insertions(+), 2 deletions(-)
diff --git a/messages/en-US.json b/messages/en-US.json
index 6e1947b3e..202444882 100644
--- a/messages/en-US.json
+++ b/messages/en-US.json
@@ -1667,6 +1667,7 @@
"pangolinUpdateAvailableReleaseNotes": "View Release Notes",
"newtUpdateAvailable": "Update Available",
"newtUpdateAvailableInfo": "A new version of Newt is available. Please update to the latest version for the best experience.",
+ "pangolinNodeUpdateAvailableInfo": "A new version of Pangolin Node is available. Please update to the latest version for the best experience.",
"domainPickerEnterDomain": "Domain",
"domainPickerPlaceholder": "myapp.example.com",
"domainPickerDescription": "Enter the full domain of the resource to see available options.",
diff --git a/server/private/routers/remoteExitNode/listRemoteExitNodes.ts b/server/private/routers/remoteExitNode/listRemoteExitNodes.ts
index 54001432f..3edf2c149 100644
--- a/server/private/routers/remoteExitNode/listRemoteExitNodes.ts
+++ b/server/private/routers/remoteExitNode/listRemoteExitNodes.ts
@@ -22,6 +22,91 @@ import createHttpError from "http-errors";
import logger from "@server/logger";
import { fromError } from "zod-validation-error";
import { ListRemoteExitNodesResponse } from "@server/routers/remoteExitNode/types";
+import cache from "#dynamic/lib/cache";
+import semver from "semver";
+
+let stalePangolinNodeVersion: string | null = null;
+
+async function getLatestPangolinNodeVersion(): Promise {
+ try {
+ const cachedVersion = await cache.get(
+ "cache:latestPangolinNodeVersion"
+ );
+ if (cachedVersion) {
+ return cachedVersion;
+ }
+
+ const controller = new AbortController();
+ const timeoutId = setTimeout(() => controller.abort(), 1500);
+
+ const res = await fetch(
+ "https://api.github.com/repos/fosrl/pangolin-node/tags",
+ { signal: controller.signal }
+ );
+
+ clearTimeout(timeoutId);
+
+ if (!res.ok) {
+ logger.warn(
+ `Failed to fetch latest pangolin-node version from GitHub: ${res.status} ${res.statusText}`
+ );
+ return stalePangolinNodeVersion;
+ }
+
+ let tags = await res.json();
+ if (!Array.isArray(tags) || tags.length === 0) {
+ logger.warn("No tags found for pangolin-node repository");
+ return stalePangolinNodeVersion;
+ }
+
+ tags = tags.filter((tag: any) => !tag.name.includes("rc"));
+ tags.sort((a: any, b: any) => {
+ const va = semver.coerce(a.name);
+ const vb = semver.coerce(b.name);
+ if (!va && !vb) return 0;
+ if (!va) return 1;
+ if (!vb) return -1;
+ return semver.rcompare(va, vb);
+ });
+
+ const seen = new Set();
+ tags = tags.filter((tag: any) => {
+ const normalised = semver.coerce(tag.name)?.version;
+ if (!normalised || seen.has(normalised)) return false;
+ seen.add(normalised);
+ return true;
+ });
+
+ if (tags.length === 0) {
+ logger.warn(
+ "No valid semver tags found for pangolin-node repository"
+ );
+ return stalePangolinNodeVersion;
+ }
+
+ const latestVersion = tags[0].name;
+ stalePangolinNodeVersion = latestVersion;
+ await cache.set("cache:latestPangolinNodeVersion", latestVersion, 3600);
+
+ return latestVersion;
+ } catch (error: any) {
+ if (error.name === "AbortError") {
+ logger.warn(
+ "Request to fetch latest pangolin-node version timed out (1.5s)"
+ );
+ } else if (error.cause?.code === "UND_ERR_CONNECT_TIMEOUT") {
+ logger.warn(
+ "Connection timeout while fetching latest pangolin-node version"
+ );
+ } else {
+ logger.warn(
+ "Error fetching latest pangolin-node version:",
+ error.message || error
+ );
+ }
+ return stalePangolinNodeVersion;
+ }
+}
const listRemoteExitNodesParamsSchema = z.strictObject({
orgId: z.string()
@@ -118,9 +203,41 @@ export async function listRemoteExitNodes(
const totalCountResult = await countQuery;
const totalCount = totalCountResult[0].count;
+ const latestPangolinNodeVersionPromise = getLatestPangolinNodeVersion();
+
+ const nodesWithUpdates = remoteExitNodesList.map((node) => ({
+ ...node,
+ updateAvailable: false
+ }));
+
+ try {
+ const latestPangolinNodeVersion =
+ await latestPangolinNodeVersionPromise;
+
+ if (latestPangolinNodeVersion) {
+ nodesWithUpdates.forEach((node) => {
+ if (node.version) {
+ try {
+ node.updateAvailable = semver.lt(
+ node.version,
+ latestPangolinNodeVersion
+ );
+ } catch {
+ node.updateAvailable = false;
+ }
+ }
+ });
+ }
+ } catch (error) {
+ logger.warn(
+ "Failed to check for pangolin-node updates, continuing without update info:",
+ error
+ );
+ }
+
return response(res, {
data: {
- remoteExitNodes: remoteExitNodesList,
+ remoteExitNodes: nodesWithUpdates,
pagination: {
total: totalCount,
limit,
diff --git a/server/routers/remoteExitNode/types.ts b/server/routers/remoteExitNode/types.ts
index 25a7d6c53..9984b1b4f 100644
--- a/server/routers/remoteExitNode/types.ts
+++ b/server/routers/remoteExitNode/types.ts
@@ -21,6 +21,7 @@ export type ListRemoteExitNodesResponse = {
remoteExitNodeId: string;
dateCreated: string;
version: string | null;
+ updateAvailable?: boolean;
exitNodeId: number | null;
name: string;
address: string;
diff --git a/src/app/[orgId]/settings/(private)/remote-exit-nodes/page.tsx b/src/app/[orgId]/settings/(private)/remote-exit-nodes/page.tsx
index 2c34d92ec..890a14564 100644
--- a/src/app/[orgId]/settings/(private)/remote-exit-nodes/page.tsx
+++ b/src/app/[orgId]/settings/(private)/remote-exit-nodes/page.tsx
@@ -45,6 +45,7 @@ export default async function RemoteExitNodesPage(
type: node.type,
dateCreated: node.dateCreated,
version: node.version || undefined,
+ updateAvailable: node.updateAvailable,
orgId: params.orgId
};
}
diff --git a/src/components/ExitNodesTable.tsx b/src/components/ExitNodesTable.tsx
index 67d819a47..73e96a96c 100644
--- a/src/components/ExitNodesTable.tsx
+++ b/src/components/ExitNodesTable.tsx
@@ -21,6 +21,7 @@ import { createApiClient } from "@app/lib/api";
import { useEnvContext } from "@app/hooks/useEnvContext";
import { useTranslations } from "next-intl";
import { Badge } from "@app/components/ui/badge";
+import { InfoPopup } from "@app/components/ui/info-popup";
export type RemoteExitNodeRow = {
id: string;
@@ -33,6 +34,7 @@ export type RemoteExitNodeRow = {
online: boolean;
dateCreated: string;
version?: string;
+ updateAvailable?: boolean;
};
type ExitNodesTableProps = {
@@ -233,13 +235,18 @@ export default function ExitNodesTable({
const originalRow = row.original;
return (
- {originalRow.version && originalRow.version ? (
+ {originalRow.version ? (
{"v" + originalRow.version}
) : (
"-"
)}
+ {originalRow.updateAvailable && (
+
+ )}
);
}
From d8c3484ed55cc94df8cb7d636ee9637ddff29f46 Mon Sep 17 00:00:00 2001
From: Owen
Date: Sat, 2 May 2026 12:00:51 -0700
Subject: [PATCH 02/53] Have to import from private
---
server/private/routers/remoteExitNode/listRemoteExitNodes.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server/private/routers/remoteExitNode/listRemoteExitNodes.ts b/server/private/routers/remoteExitNode/listRemoteExitNodes.ts
index 3edf2c149..061be1792 100644
--- a/server/private/routers/remoteExitNode/listRemoteExitNodes.ts
+++ b/server/private/routers/remoteExitNode/listRemoteExitNodes.ts
@@ -22,7 +22,7 @@ import createHttpError from "http-errors";
import logger from "@server/logger";
import { fromError } from "zod-validation-error";
import { ListRemoteExitNodesResponse } from "@server/routers/remoteExitNode/types";
-import cache from "#dynamic/lib/cache";
+import cache from "#private/lib/cache";
import semver from "semver";
let stalePangolinNodeVersion: string | null = null;
From de92a28435ab59dcc36444706753c8669cbca187 Mon Sep 17 00:00:00 2001
From: miloschwartz
Date: Sat, 2 May 2026 12:09:49 -0700
Subject: [PATCH 03/53] update mac models
---
server/db/mac_models.json | 290 +++++++++++++++++++++-----------------
1 file changed, 162 insertions(+), 128 deletions(-)
diff --git a/server/db/mac_models.json b/server/db/mac_models.json
index db473f3ae..6d9b837d5 100644
--- a/server/db/mac_models.json
+++ b/server/db/mac_models.json
@@ -1,94 +1,53 @@
{
- "PowerMac4,4": "eMac",
- "PowerMac6,4": "eMac",
- "PowerBook2,1": "iBook",
- "PowerBook2,2": "iBook",
- "PowerBook4,1": "iBook",
- "PowerBook4,2": "iBook",
- "PowerBook4,3": "iBook",
- "PowerBook6,3": "iBook",
- "PowerBook6,5": "iBook",
- "PowerBook6,7": "iBook",
- "iMac,1": "iMac",
- "PowerMac2,1": "iMac",
- "PowerMac2,2": "iMac",
- "PowerMac4,1": "iMac",
- "PowerMac4,2": "iMac",
- "PowerMac4,5": "iMac",
- "PowerMac6,1": "iMac",
- "PowerMac6,3*": "iMac",
- "PowerMac6,3": "iMac",
- "PowerMac8,1": "iMac",
- "PowerMac8,2": "iMac",
- "PowerMac12,1": "iMac",
- "iMac4,1": "iMac",
- "iMac4,2": "iMac",
- "iMac5,2": "iMac",
- "iMac5,1": "iMac",
- "iMac6,1": "iMac",
- "iMac7,1": "iMac",
- "iMac8,1": "iMac",
- "iMac9,1": "iMac",
- "iMac10,1": "iMac",
- "iMac11,1": "iMac",
- "iMac11,2": "iMac",
- "iMac11,3": "iMac",
- "iMac12,1": "iMac",
- "iMac12,2": "iMac",
- "iMac13,1": "iMac",
- "iMac13,2": "iMac",
- "iMac14,1": "iMac",
- "iMac14,3": "iMac",
- "iMac14,2": "iMac",
- "iMac14,4": "iMac",
- "iMac15,1": "iMac",
- "iMac16,1": "iMac",
- "iMac16,2": "iMac",
- "iMac17,1": "iMac",
- "iMac18,1": "iMac",
- "iMac18,2": "iMac",
- "iMac18,3": "iMac",
- "iMac19,2": "iMac",
- "iMac19,1": "iMac",
- "iMac20,1": "iMac",
- "iMac20,2": "iMac",
- "iMac21,2": "iMac",
- "iMac21,1": "iMac",
- "iMacPro1,1": "iMac Pro",
- "PowerMac10,1": "Mac mini",
- "PowerMac10,2": "Mac mini",
- "Macmini1,1": "Mac mini",
- "Macmini2,1": "Mac mini",
- "Macmini3,1": "Mac mini",
- "Macmini4,1": "Mac mini",
- "Macmini5,1": "Mac mini",
- "Macmini5,2": "Mac mini",
- "Macmini5,3": "Mac mini",
- "Macmini6,1": "Mac mini",
- "Macmini6,2": "Mac mini",
- "Macmini7,1": "Mac mini",
- "Macmini8,1": "Mac mini",
"ADP3,2": "Mac mini",
- "Macmini9,1": "Mac mini",
- "Mac14,3": "Mac mini",
- "Mac14,12": "Mac mini",
- "MacPro1,1*": "Mac Pro",
- "MacPro2,1": "Mac Pro",
- "MacPro3,1": "Mac Pro",
- "MacPro4,1": "Mac Pro",
- "MacPro5,1": "Mac Pro",
- "MacPro6,1": "Mac Pro",
- "MacPro7,1": "Mac Pro",
- "N/A*": "Power Macintosh",
- "PowerMac1,1": "Power Macintosh",
- "PowerMac3,1": "Power Macintosh",
- "PowerMac3,3": "Power Macintosh",
- "PowerMac3,4": "Power Macintosh",
- "PowerMac3,5": "Power Macintosh",
- "PowerMac3,6": "Power Macintosh",
"Mac13,1": "Mac Studio",
"Mac13,2": "Mac Studio",
+ "Mac14,10": "MacBook Pro",
+ "Mac14,12": "Mac mini",
+ "Mac14,13": "Mac Studio",
+ "Mac14,14": "Mac Studio",
+ "Mac14,15": "MacBook Air",
+ "Mac14,2": "MacBook Air",
+ "Mac14,3": "Mac mini",
+ "Mac14,5": "MacBook Pro",
+ "Mac14,6": "MacBook Pro",
+ "Mac14,7": "MacBook Pro",
+ "Mac14,8": "Mac Pro",
+ "Mac14,9": "MacBook Pro",
+ "Mac15,10": "MacBook Pro",
+ "Mac15,11": "MacBook Pro",
+ "Mac15,12": "MacBook Air",
+ "Mac15,13": "MacBook Air",
+ "Mac15,14": "Mac Studio",
+ "Mac15,3": "MacBook Pro",
+ "Mac15,4": "iMac",
+ "Mac15,5": "iMac",
+ "Mac15,6": "MacBook Pro",
+ "Mac15,7": "MacBook Pro",
+ "Mac15,8": "MacBook Pro",
+ "Mac15,9": "MacBook Pro",
+ "Mac16,1": "MacBook Pro",
+ "Mac16,10": "Mac mini",
+ "Mac16,11": "Mac mini",
+ "Mac16,12": "MacBook Air",
+ "Mac16,13": "MacBook Air",
+ "Mac16,2": "iMac",
+ "Mac16,3": "iMac",
+ "Mac16,5": "MacBook Pro",
+ "Mac16,6": "MacBook Pro",
+ "Mac16,7": "MacBook Pro",
+ "Mac16,8": "MacBook Pro",
+ "Mac16,9": "Mac Studio",
+ "Mac17,2": "MacBook Pro",
+ "Mac17,3": "MacBook Air",
+ "Mac17,4": "MacBook Air",
+ "Mac17,5": "MacBook Neo",
+ "Mac17,6": "MacBook Pro",
+ "Mac17,7": "MacBook Pro",
+ "Mac17,8": "MacBook Pro",
+ "Mac17,9": "MacBook Pro",
"MacBook1,1": "MacBook",
+ "MacBook10,1": "MacBook",
"MacBook2,1": "MacBook",
"MacBook3,1": "MacBook",
"MacBook4,1": "MacBook",
@@ -98,8 +57,8 @@
"MacBook7,1": "MacBook",
"MacBook8,1": "MacBook",
"MacBook9,1": "MacBook",
- "MacBook10,1": "MacBook",
"MacBookAir1,1": "MacBook Air",
+ "MacBookAir10,1": "MacBook Air",
"MacBookAir2,1": "MacBook Air",
"MacBookAir3,1": "MacBook Air",
"MacBookAir3,2": "MacBook Air",
@@ -114,88 +73,163 @@
"MacBookAir8,1": "MacBook Air",
"MacBookAir8,2": "MacBook Air",
"MacBookAir9,1": "MacBook Air",
- "MacBookAir10,1": "MacBook Air",
- "Mac14,2": "MacBook Air",
"MacBookPro1,1": "MacBook Pro",
"MacBookPro1,2": "MacBook Pro",
- "MacBookPro2,2": "MacBook Pro",
- "MacBookPro2,1": "MacBook Pro",
- "MacBookPro3,1": "MacBook Pro",
- "MacBookPro4,1": "MacBook Pro",
- "MacBookPro5,1": "MacBook Pro",
- "MacBookPro5,2": "MacBook Pro",
- "MacBookPro5,5": "MacBook Pro",
- "MacBookPro5,4": "MacBook Pro",
- "MacBookPro5,3": "MacBook Pro",
- "MacBookPro7,1": "MacBook Pro",
- "MacBookPro6,2": "MacBook Pro",
- "MacBookPro6,1": "MacBook Pro",
- "MacBookPro8,1": "MacBook Pro",
- "MacBookPro8,2": "MacBook Pro",
- "MacBookPro8,3": "MacBook Pro",
- "MacBookPro9,2": "MacBook Pro",
- "MacBookPro9,1": "MacBook Pro",
"MacBookPro10,1": "MacBook Pro",
"MacBookPro10,2": "MacBook Pro",
"MacBookPro11,1": "MacBook Pro",
"MacBookPro11,2": "MacBook Pro",
"MacBookPro11,3": "MacBook Pro",
- "MacBookPro12,1": "MacBook Pro",
"MacBookPro11,4": "MacBook Pro",
"MacBookPro11,5": "MacBook Pro",
+ "MacBookPro12,1": "MacBook Pro",
"MacBookPro13,1": "MacBook Pro",
"MacBookPro13,2": "MacBook Pro",
"MacBookPro13,3": "MacBook Pro",
"MacBookPro14,1": "MacBook Pro",
"MacBookPro14,2": "MacBook Pro",
"MacBookPro14,3": "MacBook Pro",
- "MacBookPro15,2": "MacBook Pro",
"MacBookPro15,1": "MacBook Pro",
+ "MacBookPro15,2": "MacBook Pro",
"MacBookPro15,3": "MacBook Pro",
"MacBookPro15,4": "MacBook Pro",
"MacBookPro16,1": "MacBook Pro",
- "MacBookPro16,3": "MacBook Pro",
"MacBookPro16,2": "MacBook Pro",
+ "MacBookPro16,3": "MacBook Pro",
"MacBookPro16,4": "MacBook Pro",
"MacBookPro17,1": "MacBook Pro",
- "MacBookPro18,3": "MacBook Pro",
- "MacBookPro18,4": "MacBook Pro",
"MacBookPro18,1": "MacBook Pro",
"MacBookPro18,2": "MacBook Pro",
- "Mac14,7": "MacBook Pro",
- "Mac14,9": "MacBook Pro",
- "Mac14,5": "MacBook Pro",
- "Mac14,10": "MacBook Pro",
- "Mac14,6": "MacBook Pro",
- "PowerMac1,2": "Power Macintosh",
- "PowerMac5,1": "Power Macintosh",
- "PowerMac7,2": "Power Macintosh",
- "PowerMac7,3": "Power Macintosh",
- "PowerMac9,1": "Power Macintosh",
- "PowerMac11,2": "Power Macintosh",
+ "MacBookPro18,3": "MacBook Pro",
+ "MacBookPro18,4": "MacBook Pro",
+ "MacBookPro2,1": "MacBook Pro",
+ "MacBookPro2,2": "MacBook Pro",
+ "MacBookPro3,1": "MacBook Pro",
+ "MacBookPro4,1": "MacBook Pro",
+ "MacBookPro5,1": "MacBook Pro",
+ "MacBookPro5,2": "MacBook Pro",
+ "MacBookPro5,3": "MacBook Pro",
+ "MacBookPro5,4": "MacBook Pro",
+ "MacBookPro5,5": "MacBook Pro",
+ "MacBookPro6,1": "MacBook Pro",
+ "MacBookPro6,2": "MacBook Pro",
+ "MacBookPro7,1": "MacBook Pro",
+ "MacBookPro8,1": "MacBook Pro",
+ "MacBookPro8,2": "MacBook Pro",
+ "MacBookPro8,3": "MacBook Pro",
+ "MacBookPro9,1": "MacBook Pro",
+ "MacBookPro9,2": "MacBook Pro",
+ "MacPro1,1": "Mac Pro",
+ "MacPro2,1": "Mac Pro",
+ "MacPro3,1": "Mac Pro",
+ "MacPro4,1": "Mac Pro",
+ "MacPro5,1": "Mac Pro",
+ "MacPro6,1": "Mac Pro",
+ "MacPro7,1": "Mac Pro",
+ "Macmini1,1": "Mac mini",
+ "Macmini2,1": "Mac mini",
+ "Macmini3,1": "Mac mini",
+ "Macmini4,1": "Mac mini",
+ "Macmini5,1": "Mac mini",
+ "Macmini5,2": "Mac mini",
+ "Macmini5,3": "Mac mini",
+ "Macmini6,1": "Mac mini",
+ "Macmini6,2": "Mac mini",
+ "Macmini7,1": "Mac mini",
+ "Macmini8,1": "Mac mini",
+ "Macmini9,1": "Mac mini",
"PowerBook1,1": "PowerBook",
+ "PowerBook2,1": "iBook",
+ "PowerBook2,2": "iBook",
"PowerBook3,1": "PowerBook",
"PowerBook3,2": "PowerBook",
"PowerBook3,3": "PowerBook",
"PowerBook3,4": "PowerBook",
"PowerBook3,5": "PowerBook",
- "PowerBook6,1": "PowerBook",
+ "PowerBook4,1": "iBook",
+ "PowerBook4,2": "iBook",
+ "PowerBook4,3": "iBook",
"PowerBook5,1": "PowerBook",
- "PowerBook6,2": "PowerBook",
"PowerBook5,2": "PowerBook",
"PowerBook5,3": "PowerBook",
- "PowerBook6,4": "PowerBook",
"PowerBook5,4": "PowerBook",
"PowerBook5,5": "PowerBook",
- "PowerBook6,8": "PowerBook",
"PowerBook5,6": "PowerBook",
"PowerBook5,7": "PowerBook",
"PowerBook5,8": "PowerBook",
"PowerBook5,9": "PowerBook",
+ "PowerBook6,1": "PowerBook",
+ "PowerBook6,2": "PowerBook",
+ "PowerBook6,3": "iBook",
+ "PowerBook6,4": "PowerBook",
+ "PowerBook6,5": "iBook",
+ "PowerBook6,7": "iBook",
+ "PowerBook6,8": "PowerBook",
+ "PowerMac1,1": "Power Macintosh",
+ "PowerMac1,2": "Power Macintosh",
+ "PowerMac10,1": "Mac mini",
+ "PowerMac10,2": "Mac mini",
+ "PowerMac11,2": "Power Macintosh",
+ "PowerMac12,1": "iMac",
+ "PowerMac2,1": "iMac",
+ "PowerMac2,2": "iMac",
+ "PowerMac3,1": "Mac Server",
+ "PowerMac3,3": "Power Macintosh",
+ "PowerMac3,4": "Power Macintosh",
+ "PowerMac3,5": "Power Macintosh",
+ "PowerMac3,6": "Power Macintosh",
+ "PowerMac4,1": "iMac",
+ "PowerMac4,2": "iMac",
+ "PowerMac4,4": "eMac",
+ "PowerMac4,5": "iMac",
+ "PowerMac5,1": "Power Macintosh",
+ "PowerMac6,1": "iMac",
+ "PowerMac6,3": "iMac",
+ "PowerMac6,4": "eMac",
+ "PowerMac7,2": "Power Macintosh",
+ "PowerMac7,3": "Power Macintosh",
+ "PowerMac8,1": "iMac",
+ "PowerMac8,2": "iMac",
+ "PowerMac9,1": "Power Macintosh",
"RackMac1,1": "Xserve",
"RackMac1,2": "Xserve",
"RackMac3,1": "Xserve",
"Xserve1,1": "Xserve",
"Xserve2,1": "Xserve",
- "Xserve3,1": "Xserve"
-}
\ No newline at end of file
+ "Xserve3,1": "Xserve",
+ "iMac,1": "iMac",
+ "iMac10,1": "iMac",
+ "iMac11,1": "iMac",
+ "iMac11,2": "iMac",
+ "iMac11,3": "iMac",
+ "iMac12,1": "iMac",
+ "iMac12,2": "iMac",
+ "iMac13,1": "iMac",
+ "iMac13,2": "iMac",
+ "iMac14,1": "iMac",
+ "iMac14,2": "iMac",
+ "iMac14,3": "iMac",
+ "iMac14,4": "iMac",
+ "iMac15,1": "iMac",
+ "iMac16,1": "iMac",
+ "iMac16,2": "iMac",
+ "iMac17,1": "iMac",
+ "iMac18,1": "iMac",
+ "iMac18,2": "iMac",
+ "iMac18,3": "iMac",
+ "iMac19,1": "iMac",
+ "iMac19,2": "iMac",
+ "iMac20,1": "iMac",
+ "iMac20,2": "iMac",
+ "iMac21,1": "iMac",
+ "iMac21,2": "iMac",
+ "iMac4,1": "iMac",
+ "iMac4,2": "iMac",
+ "iMac5,1": "iMac",
+ "iMac5,2": "iMac",
+ "iMac6,1": "iMac",
+ "iMac7,1": "iMac",
+ "iMac8,1": "iMac",
+ "iMac9,1": "iMac",
+ "iMacPro1,1": "iMac Pro"
+}
From 2f2105a085aa379d975caf35ecbb11968cc1b75e Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 12:12:46 -0700
Subject: [PATCH 04/53] New translations en-us.json (French)
[ci skip]
---
messages/fr-FR.json | 1 +
1 file changed, 1 insertion(+)
diff --git a/messages/fr-FR.json b/messages/fr-FR.json
index e443246fc..d73586566 100644
--- a/messages/fr-FR.json
+++ b/messages/fr-FR.json
@@ -1667,6 +1667,7 @@
"pangolinUpdateAvailableReleaseNotes": "Voir les notes de publication",
"newtUpdateAvailable": "Mise à jour disponible",
"newtUpdateAvailableInfo": "Une nouvelle version de Newt est disponible. Veuillez mettre à jour vers la dernière version pour une meilleure expérience.",
+ "pangolinNodeUpdateAvailableInfo": "A new version of Pangolin Node is available. Please update to the latest version for the best experience.",
"domainPickerEnterDomain": "Domaine",
"domainPickerPlaceholder": "monapp.exemple.com",
"domainPickerDescription": "Entrez le domaine complet de la ressource pour voir les options disponibles.",
From 960fe760f117386d4d17868df900c6f2c1d6a7c1 Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 12:12:48 -0700
Subject: [PATCH 05/53] New translations en-us.json (Bulgarian)
[ci skip]
---
messages/bg-BG.json | 1 +
1 file changed, 1 insertion(+)
diff --git a/messages/bg-BG.json b/messages/bg-BG.json
index 9efa9e394..219f41a07 100644
--- a/messages/bg-BG.json
+++ b/messages/bg-BG.json
@@ -1667,6 +1667,7 @@
"pangolinUpdateAvailableReleaseNotes": "Преглед на бележките за изданието",
"newtUpdateAvailable": "Ново обновление",
"newtUpdateAvailableInfo": "Нова версия на Newt е налична. Моля, обновете до последната версия за най-добро изживяване.",
+ "pangolinNodeUpdateAvailableInfo": "A new version of Pangolin Node is available. Please update to the latest version for the best experience.",
"domainPickerEnterDomain": "Домейн",
"domainPickerPlaceholder": "myapp.example.com",
"domainPickerDescription": "Въведете пълния домейн на ресурса, за да видите наличните опции.",
From 9bb936a40d816dc6b31a8c987f0fd2add0e42dc5 Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 12:12:50 -0700
Subject: [PATCH 06/53] New translations en-us.json (Czech)
[ci skip]
---
messages/cs-CZ.json | 1 +
1 file changed, 1 insertion(+)
diff --git a/messages/cs-CZ.json b/messages/cs-CZ.json
index 3e1965f89..dab862721 100644
--- a/messages/cs-CZ.json
+++ b/messages/cs-CZ.json
@@ -1667,6 +1667,7 @@
"pangolinUpdateAvailableReleaseNotes": "Zobrazit poznámky k vydání",
"newtUpdateAvailable": "Dostupná aktualizace",
"newtUpdateAvailableInfo": "Je k dispozici nová verze Newt. Pro nejlepší zážitek prosím aktualizujte na nejnovější verzi.",
+ "pangolinNodeUpdateAvailableInfo": "A new version of Pangolin Node is available. Please update to the latest version for the best experience.",
"domainPickerEnterDomain": "Doména",
"domainPickerPlaceholder": "myapp.example.com",
"domainPickerDescription": "Zadejte úplnou doménu zdroje pro zobrazení dostupných možností.",
From 5379b32959def192b801bcb87960a858c9c5570e Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 12:12:51 -0700
Subject: [PATCH 07/53] New translations en-us.json (German)
[ci skip]
---
messages/de-DE.json | 1 +
1 file changed, 1 insertion(+)
diff --git a/messages/de-DE.json b/messages/de-DE.json
index 0109a011b..f1ec125bc 100644
--- a/messages/de-DE.json
+++ b/messages/de-DE.json
@@ -1667,6 +1667,7 @@
"pangolinUpdateAvailableReleaseNotes": "Versionshinweise anzeigen",
"newtUpdateAvailable": "Update verfügbar",
"newtUpdateAvailableInfo": "Eine neue Version von Newt ist verfügbar. Bitte aktualisieren Sie auf die neueste Version für das beste Erlebnis.",
+ "pangolinNodeUpdateAvailableInfo": "A new version of Pangolin Node is available. Please update to the latest version for the best experience.",
"domainPickerEnterDomain": "Domäne",
"domainPickerPlaceholder": "myapp.example.com",
"domainPickerDescription": "Geben Sie die vollständige Domain der Ressource ein, um verfügbare Optionen zu sehen.",
From 6efaf9f40dd7e9c2c5d0406014153f6a6e68f714 Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 12:12:53 -0700
Subject: [PATCH 08/53] New translations en-us.json (Italian)
[ci skip]
---
messages/it-IT.json | 1 +
1 file changed, 1 insertion(+)
diff --git a/messages/it-IT.json b/messages/it-IT.json
index 4b9dc2717..23e813450 100644
--- a/messages/it-IT.json
+++ b/messages/it-IT.json
@@ -1667,6 +1667,7 @@
"pangolinUpdateAvailableReleaseNotes": "Visualizza Note Di Rilascio",
"newtUpdateAvailable": "Aggiornamento Disponibile",
"newtUpdateAvailableInfo": "È disponibile una nuova versione di Newt. Si prega di aggiornare all'ultima versione per la migliore esperienza.",
+ "pangolinNodeUpdateAvailableInfo": "A new version of Pangolin Node is available. Please update to the latest version for the best experience.",
"domainPickerEnterDomain": "Dominio",
"domainPickerPlaceholder": "myapp.example.com",
"domainPickerDescription": "Inserisci il dominio completo della risorsa per vedere le opzioni disponibili.",
From d28d3ba6eaf470f42e042798fd70927942172f71 Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 12:12:55 -0700
Subject: [PATCH 09/53] New translations en-us.json (Korean)
[ci skip]
---
messages/ko-KR.json | 1 +
1 file changed, 1 insertion(+)
diff --git a/messages/ko-KR.json b/messages/ko-KR.json
index 2dd09f853..faec7d107 100644
--- a/messages/ko-KR.json
+++ b/messages/ko-KR.json
@@ -1667,6 +1667,7 @@
"pangolinUpdateAvailableReleaseNotes": "릴리스 노트 보기",
"newtUpdateAvailable": "업데이트 가능",
"newtUpdateAvailableInfo": "뉴트의 새 버전이 출시되었습니다. 최상의 경험을 위해 최신 버전으로 업데이트하세요.",
+ "pangolinNodeUpdateAvailableInfo": "A new version of Pangolin Node is available. Please update to the latest version for the best experience.",
"domainPickerEnterDomain": "도메인",
"domainPickerPlaceholder": "myapp.example.com",
"domainPickerDescription": "리소스의 전체 도메인을 입력하여 사용 가능한 옵션을 확인하십시오.",
From 6b28f0c81e5c87d6be58faf84dd19685cea80681 Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 12:12:56 -0700
Subject: [PATCH 10/53] New translations en-us.json (Dutch)
[ci skip]
---
messages/nl-NL.json | 1 +
1 file changed, 1 insertion(+)
diff --git a/messages/nl-NL.json b/messages/nl-NL.json
index bd01045bb..10f19467a 100644
--- a/messages/nl-NL.json
+++ b/messages/nl-NL.json
@@ -1667,6 +1667,7 @@
"pangolinUpdateAvailableReleaseNotes": "Uitgaveopmerkingen bekijken",
"newtUpdateAvailable": "Update beschikbaar",
"newtUpdateAvailableInfo": "Er is een nieuwe versie van Newt beschikbaar. Update naar de nieuwste versie voor de beste ervaring.",
+ "pangolinNodeUpdateAvailableInfo": "A new version of Pangolin Node is available. Please update to the latest version for the best experience.",
"domainPickerEnterDomain": "Domein",
"domainPickerPlaceholder": "mijnapp.voorbeeld.nl",
"domainPickerDescription": "Voer de volledige domein van de bron in om beschikbare opties te zien.",
From a84e1cc9e0d096695f4cf585dd9c9caad1311121 Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 12:12:58 -0700
Subject: [PATCH 11/53] New translations en-us.json (Polish)
[ci skip]
---
messages/pl-PL.json | 1 +
1 file changed, 1 insertion(+)
diff --git a/messages/pl-PL.json b/messages/pl-PL.json
index b8182232e..566aaf636 100644
--- a/messages/pl-PL.json
+++ b/messages/pl-PL.json
@@ -1667,6 +1667,7 @@
"pangolinUpdateAvailableReleaseNotes": "Zobacz informacje o wydaniu",
"newtUpdateAvailable": "Dostępna aktualizacja",
"newtUpdateAvailableInfo": "Nowa wersja Newt jest dostępna. Prosimy o aktualizację do najnowszej wersji dla najlepszej pracy.",
+ "pangolinNodeUpdateAvailableInfo": "A new version of Pangolin Node is available. Please update to the latest version for the best experience.",
"domainPickerEnterDomain": "Domena",
"domainPickerPlaceholder": "mojapp.example.com",
"domainPickerDescription": "Wpisz pełną domenę zasobu, aby zobaczyć dostępne opcje.",
From 8e2f30d8de4ec9ff3d1d56b4278307cca6f8d403 Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 12:13:00 -0700
Subject: [PATCH 12/53] New translations en-us.json (Portuguese)
[ci skip]
---
messages/pt-PT.json | 1 +
1 file changed, 1 insertion(+)
diff --git a/messages/pt-PT.json b/messages/pt-PT.json
index d7824263e..7172a9e78 100644
--- a/messages/pt-PT.json
+++ b/messages/pt-PT.json
@@ -1667,6 +1667,7 @@
"pangolinUpdateAvailableReleaseNotes": "Ver notas de versão",
"newtUpdateAvailable": "Nova Atualização Disponível",
"newtUpdateAvailableInfo": "Uma nova versão do Newt está disponível. Atualize para a versão mais recente para uma melhor experiência.",
+ "pangolinNodeUpdateAvailableInfo": "A new version of Pangolin Node is available. Please update to the latest version for the best experience.",
"domainPickerEnterDomain": "Domínio",
"domainPickerPlaceholder": "myapp.exemplo.com",
"domainPickerDescription": "Insira o domínio completo do recurso para ver as opções disponíveis.",
From 2bdbc9d688ec59a4e0d014234ecab45866eeb59b Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 12:13:02 -0700
Subject: [PATCH 13/53] New translations en-us.json (Russian)
[ci skip]
---
messages/ru-RU.json | 1 +
1 file changed, 1 insertion(+)
diff --git a/messages/ru-RU.json b/messages/ru-RU.json
index 2d9811c65..9757db28a 100644
--- a/messages/ru-RU.json
+++ b/messages/ru-RU.json
@@ -1667,6 +1667,7 @@
"pangolinUpdateAvailableReleaseNotes": "Просмотреть примечания к выпуску",
"newtUpdateAvailable": "Доступно обновление",
"newtUpdateAvailableInfo": "Доступна новая версия Newt. Пожалуйста, обновитесь до последней версии для лучшего опыта.",
+ "pangolinNodeUpdateAvailableInfo": "A new version of Pangolin Node is available. Please update to the latest version for the best experience.",
"domainPickerEnterDomain": "Домен",
"domainPickerPlaceholder": "myapp.example.com",
"domainPickerDescription": "Введите полный домен ресурса, чтобы увидеть доступные опции.",
From 13f512aed6334d8279f225430a1fbd6df474b3b6 Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 12:13:03 -0700
Subject: [PATCH 14/53] New translations en-us.json (Turkish)
[ci skip]
---
messages/tr-TR.json | 1 +
1 file changed, 1 insertion(+)
diff --git a/messages/tr-TR.json b/messages/tr-TR.json
index f2c56eeb5..d1bc5831d 100644
--- a/messages/tr-TR.json
+++ b/messages/tr-TR.json
@@ -1667,6 +1667,7 @@
"pangolinUpdateAvailableReleaseNotes": "Yayın Notlarını Görüntüle",
"newtUpdateAvailable": "Güncelleme Mevcut",
"newtUpdateAvailableInfo": "Newt'in yeni bir versiyonu mevcut. En iyi deneyim için lütfen en son sürüme güncelleyin.",
+ "pangolinNodeUpdateAvailableInfo": "A new version of Pangolin Node is available. Please update to the latest version for the best experience.",
"domainPickerEnterDomain": "Alan Adı",
"domainPickerPlaceholder": "myapp.example.com",
"domainPickerDescription": "Mevcut seçenekleri görmek için kaynağın tam etki alanını girin.",
From 6ca24d51a13657321f0f6d48fae881a762565988 Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 12:13:05 -0700
Subject: [PATCH 15/53] New translations en-us.json (Chinese Simplified)
[ci skip]
---
messages/zh-CN.json | 1 +
1 file changed, 1 insertion(+)
diff --git a/messages/zh-CN.json b/messages/zh-CN.json
index fb7874750..c5ac8fffe 100644
--- a/messages/zh-CN.json
+++ b/messages/zh-CN.json
@@ -1667,6 +1667,7 @@
"pangolinUpdateAvailableReleaseNotes": "查看发布说明",
"newtUpdateAvailable": "更新可用",
"newtUpdateAvailableInfo": "新版本的 Newt 已可用。请更新到最新版本以获得最佳体验。",
+ "pangolinNodeUpdateAvailableInfo": "A new version of Pangolin Node is available. Please update to the latest version for the best experience.",
"domainPickerEnterDomain": "域名",
"domainPickerPlaceholder": "example.com",
"domainPickerDescription": "输入资源的完整域名以查看可用选项。",
From c30e94da9843e702fa31d113a6befe3cd1a85f98 Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 12:13:06 -0700
Subject: [PATCH 16/53] New translations en-us.json (Norwegian Bokmal)
[ci skip]
---
messages/nb-NO.json | 1 +
1 file changed, 1 insertion(+)
diff --git a/messages/nb-NO.json b/messages/nb-NO.json
index 318c31bca..f4a7252bb 100644
--- a/messages/nb-NO.json
+++ b/messages/nb-NO.json
@@ -1667,6 +1667,7 @@
"pangolinUpdateAvailableReleaseNotes": "Se utgivelsesnotater",
"newtUpdateAvailable": "Oppdatering tilgjengelig",
"newtUpdateAvailableInfo": "En ny versjon av Newt er tilgjengelig. Vennligst oppdater til den nyeste versjonen for den beste opplevelsen.",
+ "pangolinNodeUpdateAvailableInfo": "A new version of Pangolin Node is available. Please update to the latest version for the best experience.",
"domainPickerEnterDomain": "Domene",
"domainPickerPlaceholder": "minapp.eksempel.no",
"domainPickerDescription": "Skriv inn hele domenet til ressursen for å se tilgjengelige alternativer.",
From 5eb3951f0062209bdcbe5755c07c7294ab3a6e30 Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 12:13:08 -0700
Subject: [PATCH 17/53] New translations en-us.json (Spanish)
[ci skip]
---
messages/es-ES.json | 1 +
1 file changed, 1 insertion(+)
diff --git a/messages/es-ES.json b/messages/es-ES.json
index f1db6ad90..438963d93 100644
--- a/messages/es-ES.json
+++ b/messages/es-ES.json
@@ -1667,6 +1667,7 @@
"pangolinUpdateAvailableReleaseNotes": "Ver notas de lanzamiento",
"newtUpdateAvailable": "Nueva actualización disponible",
"newtUpdateAvailableInfo": "Hay una nueva versión de Newt disponible. Actualice a la última versión para la mejor experiencia.",
+ "pangolinNodeUpdateAvailableInfo": "A new version of Pangolin Node is available. Please update to the latest version for the best experience.",
"domainPickerEnterDomain": "Dominio",
"domainPickerPlaceholder": "miapp.ejemplo.com",
"domainPickerDescription": "Ingresa el dominio completo del recurso para ver las opciones disponibles.",
From 380ff381fc349968367ad34aab29c594eac2bd59 Mon Sep 17 00:00:00 2001
From: miloschwartz
Date: Sat, 2 May 2026 12:19:00 -0700
Subject: [PATCH 18/53] fix credenza scroll extra spacing above footer
---
src/components/Credenza.tsx | 16 +++++++---------
1 file changed, 7 insertions(+), 9 deletions(-)
diff --git a/src/components/Credenza.tsx b/src/components/Credenza.tsx
index 8fad43836..73d2d5141 100644
--- a/src/components/Credenza.tsx
+++ b/src/components/Credenza.tsx
@@ -145,21 +145,19 @@ const CredenzaTitle = ({ className, children, ...props }: CredenzaProps) => {
};
const CredenzaBody = ({ className, children, ...props }: CredenzaProps) => {
- // return (
- //
- // {children}
- //
- // );
-
return (
- {children}
+
{children}
+
);
};
@@ -172,7 +170,7 @@ const CredenzaFooter = ({ className, children, ...props }: CredenzaProps) => {
return (
Date: Sat, 2 May 2026 12:46:39 -0700
Subject: [PATCH 19/53] log in page improvements
---
messages/en-US.json | 2 +-
src/app/auth/login/page.tsx | 15 ++++++-
src/components/OrgSignInLink.tsx | 42 ++++++++++++++----
src/components/SmartLoginForm.tsx | 73 +++++++++++++++++++++++++++++--
4 files changed, 118 insertions(+), 14 deletions(-)
diff --git a/messages/en-US.json b/messages/en-US.json
index 202444882..a7b045480 100644
--- a/messages/en-US.json
+++ b/messages/en-US.json
@@ -2355,7 +2355,7 @@
"orgAuthChooseIdpDescription": "Choose your identity provider to continue",
"orgAuthNoIdpConfigured": "This organization doesn't have any identity providers configured. You can log in with your Pangolin identity instead.",
"orgAuthSignInWithPangolin": "Sign in with Pangolin",
- "orgAuthSignInToOrg": "Sign in to an organization",
+ "orgAuthSignInToOrg": "Organization Identity Provider (SSO)",
"orgAuthSelectOrgTitle": "Organization Sign In",
"orgAuthSelectOrgDescription": "Enter your organization ID to continue",
"orgAuthOrgIdPlaceholder": "your-organization",
diff --git a/src/app/auth/login/page.tsx b/src/app/auth/login/page.tsx
index c2aaefaa6..6373e334a 100644
--- a/src/app/auth/login/page.tsx
+++ b/src/app/auth/login/page.tsx
@@ -160,6 +160,18 @@ export default async function Page(props: {
redirect={redirectUrl}
forceLogin={forceLogin}
defaultUser={defaultUser}
+ orgSignIn={
+ !isInvite &&
+ (build === "saas" ||
+ env.app.identityProviderMode === "org")
+ ? {
+ href: `/auth/org${buildQueryString(searchParams)}`,
+ linkText: t("orgAuthSignInToOrg"),
+ descriptionText:
+ t("needToSignInToOrg")
+ }
+ : undefined
+ }
/>
@@ -195,7 +207,8 @@ export default async function Page(props: {
)}
- {!isInvite &&
+ {!useSmartLogin &&
+ !isInvite &&
(build === "saas" || env.app.identityProviderMode === "org") ? (
)}
-
-
{descriptionText}
-
+
+ {primaryActionVariant === "button" ? (
+
+ ) : (
+
+ )}
>
);
diff --git a/src/components/SmartLoginForm.tsx b/src/components/SmartLoginForm.tsx
index 24f2acb72..164311b7b 100644
--- a/src/components/SmartLoginForm.tsx
+++ b/src/components/SmartLoginForm.tsx
@@ -15,15 +15,18 @@ import {
FormMessage
} from "@app/components/ui/form";
import { Alert, AlertDescription } from "@app/components/ui/alert";
+import Link from "next/link";
import { useRouter } from "next/navigation";
import { useUserLookup } from "@app/hooks/useUserLookup";
+import { useEnvContext } from "@app/hooks/useEnvContext";
import { LookupUserResponse } from "@server/routers/auth/lookupUser";
import { useTranslations } from "next-intl";
import LoginPasswordForm from "@app/components/LoginPasswordForm";
import LoginOrgSelector from "@app/components/LoginOrgSelector";
import UserProfileCard from "@app/components/UserProfileCard";
-import { ArrowLeft } from "lucide-react";
import SecurityKeyAuthButton from "@app/components/SecurityKeyAuthButton";
+import { Separator } from "@app/components/ui/separator";
+import OrgSignInLink from "@app/components/OrgSignInLink";
const identifierSchema = z.object({
identifier: z.string().min(1, "Username or email is required")
@@ -39,10 +42,17 @@ const isValidEmail = (str: string): boolean => {
}
};
+type OrgSignInConfig = {
+ href: string;
+ linkText: string;
+ descriptionText: string;
+};
+
type SmartLoginFormProps = {
redirect?: string;
forceLogin?: boolean;
defaultUser?: string;
+ orgSignIn?: OrgSignInConfig;
};
type ViewState =
@@ -58,12 +68,31 @@ type ViewState =
lookupResult: LookupUserResponse;
};
+function buildResetPasswordHref(
+ dashboardUrl: string,
+ identifier: string,
+ redirectParam?: string
+) {
+ const trimmed = identifier.trim();
+ const params = new URLSearchParams();
+ if (isValidEmail(trimmed)) {
+ params.set("email", trimmed);
+ }
+ if (redirectParam) {
+ params.set("redirect", redirectParam);
+ }
+ const qs = params.toString();
+ return `${dashboardUrl}/auth/reset-password${qs ? `?${qs}` : ""}`;
+}
+
export default function SmartLoginForm({
redirect,
forceLogin,
- defaultUser
+ defaultUser,
+ orgSignIn
}: SmartLoginFormProps) {
const router = useRouter();
+ const { env } = useEnvContext();
const { lookup, loading, error } = useUserLookup();
const t = useTranslations();
const [viewState, setViewState] = useState
({ type: "initial" });
@@ -78,6 +107,13 @@ export default function SmartLoginForm({
}
});
+ const watchedIdentifier = form.watch("identifier");
+ const resetPasswordHref = buildResetPasswordHref(
+ env.app.dashboardUrl,
+ watchedIdentifier,
+ redirect
+ );
+
const hasAutoLookedUp = useRef(false);
useEffect(() => {
if (defaultUser?.trim() && !hasAutoLookedUp.current) {
@@ -209,6 +245,15 @@ export default function SmartLoginForm({
)}
/>
+
+
+ {t("passwordForgot")}
+
+
+
{(error || securityKeyError) && (
@@ -219,7 +264,7 @@ export default function SmartLoginForm({
-
+
+
+ {orgSignIn && (
+ <>
+
+
+
+
+
+
+ {t("idpContinue")}
+
+
+
+
+ >
+ )}
);
From fcd57892212a50a4187e2a544daeb306163a0c81 Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 13:16:06 -0700
Subject: [PATCH 20/53] New translations en-us.json (French)
[ci skip]
---
messages/fr-FR.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/messages/fr-FR.json b/messages/fr-FR.json
index d73586566..50300df38 100644
--- a/messages/fr-FR.json
+++ b/messages/fr-FR.json
@@ -2355,7 +2355,7 @@
"orgAuthChooseIdpDescription": "Choisissez votre fournisseur d'identité pour continuer",
"orgAuthNoIdpConfigured": "Cette organisation n'a aucun fournisseur d'identité configuré. Vous pouvez vous connecter avec votre identité Pangolin à la place.",
"orgAuthSignInWithPangolin": "Se connecter avec Pangolin",
- "orgAuthSignInToOrg": "Se connecter à une organisation",
+ "orgAuthSignInToOrg": "Organization Identity Provider (SSO)",
"orgAuthSelectOrgTitle": "Connexion à l'organisation",
"orgAuthSelectOrgDescription": "Entrez votre identifiant d'organisation pour continuer",
"orgAuthOrgIdPlaceholder": "votre-organisation",
From 208132082eed70c9b3dedf3ee030e389291ef6c1 Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 13:16:08 -0700
Subject: [PATCH 21/53] New translations en-us.json (Bulgarian)
[ci skip]
---
messages/bg-BG.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/messages/bg-BG.json b/messages/bg-BG.json
index 219f41a07..6711d352b 100644
--- a/messages/bg-BG.json
+++ b/messages/bg-BG.json
@@ -2355,7 +2355,7 @@
"orgAuthChooseIdpDescription": "Изберете своя доставчик на идентичност, за да продължите",
"orgAuthNoIdpConfigured": "Тази организация няма конфигурирани доставчици на идентичност. Можете да влезете с вашата Pangolin идентичност.",
"orgAuthSignInWithPangolin": "Впишете се с Pangolin",
- "orgAuthSignInToOrg": "Влезте в организация",
+ "orgAuthSignInToOrg": "Organization Identity Provider (SSO)",
"orgAuthSelectOrgTitle": "Вход в организация.",
"orgAuthSelectOrgDescription": "Въведете идентификатора на вашата организация, за да продължите.",
"orgAuthOrgIdPlaceholder": "вашата-организация",
From a188552ba07d6a93b22b0fff7906d2b3899adb62 Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 13:16:09 -0700
Subject: [PATCH 22/53] New translations en-us.json (Czech)
[ci skip]
---
messages/cs-CZ.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/messages/cs-CZ.json b/messages/cs-CZ.json
index dab862721..a440b4b21 100644
--- a/messages/cs-CZ.json
+++ b/messages/cs-CZ.json
@@ -2355,7 +2355,7 @@
"orgAuthChooseIdpDescription": "Chcete-li pokračovat, vyberte svého poskytovatele identity",
"orgAuthNoIdpConfigured": "Tato organizace nemá nakonfigurovány žádné poskytovatele identity. Místo toho se můžete přihlásit s vaší Pangolinovou identitou.",
"orgAuthSignInWithPangolin": "Přihlásit se pomocí Pangolinu",
- "orgAuthSignInToOrg": "Přihlásit se do organizace",
+ "orgAuthSignInToOrg": "Organization Identity Provider (SSO)",
"orgAuthSelectOrgTitle": "Přihlášení do organizace",
"orgAuthSelectOrgDescription": "Zadejte ID vaší organizace pro pokračování",
"orgAuthOrgIdPlaceholder": "vaše-organizace",
From 769ba27e3a275e34ac2915f0aea3274cf5756f7b Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 13:16:11 -0700
Subject: [PATCH 23/53] New translations en-us.json (German)
[ci skip]
---
messages/de-DE.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/messages/de-DE.json b/messages/de-DE.json
index f1ec125bc..627f66349 100644
--- a/messages/de-DE.json
+++ b/messages/de-DE.json
@@ -2355,7 +2355,7 @@
"orgAuthChooseIdpDescription": "Wähle deinen Identitätsanbieter um fortzufahren",
"orgAuthNoIdpConfigured": "Diese Organisation hat keine Identitätsanbieter konfiguriert. Sie können sich stattdessen mit Ihrer Pangolin-Identität anmelden.",
"orgAuthSignInWithPangolin": "Mit Pangolin anmelden",
- "orgAuthSignInToOrg": "Bei einer Organisation anmelden",
+ "orgAuthSignInToOrg": "Organization Identity Provider (SSO)",
"orgAuthSelectOrgTitle": "Organisations-Anmeldung",
"orgAuthSelectOrgDescription": "Geben Sie Ihre Organisations-ID ein, um fortzufahren",
"orgAuthOrgIdPlaceholder": "Ihre Organisation",
From 7f25d94a83885e3f87e97ef154d2b9be7a26f0d8 Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 13:16:13 -0700
Subject: [PATCH 24/53] New translations en-us.json (Italian)
[ci skip]
---
messages/it-IT.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/messages/it-IT.json b/messages/it-IT.json
index 23e813450..e7e4edb45 100644
--- a/messages/it-IT.json
+++ b/messages/it-IT.json
@@ -2355,7 +2355,7 @@
"orgAuthChooseIdpDescription": "Scegli il tuo provider di identità per continuare",
"orgAuthNoIdpConfigured": "Questa organizzazione non ha nessun provider di identità configurato. Puoi accedere con la tua identità Pangolin.",
"orgAuthSignInWithPangolin": "Accedi con Pangolino",
- "orgAuthSignInToOrg": "Accedi a un'organizzazione",
+ "orgAuthSignInToOrg": "Organization Identity Provider (SSO)",
"orgAuthSelectOrgTitle": "Accesso Organizzazione",
"orgAuthSelectOrgDescription": "Inserisci l'ID dell'organizzazione per continuare",
"orgAuthOrgIdPlaceholder": "la-tua-organizzazione",
From 76ba4c1fdf40e87655586e4ef1033354f5fd1977 Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 13:16:14 -0700
Subject: [PATCH 25/53] New translations en-us.json (Korean)
[ci skip]
---
messages/ko-KR.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/messages/ko-KR.json b/messages/ko-KR.json
index faec7d107..08003f6c1 100644
--- a/messages/ko-KR.json
+++ b/messages/ko-KR.json
@@ -2355,7 +2355,7 @@
"orgAuthChooseIdpDescription": "계속하려면 신원 공급자를 선택하세요.",
"orgAuthNoIdpConfigured": "이 조직은 구성된 신원 공급자가 없습니다. 대신 Pangolin 아이덴티티로 로그인할 수 있습니다.",
"orgAuthSignInWithPangolin": "Pangolin으로 로그인",
- "orgAuthSignInToOrg": "조직에 로그인",
+ "orgAuthSignInToOrg": "Organization Identity Provider (SSO)",
"orgAuthSelectOrgTitle": "조직 로그인",
"orgAuthSelectOrgDescription": "계속하려면 조직 ID를 입력하십시오.",
"orgAuthOrgIdPlaceholder": "your-organization",
From 22e7038b2c5443e59d1b4831d32f16c96290c04e Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 13:16:16 -0700
Subject: [PATCH 26/53] New translations en-us.json (Dutch)
[ci skip]
---
messages/nl-NL.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/messages/nl-NL.json b/messages/nl-NL.json
index 10f19467a..5ca2d1089 100644
--- a/messages/nl-NL.json
+++ b/messages/nl-NL.json
@@ -2355,7 +2355,7 @@
"orgAuthChooseIdpDescription": "Kies uw identiteitsprovider om door te gaan",
"orgAuthNoIdpConfigured": "Deze organisatie heeft geen identiteitsproviders geconfigureerd. Je kunt in plaats daarvan inloggen met je Pangolin-identiteit.",
"orgAuthSignInWithPangolin": "Log in met Pangolin",
- "orgAuthSignInToOrg": "Log in bij een organisatie",
+ "orgAuthSignInToOrg": "Organization Identity Provider (SSO)",
"orgAuthSelectOrgTitle": "Organisatie Inloggen",
"orgAuthSelectOrgDescription": "Voer je organisatie-ID in om verder te gaan",
"orgAuthOrgIdPlaceholder": "jouw-organisatie",
From 6e223bb363139ada1f9567dae27aed733dc77058 Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 13:16:18 -0700
Subject: [PATCH 27/53] New translations en-us.json (Polish)
[ci skip]
---
messages/pl-PL.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/messages/pl-PL.json b/messages/pl-PL.json
index 566aaf636..0f07e9de2 100644
--- a/messages/pl-PL.json
+++ b/messages/pl-PL.json
@@ -2355,7 +2355,7 @@
"orgAuthChooseIdpDescription": "Wybierz swojego dostawcę tożsamości, aby kontynuować",
"orgAuthNoIdpConfigured": "Ta organizacja nie ma skonfigurowanych żadnych dostawców tożsamości. Zamiast tego możesz zalogować się za pomocą swojej tożsamości Pangolin.",
"orgAuthSignInWithPangolin": "Zaloguj się używając Pangolin",
- "orgAuthSignInToOrg": "Zaloguj się do organizacji",
+ "orgAuthSignInToOrg": "Organization Identity Provider (SSO)",
"orgAuthSelectOrgTitle": "Logowanie do organizacji",
"orgAuthSelectOrgDescription": "Wprowadź identyfikator organizacji, aby kontynuować",
"orgAuthOrgIdPlaceholder": "twoja-organizacja",
From f4684c1858d907f14447ee71cb99d20444a39ace Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 13:16:19 -0700
Subject: [PATCH 28/53] New translations en-us.json (Portuguese)
[ci skip]
---
messages/pt-PT.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/messages/pt-PT.json b/messages/pt-PT.json
index 7172a9e78..1b336e038 100644
--- a/messages/pt-PT.json
+++ b/messages/pt-PT.json
@@ -2355,7 +2355,7 @@
"orgAuthChooseIdpDescription": "Escolha o seu provedor de identidade para continuar",
"orgAuthNoIdpConfigured": "Esta organização não tem nenhum provedor de identidade configurado. Você pode entrar com a identidade do seu Pangolin.",
"orgAuthSignInWithPangolin": "Entrar com o Pangolin",
- "orgAuthSignInToOrg": "Fazer login em uma organização",
+ "orgAuthSignInToOrg": "Organization Identity Provider (SSO)",
"orgAuthSelectOrgTitle": "Entrada da Organização",
"orgAuthSelectOrgDescription": "Digite seu ID da organização para continuar",
"orgAuthOrgIdPlaceholder": "sua-organização",
From 49e259e2597de7255c779f9724e1222ae599ffa9 Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 13:16:21 -0700
Subject: [PATCH 29/53] New translations en-us.json (Russian)
[ci skip]
---
messages/ru-RU.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/messages/ru-RU.json b/messages/ru-RU.json
index 9757db28a..46ffa5242 100644
--- a/messages/ru-RU.json
+++ b/messages/ru-RU.json
@@ -2355,7 +2355,7 @@
"orgAuthChooseIdpDescription": "Выберите своего поставщика удостоверений личности для продолжения",
"orgAuthNoIdpConfigured": "Эта организация не имеет настроенных поставщиков идентификационных данных. Вместо этого вы можете войти в свой Pangolin.",
"orgAuthSignInWithPangolin": "Войти через Pangolin",
- "orgAuthSignInToOrg": "Войти в организацию",
+ "orgAuthSignInToOrg": "Organization Identity Provider (SSO)",
"orgAuthSelectOrgTitle": "Вход в организацию",
"orgAuthSelectOrgDescription": "Введите ID вашей организации, чтобы продолжить",
"orgAuthOrgIdPlaceholder": "ваша-организация",
From d31da1a41e257a7fff2671828617bb19b5850853 Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 13:16:23 -0700
Subject: [PATCH 30/53] New translations en-us.json (Turkish)
[ci skip]
---
messages/tr-TR.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/messages/tr-TR.json b/messages/tr-TR.json
index d1bc5831d..ad04dcb6a 100644
--- a/messages/tr-TR.json
+++ b/messages/tr-TR.json
@@ -2355,7 +2355,7 @@
"orgAuthChooseIdpDescription": "Devam etmek için kimlik sağlayıcınızı seçin",
"orgAuthNoIdpConfigured": "Bu kuruluşta yapılandırılmış kimlik sağlayıcı yok. Bunun yerine Pangolin kimliğinizle giriş yapabilirsiniz.",
"orgAuthSignInWithPangolin": "Pangolin ile Giriş Yap",
- "orgAuthSignInToOrg": "Bir kuruluşa giriş yapın",
+ "orgAuthSignInToOrg": "Organization Identity Provider (SSO)",
"orgAuthSelectOrgTitle": "Kuruluş Giriş",
"orgAuthSelectOrgDescription": "Devam etmek için kuruluş kimliğinizi girin",
"orgAuthOrgIdPlaceholder": "kuruluşunuz",
From 7675b6409c1f680da8259a253a961816c208d7de Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 13:16:24 -0700
Subject: [PATCH 31/53] New translations en-us.json (Chinese Simplified)
[ci skip]
---
messages/zh-CN.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/messages/zh-CN.json b/messages/zh-CN.json
index c5ac8fffe..89fc447d8 100644
--- a/messages/zh-CN.json
+++ b/messages/zh-CN.json
@@ -2355,7 +2355,7 @@
"orgAuthChooseIdpDescription": "选择您的身份提供商以继续",
"orgAuthNoIdpConfigured": "此机构没有配置任何身份提供者。您可以使用您的 Pangolin 身份登录。",
"orgAuthSignInWithPangolin": "使用 Pangolin 登录",
- "orgAuthSignInToOrg": "登录到组织",
+ "orgAuthSignInToOrg": "Organization Identity Provider (SSO)",
"orgAuthSelectOrgTitle": "组织登录",
"orgAuthSelectOrgDescription": "输入您的组织ID以继续",
"orgAuthOrgIdPlaceholder": "您的组织",
From 368c5c374f31305ef8cbe7fda279b931113a8b6f Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 13:16:26 -0700
Subject: [PATCH 32/53] New translations en-us.json (Norwegian Bokmal)
[ci skip]
---
messages/nb-NO.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/messages/nb-NO.json b/messages/nb-NO.json
index f4a7252bb..a0f2c8400 100644
--- a/messages/nb-NO.json
+++ b/messages/nb-NO.json
@@ -2355,7 +2355,7 @@
"orgAuthChooseIdpDescription": "Velg din identitet leverandør for å fortsette",
"orgAuthNoIdpConfigured": "Denne organisasjonen har ikke noen identitetstjeneste konfigurert. Du kan i stedet logge inn med Pangolin identiteten din.",
"orgAuthSignInWithPangolin": "Logg inn med Pangolin",
- "orgAuthSignInToOrg": "Logg inn på en organisasjon",
+ "orgAuthSignInToOrg": "Organization Identity Provider (SSO)",
"orgAuthSelectOrgTitle": "Organisasjonsinnlogging",
"orgAuthSelectOrgDescription": "Skriv inn organisasjons-ID-en din for å fortsette",
"orgAuthOrgIdPlaceholder": "din-organisasjon",
From 587e4d104bd37b9f96236e9a24890f344a1c4c8c Mon Sep 17 00:00:00 2001
From: Owen Schwartz
Date: Sat, 2 May 2026 13:16:28 -0700
Subject: [PATCH 33/53] New translations en-us.json (Spanish)
[ci skip]
---
messages/es-ES.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/messages/es-ES.json b/messages/es-ES.json
index 438963d93..77358849e 100644
--- a/messages/es-ES.json
+++ b/messages/es-ES.json
@@ -2355,7 +2355,7 @@
"orgAuthChooseIdpDescription": "Elige tu proveedor de identidad para continuar",
"orgAuthNoIdpConfigured": "Esta organización no tiene ningún proveedor de identidad configurado. En su lugar puedes iniciar sesión con tu identidad de Pangolin.",
"orgAuthSignInWithPangolin": "Iniciar sesión con Pangolin",
- "orgAuthSignInToOrg": "Iniciar sesión en una organización",
+ "orgAuthSignInToOrg": "Organization Identity Provider (SSO)",
"orgAuthSelectOrgTitle": "Inicio de sesión de organización",
"orgAuthSelectOrgDescription": "Ingrese el ID de su organización para continuar",
"orgAuthOrgIdPlaceholder": "tu-organización",
From 96c450fd082d2f6dcba99d894c7389073ec4e1f3 Mon Sep 17 00:00:00 2001
From: miloschwartz
Date: Sat, 2 May 2026 13:19:00 -0700
Subject: [PATCH 34/53] update private resources screenshot
---
public/screenshots/private-resources.png | Bin 572953 -> 545052 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
diff --git a/public/screenshots/private-resources.png b/public/screenshots/private-resources.png
index b393e31f479b3122f1c80b300a67a28ab8512fce..55bf97d3b27f5ad36466a898f436f183739df77f 100644
GIT binary patch
literal 545052
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