Skip to content
Open
Show file tree
Hide file tree
Changes from 68 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
2 changes: 1 addition & 1 deletion .claude/skills/host-test-memory-leak-hunting/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ Snapshots at `t=10` (warm) and `t=50` give a clean delta over 40 tests. Add `t=9
### 3. Open a fresh test tab

```sh
ENCODED=$(node -e 'console.log(encodeURIComponent("http://localhost:4200/tests/index.html?hidepassed&filter=card-basics"))')
ENCODED=$(node -e 'console.log(encodeURIComponent("https://localhost:4200/tests/index.html?hidepassed&filter=card-basics"))')
curl -sX PUT "http://localhost:9333/json/new?${ENCODED}"
```

Expand Down
165 changes: 84 additions & 81 deletions .claude/skills/indexing-diagnostics/SKILL.md

Large diffs are not rendered by default.

17 changes: 17 additions & 0 deletions .github/actions/init/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,20 @@ runs:
if: ${{ steps.cache.outputs.cache-hit != 'true' }}
shell: bash
run: pnpm store prune

# Provision the mandatory dev cert so the realm-server can speak
# HTTPS+HTTP/2 — the only protocol it supports. Local devs get this
# via `mise run infra:ensure-dev-cert`; CI runs it explicitly here
# so every downstream job starts with the cert in
# ~/.local/share/boxel/dev-certs/ and `NODE_EXTRA_CA_CERTS` pointed
# at mkcert's root. See packages/realm-server/server.ts and
# mise-tasks/infra/ensure-dev-cert.
- name: Install mkcert
shell: bash
run: |
sudo apt-get update
sudo apt-get install -y mkcert libnss3-tools

- name: Provision dev TLS cert
shell: bash
run: mise run infra:ensure-dev-cert
36 changes: 23 additions & 13 deletions .github/workflows/ci-host.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -108,18 +108,23 @@ jobs:

- name: Disable TCP/UDP network offloading
run: sudo ethtool -K eth0 tx off rx off
- name: Start test services (icons + host dist + realm servers)
run: mise run test-services:host | tee -a /tmp/server.log &
- name: Create realm users
run: pnpm register-realm-users
working-directory: packages/matrix

# Install + restart dbus/upower BEFORE the test services come up.
# `sudo service dbus restart` triggers chrome's NetworkChangeNotifier
# in any already-running chromium (the prerender's standby probe and
# the realm-server's prerender workers), which aborts every in-flight
# h2 stream with ERR_NETWORK_CHANGED and leaves wait-for-host-standby
# stuck waiting for #standby-ready that never lands.
- name: Install D-Bus helpers
run: |
sudo apt-get update
sudo apt-get install -y dbus-x11 upower
sudo service dbus restart
sudo service upower restart
- name: Start test services (icons + host dist + realm servers)
run: mise run test-services:host | tee -a /tmp/server.log &
- name: Create realm users
run: pnpm register-realm-users
working-directory: packages/matrix

- name: Live test suite
run: dbus-run-session -- pnpm test:live
Expand Down Expand Up @@ -170,6 +175,18 @@ jobs:
# https://github.com/actions/runner-images/issues/1187#issuecomment-686735760
- name: Disable TCP/UDP network offloading
run: sudo ethtool -K eth0 tx off rx off
# Install + restart dbus/upower BEFORE the test services come up.
# `sudo service dbus restart` triggers chrome's NetworkChangeNotifier
# in any already-running chromium (the prerender's standby probe and
# the realm-server's prerender workers), which aborts every in-flight
# h2 stream with ERR_NETWORK_CHANGED and leaves wait-for-host-standby
# stuck waiting for #standby-ready that never lands.
- name: Install D-Bus helpers
run: |
sudo apt-get update
sudo apt-get install -y dbus-x11 upower
sudo service dbus restart
sudo service upower restart
- name: Start test services (icons + host dist + realm servers)
run: mise run test-services:host | tee -a /tmp/server.log &
env:
Expand All @@ -178,13 +195,6 @@ jobs:
run: pnpm register-realm-users
working-directory: packages/matrix

- name: Install D-Bus helpers
run: |
sudo apt-get update
sudo apt-get install -y dbus-x11 upower
sudo service dbus restart
sudo service upower restart

- name: host test suite (shard ${{ matrix.shardIndex }})
run: |
if [ "$PERCY_ENABLED" = "true" ]; then
Expand Down
13 changes: 10 additions & 3 deletions .github/workflows/ci-software-factory.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -80,10 +80,17 @@ jobs:
if: ${{ matrix.shard.index == 1 }}
run: pnpm test:node
working-directory: packages/software-factory
- name: Serve test assets (icons + host dist)
- name: Serve boxel-icons
run: |
mise run ci:serve-test-assets &
timeout 180 bash -c 'until curl -sf http://localhost:4200 > /dev/null && curl -sf http://localhost:4206 > /dev/null; do sleep 2; done'
# SF Playwright tests use the realm-test-harness, which spins up
# vite / realm-server on its own dynamic ports — it is hermetic
# by design (see packages/software-factory/docs/testing-strategy.md).
# The only external service it expects is the icons server on
# ICONS_URL (defaults to http://localhost:4206/). Do not start
# host-dist on port 4200 here — it collides with the harness
# and masks regressions in the harness's host bring-up code.
mise run services:icons &
timeout 60 bash -c 'until curl -sf http://localhost:4206 > /dev/null; do sleep 1; done'
- name: Run Playwright tests
run: pnpm test:playwright:shard ${{ matrix.shard.index }}/${{ matrix.shard.total }}
working-directory: packages/software-factory
Expand Down
12 changes: 9 additions & 3 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -385,7 +385,7 @@ jobs:
- name: Start test services (icons + host dist + base realm)
run: |
MATRIX_REGISTRATION_SHARED_SECRET='xxxx' mise run test-services:matrix | tee -a /tmp/server.log &
timeout 300 bash -c 'until curl -sf http://localhost:4200 > /dev/null && curl -sf http://localhost:4206 > /dev/null; do sleep 2; done'
timeout 300 bash -c 'until curl -ksf https://localhost:4200 > /dev/null && curl -sf http://localhost:4206 > /dev/null; do sleep 2; done'
- name: Run Playwright tests
run: pnpm test:group ${{ matrix.shardIndex }}/${{ matrix.shardTotal }}
working-directory: packages/matrix
Expand Down Expand Up @@ -906,7 +906,7 @@ jobs:
- name: Serve test assets (icons + host dist)
run: |
mise run ci:serve-test-assets &
timeout 180 bash -c 'until curl -sf http://localhost:4200 > /dev/null && curl -sf http://localhost:4206 > /dev/null; do sleep 2; done'
timeout 180 bash -c 'until curl -ksf https://localhost:4200 > /dev/null && curl -sf http://localhost:4206 > /dev/null; do sleep 2; done'
- name: Start PostgreSQL for tests
run: pnpm start:pg | tee -a /tmp/test-services.log &
working-directory: packages/realm-server
Expand Down Expand Up @@ -980,7 +980,13 @@ jobs:
- name: Start dev stack (icons + host-dist + base realm + prerenderer)
run: |
mise run test-services:matrix | tee -a /tmp/server.log &
timeout 600 bash -c 'until curl -sf http://localhost:4200 > /dev/null && curl -sf -H "Accept: application/vnd.api+json" http://localhost:4201/base/_readiness-check > /dev/null; do sleep 2; done'
# `-k` skips cert verification (the local realm-server speaks
# HTTPS with the mkcert leaf cert). `-w '%{http_code}'` + grep
# ensures we treat 3xx as still-not-ready instead of letting
# `-f` return 0 on the dispatcher's redirect response, which
# would race the tests ahead of the base realm finishing its
# initial index.
timeout 600 bash -c 'until curl -sk -o /dev/null -w "%{http_code}" https://localhost:4200/ | grep -qx 200 && curl -sk -o /dev/null -w "%{http_code}" -H "Accept: application/vnd.api+json" https://localhost:4201/base/_readiness-check | grep -qx 200; do sleep 2; done'
- name: Run integration tests
run: pnpm test:integration
working-directory: packages/boxel-cli
Expand Down
6 changes: 3 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,10 +94,10 @@

#### Iterating on host tests with the Chrome MCP server

- Start the host app so qunit test runner is available at `http://localhost:4200/tests` (usual `pnpm start` + dependencies).
- Start the host app so qunit test runner is available at `https://localhost:4200/tests` (usual `pnpm start` + dependencies).
- Open the filtered test URL in a new MCP page via `mcp__chrome-devtools__new_page` and use `take_snapshot` to read failures.
- Filtered URL structure: `http://localhost:4200/tests?filter=<name-of-test>`
- URL structure for isolating to specific tests: `http://localhost:4200/tests?moduleId=<module-id>&testId=<test-id>&testId=...` (visible on the “Rerun” links for failing tests).
- Filtered URL structure: `https://localhost:4200/tests?filter=<name-of-test>`
- URL structure for isolating to specific tests: `https://localhost:4200/tests?moduleId=<module-id>&testId=<test-id>&testId=...` (visible on the “Rerun” links for failing tests).
- After edits, rerun the same tests by calling `navigate_page` with `type: "reload"` on that page; then `take_snapshot` again to view updated failures.
- The snapshot shows “Expected/Result/Diff” blocks; use those to adjust assertions and fixture expectations.
- Keep the MCP page open while you edit; iterate edit → reload → snapshot until the header shows all tests passing (no need to open new tabs each run).
Expand Down
20 changes: 12 additions & 8 deletions QUICKSTART.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,17 @@

To build the entire repository and run the application, follow these steps:

1. The 2 main system dependencies to install are:

1. The system dependencies to install are:
- [mise](https://mise.jdx.dev/getting-started.html)
- [docker](https://docs.docker.com/get-docker/)
- [mkcert](https://github.com/FiloSottile/mkcert) — provisions the
local TLS cert the realm-server needs to speak HTTPS+HTTP/2 (local
dev has no HTTP fallback). Install with
`sudo apt install -y mkcert libnss3-tools` on Debian/Ubuntu or
`brew install mkcert nss` on macOS. After install, run
`mise run infra:ensure-dev-cert` once before the first
`mise run dev` / `pnpm start:all`; subsequent runs are a no-op. See
the repo-root [README](README.md#local-https-dev-access) for details.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Has anyone actually tried following the steps in this document in a while? I too updated it with the mise changes but I’m not convinced it actually works. It doesn’t have to be addressed as part of this PR but I think we should consider removing it, or committing to making sure it works and stays working.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I have not. I think @tintinthong made this originally, perhaps he has thoughts?


2. Clone the repo:

Expand Down Expand Up @@ -52,7 +59,7 @@ To build the entire repository and run the application, follow these steps:
Note: Ensure that the realm-server is completely started by looking out for tor the test-realm indexing output.

```zsh
Realm http://localhost:4202/test/ has started ({
Realm https://localhost:4202/test/ has started ({
"instancesIndexed": 8,
"instanceErrors": 0,
"moduleErrors": 0
Expand All @@ -76,19 +83,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:4200/
- 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:4200/ 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
Loading
Loading