Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
014dd45
Hide Explore extensions page when EXTENSIONS_API_URL is not configure…
lkostrowski Mar 2, 2026
58d4b6d
Merge branch 'main' into hide-extensions-self-hosted
lkostrowski Mar 2, 2026
fb7ea23
changeset
lkostrowski Mar 2, 2026
659295e
Gate all Explore Extensions entry points behind hasExtensionsApiUrl a…
lkostrowski Mar 2, 2026
5bdf6dd
cleanup envs and remove explore from dropdown
lkostrowski Mar 2, 2026
8420542
Fix EXTENSIONS_API_URL not being properly unset in Docker builds
lkostrowski Mar 2, 2026
e09dabb
Fix docker
lkostrowski Mar 2, 2026
40b4680
Show Explore Extensions for self-hosted with static JSON fallback
lkostrowski Mar 3, 2026
77bedf6
clean devcontainer
lkostrowski Mar 3, 2026
c496b00
changeset update
lkostrowski Mar 3, 2026
d80a55b
messages
lkostrowski Mar 5, 2026
baa0045
Merge branch 'main' into hide-extensions-self-hosted
lkostrowski Mar 5, 2026
36e3ed4
Merge branch 'main' into hide-extensions-self-hosted
lkostrowski Mar 9, 2026
725c50a
Merge branch 'main' into hide-extensions-self-hosted
lkostrowski Mar 9, 2026
65dc32d
Merge branch 'hide-extensions-self-hosted' of github.com:saleor/saleo…
lkostrowski Mar 9, 2026
fbc403d
Apply suggestion from @Copilot
lkostrowski Mar 9, 2026
7c0e3f7
messages
lkostrowski Mar 9, 2026
ebd992c
Update docs/configuration.md
lkostrowski Mar 9, 2026
063fa3b
messages
lkostrowski Mar 9, 2026
aec79b7
Merge branch 'main' into hide-extensions-self-hosted
lkostrowski Mar 9, 2026
3a07011
extract messages
lkostrowski Mar 10, 2026
5aedd48
Merge branch 'main' into hide-extensions-self-hosted
lkostrowski Mar 10, 2026
8740a7f
Address PR review comments
lkostrowski Mar 10, 2026
bf4374f
Merge branch 'main' into hide-extensions-self-hosted
lkostrowski Mar 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/fiery-pigs-kiss.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"saleor-dashboard": patch
---

When App Store is not configured (env variable not set), Dashboard will not longer crash. Instead it will load
local catalog of apps and plugins to render them as a fallback
3 changes: 0 additions & 3 deletions .devcontainer/dashboard.env
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@ API_URL=http://localhost:8000/graphql/
APP_MOUNT_URI=/dashboard/
STATIC_URL=/dashboard/

# Marketplace API URL to get Saleor app listings, used to retrieve information about
# apps from the Saleor App Marketplace.
APPS_MARKETPLACE_API_URL=https://apps.saleor.io/api/v2/saleor-apps
EXTENSIONS_API_URL=https://apps.saleor.io/api/v1/extensions

# Language for the Dashboard (ISO 639-1 format, e.g., `EN` for English,
Expand Down
4 changes: 2 additions & 2 deletions .env.template
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
API_URL=http://localhost:8000/graphql/
APP_MOUNT_URI=/
APPS_MARKETPLACE_API_URL=https://apps.saleor.io/api/v2/saleor-apps
EXTENSIONS_API_URL=https://apps.saleor.io/api/v1/extensions
# Provides source for App Store / explore feature. Only for Saleor Cloud
# EXTENSIONS_API_URL=https://apps.saleor.io/api/v1/extensions
LOCALE_CODE="EN"

# Multi-schema support (optional)
Expand Down
3 changes: 0 additions & 3 deletions .github/actions/run-pw-tests/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -108,9 +108,6 @@ runs:
- name: Run tests
shell: bash
env:
## backward compatibility for older versions
API_URI: ${{ inputs.API_URL }}
Comment on lines -111 to -112
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

some 100 years old legacy, cleaned that up


API_URL: ${{ inputs.API_URL }}
BASE_URL: ${{ inputs.BASE_URL }}
E2E_USER_NAME: ${{ inputs.E2E_USER_NAME }}
Expand Down
6 changes: 0 additions & 6 deletions .github/workflows/deploy-cloud.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,6 @@ jobs:
outputs:
ENVIRONMENT: ${{ env.ENVIRONMENT }}
env:
## backward compatibility for older versions
APPS_MARKETPLACE_API_URI: "https://apps.saleor.io/api/v2/saleor-apps"
## backward compatibility for older versions
API_URI: /graphql/

API_URL: /graphql/
APP_MOUNT_URI: /dashboard/
STATIC_URL: /dashboard/static/
Expand All @@ -48,7 +43,6 @@ jobs:
REGION: ${{ github.event.client_payload.region }}
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
APPS_MARKETPLACE_API_URL: "https://apps.saleor.io/api/v2/saleor-apps"
EXTENSIONS_API_URL: "https://apps.saleor.io/api/v1/extensions"
IS_CLOUD_INSTANCE: true
POSTHOG_KEY: ${{ secrets.POSTHOG_KEY }}
Expand Down
6 changes: 0 additions & 6 deletions .github/workflows/deploy-dev.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,6 @@ jobs:
id-token: write # needed by aws-actions/configure-aws-credentials
contents: read
env:
## backward compatibility for older versions
APPS_MARKETPLACE_API_URI: "https://apps.staging.saleor.io/api/v2/saleor-apps"
## backward compatibility for older versions
API_URI: /graphql/

API_URL: /graphql/
APP_MOUNT_URI: /dashboard/
STATIC_URL: /dashboard/static/
Expand All @@ -28,7 +23,6 @@ jobs:
SENTRY_URL_PREFIX: "~/dashboard/static"
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
APPS_MARKETPLACE_API_URL: "https://apps.staging.saleor.io/api/v2/saleor-apps"
EXTENSIONS_API_URL: "https://apps.staging.saleor.io/api/v1/extensions"
ENABLED_SERVICE_NAME_HEADER: true
ONBOARDING_USER_JOINED_DATE_THRESHOLD: ${{ vars.DEV_ONBOARDING_USER_JOINED_DATE_THRESHOLD }}
Expand Down
6 changes: 0 additions & 6 deletions .github/workflows/deploy-master-staging.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,6 @@ jobs:
outputs:
CUSTOM_VERSION: ${{ env.CUSTOM_VERSION }}
env:
## backward compatibility for older versions
API_URI: /graphql/
## backward compatibility for older versions
APPS_MARKETPLACE_API_URI: "https://apps.staging.saleor.io/api/v2/saleor-apps"

API_URL: /graphql/
APP_MOUNT_URI: /dashboard/
STATIC_URL: /dashboard/static/
Expand All @@ -27,7 +22,6 @@ jobs:
SENTRY_URL_PREFIX: "~/dashboard/static"
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
APPS_MARKETPLACE_API_URL: "https://apps.staging.saleor.io/api/v2/saleor-apps"
EXTENSIONS_API_URL: "https://apps.staging.saleor.io/api/v1/extensions"
IS_CLOUD_INSTANCE: true
ENABLED_SERVICE_NAME_HEADER: true
Expand Down
6 changes: 0 additions & 6 deletions .github/workflows/deploy-staging-and-prepare-release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -65,11 +65,6 @@ jobs:
CUSTOM_VERSION: ${{ env.CUSTOM_VERSION || env.VERSION }}
ENVIRONMENT: ${{ env.ENVIRONMENT }}
env:
## backward compatibility for older versions
APPS_MARKETPLACE_API_URI: "https://apps.staging.saleor.io/api/v2/saleor-apps"
## backward compatibility for older versions
API_URI: /graphql/

API_URL: /graphql/
APP_MOUNT_URI: /dashboard/
STATIC_URL: /dashboard/static/
Expand All @@ -78,7 +73,6 @@ jobs:
SENTRY_URL_PREFIX: "~/dashboard/static"
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
APPS_MARKETPLACE_API_URL: "https://apps.staging.saleor.io/api/v2/saleor-apps"
EXTENSIONS_API_URL: "https://apps.staging.saleor.io/api/v1/extensions"
VERSION: ${{ github.event.inputs.git_ref || github.ref_name }}
IS_CLOUD_INSTANCE: true
Expand Down
6 changes: 0 additions & 6 deletions .github/workflows/pr-automation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -120,13 +120,7 @@ jobs:
- name: Build dashboard
id: build-dashboard
env:
## backward compatibility for older versions
API_URI: ${{ needs.initialize-cloud.outputs.API_URL }}
## backward compatibility for older versions
APPS_MARKETPLACE_API_URI: "https://apps.staging.saleor.io/api/v2/saleor-apps"

API_URL: ${{ needs.initialize-cloud.outputs.API_URL }}
APPS_MARKETPLACE_API_URL: "https://apps.staging.saleor.io/api/v2/saleor-apps"
EXTENSIONS_API_URL: "https://apps.staging.saleor.io/api/v1/extensions"
APP_MOUNT_URI: /
STATIC_URL: /
Expand Down
2 changes: 0 additions & 2 deletions .storybook/preview-head.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@
API_URL: "/graphql/",
APP_MOUNT_URI: "/",
STATIC_URL: "/",
APPS_MARKETPLACE_API_URL: "https://marketplace.saleor.io",
EXTENSIONS_API_URL: "https://extensions.saleor.io",
APPS_TUNNEL_URL_KEYWORDS: "",
IS_CLOUD_INSTANCE: "false",
LOCALE_CODE: "",
};
Expand Down
6 changes: 1 addition & 5 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -22,18 +22,14 @@ COPY src/ src/

ARG API_URL
ARG APP_MOUNT_URI
ARG APPS_MARKETPLACE_API_URL
ARG EXTENSIONS_API_URL
ARG APPS_TUNNEL_URL_KEYWORDS
ARG STATIC_URL
ARG SKIP_SOURCEMAPS
ARG LOCALE_CODE

ENV API_URL="${API_URL:-http://localhost:8000/graphql/}"
ENV APP_MOUNT_URI="${APP_MOUNT_URI:-/dashboard/}"
ENV APPS_MARKETPLACE_API_URL="${APPS_MARKETPLACE_API_URL:-https://apps.saleor.io/api/v2/saleor-apps}"
ENV EXTENSIONS_API_URL="${EXTENSIONS_API_URL:-https://apps.saleor.io/api/v1/extensions}"
ENV APPS_TUNNEL_URL_KEYWORDS="${APPS_TUNNEL_URL_KEYWORDS}"
ENV EXTENSIONS_API_URL="${EXTENSIONS_API_URL}"
ENV STATIC_URL="${STATIC_URL:-/dashboard/}"
ENV SKIP_SOURCEMAPS="${SKIP_SOURCEMAPS:-true}"
ENV LOCALE_CODE="${LOCALE_CODE:-EN}"
Expand Down
6 changes: 1 addition & 5 deletions docs/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,7 @@ Create or edit `.env` file in a root directory or set environment variables with
- `STATIC_URL` - URL where the static files are located.
E.g., if you use an S3 bucket, you should set it to the bucket's URL. By default, Saleor assumes you serve static files from the root of your site at "http://localhost:9000/".

- `APPS_MARKETPLACE_API_URL` - URI of Marketplace API to fetch list of Apps in JSON.

- `EXTENSIONS_API_URL` - URI of Marketplace API to fetch list of Extensions in JSON.

- `APPS_TUNNEL_URL_KEYWORDS` - Custom apps tunnel URL keywords.
- `EXTENSIONS_API_URL` - Optional URI of the Saleor Marketplace API used to fetch the list of extensions in JSON. Saleor Cloud projects have this preconfigured; self-hosted deployments can omit it and the Dashboard will fall back to a bundled `extensions.json` dataset and show a self-hosted banner in the Explore view.

## Fetching schema

Expand Down
4 changes: 0 additions & 4 deletions docs/docker.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,7 @@ The replacement is not limited to `API_URL` only. You can also replace other env
docker exec -it \
-e "API_URL=NEW_API_URL" \
-e "APP_MOUNT_URI=NEW_APP_MOUNT_URI" \
-e "APPS_MARKETPLACE_API_URL=NEW_APPS_MARKETPLACE_API_URL" \
-e "EXTENSIONS_API_URL=NEW_EXTENSIONS_API_URL" \
-e "APPS_TUNNEL_URL_KEYWORDS=NEW_APPS_TUNNEL_URL_KEYWORDS" \
-e "IS_CLOUD_INSTANCE=NEW_IS_CLOUD_INSTANCE" \
-e "LOCALE_CODE=NEW_LOCALE_CODE" \
saleor-dashboard /docker-entrypoint.d/50-replace-env-vars.sh
Expand All @@ -40,9 +38,7 @@ Of course you can also provide all the environment variables at the `docker run`
docker run --publish 8080:80 \
-e "API_URL=NEW_API_URL" \
-e "APP_MOUNT_URI=NEW_APP_MOUNT_URI" \
-e "APPS_MARKETPLACE_API_URL=NEW_APPS_MARKETPLACE_API_URL" \
-e "EXTENSIONS_API_URL=NEW_EXTENSIONS_API_URL" \
-e "APPS_TUNNEL_URL_KEYWORDS=NEW_APPS_TUNNEL_URL_KEYWORDS" \
-e "IS_CLOUD_INSTANCE=NEW_IS_CLOUD_INSTANCE" \
-e "LOCALE_CODE=NEW_LOCALE_CODE" \
saleor-dashboard
Expand Down
6 changes: 3 additions & 3 deletions locale/defaultMessages.json
Original file line number Diff line number Diff line change
Expand Up @@ -1408,6 +1408,9 @@
"context": "tax strategy combobox hint",
"string": "Select the method of tax calculation"
},
"6IteaF": {
"string": "Apps are available for Saleor Cloud users. Most of them are available for self-hosting."
},
"6J1m2c": {
"string": "Create a Model"
},
Expand Down Expand Up @@ -7784,9 +7787,6 @@
"gVqSnA": {
"string": "Assign and save"
},
"gZ1qnD": {
"string": "No extensions API URL provided"
},
"gaOXvo": {
"context": "notification, form submitted",
"string": "Refund grant for order #{orderNumber} was updated"
Expand Down
4 changes: 1 addition & 3 deletions nginx/replace-env-vars.sh
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ replace_env_var() {
var_value=$(eval echo \$"$var_name")
if [ -n "$var_value" ]; then
echo "Setting $var_name to: $var_value"
sed -i "s#$var_name: \".*\"#$var_name: \"$var_value\"#" "$INDEX_BUNDLE_PATH"
sed -i "s#\([[:space:]]*\)$var_name:[[:space:]]*\"[^\"]*\"#\1$var_name: \"$var_value\"#" "$INDEX_BUNDLE_PATH"
else
echo "No $var_name provided, using defaults."
fi
Expand All @@ -22,9 +22,7 @@ replace_env_var() {
# Replace each environment variable
replace_env_var "API_URL"
replace_env_var "APP_MOUNT_URI"
replace_env_var "APPS_MARKETPLACE_API_URL"
replace_env_var "EXTENSIONS_API_URL"
replace_env_var "APPS_TUNNEL_URL_KEYWORDS"
replace_env_var "IS_CLOUD_INSTANCE"
replace_env_var "LOCALE_CODE"

Expand Down
2 changes: 1 addition & 1 deletion src/components/NavigatorSearch/useActionTriggers.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -600,7 +600,7 @@ const allActions: TriggerDescriptor[] = [
{
section: allMessages.extensionsSection,
name: allMessages.gotoExploreExtensions,
Component: ({ onClick }) => (
Component: ({ onClick }: { onClick?: React.MouseEventHandler<HTMLAnchorElement> }) => (
<Box onClick={onClick}>
<ActionLinkItem href={ExtensionsUrls.resolveExploreExtensionsUrl()}>
<FormattedMessage {...allMessages.gotoExploreExtensions} />
Comment on lines 600 to 606
Copy link

Copilot AI Mar 3, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Navigator Search action still links to Explore unconditionally. If /extensions/explore should be unavailable when EXTENSIONS_API_URL is unset (per PR title/description), this action should be gated the same way to avoid a dead link in self-hosted setups.

Copilot uses AI. Check for mistakes.
Expand Down
2 changes: 1 addition & 1 deletion src/components/Sidebar/menu/hooks/useMenuStructure.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ export function useMenuStructure() {
id: "explore-extensions",
url: ExtensionsPaths.exploreExtensions,
permissions: [],
type: "item",
type: "item" as const,
},
],
});
Expand Down
9 changes: 0 additions & 9 deletions src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,6 @@ export const getAbsoluteApiUrl = () => new URL(getApiUrl(), window.location.orig
export const SW_INTERVAL = parseInt(process.env.SW_INTERVAL ?? "300", 10);
export const IS_CLOUD_INSTANCE = window.__SALEOR_CONFIG__.IS_CLOUD_INSTANCE === "true";

export const getAppsConfig = () => ({
marketplaceApiUri: window.__SALEOR_CONFIG__.APPS_MARKETPLACE_API_URL,
tunnelUrlKeywords: window.__SALEOR_CONFIG__.APPS_TUNNEL_URL_KEYWORDS?.split(";") || [
".ngrok.io",
".saleor.live",
".trycloudflare.com",
],
});

export const getExtensionsConfig = () => ({
extensionsApiUri: window.__SALEOR_CONFIG__.EXTENSIONS_API_URL,
});
Expand Down
Loading
Loading