From 934a8a536c4845cef8eda575d13ff85bd486e582 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 20 May 2026 18:03:05 +0000 Subject: [PATCH] Fix enabled alpha apps not showing in sidebar and app store getEnabledAppIds was filtering through getAllAvailableAppIds which excludes alpha-stage apps in production. This meant enabled alpha apps (like support) were hidden from the sidebar, CmdK, and app store. Now enabled apps are always shown regardless of stage. The alpha filter only gates discovery (app store listing for new apps, onboarding wizard). Co-Authored-By: Konstantin Wohlwend --- .../(protected)/projects/[projectId]/apps/page-client.tsx | 8 ++++---- apps/dashboard/src/lib/apps-utils.ts | 6 +++++- 2 files changed, 9 insertions(+), 5 deletions(-) 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)); } /**