diff --git a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/apps/page-client.tsx b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/apps/page-client.tsx index 9cb15c64c2..cf65866c36 100644 --- a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/apps/page-client.tsx +++ b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/apps/page-client.tsx @@ -46,9 +46,9 @@ export default function PageClient() { const filteredApps = useMemo(() => { let apps = Object.keys(ALL_APPS) as AppId[]; - // Filter out alpha apps in production + // Filter out alpha apps in production, but keep enabled ones if (process.env.NODE_ENV !== "development") { - apps = apps.filter(appId => ALL_APPS[appId].stage !== "alpha"); + apps = apps.filter(appId => ALL_APPS[appId].stage !== "alpha" || installedAppsSet.has(appId)); } // Apply category filter @@ -88,14 +88,14 @@ export default function PageClient() { const getCategoryCount = (categoryId: string) => { if (categoryId === "installed") return installedApps.length; if (categoryId === "all") return Object.keys(ALL_APPS).filter(appId => - process.env.NODE_ENV === "development" || ALL_APPS[appId as AppId].stage !== "alpha" + process.env.NODE_ENV === "development" || ALL_APPS[appId as AppId].stage !== "alpha" || installedAppsSet.has(appId as AppId) ).length; const category = CATEGORIES.find(c => c.id === categoryId); if (!category) return 0; return (Object.entries(ALL_APPS) as [AppId, typeof ALL_APPS[AppId]][]).filter(([appId, app]) => { - if (process.env.NODE_ENV !== "development" && app.stage === "alpha") return false; + if (process.env.NODE_ENV !== "development" && app.stage === "alpha" && !installedAppsSet.has(appId)) return false; return app.tags.some((tag: string) => category.tags.includes(tag)); }).length; }; diff --git a/apps/dashboard/src/lib/apps-utils.ts b/apps/dashboard/src/lib/apps-utils.ts index cf405df3a3..c781417a1a 100644 --- a/apps/dashboard/src/lib/apps-utils.ts +++ b/apps/dashboard/src/lib/apps-utils.ts @@ -38,9 +38,13 @@ export function isAppEnabled(installedApps: InstalledAppsMap, appId: AppId): boo /** * Get all enabled app IDs using centralized enabled/sub-app logic. + * + * Unlike `getAllAvailableAppIds`, this intentionally includes alpha-stage apps + * that are explicitly enabled. The alpha filter only gates *discovery* + * (app store listing, onboarding wizard), not functionality. */ export function getEnabledAppIds(installedApps: InstalledAppsMap): AppId[] { - return getAllAvailableAppIds().filter((appId) => isAppEnabled(installedApps, appId)); + return (Object.keys(ALL_APPS) as AppId[]).filter((appId) => isAppEnabled(installedApps, appId)); } /**