Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
04415cf
WIP: connect shared browser UI to authenticated remote engines
Gratenes Sep 11, 2026
bf46b82
docs: record OSS-first self-hosting and optional WorkOS roadmap
Gratenes Sep 11, 2026
c505654
Remove unused browser presentation and unrelated lock updates
Gratenes Sep 11, 2026
0c20b1f
Merge upstream main and preserve browser compatibility
Gratenes Sep 11, 2026
59da11f
Enable native keyboard resizing and use sibling browser runtime
Gratenes Sep 12, 2026
63dcfd9
Constrain mobile popovers to viewport
Gratenes Sep 12, 2026
11d5f55
Remove obsolete standalone browser RPC
Gratenes Sep 12, 2026
1ffbf8d
Merge upstream main for browser PR validation
Gratenes Sep 12, 2026
3c703df
Fix browser upload backpressure without starving inbound RPC
Gratenes Sep 12, 2026
5d123de
Pin published browser runtime and add reproducible web validation
Gratenes Sep 12, 2026
25b4d84
Refresh lifecycle lockfile after upstream version bump
Gratenes Sep 12, 2026
08fcd03
feat(web): prepare production deployment and multiuser authentication
Gratenes Sep 12, 2026
ccedd0d
Streamline browser connection and mobile layout with smaller WASM
Gratenes Sep 13, 2026
f0d348b
fix(web): make browser reconnects resilient to visibility changes
Gratenes Sep 13, 2026
5be4e8d
fix(ui): align mobile drawers and shared sidebar layout
Gratenes Sep 13, 2026
5254ff3
fix(terminal): bridge browser text input and touch focus
Gratenes Sep 13, 2026
ac1e4ac
fix(web): suppress full-page mobile button tap highlight
Gratenes Sep 13, 2026
5c0a81b
Merge upstream main and prepare browser PR for review
Gratenes Sep 13, 2026
b395c09
fix(web): address browser review findings
Gratenes Sep 13, 2026
b72684a
fix(web): address remaining browser review findings
Gratenes Sep 14, 2026
29f3841
chore(web): repin Gratenes/zui to 93ab2ca
Gratenes Sep 18, 2026
8f98056
feat(web): cache the WASM bundle and show load progress
Gratenes Sep 18, 2026
75fc1b4
fix(web): title the browser tab Zeron
Gratenes Sep 18, 2026
9351f8c
fix(web): load chat-history attachment images in the browser
Gratenes Sep 18, 2026
e07f952
Merge upstream main and restore the browser/WASM boundary
Gratenes Sep 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
54 changes: 50 additions & 4 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
name: deploy

# Autodeploy the edge Worker + Durable Objects (session/device rooms, R2,
# WorkOS auth routes) on every push to main that touches edge/. Skips
# Autodeploy the edge Worker + Durable Objects and web.zeron.sh assets
# on every push to main that touches edge or web build inputs. Skips
# gracefully until the CLOUDFLARE_API_TOKEN secret is configured (until then:
# `npm -C edge run deploy` from a wrangler-authenticated machine).
# build apps/web with the pinned toolchain below, then `npm -C edge run deploy`).
#
# The token needs: Workers Scripts (edit), Workers Routes (edit) on zeron.sh,
# Workers R2 Storage (edit). Account id is pinned in edge/wrangler.jsonc.
Expand All @@ -20,6 +20,7 @@ concurrency:
jobs:
edge:
runs-on: ubuntu-latest
timeout-minutes: 60
env:
# `secrets` is not a valid context in step `if:` expressions — surface
# the token through job env and gate on that instead.
Expand All @@ -38,7 +39,7 @@ jobs:
|| [ -z "$before" ] || ! git cat-file -e "$before" 2>/dev/null; then
echo "changed=true" >> "$GITHUB_OUTPUT"; exit 0
fi
if git diff --name-only "$before" "$GITHUB_SHA" | grep -qE "^(edge/|\.github/workflows/deploy\.yml)"; then
if git diff --name-only "$before" "$GITHUB_SHA" | grep -E '^(edge/|apps/web/|crates/|vendor/|\.cargo/|Cargo\.(toml|lock)$|rust-toolchain(\.toml)?$|\.github/workflows/(deploy|web-validation)\.yml$)' > /dev/null; then
echo "changed=true" >> "$GITHUB_OUTPUT"
else
echo "changed=false" >> "$GITHUB_OUTPUT"
Expand All @@ -61,10 +62,55 @@ jobs:
if: steps.changed.outputs.changed == 'true'
working-directory: edge
run: npm test
- name: Rust toolchain
if: steps.changed.outputs.changed == 'true'
uses: dtolnay/rust-toolchain@stable
with:
toolchain: nightly-2026-09-08
targets: wasm32-unknown-unknown
components: rust-src
- uses: Swatinem/rust-cache@v2
if: steps.changed.outputs.changed == 'true'
with:
workspaces: apps/web
cache-on-failure: true
- name: Install Trunk
if: steps.changed.outputs.changed == 'true'
run: cargo install trunk --locked --version 0.21.14
- name: Build web bundle
if: steps.changed.outputs.changed == 'true'
working-directory: apps/web
env:
RUSTUP_TOOLCHAIN: nightly-2026-09-08
CARGO_BUILD_JOBS: 2
run: env -u NO_COLOR trunk build --release --locked
- name: Check web assets
if: steps.changed.outputs.changed == 'true'
run: |
test -s apps/web/dist/index.html
cmp apps/web/_headers apps/web/dist/_headers
find apps/web/dist -name '*.wasm' -size +0c | grep .
oversized=$(find apps/web/dist -type f -size +26214400c)
if [ -n "$oversized" ]; then
printf 'Assets exceed the 25 MiB limit:\n%s\n' "$oversized"
exit 1
fi

- name: Local production routing preflight
if: steps.changed.outputs.changed == 'true'
working-directory: edge
timeout-minutes: 5
run: node scripts/production-routing.mjs

- name: deploy
if: steps.changed.outputs.changed == 'true' && env.CLOUDFLARE_API_TOKEN != ''
working-directory: edge
run: npx wrangler deploy
- name: Smoke test web.zeron.sh
if: steps.changed.outputs.changed == 'true' && env.CLOUDFLARE_API_TOKEN != ''
working-directory: edge
timeout-minutes: 5
run: node scripts/production-smoke.mjs https://web.zeron.sh

# Static landing page (zeron.sh) — assets-only worker, no build step.
landing:
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/ui-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ jobs:
- uses: Swatinem/rust-cache@v2
- name: UI and headless layout regressions
run: cargo test --release --locked -p zeron-ui --lib -- --test-threads=1
- name: Browser terminal input regressions
run: cargo test --release --locked -p zeron-ui --features web-input-tests --lib terminal::panel::input_tests -- --test-threads=1

macos-frame-recovery:
runs-on: macos-latest
Expand Down
125 changes: 125 additions & 0 deletions .github/workflows/web-validation.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
name: Web validation

on:
pull_request:
paths:
- 'apps/web/**'
- 'crates/**'
- 'vendor/**'
- '.cargo/**'
- 'edge/**'
- 'Cargo.toml'
- 'Cargo.lock'
- 'rust-toolchain.toml'
- 'rust-toolchain'
- '.github/workflows/deploy.yml'
- '.github/workflows/web-validation.yml'
push:
paths:
- 'apps/web/**'
- 'crates/**'
- 'vendor/**'
- '.cargo/**'
- 'edge/**'
- 'Cargo.toml'
- 'Cargo.lock'
- 'rust-toolchain.toml'
- 'rust-toolchain'
- '.github/workflows/deploy.yml'
- '.github/workflows/web-validation.yml'
workflow_dispatch:

permissions:
contents: read

concurrency:
group: web-validation-${{ github.ref }}
cancel-in-progress: true

jobs:
wasm:
name: Locked WASM build
runs-on: ubuntu-24.04
timeout-minutes: 45
steps:
- uses: actions/checkout@v4
- name: Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
toolchain: nightly-2026-09-08
targets: wasm32-unknown-unknown
components: rust-src
- uses: Swatinem/rust-cache@v2
with:
workspaces: apps/web
cache-on-failure: true
- name: Install Trunk
run: cargo install trunk --locked --version 0.21.14
- name: Build web bundle
working-directory: apps/web
env:
RUSTUP_TOOLCHAIN: nightly-2026-09-08
CARGO_BUILD_JOBS: 2
run: env -u NO_COLOR trunk build --release --locked
- name: Check web assets
run: |
test -s apps/web/dist/index.html
cmp apps/web/_headers apps/web/dist/_headers
find apps/web/dist -name '*.wasm' -size +0c | grep .
oversized=$(find apps/web/dist -type f -size +26214400c)
if [ -n "$oversized" ]; then
printf 'Assets exceed the 25 MiB limit:\n%s\n' "$oversized"
exit 1
fi
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
cache-dependency-path: edge/package-lock.json
- name: Install edge packaging tools
working-directory: edge
run: npm ci
# Uses the production config without credentials or remote mutations.
- name: Package production Worker and web assets (dry run)
working-directory: edge
run: npx wrangler deploy --config wrangler.jsonc --dry-run --outdir dist
- name: Local production routing integration
working-directory: edge
timeout-minutes: 5
run: node scripts/production-routing.mjs

lifecycle:
name: Browser lifecycle tests
runs-on: ubuntu-24.04
timeout-minutes: 15
steps:
- uses: actions/checkout@v4
- name: Rust toolchain
uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
workspaces: apps/web/tests/lifecycle
cache-on-failure: true
- name: Run lifecycle tests
run: cargo test --locked --manifest-path apps/web/tests/lifecycle/Cargo.toml

edge:
name: Focused edge auth and device tests
runs-on: ubuntu-24.04
timeout-minutes: 15
defaults:
run:
working-directory: edge
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 24
cache: npm
cache-dependency-path: edge/package-lock.json
- run: npm ci
- run: npm run typecheck
- name: Unit auth and frame tests
run: npm run test:unit -- src/browser-routes.test.ts src/device-frame.test.ts src/forwarded-headers.test.ts
- name: Workerd session and DeviceRoom tests
run: npm run test:workerd -- test/workerd/browser-discovery.workerd.test.ts test/workerd/browser-sessions.workerd.test.ts test/workerd/device-browser.workerd.test.ts test/workerd/browser-multi-user.workerd.test.ts
Loading