Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
1655a6f
realm-server: speak HTTPS+HTTP/2 in local dev
habdelra May 12, 2026
5de44d9
dispatcher + canonical URL migration for HTTPS flip
habdelra May 12, 2026
01e3108
ensure-dev-cert soft-warn + env-vars conditional scheme
habdelra May 12, 2026
1fa2d4b
HTTPS mandatory: provision dev cert in CI init, drop fallback paths
habdelra May 12, 2026
55d518e
QUICKSTART: list mkcert prereq + dev-cert step
habdelra May 12, 2026
5b383ee
test-services tasks: depend on ensure-dev-cert + scheme-aware readiness
habdelra May 12, 2026
6e2e916
landing the review-agent + Copilot findings
habdelra May 12, 2026
953f8c6
3 more review threads: README indent, dispatcher coverage, force-close
habdelra May 12, 2026
a5342d3
listener-dispatcher test: split logical-and assertions
habdelra May 12, 2026
caf7e7b
test harnesses: strip TLS env vars before spawning realm-server
habdelra May 13, 2026
0a07028
testem-live: realm URL → https + --ignore-certificate-errors for Chrome
habdelra May 13, 2026
3f3a76e
canonical-url migration: pre-check realm_user_permissions, not realm_…
habdelra May 13, 2026
fe5ee68
host environmentDefaults: keep test env on http
habdelra May 13, 2026
88dc5bc
revert test-mode http revert; flip readiness scripts to https
habdelra May 13, 2026
4d19e15
audit + flip http://localhost:42XX refs across the monorepo
habdelra May 13, 2026
1b863c1
host testem.js: --ignore-certificate-errors for the Host Tests Chrome
habdelra May 13, 2026
b1f3cb9
runTestRealmServer*: strip TLS env vars in the shared helpers
habdelra May 13, 2026
b75edf1
Merge remote-tracking branch 'origin/main' into worktree-cs-11114-htt…
habdelra May 13, 2026
ec75fea
test scripts: flip stale http-get:// wait-on URLs to https-get://
habdelra May 13, 2026
03b5a55
test fixtures: flip card adoptsFrom URLs to https for HTTPS realm-server
habdelra May 13, 2026
2ef2397
diagnostic: bind realm-server as plain HTTPS+HTTP/1.1 via BOXEL_REALM…
habdelra May 13, 2026
aaf3b4c
yamllint: use double-quoted '1' in BOXEL_REALM_FORCE_HTTP1 env entries
habdelra May 13, 2026
f9e9955
host tests: flip http://localhost:42XX → https in test code
habdelra May 13, 2026
20c0bba
ensure-dev-cert: init NSS DB before mkcert -install so Chromium trust…
habdelra May 13, 2026
5e9704b
ensure-dev-cert: run NSS DB init + mkcert -install BEFORE the cert-skip
habdelra May 13, 2026
ff96ee4
ensure-dev-cert: log mkcert -install output + NSS DB contents
habdelra May 13, 2026
4d84630
boxel-cli CI: wait for base realm 200 not 301 redirect
habdelra May 13, 2026
7c4458d
diagnostic: bypass dispatcher with BOXEL_REALM_NO_DISPATCHER=1
habdelra May 13, 2026
b2507a6
revert: drop BOXEL_REALM_NO_DISPATCHER bypass — dispatcher isn't the …
habdelra May 13, 2026
678e850
realm-server: fix HEAD-over-h2 hang by patching Koa response.writable
habdelra May 13, 2026
f491cb9
mise-tasks: realm-server-base / worker-base use https for --toUrl
habdelra May 13, 2026
2fbebd9
host realm-indexing-test: move test/person URL to correct sort slot
habdelra May 13, 2026
713e32c
realm-server tests: flip hardcoded http://localhost:4202/ to https
habdelra May 13, 2026
7c6a88b
realm-server proxyAsset: strip h2 pseudo-headers before koa-proxies h…
habdelra May 13, 2026
8bcc98a
realm-server proxyAsset: shadow req.headers instead of mutating it
habdelra May 13, 2026
a1298a7
realm-server proxyAsset: replace koa-proxies with a hand-rolled forwa…
habdelra May 13, 2026
12b7fbc
matrix isolated-realm-server: strip TLS env vars from spawned children
habdelra May 13, 2026
1cee373
Merge remote-tracking branch 'origin/main' into worktree-cs-11114-htt…
habdelra May 14, 2026
442e278
ensure-dev-cert: fail fast when mkcert root CA isn't already trusted
habdelra May 14, 2026
b204160
dev-all: run ensure-dev-cert upfront so missing-cert errors are visible
habdelra May 14, 2026
739da6b
dev-cert: add infra:trust-dev-cert task, fail fast with active-voice …
habdelra May 14, 2026
1e1009a
ensure-dev-cert: name the exact command to re-run in the failure hint
habdelra May 14, 2026
16e619a
vite: serve HTTPS at localhost:4200 when the dev cert is present
habdelra May 14, 2026
495be71
vite: serve HTTPS at localhost:4200 when the dev cert is present
habdelra May 14, 2026
852e6a1
matrix: migration script to flip user account_data URLs http→https
habdelra May 14, 2026
6c2d7f8
vite: same-port http→https redirect dispatcher for local dev
habdelra May 14, 2026
a466e7f
prerender: warm vite over HTTPS in dev so the first standby doesn't t…
habdelra May 14, 2026
4c138e7
Audit + flip http://localhost:4200 → https://localhost:4200 across th…
habdelra May 14, 2026
77e7c69
env-vars: prefer system chrome over puppeteer's bundled chrome 143
habdelra May 14, 2026
c6e848b
Merge branch 'worktree-cs-11114-http2-v2' of https://github.com/cards…
habdelra May 14, 2026
9a45b4d
realm-test-harness: strip TLS env vars before spawning vite preview
habdelra May 14, 2026
dfff3a0
fix experiments url
habdelra May 14, 2026
9ce00a7
vite-with-traefik: prettier formatting
habdelra May 14, 2026
73ac30c
CI: fix dispatcher byte-peek and wait-on TLS trust
habdelra May 14, 2026
3399902
realm-server + CI: hardcode https serverURL, scope SF probe to icons-…
habdelra May 14, 2026
438b82b
postgres ensure-db-exists: force TCP inside container, fail loud on C…
habdelra May 14, 2026
190b73c
vite-with-traefik: skip the same-port redirect dispatcher for vite pr…
habdelra May 14, 2026
f5de14e
add reversible migrate-down for http↔https rewrite (postgres + matrix)
habdelra May 14, 2026
de5129a
prerender + standby probe: pair --ignore-certificate-errors with --al…
habdelra May 14, 2026
26f5eac
matrix harness: switch isolated realm-server on :4205 to HTTPS+HTTP/2
habdelra May 14, 2026
9ee116e
canonical-url migration: add :4205 to the http→https rewrite
habdelra May 14, 2026
26acb01
workspace-sync-cli: switch test harness on :4205 to HTTPS
habdelra May 14, 2026
d5a6860
Merge remote-tracking branch 'origin/main' into worktree-cs-11114-htt…
habdelra May 14, 2026
24693b9
host/matrix/realm-server test scripts: pin START_SERVER_AND_TEST_INSE…
habdelra May 14, 2026
9706c34
wait-for-host-standby: add chrome-event logging to diagnose CI frame-…
habdelra May 14, 2026
4ce991f
ci-host workflow: install dbus/upower BEFORE starting test services
habdelra May 14, 2026
60360c1
testem: pair --ignore-certificate-errors with --allow-insecure-localhost
habdelra May 14, 2026
1dc733a
host-submode-test: flip subdomain assertions to https
habdelra May 14, 2026
deee75a
post-review cleanup: cert + migration symmetry + dead-code removal
habdelra May 14, 2026
3e1acdf
address Codex review feedback + tighten cert-relax gate
habdelra May 14, 2026
7832e3e
listener-dispatcher tests: assert 308, not 301
habdelra May 14, 2026
27035c6
vite-with-traefik: pin internal vite to 127.0.0.1 behind dispatcher (…
backspace May 15, 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
163 changes: 83 additions & 80 deletions .claude/skills/indexing-diagnostics/SKILL.md

Large diffs are not rendered by default.

8 changes: 2 additions & 6 deletions QUICKSTART.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
To build the entire repository and run the application, follow these steps:

1. The 2 main system dependencies to install are:

- [mise](https://mise.jdx.dev/getting-started.html)
- [docker](https://docs.docker.com/get-docker/)

Expand Down Expand Up @@ -76,19 +75,16 @@ To build the entire repository and run the application, follow these steps:
Visit http://localhost:8080. Type in Username = "admin", Password: "password" Homeserver URL: http://localhost:8008

10. Host App

- Visit http://localhost:4201/
- Visit https://localhost:4201/
- Enter the registration flow and create a Boxel Account
- When prompted for an authentication token, type in "dev-token"
Comment thread
habdelra marked this conversation as resolved.

11. Validate email for login

- Visit SMTP UI at http://localhost:5001/
- Validate email
- Go back to Host http://localhost:4201/ and login
- Go back to Host https://localhost:4201/ and login

12. Perform "Setup up Secure Payment Method" flow

- More detailed steps can be found in our [README](README.md) Payment Setup section

13. Run ai bot (Optional):
Expand Down
121 changes: 107 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,10 @@ For a quickstart, see [here](./QUICKSTART.md)

Two catalog realms run side by side. The **Cardstack Catalog** (served from [cardstack/boxel-catalog](https://github.com/cardstack/boxel-catalog)) is the source of truth for new development and the destination for community submissions. The **Legacy Catalog** (shipped from this monorepo) remains available during the deprecation window for content that hasn't been migrated upstream.

| Realm | Source | URL path | Purpose |
| ---------------------- | --------------------------------------------------------------------------------------- | ------------------ | -------------------------------------------------------------------------------------------------------------------------------- |
| **Cardstack Catalog** | `packages/catalog` (clones [boxel-catalog](https://github.com/cardstack/boxel-catalog)) | `/catalog/` | Official catalog. New listings and community submissions land here via `pr-listing-create` PRs to `cardstack/boxel-catalog`. |
| **Legacy Catalog** | `packages/catalog-realm` | `/legacy-catalog/` | Historical catalog shipped from this repo. Kept visible in the workspace chooser while existing content migrates upstream. |
| Realm | Source | URL path | Purpose |
| --------------------- | --------------------------------------------------------------------------------------- | ------------------ | ---------------------------------------------------------------------------------------------------------------------------- |
| **Cardstack Catalog** | `packages/catalog` (clones [boxel-catalog](https://github.com/cardstack/boxel-catalog)) | `/catalog/` | Official catalog. New listings and community submissions land here via `pr-listing-create` PRs to `cardstack/boxel-catalog`. |
| **Legacy Catalog** | `packages/catalog-realm` | `/legacy-catalog/` | Historical catalog shipped from this repo. Kept visible in the workspace chooser while existing content migrates upstream. |

Both catalogs appear in the workspace chooser by default; the Cardstack Catalog is sorted first, Legacy Catalog last. Both are controlled by the same `SKIP_CATALOG` flag — setting `SKIP_CATALOG=true` skips setup and startup for both.

Expand Down Expand Up @@ -137,7 +137,7 @@ In order to run the realm server hosted app:
1. `mise run services:host-build` to re-build the host app (this step can be omitted if you do not want host app re-builds)
2. `mise run dev` to serve the base and experiments realms

You can visit the URL of each realm server to view that realm's app. So for instance, the base realm's app is available at `http://localhost:4201/base` and the experiments realm's app is at `http://localhost:4201/experiments`.
You can visit the URL of each realm server to view that realm's app. So for instance, the base realm's app is available at `https://localhost:4201/base` and the experiments realm's app is at `https://localhost:4201/experiments`. (Local dev now serves HTTPS+HTTP/2 — see "Local HTTPS dev access" below for the one-time cert setup.)

Live reloads are not available in this mode, however, if you use start the server with the environment variable `DISABLE_MODULE_CACHING=true` you can just refresh the page to grab the latest code changes if you are running rebuilds (step #1 and #2 above).

Expand Down Expand Up @@ -191,10 +191,10 @@ Here's what is spun up with `mise run dev`:

| Port | Description | `mise run dev` | `mise run services:realm-server-base` |
| ----- | --------------------------------------------------------------------------------------------- | -------------- | ------------------------------------- |
| :4201 | `/base` base realm | ✅ | ✅ |
| :4201 | `/base` base realm (HTTPS+HTTP/2; see "Local HTTPS dev access" below) | ✅ | ✅ |
| :4201 | `/skills` skills realm | ✅ | 🚫 |
| :4201 | `/experiments` experiments realm | ✅ | 🚫 |
| :4202 | `/test` host test realm, `/node-test` node test realm | ✅ | 🚫 |
| :4202 | `/test` host test realm, `/node-test` node test realm (HTTPS+HTTP/2) | ✅ | 🚫 |
| :4205 | `/test` realm for matrix client tests (playwright controlled) | 🚫 | 🚫 |
| :4206 | Boxel icons server | ✅ | 🚫 |
| :4210 | Development Worker Manager (spins up 1 worker by default) | ✅ | 🚫 |
Expand All @@ -207,9 +207,102 @@ Here's what is spun up with `mise run dev`:
| :5435 | Postgres DB | ✅ | 🚫 |
| :8008 | Matrix synapse server | ✅ | 🚫 |

#### Local HTTPS dev access

##### Why

Heavy aggregator cards (Cohort, dashboards) fan out 80+ federated-search
requests per render. Chrome — including the headless Chromium that
drives the prerender — caps any single origin at 6 concurrent HTTP/1.1
connections, so the 80+ requests serialize. A single cohort render
takes ~4–5 minutes under that ceiling. HTTP/2 multiplexes them over one
connection and the same render finishes in seconds. Browsers only do
HTTP/2 over TLS, so the local realm-server terminates a leaf cert.

##### Setup

```
mise run infra:ensure-dev-cert
```

That task:

1. Requires [`mkcert`](https://github.com/FiloSottile/mkcert)
(`sudo apt install -y mkcert libnss3-tools` on Debian/Ubuntu;
`brew install mkcert nss` on macOS). If it's missing, the task
prints these instructions and exits non-zero — local dev now
speaks HTTPS only and has no HTTP fallback.
Comment thread
habdelra marked this conversation as resolved.
2. Attempts `mkcert -install` once (one-time sudo prompt) so mkcert's
root CA lands in your system trust store. Your normal browser then
silently accepts the cert. If you decline the sudo prompt the cert
is still generated, indexing keeps working, and you can run
`mkcert -install` later when convenient.
3. Generates `~/.local/share/boxel/dev-certs/{localhost.pem,
localhost-key.pem}`. Idempotent — re-runs are a no-op until the
Comment thread
habdelra marked this conversation as resolved.
cert is within 7 days of expiry.

After provisioning, `mise run dev` (and `mise run dev-all`) automatically
brings the realm-server up on `https://localhost:4201` (and
`https://localhost:4202` for the test-realms server). Node clients
(worker, scripts, prerender Node-side) trust the cert via
`NODE_EXTRA_CA_CERTS` (pointed at mkcert's root by `env-vars.sh`); the
prerender Chromium uses `--ignore-certificate-errors` for belt-and-
suspenders coverage.

##### Migration after pulling this change

The canonical realm URLs are now `https://localhost:4201/…` and
`https://localhost:4202/…`, so every row that was written under the old
`http://localhost:42XX/…` canonical needs its URLs rewritten in place
— PK columns, FK columns, JSONB documents (`pristine_doc`, `search_doc`,
`error_doc`, `deps`, `value`, `headers`, etc.), and rendered HTML /
markdown payloads. The repo ships an auto-run migration that handles
all of it:

- `pnpm migrate` (which `mise run dev` runs via `--migrateDB`) picks up
`packages/postgres/migrations/1779200000000_canonical-url-http-to-https.js`
on the next boot.
- That migration walks `information_schema.columns`, finds every
text/varchar/jsonb column on every public table (skipping `modules`,
which the realm-server truncates on startup anyway), and runs an
in-place `REPLACE` for the two canonicals. WHERE-filtered so it only
touches rows that still contain the old URL — idempotent, and a
no-op in production (where the canonical URL is never `localhost`).

After the migration runs, the realm-server boots normally on
`https://localhost:4201/`. The same-port HTTP→HTTPS dispatcher catches
any lingering `http://localhost:4201/…` requests (e.g. you typed it
into a browser, or a card still has a stale URL in a rendered HTML
attribute) and 301-redirects to the canonical https origin.

Personal realm files under `realms/localhost_4201/**/*.json` may still
have `id`/`relationships` URLs spelled `http://localhost:4201/…`. The
indexer re-derives canonical URLs from the realm mount root, so those
files index cleanly under the new canonical and the redirect handles
runtime fetches; cleaning up the on-disk strings is optional (a
`sed -i 's|http://localhost:4201|https://localhost:4201|g'` across the
realm dir does it in one shot).

##### Verify

```
curl -kI --http2 https://localhost:4201/_alive
```

Look for `HTTP/2 200`. The `mise run dev` log also confirms with
`Realm server listening on port 4201 (https/h2)`.

##### CI / hermetic test harness

`env-vars.sh` exports the cert env vars only when the cert files exist
under `~/.local/share/boxel/dev-certs/`. CI images and the software-
factory hermetic harness do not provision the cert, so realm-server
boots HTTP/1.1 on `http://localhost:4201/…` exactly as before. This
keeps the test harness path unchanged.
Comment thread
habdelra marked this conversation as resolved.
Outdated

#### Using `mise run services:realm-server`

You can also use `mise run services:realm-server` if you want the functionality of `mise run dev`, but without running the test realms. This will enable you to open http://localhost:4201 and allow to select between the cards in the /base and /experiments realm. You must also make sure to run `mise run services:worker` in order to start the workers which are normally started in `mise run dev`.
You can also use `mise run services:realm-server` if you want the functionality of `mise run dev`, but without running the test realms. This will enable you to open https://localhost:4201 and allow to select between the cards in the /base and /experiments realm. You must also make sure to run `mise run services:worker` in order to start the workers which are normally started in `mise run dev`.

#### Indexing dashboard

Expand Down Expand Up @@ -610,12 +703,12 @@ BOXEL_ENVIRONMENT=parallel mise run services:ai-bot

In environment mode, services are available at:

| Service | Hostname |
| ------------- | ----------------------------------------- |
| Host app | `http://host.<slug>.localhost` |
| Realm server | `http://realm-server.<slug>.localhost` |
| Matrix | `http://matrix.<slug>.localhost` |
| Icons | `http://icons.<slug>.localhost` |
| Service | Hostname |
| ------------ | -------------------------------------- |
| Host app | `http://host.<slug>.localhost` |
| Realm server | `http://realm-server.<slug>.localhost` |
| Matrix | `http://matrix.<slug>.localhost` |
| Icons | `http://icons.<slug>.localhost` |

Where `<slug>` is the lowercased, sanitized form of `BOXEL_ENVIRONMENT` (e.g., `feature/my-branch` becomes `feature-my-branch`).

Expand Down
90 changes: 90 additions & 0 deletions mise-tasks/infra/ensure-dev-cert
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
#!/usr/bin/env bash
#MISE description="Provision a local dev TLS cert so realm-server can speak HTTP/2"
#
# Generates ~/.local/share/boxel/dev-certs/{localhost.pem, localhost-key.pem}
# using mkcert. Idempotent — re-runs are a no-op if the cert already exists
# and isn't near expiry.
#
# Why this exists
# ---------------
# Heavy aggregator-card prerenders (Cohort, dashboards) fan out 80+
# federated-search requests in a single Chromium tab. Chrome's HTTP/1.1
# per-origin connection limit (6) serializes them and turns one cohort
# render into multiple minutes. HTTP/2 multiplexes them over a single
# TCP connection and the same render finishes in seconds.
#
# Browsers only do HTTP/2 over TLS, so the realm-server has to terminate
# a cert. We use mkcert because:
# 1. It can install a local CA into the system trust store (one-time,
# requires sudo) so the dev's normal browser and command-line tools
# silently accept the cert.
# 2. The leaf cert it generates is short-lived and replaceable; it
# lives under the dev's home dir and is never committed.
#
# This task tries `mkcert -install` automatically — if it succeeds (or
# was already done), the dev's whole local toolchain trusts the cert.
# If the sudo prompt is declined, we still generate the cert so the
# server can boot; only the manual browser keeps showing warnings until
# the dev opts in.

set -euo pipefail

CERT_DIR="${BOXEL_DEV_CERT_DIR:-$HOME/.local/share/boxel/dev-certs}"
CERT_FILE="$CERT_DIR/localhost.pem"
KEY_FILE="$CERT_DIR/localhost-key.pem"

# Idempotent skip when the cert already exists and isn't within 7 days of
# expiry. openssl's `-checkend` returns 0 if the cert is valid for at least
# the given number of seconds.
if [ -f "$CERT_FILE" ] && [ -f "$KEY_FILE" ]; then
if openssl x509 -in "$CERT_FILE" -checkend $((7 * 24 * 60 * 60)) -noout >/dev/null 2>&1; then
exit 0
fi
Comment thread
habdelra marked this conversation as resolved.
Outdated
echo "[ensure-dev-cert] Existing cert at $CERT_FILE is near expiry; regenerating."
fi

if ! command -v mkcert >/dev/null 2>&1; then
cat >&2 <<'EOF'
[ensure-dev-cert] mkcert not installed — skipping HTTPS cert provisioning.
The realm-server's `listen()` falls back to plain HTTP when the cert
env vars are unset, so this is a soft warning (CI and any environment
without mkcert keep working unchanged). Local dev still gets the
HTTPS/HTTP-2 throughput win by installing mkcert and re-running:

Linux (Debian/Ubuntu): sudo apt install -y mkcert libnss3-tools
Linux (Fedora/RHEL): sudo dnf install -y mkcert nss-tools
macOS (Homebrew): brew install mkcert nss

Then: `mise run infra:ensure-dev-cert`

See the repo-root README ("Local HTTPS dev access") for the why.
EOF
exit 0
fi

mkdir -p "$CERT_DIR"

# Best-effort trust install. On a fresh machine this prompts for sudo
# once and adds mkcert's root CA to /etc/ssl/certs (Linux) or the system
# keychain (macOS). On subsequent runs it's a no-op. If the prompt is
# declined, we still proceed — the cert is generated, indexing works
# via puppeteer's --ignore-certificate-errors flag and Node clients
# via NODE_EXTRA_CA_CERTS, and only the manual browser keeps showing
# warnings until the dev opts in later.
if ! mkcert -install 2>/dev/null; then
cat >&2 <<'EOF'
[ensure-dev-cert] `mkcert -install` did not complete (sudo declined or
not available). The cert is still generated below; indexing and Node
clients pick up the local CA via NODE_EXTRA_CA_CERTS. To silence cert
warnings in your manual browser later, run:

mkcert -install # one-time, requires sudo

EOF
fi

echo "[ensure-dev-cert] Generating cert at $CERT_FILE"
mkcert \
-cert-file "$CERT_FILE" \
-key-file "$KEY_FILE" \
localhost 127.0.0.1 ::1
29 changes: 21 additions & 8 deletions mise-tasks/lib/dev-common.sh
Original file line number Diff line number Diff line change
Expand Up @@ -243,27 +243,40 @@ sweep_orphaned_services() {

READY_PATH="_readiness-check?acceptHeader=application%2Fvnd.api%2Bjson"

# Pick wait-on's protocol prefix based on the realm-server's scheme. Local
# dev runs HTTPS+HTTP/2 by default; tests/CI fall back to plain HTTP when
# `infra:ensure-dev-cert` hasn't run. `${REALM_BASE_URL#*://}` strips
# whichever scheme is in use to feed wait-on's authority-only form.
case "$REALM_BASE_URL" in
https://*) REALM_READY_SCHEME="https-get" ;;
*) REALM_READY_SCHEME="http-get" ;;
esac
case "$REALM_TEST_URL" in
https://*) REALM_TEST_READY_SCHEME="https-get" ;;
*) REALM_TEST_READY_SCHEME="http-get" ;;
esac

# Phase 1 readiness URLs
BASE_REALM_READY="http-get://${REALM_BASE_URL#http://}/base/${READY_PATH}"
SKILLS_READY="http-get://${REALM_BASE_URL#http://}/skills/${READY_PATH}"
BASE_REALM_READY="${REALM_READY_SCHEME}://${REALM_BASE_URL#*://}/base/${READY_PATH}"
SKILLS_READY="${REALM_READY_SCHEME}://${REALM_BASE_URL#*://}/skills/${READY_PATH}"
PHASE1_URLS="${BASE_REALM_READY}|${SKILLS_READY}"

if [ -z "${SKIP_CATALOG:-}" ]; then
PHASE1_URLS="${PHASE1_URLS}|http-get://${REALM_BASE_URL#http://}/catalog/${READY_PATH}"
PHASE1_URLS="${PHASE1_URLS}|http-get://${REALM_BASE_URL#http://}/legacy-catalog/${READY_PATH}"
PHASE1_URLS="${PHASE1_URLS}|${REALM_READY_SCHEME}://${REALM_BASE_URL#*://}/catalog/${READY_PATH}"
PHASE1_URLS="${PHASE1_URLS}|${REALM_READY_SCHEME}://${REALM_BASE_URL#*://}/legacy-catalog/${READY_PATH}"
fi
if [ -z "${SKIP_BOXEL_HOMEPAGE:-}" ]; then
PHASE1_URLS="${PHASE1_URLS}|http-get://${REALM_BASE_URL#http://}/boxel-homepage/${READY_PATH}"
PHASE1_URLS="${PHASE1_URLS}|${REALM_READY_SCHEME}://${REALM_BASE_URL#*://}/boxel-homepage/${READY_PATH}"
fi
if [ -z "${SKIP_EXPERIMENTS:-}" ]; then
PHASE1_URLS="${PHASE1_URLS}|http-get://${REALM_BASE_URL#http://}/experiments/${READY_PATH}"
PHASE1_URLS="${PHASE1_URLS}|${REALM_READY_SCHEME}://${REALM_BASE_URL#*://}/experiments/${READY_PATH}"
fi
PHASE1_URLS="${PHASE1_URLS}|http-get://${REALM_BASE_URL#http://}/software-factory/${READY_PATH}"
PHASE1_URLS="${PHASE1_URLS}|${REALM_READY_SCHEME}://${REALM_BASE_URL#*://}/software-factory/${READY_PATH}"

PHASE1_URLS="${PHASE1_URLS}|${MATRIX_URL_VAL}|http://localhost:5001|${ICONS_URL}"

# Phase 2 readiness URL
NODE_TEST_REALM_READY="http-get://${REALM_TEST_URL#http://}/node-test/${READY_PATH}"
NODE_TEST_REALM_READY="${REALM_TEST_READY_SCHEME}://${REALM_TEST_URL#*://}/node-test/${READY_PATH}"

# In environment mode, bootstrap infra before starting services
if [ -n "$BOXEL_ENVIRONMENT" ]; then
Expand Down
Loading
Loading