Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
89 commits
Select commit Hold shift + click to select a range
b925272
refactor: Pin filing-cabinet typescript to stabilize lockfile regener…
mtrezza Jul 13, 2026
44ef273
refactor: Bump undici from 6.24.0 to 6.27.0 (#3381)
dependabot[bot] Jul 13, 2026
de06161
refactor: Bump form-data from 2.5.5 to 2.5.6 (#3375)
dependabot[bot] Jul 13, 2026
bd41672
refactor: Bump @babel/core from 7.29.0 to 7.29.6 (#3402)
mtrezza Jul 13, 2026
9fe8bc7
refactor: Bump ws from 8.20.0 to 8.21.0 (#3403)
mtrezza Jul 13, 2026
4fc1c0b
refactor: Bump parse-server from 9.7.0 to 9.9.0 (#3401)
mtrezza Jul 13, 2026
dffc726
refactor: Bump @protobufjs/utf8 from 1.1.0 to 1.1.2 (#3358)
dependabot[bot] Jul 13, 2026
f0285a5
refactor: Bump postcss from 8.5.3 to 8.5.19 (#3355)
dependabot[bot] Jul 13, 2026
5a8bdce
refactor: Bump fast-uri from 3.1.0 to 3.1.3 (#3353)
dependabot[bot] Jul 13, 2026
72a8478
refactor: Bump fast-xml-builder from 1.1.4 to 1.3.0 (#3352)
dependabot[bot] Jul 13, 2026
d9292db
refactor: Bump fast-xml-parser from 5.5.9 to 5.10.0 (#3346)
dependabot[bot] Jul 13, 2026
f4f751d
refactor: Bump typescript from 6.0.2 to 6.0.3 (#3404)
mtrezza Jul 13, 2026
156ec26
refactor: Bump globals from 17.3.0 to 17.5.0 (#3405)
mtrezza Jul 13, 2026
d922d96
refactor: Bump @babel/plugin-transform-modules-systemjs from 7.29.0 t…
dependabot[bot] Jul 13, 2026
b7f04e1
refactor: Bump webpack from 5.105.1 to 5.106.2 (#3406)
mtrezza Jul 13, 2026
dff103a
refactor: Bump qs from 6.15.0 to 6.15.3 (#3366)
dependabot[bot] Jul 13, 2026
0f9194a
refactor: Bump js-cookie from 3.0.5 to 3.0.8 (#3364)
dependabot[bot] Jul 13, 2026
33ce7b8
fix: Advertise localhost instead of 0.0.0.0 in the dashboard startup …
mtrezza Jul 17, 2026
baeaf8d
chore(release): 9.2.1-alpha.1 [skip ci]
semantic-release-bot Jul 17, 2026
c3e16c2
feat: React 19 + react-router 7 + GraphiQL 5 coordinated upgrade (#3409)
mtrezza Jul 18, 2026
62b4f6f
chore(release): 9.3.0-alpha.1 [skip ci]
semantic-release-bot Jul 18, 2026
7d6408f
refactor: Bump parse-server from 9.9.0 to 9.10.0 (#3411)
mtrezza Jul 19, 2026
5093c77
refactor: Bump jest-environment-jsdom from 30.0.5 to 30.4.1 (#3417)
mtrezza Jul 20, 2026
00b111d
refactor: Bump semver from 7.7.4 to 7.8.5 (#3418)
mtrezza Jul 20, 2026
f52c746
refactor: Bump globals from 17.5.0 to 17.7.0 (#3421)
mtrezza Jul 21, 2026
5b4f2e6
refactor: Bump webpack-cli from 7.0.2 to 7.2.1 (#3423)
mtrezza Jul 23, 2026
7150acf
fix: Prevent Config table crash when a parameter value is null (#3424)
Moumouls Jul 23, 2026
260481a
chore(release): 9.3.0-alpha.2 [skip ci]
semantic-release-bot Jul 23, 2026
2d1b739
fix: Add Cancel and Add buttons to the add-row modal (#1995) (#3383)
dblythy Jul 25, 2026
5d49f1c
chore(release): 9.3.0-alpha.3 [skip ci]
semantic-release-bot Jul 25, 2026
4879959
fix: Info panel data not loaded when opened over an existing selectio…
dblythy Jul 25, 2026
1948f96
chore(release): 9.3.0-alpha.4 [skip ci]
semantic-release-bot Jul 25, 2026
60cb379
fix: Remote access restrictions not enforced when running behind a re…
mtrezza Aug 11, 2026
4b257f9
chore(release): 9.3.0-alpha.5 [skip ci]
semantic-release-bot Aug 11, 2026
33a37e4
refactor: Bump react-router from 7.18.1 to 7.18.2 (#3438)
mtrezza Aug 26, 2026
2ee7843
refactor: Bump js-yaml from 3.14.2 to 3.15.2 (#3451)
mtrezza Sep 24, 2026
8b67116
refactor: Bump browserslist from 4.28.1 to 4.29.0 (#3452)
mtrezza Sep 24, 2026
bb0f9e0
refactor: Bump fast-uri from 3.1.3 to 3.1.8 (#3453)
mtrezza Sep 24, 2026
937fe17
fix: Bump brace-expansion from 1.1.13 to 1.1.21 (#3454)
mtrezza Sep 24, 2026
6ddaab5
chore(release): 9.3.0-alpha.6 [skip ci]
semantic-release-bot Sep 24, 2026
5e9f4b4
refactor: Bump fast-xml-parser from 5.10.0 to 5.11.1 (#3455)
mtrezza Sep 24, 2026
5097c04
fix: Bump immutable from 5.1.5 to 5.1.9 (#3457)
mtrezza Sep 24, 2026
82be421
chore(release): 9.3.0-alpha.7 [skip ci]
semantic-release-bot Sep 24, 2026
04f5acb
fix: Bump qs from 6.15.3 to 6.16.0 (#3458)
mtrezza Sep 24, 2026
8664ed0
chore(release): 9.3.0-alpha.8 [skip ci]
semantic-release-bot Sep 24, 2026
731ba38
refactor: Bump @humanfs/node from 0.16.6 to 0.16.8 (#3459)
mtrezza Sep 24, 2026
89cd816
refactor: Bump undici from 6.27.0 to 6.28.1 (#3460)
mtrezza Sep 24, 2026
4fff3df
refactor: Bump postcss from 8.5.19 to 8.5.28 and css-loader from 7.1.…
mtrezza Sep 24, 2026
c495826
refactor: Bump postcss-selector-parser from 7.1.1 to 7.1.6 (#3464)
mtrezza Sep 25, 2026
662899b
fix: Bump body-parser from 2.2.2 to 2.3.0 (#3465)
mtrezza Sep 25, 2026
b1a2d3e
chore(release): 9.3.0-alpha.9 [skip ci]
semantic-release-bot Sep 25, 2026
d9e0f52
refactor: Bump otpauth from 9.5.0 to 9.5.2 (#3466)
mtrezza Sep 25, 2026
f31ada5
fix: Bump glob from 10.4.5 to 10.5.0 and minimatch from 9.0.1 to 9.0.…
mtrezza Sep 25, 2026
8b2ccb9
chore(release): 9.3.0-alpha.10 [skip ci]
semantic-release-bot Sep 25, 2026
8a4c12b
fix: Bump parse from 8.5.0 to 8.6.2 (#3468)
mtrezza Sep 25, 2026
c3ed2a6
chore(release): 9.3.0-alpha.11 [skip ci]
semantic-release-bot Sep 25, 2026
d03af49
refactor: Bump js-yaml from 4.1.1 to 4.3.2 (#3469)
mtrezza Sep 25, 2026
71c5253
refactor: Bump basic-ftp from 5.2.0 to 5.3.1 (#3470)
mtrezza Sep 25, 2026
b41e53b
refactor: Bump tar from 7.5.13 to 7.5.22 (#3471)
mtrezza Sep 25, 2026
d88d21e
refactor: Bump uuid from 11.1.0 to 11.1.1 (#3472)
mtrezza Sep 25, 2026
f650027
refactor: Bump ip-address from 9.0.5 to 10.7.2, socks from 2.8.6 to 2…
mtrezza Sep 25, 2026
f14a5d8
refactor: Bump tar from 7.5.11 to 7.5.22, npm from 10.9.8 to 10.9.9 a…
mtrezza Sep 26, 2026
c23655a
refactor: Bump puppeteer from 24.37.2 to 24.43.1 (#3476)
mtrezza Sep 26, 2026
4807ffc
refactor: Bump npm from 10.9.9 to 11.20.0 (#3477)
mtrezza Sep 26, 2026
e017c62
fix: Bump proxy-addr from 2.0.7 to 2.0.8 (#3490)
mtrezza Oct 17, 2026
3ff8b5c
chore(release): 9.3.0-alpha.12 [skip ci]
semantic-release-bot Oct 17, 2026
cd1a96d
refactor: Bump handlebars from 4.7.9 to 4.7.10 (#3491)
mtrezza Oct 17, 2026
4f102bf
refactor: Bump source-map-js from 1.2.1 to 1.2.2 (#3492)
mtrezza Oct 17, 2026
ea8b78b
refactor: Bump moment from 2.30.1 to 2.31.0 (#3493)
mtrezza Oct 17, 2026
12d7cc0
fix: Bump markdown-it from 14.3.0 to 14.3.3 (#3494)
mtrezza Oct 17, 2026
b9d232d
chore(release): 9.3.0-alpha.13 [skip ci]
semantic-release-bot Oct 17, 2026
d1fb925
refactor: Bump react-draggable from 4.7.0 to 4.7.2 (#3495)
mtrezza Oct 17, 2026
3e689a7
refactor: Bump @microlink/react-json-view from 1.31.22 to 1.31.40 (#3…
mtrezza Oct 17, 2026
1986e2b
refactor: Bump npm from 11.20.0 to 11.21.1 (#3497)
mtrezza Oct 17, 2026
13ecc66
refactor: Bump inquirer from 13.2.2 to 14.2.3 (#3501)
mtrezza Oct 24, 2026
cb9caf8
fix: Bump body-parser from 2.3.0 to 2.4.0 (#3508)
mtrezza Oct 27, 2026
373e9b2
chore(release): 9.3.0-alpha.14 [skip ci]
semantic-release-bot Oct 27, 2026
6861800
refactor: Bump undici from 6.28.1 to 6.29.1, 7.29.1 to 7.30.1 and 7.3…
mtrezza Oct 27, 2026
ffa89d2
refactor: Bump fast-uri from 3.1.8 to 3.1.9 (#3511)
mtrezza Oct 27, 2026
9ead37d
refactor: Replace deprecated mongodb-runner with @mongodb-js/mongodb-…
mtrezza Oct 28, 2026
562dc1a
ci: Docker release crashes or times out under arm64 emulation (#3516)
mtrezza Oct 28, 2026
9dc2c30
fix: Security upgrade Docker image from Node.js 20 to 24 (#3518)
mtrezza Nov 2, 2026
f99aa8a
chore(release): 9.3.0-alpha.15 [skip ci]
semantic-release-bot Nov 2, 2026
619c342
refactor: Bump puppeteer from 24.43.1 to 25.16.0 (#3523)
mtrezza Nov 3, 2026
bdc5d62
feat: Add support for Node.js 26 (#3525)
mtrezza Nov 4, 2026
62885a9
chore(release): 9.3.0-alpha.16 [skip ci]
semantic-release-bot Nov 4, 2026
2ff9098
feat: Remove Node 20 support and increase minimum required Node 22 ve…
mtrezza Nov 4, 2026
99c130e
chore(release): 10.0.0-alpha.1 [skip ci]
semantic-release-bot Nov 4, 2026
8763ae6
empty commit to trigger CI
github-actions[bot] Nov 4, 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
13 changes: 13 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,16 @@ updates:
commit-message:
# Set commit message prefix
prefix: "refactor"
- package-ecosystem: "docker"
# Location of Dockerfile
directory: "/"
# Check daily for updates
schedule:
interval: "daily"
ignore:
# Update the Node.js major version only with a Parse Dashboard major release
- dependency-name: "node"
update-types: ["version-update:semver-major"]
commit-message:
# Set commit message prefix; fix triggers a release that publishes the updated image
prefix: "fix"
2 changes: 1 addition & 1 deletion .github/workflows/ci-automated-check-environment.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 20
node-version: 22
cache: npm
- name: Install dependencies
run: npm ci
Expand Down
26 changes: 10 additions & 16 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,24 +60,18 @@ jobs:
include:
- name: Docker linux/amd64
DOCKER_PLATFORM: linux/amd64
CACHE_SCOPE: docker-amd64
RUNNER_TYPE: ubuntu-latest
- name: Docker linux/arm64/v8
DOCKER_PLATFORM: linux/arm64/v8
CACHE_SCOPE: docker-arm64
RUNNER_TYPE: ubuntu-latest
# - name: Docker linux/arm64/v8
# DOCKER_PLATFORM: linux/arm64/v8
# # Replace this with a native arm linux runner when available, presumably by EOY 2024, see:
# # https://github.com/orgs/community/discussions/19197#discussioncomment-10550689
# # The conditional setup of QEMU may need to be adapted to not run on native arm,
# # which will speed up the build process for arm64/v8 since no emulation will be needed.
# RUNNER_TYPE: ubuntu-latest
fail-fast: false
name: ${{ matrix.name }}
timeout-minutes: 45
runs-on: ${{ matrix.RUNNER_TYPE }}
steps:
- uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
# Only set up QEMU if not running on native arm
if: ${{ matrix.DOCKER_PLATFORM != 'linux/amd64' && matrix.RUNNER_TYPE == 'ubuntu-latest' }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
with:
Expand All @@ -86,8 +80,8 @@ jobs:
uses: docker/build-push-action@v3
with:
platforms: ${{ matrix.DOCKER_PLATFORM }}
cache-from: type=gha
cache-to: type=gha,mode=max
cache-from: type=gha,scope=${{ matrix.CACHE_SCOPE }}
cache-to: type=gha,mode=max,scope=${{ matrix.CACHE_SCOPE }}
check-lock-file-version:
name: NPM Lock File Version
timeout-minutes: 5
Expand All @@ -105,12 +99,12 @@ jobs:
strategy:
matrix:
include:
- name: Node 20
NODE_VERSION: 20.19.0
- name: Node 22
NODE_VERSION: 22.12.0
NODE_VERSION: 22.13.0
- name: Node 24
NODE_VERSION: 24.1.0
- name: Node 26
NODE_VERSION: 26.13.0
fail-fast: false
name: ${{ matrix.name }}
timeout-minutes: 15
Expand Down
3 changes: 0 additions & 3 deletions .github/workflows/release-automated.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,6 @@ jobs:
uses: actions/checkout@v2
with:
ref: ${{ needs.release.outputs.current_tag }}
- name: Set up QEMU
id: qemu
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
with:
Expand Down
3 changes: 0 additions & 3 deletions .github/workflows/release-manual-docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,6 @@ jobs:
uses: actions/checkout@v2
with:
ref: ${{ github.event.inputs.ref }}
- name: Set up QEMU
id: qemu
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
with:
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,6 @@ test_logs
# AI tools
.claude
.superpowers

# Docs
/docs/
34 changes: 26 additions & 8 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,33 +1,51 @@
############################################################
# Build stage
############################################################
FROM node:20.19.0-alpine3.20 AS build
# Runs on the platform of the build machine, also when building the image for
# another platform, so that no code runs under emulation; Node.js running under
# QEMU emulation can crash with an illegal instruction. Builders that don't set
# BUILDPLATFORM, like the legacy Docker builder, run it on their own platform.
FROM --platform=${BUILDPLATFORM:-linux} node:24.22.2-alpine AS build

RUN apk --no-cache add git
WORKDIR /src

# Copy package.json first to benefit from layer caching
COPY package*.json ./

# Install without scripts otherwise webpack will fail
RUN npm ci --omit=dev --ignore-scripts
# Architecture of the image to build, set by BuildKit; builders that don't set
# it build the image for their own platform
ARG TARGETARCH

# Install production dependencies for the image platform without scripts
# otherwise webpack will fail
RUN arch="${TARGETARCH:-$(uname -m)}" \
&& case "$arch" in \
amd64|x86_64) cpu=x64 ;; \
arm64|aarch64) cpu=arm64 ;; \
arm|armv6l|armv7l) cpu=arm ;; \
ppc64le) cpu=ppc64 ;; \
s390x) cpu=s390x ;; \
*) echo "Unsupported target architecture: '$arch'" >&2; exit 1 ;; \
esac \
&& npm ci --omit=dev --ignore-scripts --os=linux --cpu="$cpu" --libc=musl

# Copy production node_modules aside for later
RUN cp -R node_modules prod_node_modules

# Copy src to have webpack config files ready for install
COPY . /src

# Install remaining dev dependencies
# Install remaining dev dependencies; this also runs the prepare script, which
# builds the bundles of the image
RUN npm ci

# Run all webpack build steps
RUN npm run prepare && npm run build

############################################################
# Release stage
############################################################
FROM node:20.19.0-alpine3.20 AS release
# Must not contain RUN instructions, because building the image for another
# platform than the one of the build machine would then require emulation.
FROM node:24.22.2-alpine AS release
WORKDIR /src

# Copy production node_modules
Expand Down
63 changes: 53 additions & 10 deletions Parse-Dashboard/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -87,13 +87,52 @@ module.exports = function(config, options) {
cookieSessionStore: options.cookieSessionStore
});

// Headers set by reverse proxies to describe the original client. Their
// presence means the request was relayed and did not originate on this host.
// The `x-forwarded-` prefix is matched as a whole because proxies vary in
// which of them they set, and any single one is enough to reveal a relay.
const forwardingHeaderPrefix = 'x-forwarded-';
const forwardingHeaders = ['x-real-ip', 'forwarded'];

/**
* Checks whether a request is from localhost.
* Checks whether the connection was opened from this host.
*
* This describes the connection, not the client: a reverse proxy running on
* the same host also connects over loopback, so a true result does not mean
* the client is local. Use it only to decide whether the connection itself
* needs encrypting, never to grant access.
*/
function isLoopbackPeer(req) {
// The whole of 127.0.0.0/8 is loopback, not just 127.0.0.1. The address is
// absent on a socket that has already been destroyed.
const address = req.socket.remoteAddress;
return typeof address === 'string' && (
address.startsWith('127.') ||
address.startsWith('::ffff:127.') ||
address === '::1'
);
}

/**
* Checks whether a request originated on this host.
*
* Stricter than `isLoopbackPeer`, because a same-host reverse proxy would
* otherwise make every request it relays look local. A request counts as
* local only when nothing indicates it was relayed.
*/
function isLocalRequest(req) {
return req.connection.remoteAddress === '127.0.0.1' ||
req.connection.remoteAddress === '::ffff:127.0.0.1' ||
req.connection.remoteAddress === '::1';
// A configured proxy relays every request, so no request is local.
if (config.trustProxy) {
return false;
}
// Forwarding headers are never sent by a client on this host.
const isForwarded = Object.keys(req.headers).some(header =>
header.startsWith(forwardingHeaderPrefix) || forwardingHeaders.includes(header)
);
if (isForwarded) {
return false;
}
return isLoopbackPeer(req);
}

/**
Expand All @@ -102,11 +141,15 @@ module.exports = function(config, options) {
* - Requires users to be configured for remote access (unless dev mode is enabled)
*/
function enforceRemoteAccessRestrictions(req, res, next) {
if (!options.dev && !isLocalRequest(req)) {
if (!req.secure && !options.allowInsecureHTTP) {
if (!options.dev) {
// Keyed on the connection: a loopback connection cannot be observed off
// this host, so it needs no encryption of its own.
if (!isLoopbackPeer(req) && !req.secure && !options.allowInsecureHTTP) {
return res.status(403).json({ error: 'Parse Dashboard can only be remotely accessed via HTTPS' });
}
if (!users) {
// Keyed on the client: granting access requires knowing where the
// request came from, which a relayed request cannot establish.
if (!isLocalRequest(req) && !users) {
return res.status(401).json({ error: 'Configure a user to access Parse Dashboard remotely' });
}
}
Expand Down Expand Up @@ -135,13 +178,13 @@ module.exports = function(config, options) {
agent: config.agent,
};

if (!options.dev && !isLocalRequest(req)) {
if (!req.secure && !options.allowInsecureHTTP) {
if (!options.dev) {
if (!isLoopbackPeer(req) && !req.secure && !options.allowInsecureHTTP) {
//Disallow HTTP requests except on localhost, to prevent the master key from being transmitted in cleartext
return res.send({ success: false, error: 'Parse Dashboard can only be remotely accessed via HTTPS' });
}

if (!users) {
if (!isLocalRequest(req) && !users) {
//Accessing the dashboard over the internet can only be done with username and password
return res.send({ success: false, error: 'Configure a user to access Parse Dashboard remotely' });
}
Expand Down
2 changes: 1 addition & 1 deletion Parse-Dashboard/browser-control/BrowserControlAPI.js
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ function createBrowserControlAPI(getWebpackState) {
await page.waitForSelector(selector, { timeout });

// Clear existing text first
await page.click(selector, { clickCount: 3 });
await page.click(selector, { count: 3 });
await page.keyboard.press('Backspace');

// Type new text
Expand Down
2 changes: 1 addition & 1 deletion Parse-Dashboard/browser-control/BrowserSessionManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ class BrowserSessionManager extends EventEmitter {
}

// Close browser
if (session.browser && session.browser.isConnected()) {
if (session.browser && session.browser.connected) {
await session.browser.close();
}
} catch (error) {
Expand Down
4 changes: 2 additions & 2 deletions Parse-Dashboard/browser-control/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ The Browser Control API is a development-time tool that allows AI agents to inte
### Prerequisites

**Requirements:**
- Node.js 20.19.0 or higher
- A Node.js version that Parse Dashboard supports, see [Node.js](../../README.md#nodejs)

**Note:** MongoDB is automatically started when you run `npm run browser-control` - no manual setup needed!

Expand Down Expand Up @@ -790,7 +790,7 @@ The Browser Control API uses a **two-layer security model** to prevent accidenta
- `BROWSER_SLOW_MO=100` - Slow down browser operations by N milliseconds

### MongoDB Auto-Start (when browser-control is enabled)
MongoDB is automatically started when browser-control mode is enabled using `mongodb-runner`.
MongoDB is automatically started when browser-control mode is enabled using `@mongodb-js/mongodb-runner`.

- `MONGO_PORT=27017` - MongoDB port (default: 27017)
- `MONGO_VERSION=8.0.4` - MongoDB version (default: 8.0.4)
Expand Down
2 changes: 1 addition & 1 deletion Parse-Dashboard/browser-control/setup.js
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ function setupBrowserControl(app, config) {
let webpackWatcher = null;

// Auto-start MongoDB and Parse Server
const { MongoCluster } = require('mongodb-runner');
const { MongoCluster } = require('@mongodb-js/mongodb-runner');
const mongoPort = parseInt(process.env.MONGO_PORT, 10) || 27017;
const parseServerPort = parseInt(process.env.PARSE_SERVER_PORT, 10) || 1337;
const parseServerURL = `http://localhost:${parseServerPort}/parse`;
Expand Down
11 changes: 9 additions & 2 deletions Parse-Dashboard/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -191,11 +191,18 @@ module.exports = (options) => {
// Mount parseDashboard with authentication
app.use(mountPath, parseDashboard(config.data, dashboardOptions));

// 0.0.0.0 (IPv4) and :: (IPv6) are bind-all addresses: they are not directly
// navigable and browsers do not treat them as a secure context, which breaks
// Web APIs the dashboard relies on (e.g. crypto.randomUUID used by the Parse
// SDK). Advertise localhost instead so the printed URL actually works.
const displayHost = address =>
address === '0.0.0.0' || address === '::' ? 'localhost' : address;

let server;
if(!configSSLKey || !configSSLCert){
// Start the server.
server = app.listen(port, host, function () {
console.log(`The dashboard is now available at http://${server.address().address}:${server.address().port}${mountPath}`);
console.log(`The dashboard is now available at http://${displayHost(server.address().address)}:${server.address().port}${mountPath}`);

// Initialize browser control WebSocket if enabled
if (browserControlSetup) {
Expand All @@ -211,7 +218,7 @@ module.exports = (options) => {
key: privateKey,
cert: certificate
}, app).listen(port, host, function () {
console.log(`The dashboard is now available at https://${server.address().address}:${server.address().port}${mountPath}`);
console.log(`The dashboard is now available at https://${displayHost(server.address().address)}:${server.address().port}${mountPath}`);

// Initialize browser control WebSocket if enabled
if (browserControlSetup) {
Expand Down
10 changes: 6 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
[![Build Status](https://github.com/parse-community/parse-dashboard/workflows/ci/badge.svg?branch=release)](https://github.com/parse-community/parse-dashboard/actions?query=workflow%3Aci+branch%3Arelease)
[![Snyk Badge](https://snyk.io/test/github/parse-community/parse-dashboard/badge.svg)](https://snyk.io/test/github/parse-community/parse-dashboard)

[![Node Version](https://img.shields.io/badge/nodejs-20,_22,_24-green.svg?logo=node.js&style=flat)](https://nodejs.org/)
[![Node Version](https://img.shields.io/badge/nodejs-22,_24,_26-green.svg?logo=node.js&style=flat)](https://nodejs.org/)
[![auto-release](https://img.shields.io/badge/%F0%9F%9A%80-auto--release-9e34eb.svg)](https://github.com/parse-community/parse-dashboard/releases)

[![npm latest version](https://img.shields.io/npm/v/parse-dashboard/latest.svg)](https://www.npmjs.com/package/parse-dashboard)
Expand Down Expand Up @@ -168,9 +168,9 @@ Parse Dashboard is continuously tested with the most recent releases of Node.js

| Version | Minimum version | End-of-Life | Compatible |
|------------|----------------|-------------|------------|
| Node.js 20 | 20.18.0 | April 2026 | ✅ Yes |
| Node.js 22 | 22.9.0 | April 2027 | ✅ Yes |
| Node.js 24 | 24.0.0 | April 2028 | ✅ Yes |
| Node.js 22 | 22.13.0 | April 2027 | ✅ Yes |
| Node.js 24 | 24.1.0 | April 2028 | ✅ Yes |
| Node.js 26 | 26.13.0 | April 2029 | ✅ Yes |

## Configuring Parse Dashboard

Expand Down Expand Up @@ -986,6 +986,8 @@ You can provide a list of locales or languages you want to support for your dash

The official docker image is published on [docker hub](https://hub.docker.com/r/parseplatform/parse-dashboard)

With every Parse Dashboard major release, the Docker image is updated to the newest Node.js LTS version that the new major version supports, see [Compatibility](#nodejs). Between major releases, it only receives Node.js minor and patch updates, unless its Node.js version reaches its end-of-life.

Run the image with your ``config.json`` mounted as a volume

```
Expand Down
Loading
Loading